2 * Copyright (C) 2013 ROCKCHIP, Inc.
3 * drivers/video/display/transmitter/rk616_mipi_dsi.c
4 * author: hhb@rock-chips.com
5 * create date: 2013-07-17
6 * debug sys/kernel/debug/rk616/mipi
7 * This software is licensed under the terms of the GNU General Public
8 * License version 2, as published by the Free Software Foundation, and
9 * may be copied, distributed, and modified under those terms.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
18 #define MIPI_DSI_REGISTER_IO 0
19 #define CONFIG_MIPI_DSI_LINUX 0
20 //#define CONFIG_MIPI_DSI_FT 1
21 //#define CONFIG_MFD_RK616 1
22 //#define CONFIG_ARCH_RK319X 1
23 #define CONFIG_ARCH_RK3288 1
25 #ifdef CONFIG_MIPI_DSI_LINUX
26 #if defined(CONFIG_MFD_RK616)
27 #define DWC_DSI_VERSION 0x3131302A
28 #define DWC_DSI_VERSION_0x3131302A 1
29 #elif defined(CONFIG_ARCH_RK319X)
30 #define DWC_DSI_VERSION 0x3132312A
31 #define DWC_DSI_VERSION_0x3132312A 1
32 #elif defined(CONFIG_ARCH_RK3288)
33 #define DWC_DSI_VERSION 0x3133302A
34 #define DWC_DSI_VERSION_0x3133302A 1
36 #define DWC_DSI_VERSION -1
37 #endif /* CONFIG_MFD_RK616 */
39 #define DWC_DSI_VERSION 0x3131302A
40 #endif /* end of CONFIG_MIPI_DSI_LINUX*/
43 #ifdef CONFIG_MIPI_DSI_LINUX
44 #include <linux/kernel.h>
45 #include <linux/init.h>
46 #include <linux/platform_device.h>
47 #include <linux/slab.h>
48 #include <linux/mfd/rk616.h>
49 #include <linux/rk_fb.h>
50 #include <linux/rk_screen.h>
51 #include <linux/delay.h>
52 #include <linux/clk.h>
53 #include <linux/interrupt.h>
54 #include <asm/div64.h>
57 #include <linux/debugfs.h>
58 #include <linux/seq_file.h>
59 #include <linux/regulator/machine.h>
64 #include <linux/dma-mapping.h>
66 #include "rk616_mipi_dsi.h"
67 #include <linux/rockchip/iomap.h>
72 #define MIPI_DBG(x...) printk(KERN_INFO x)
74 #ifdef CONFIG_MIPI_DSI_FT
75 #define MIPI_DBG(...) \
82 #define MIPI_DBG(x...)
83 #endif /* end of CONFIG_MIPI_DSI_FT */
86 #ifdef CONFIG_MIPI_DSI_LINUX
87 #define MIPI_TRACE(x...) printk(KERN_INFO x)
89 #define MIPI_TRACE(...) \
101 *v1.0 : this driver is mipi dsi driver of rockchip;
103 *v1.2 : add rk_mipi_dsi_init_lite() for mclk variation
104 *v1.3 : add clk_notifier function for mclk variation
105 *v1.4 : add register temp to reduce the time driver resume takes when
107 *v1.5 : change early suspend level (BLANK_SCREEN + 1)
108 *v1.6 : add dsi_rk616->resume to reduce the time driver resume takes
109 *v2.0 : add mipi dsi support for rk319x
110 *v2.1 : add inset and unplug the hdmi, mipi's lcd will be reset.
111 *v2.2 : fix bug of V1.4 register temp, dpicolom
112 *v3.0 : support kernel 3.10 and device tree
114 #define RK_MIPI_DSI_VERSION_AND_TIME "rockchip mipi_dsi v3.0 2014-03-06"
116 static struct dsi *dsi0;
117 static struct dsi *dsi1;
120 #ifdef CONFIG_MFD_RK616
121 static struct mfd_rk616 *dsi_rk616;
122 static struct rk29fb_screen *g_rk29fd_screen = NULL;
125 #ifdef CONFIG_MIPI_DSI_FT
126 #define udelay DRVDelayUs
127 #define msleep DelayMs_nops
128 static u32 fre_to_period(u32 fre);
130 static int rk_mipi_dsi_is_active(void *arg);
131 static int rk_mipi_dsi_enable_hs_clk(void *arg, u32 enable);
132 static int rk_mipi_dsi_enable_video_mode(void *arg, u32 enable);
133 static int rk_mipi_dsi_enable_command_mode(void *arg, u32 enable);
134 static int rk_mipi_dsi_send_dcs_packet(void *arg, unsigned char regs[], u32 n);
135 static int rk_mipi_dsi_is_enable(void *arg, u32 enable);
136 int rk_mipi_screen_standby(u8 enable);
138 #ifdef CONFIG_MFD_RK616
139 static u32 *host_mem = NULL;
140 static u32 *phy_mem = NULL;
143 static int dsi_read_reg(struct dsi *dsi, u16 reg, u32 *pval)
145 #ifdef CONFIG_MIPI_DSI_LINUX
147 #if defined(CONFIG_MFD_RK616)
148 return dsi_rk616->read_dev(dsi_rk616, reg, pval);
149 #elif defined(CONFIG_ARCH_RK319X)
150 if(reg >= MIPI_DSI_HOST_OFFSET)
151 *pval = __raw_readl(dsi->host.membase + (reg - MIPI_DSI_HOST_OFFSET));
152 else if(reg >= MIPI_DSI_PHY_OFFSET)
153 *pval = __raw_readl(dsi->phy.membase + (reg - MIPI_DSI_PHY_OFFSET));
155 #elif defined(CONFIG_ARCH_RK3288)
156 *pval = __raw_readl(dsi->host.membase + (reg - MIPI_DSI_HOST_OFFSET));
158 #endif /* CONFIG_MFD_RK616 */
162 #ifdef CONFIG_MIPI_DSI_FT
163 return JETTA_ReadControlRegister(reg, pval);
164 #endif /* CONFIG_MIPI_DSI_FT */
166 #endif /* end of CONFIG_MIPI_DSI_LINUX */
170 static int dsi_write_reg(struct dsi *dsi, u16 reg, u32 *pval)
172 #ifdef CONFIG_MIPI_DSI_LINUX
174 #if defined(CONFIG_MFD_RK616)
175 return dsi_rk616->write_dev(dsi_rk616, reg, pval);
176 #elif defined(CONFIG_ARCH_RK319X)
177 if(reg >= MIPI_DSI_HOST_OFFSET)
178 __raw_writel(*pval, dsi->host.membase + (reg - MIPI_DSI_HOST_OFFSET));
179 else if(reg >= MIPI_DSI_PHY_OFFSET)
180 __raw_writel(*pval, dsi->phy.membase + (reg - MIPI_DSI_PHY_OFFSET));
182 #elif defined(CONFIG_ARCH_RK3288)
183 __raw_writel(*pval, dsi->host.membase + (reg - MIPI_DSI_HOST_OFFSET));
185 #endif /* CONFIG_MFD_RK616 */
189 #ifdef CONFIG_MIPI_DSI_FT
190 return JETTA_WriteControlRegister(reg, *pval);
191 #endif /* CONFIG_MIPI_DSI_FT */
193 #endif /* end of CONFIG_MIPI_DSI_LINUX */
196 #ifdef CONFIG_MFD_RK616
197 static int dsi_write_reg_bulk(u16 reg, u32 count, u32 *pval)
199 return dsi_rk616->write_bulk(dsi_rk616, reg, count, pval);
203 static int dsi_get_bits(struct dsi *dsi, u32 reg)
206 u32 bits = (reg >> 8) & 0xff;
207 u16 reg_addr = (reg >> 16) & 0xffff;
208 u8 offset = reg & 0xff;
210 bits = (1 << bits) - 1;
213 dsi_read_reg(dsi, reg_addr, &val);
219 static int dsi_set_bits(struct dsi *dsi, u32 data, u32 reg)
222 u32 bits = (reg >> 8) & 0xff;
223 u16 reg_addr = (reg >> 16) & 0xffff;
224 u8 offset = reg & 0xff;
226 bits = (1 << bits) - 1;
230 if(bits != 0xffffffff) {
231 #ifdef CONFIG_MFD_RK616
232 if(reg_addr >= MIPI_DSI_HOST_OFFSET) {
233 val = host_mem[(reg_addr - MIPI_DSI_HOST_OFFSET)>>2];
234 } else if(reg_addr >= MIPI_DSI_PHY_OFFSET) {
235 val = phy_mem[(reg_addr - MIPI_DSI_PHY_OFFSET)>>2];
237 dsi_read_reg(dsi, reg_addr, &val);
238 if(val == 0xaaaaaaaa)
239 dsi_read_reg(dsi, reg_addr, &val);
241 dsi_read_reg(dsi, reg_addr, &val);
245 val &= ~(bits << offset);
246 val |= (data & bits) << offset;
247 //printk("%s:%04x->%08x\n", __func__, reg_addr, val);
248 dsi_write_reg(dsi, reg_addr, &val);
249 #ifdef CONFIG_MFD_RK616
250 if(reg_addr >= MIPI_DSI_HOST_OFFSET) {
251 host_mem[(reg_addr - MIPI_DSI_HOST_OFFSET)>>2] = val;
252 } else if(reg_addr >= MIPI_DSI_PHY_OFFSET) {
253 phy_mem[(reg_addr - MIPI_DSI_PHY_OFFSET)>>2] = val;
258 MIPI_TRACE("%s error reg_addr:0x%04x, offset:%d, bits:0x%04x, value:0x%04x\n",
259 __func__, reg_addr, offset, bits, data);
264 static int dwc_phy_test_rd(struct dsi *dsi, unsigned char test_code)
267 dsi_set_bits(dsi, 1, phy_testclk);
268 dsi_set_bits(dsi, test_code, phy_testdin);
269 dsi_set_bits(dsi, 1, phy_testen);
270 dsi_set_bits(dsi, 0, phy_testclk);
271 dsi_set_bits(dsi, 0, phy_testen);;
273 dsi_set_bits(dsi, 0, phy_testen);
274 val = dsi_get_bits(dsi,phy_testdout);
275 dsi_set_bits(dsi, 1, phy_testclk);
276 dsi_set_bits(dsi, 0, phy_testclk);
282 static int dwc_phy_test_wr(struct dsi *dsi, unsigned char test_code, unsigned char *test_data, unsigned char size)
286 dsi_set_bits(dsi, 0x10000 | test_code, PHY_TEST_CTRL1);
287 dsi_set_bits(dsi, 0x2, PHY_TEST_CTRL0);
288 dsi_set_bits(dsi, 0x0, PHY_TEST_CTRL0);
290 for(i = 0; i < size; i++) {
291 dsi_set_bits(dsi, test_data[i], PHY_TEST_CTRL1);
292 dsi_set_bits(dsi, 0x2, PHY_TEST_CTRL0);
293 dsi_set_bits(dsi, 0x0, PHY_TEST_CTRL0);
294 MIPI_DBG("dwc_phy_test_wr:%08x\n", dsi_get_bits(dsi, PHY_TEST_CTRL1));
299 #ifdef CONFIG_MFD_RK616
300 static int rk_mipi_recover_reg(void)
302 u32 reg_addr = 0, count = 0, i = 0;
304 for(i = 0x0c; i < MIPI_DSI_PHY_SIZE; i += 4) {
305 if(phy_mem[i>>2] != 0xaaaaaaaa) {
309 if((phy_mem[i>>2] == 0xaaaaaaaa) && (phy_mem[(i-4) >> 2] != 0xaaaaaaaa)) {
310 loop1: reg_addr = i - (count<<2);
311 dsi_write_reg_bulk(reg_addr + MIPI_DSI_PHY_OFFSET, count,
312 phy_mem+(reg_addr>>2));
313 //printk("%4x:%08x\n", reg_addr, phy_mem[reg_addr>>2]);
316 if((i == (MIPI_DSI_PHY_SIZE-4)) && (count != 0)) {
317 i = MIPI_DSI_PHY_SIZE;
322 for(i = 0x08; i < MIPI_DSI_HOST_SIZE; i += 4) {
323 if(host_mem[i>>2] != 0xaaaaaaaa) {
327 if((host_mem[i>>2] == 0xaaaaaaaa) && (host_mem[(i-4) >> 2] != 0xaaaaaaaa)) {
328 loop2: reg_addr = i - (count<<2);
329 dsi_write_reg_bulk(reg_addr + MIPI_DSI_HOST_OFFSET, count,
330 host_mem+(reg_addr>>2));
331 //printk("%4x:%08x\n", reg_addr, host_mem[reg_addr>>2]);
334 if((i == (MIPI_DSI_HOST_SIZE-4)) && (count != 0))
340 #if defined(CONFIG_MFD_RK616) || defined(CONFIG_ARCH_RK319X)
341 static int inno_phy_set_gotp(struct dsi *dsi, u32 offset)
343 u32 val = 0, temp = 0, Tlpx = 0;
344 u32 ddr_clk = dsi->phy.ddr_clk;
345 u32 Ttxbyte_clk = dsi->phy.Ttxbyte_clk;
346 u32 Tsys_clk = dsi->phy.Tsys_clk;
347 u32 Ttxclkesc = dsi->phy.Ttxclkesc;
350 case DPHY_CLOCK_OFFSET:
351 MIPI_DBG("******set DPHY_CLOCK_OFFSET gotp******\n");
353 case DPHY_LANE0_OFFSET:
354 MIPI_DBG("******set DPHY_LANE0_OFFSET gotp******\n");
356 case DPHY_LANE1_OFFSET:
357 MIPI_DBG("******set DPHY_LANE1_OFFSET gotp******\n");
359 case DPHY_LANE2_OFFSET:
360 MIPI_DBG("******set DPHY_LANE2_OFFSET gotp******\n");
362 case DPHY_LANE3_OFFSET:
363 MIPI_DBG("******set DPHY_LANE3_OFFSET gotp******\n");
369 if(ddr_clk < 110 * MHz)
371 else if(ddr_clk < 150 * MHz)
373 else if(ddr_clk < 200 * MHz)
375 else if(ddr_clk < 250 * MHz)
377 else if(ddr_clk < 300 * MHz)
379 else if(ddr_clk < 400 * MHz)
381 else if(ddr_clk < 500 * MHz)
383 else if(ddr_clk < 600 * MHz)
385 else if(ddr_clk < 700 * MHz)
387 else if(ddr_clk < 800 * MHz)
389 else if(ddr_clk <= 1000 * MHz)
391 dsi_set_bits(dsi, val, reg_ths_settle + offset);
393 if(ddr_clk < 110 * MHz)
395 else if(ddr_clk < 150 * MHz)
397 else if(ddr_clk < 200 * MHz)
399 else if(ddr_clk < 250 * MHz)
401 else if(ddr_clk < 300 * MHz)
403 else if(ddr_clk < 400 * MHz)
405 else if(ddr_clk < 500 * MHz)
407 else if(ddr_clk < 600 * MHz)
409 else if(ddr_clk < 700 * MHz)
411 else if(ddr_clk < 800 * MHz)
413 else if(ddr_clk <= 1000 * MHz)
415 dsi_set_bits(dsi, val, reg_hs_ths_prepare + offset);
417 if(offset != DPHY_CLOCK_OFFSET) {
419 if(ddr_clk < 110 * MHz)
421 else if(ddr_clk < 150 * MHz)
423 else if(ddr_clk < 200 * MHz)
425 else if(ddr_clk < 250 * MHz)
427 else if(ddr_clk < 300 * MHz)
429 else if(ddr_clk < 400 * MHz)
431 else if(ddr_clk < 500 * MHz)
433 else if(ddr_clk < 600 * MHz)
435 else if(ddr_clk < 700 * MHz)
437 else if(ddr_clk < 800 * MHz)
439 else if(ddr_clk <= 1000 * MHz)
443 if(ddr_clk < 110 * MHz)
445 else if(ddr_clk < 150 * MHz)
447 else if(ddr_clk < 200 * MHz)
449 else if(ddr_clk < 250 * MHz)
451 else if(ddr_clk < 300 * MHz)
453 else if(ddr_clk < 400 * MHz)
455 else if(ddr_clk < 500 * MHz)
457 else if(ddr_clk < 600 * MHz)
459 else if(ddr_clk < 700 * MHz)
461 else if(ddr_clk < 800 * MHz)
463 else if(ddr_clk <= 1000 * MHz)
466 dsi_set_bits(dsi, val, reg_hs_the_zero + offset);
468 if(ddr_clk < 110 * MHz)
470 else if(ddr_clk < 150 * MHz)
472 else if(ddr_clk < 200 * MHz)
474 else if(ddr_clk < 250 * MHz)
476 else if(ddr_clk < 300 * MHz)
478 else if(ddr_clk < 400 * MHz)
480 else if(ddr_clk < 500 * MHz)
482 else if(ddr_clk < 600 * MHz)
484 else if(ddr_clk < 700 * MHz)
486 else if(ddr_clk < 800 * MHz)
488 else if(ddr_clk <= 1000 * MHz)
491 dsi_set_bits(dsi, val, reg_hs_ths_trail + offset);
492 val = 120000 / Ttxbyte_clk + 1;
493 MIPI_DBG("reg_hs_ths_exit: %d, %d\n", val, val*Ttxbyte_clk/1000);
494 dsi_set_bits(dsi, val, reg_hs_ths_exit + offset);
496 if(offset == DPHY_CLOCK_OFFSET) {
497 val = (60000 + 52*dsi->phy.UI) / Ttxbyte_clk + 1;
498 MIPI_DBG("reg_hs_tclk_post: %d, %d\n", val, val*Ttxbyte_clk/1000);
499 dsi_set_bits(dsi, val, reg_hs_tclk_post + offset);
500 val = 10*dsi->phy.UI / Ttxbyte_clk + 1;
501 MIPI_DBG("reg_hs_tclk_pre: %d, %d\n", val, val*Ttxbyte_clk/1000);
502 dsi_set_bits(dsi, val, reg_hs_tclk_pre + offset);
505 val = 1010000000 / Tsys_clk + 1;
506 MIPI_DBG("reg_hs_twakup: %d, %d\n", val, val*Tsys_clk/1000);
509 MIPI_DBG("val is too large, 0x3ff is the largest\n");
511 temp = (val >> 8) & 0x03;
513 dsi_set_bits(dsi, temp, reg_hs_twakup_h + offset);
514 dsi_set_bits(dsi, val, reg_hs_twakup_l + offset);
516 if(Ttxclkesc > 50000) {
518 MIPI_DBG("Ttxclkesc:%d\n", Ttxclkesc);
520 val = val / Ttxbyte_clk;
521 Tlpx = val*Ttxbyte_clk;
522 MIPI_DBG("reg_hs_tlpx: %d, %d\n", val, Tlpx);
524 dsi_set_bits(dsi, val, reg_hs_tlpx + offset);
527 val = 4*Tlpx / Ttxclkesc;
528 MIPI_DBG("reg_hs_tta_go: %d, %d\n", val, val*Ttxclkesc);
529 dsi_set_bits(dsi, val, reg_hs_tta_go + offset);
530 val = 3 * Tlpx / 2 / Ttxclkesc;
531 MIPI_DBG("reg_hs_tta_sure: %d, %d\n", val, val*Ttxclkesc);
532 dsi_set_bits(dsi, val, reg_hs_tta_sure + offset);
533 val = 5 * Tlpx / Ttxclkesc;
534 MIPI_DBG("reg_hs_tta_wait: %d, %d\n", val, val*Ttxclkesc);
535 dsi_set_bits(dsi, val, reg_hs_tta_wait + offset);
539 static int inno_set_hs_clk(struct dsi *dsi)
541 dsi_set_bits(dsi, dsi->phy.prediv, reg_prediv);
542 dsi_set_bits(dsi, dsi->phy.fbdiv & 0xff, reg_fbdiv);
543 dsi_set_bits(dsi, (dsi->phy.fbdiv >> 8) & 0x01, reg_fbdiv_8);
547 static int inno_phy_power_up(struct dsi *dsi)
549 inno_set_hs_clk(dsi);
550 #if defined(CONFIG_ARCH_RK319X)
552 clk_enable(dsi->phy.refclk);
555 dsi_set_bits(dsi, 0xe4, DPHY_REGISTER1);
556 switch(dsi->host.lane) {
558 dsi_set_bits(dsi, 1, lane_en_3);
560 dsi_set_bits(dsi, 1, lane_en_2);
562 dsi_set_bits(dsi, 1, lane_en_1);
564 dsi_set_bits(dsi, 1, lane_en_0);
565 dsi_set_bits(dsi, 1, lane_en_ck);
571 dsi_set_bits(dsi, 0xe0, DPHY_REGISTER1);
574 dsi_set_bits(dsi, 0x1e, DPHY_REGISTER20);
575 dsi_set_bits(dsi, 0x1f, DPHY_REGISTER20);
579 static int inno_phy_power_down(struct dsi *dsi)
581 dsi_set_bits(dsi, 0x01, DPHY_REGISTER0);
582 dsi_set_bits(dsi, 0xe3, DPHY_REGISTER1);
583 #if defined(CONFIG_ARCH_RK319X)
585 clk_disable(dsi->phy.refclk);
590 static int inno_phy_init(struct dsi *dsi)
593 dsi_set_bits(dsi, 0x11, DSI_DPHY_BITS(0x06<<2, 32, 0));
594 dsi_set_bits(dsi, 0x11, DSI_DPHY_BITS(0x07<<2, 32, 0));
595 dsi_set_bits(dsi, 0xcc, DSI_DPHY_BITS(0x09<<2, 32, 0));
597 dsi_set_bits(dsi, 0x4e, DSI_DPHY_BITS(0x08<<2, 32, 0));
598 dsi_set_bits(dsi, 0x84, DSI_DPHY_BITS(0x0a<<2, 32, 0));
601 /*reg1[4] 0: enable a function of "pll phase for serial data being captured
604 we disable it here because reg5[6:4] is not compatible with the HS speed.
607 if(dsi->phy.ddr_clk >= 800*MHz) {
608 dsi_set_bits(dsi, 0x30, DSI_DPHY_BITS(0x05<<2, 32, 0));
610 dsi_set_bits(dsi, 1, reg_da_ppfc);
613 switch(dsi->host.lane) {
615 inno_phy_set_gotp(dsi, DPHY_LANE3_OFFSET);
617 inno_phy_set_gotp(dsi, DPHY_LANE2_OFFSET);
619 inno_phy_set_gotp(dsi, DPHY_LANE1_OFFSET);
621 inno_phy_set_gotp(dsi, DPHY_LANE0_OFFSET);
622 inno_phy_set_gotp(dsi, DPHY_CLOCK_OFFSET);
630 static int rk32_phy_power_up(struct dsi *dsi)
633 clk_prepare_enable(dsi->phy.refclk);
634 clk_prepare_enable(dsi->dsi_pclk);
637 switch(dsi->host.lane) {
639 dsi_set_bits(dsi, 3, n_lanes);
641 dsi_set_bits(dsi, 2, n_lanes);
643 dsi_set_bits(dsi, 1, n_lanes);
645 dsi_set_bits(dsi, 0, n_lanes);
650 dsi_set_bits(dsi, 1, phy_shutdownz);
651 dsi_set_bits(dsi, 1, phy_rstz);
652 dsi_set_bits(dsi, 1, phy_enableclk);
653 dsi_set_bits(dsi, 1, phy_forcepll);
657 static int rk32_phy_power_down(struct dsi *dsi)
659 dsi_set_bits(dsi, 0, phy_shutdownz);
660 clk_disable_unprepare(dsi->phy.refclk);
661 clk_disable_unprepare(dsi->dsi_pclk);
665 static int rk32_phy_init(struct dsi *dsi)
668 u32 ddr_clk = dsi->phy.ddr_clk;
669 u16 prediv = dsi->phy.prediv;
670 u16 fbdiv = dsi->phy.fbdiv;
671 // u32 Ttxclkesc = dsi->phy.Ttxclkesc;
672 unsigned char test_data[2] = {0};
674 if(ddr_clk < 90 * MHz)
676 else if(ddr_clk < 100 * MHz)
678 else if(ddr_clk < 110 * MHz)
680 else if(ddr_clk < 130 * MHz)
682 else if(ddr_clk < 140 * MHz)
684 else if(ddr_clk < 150 * MHz)
686 else if(ddr_clk < 170 * MHz)
688 else if(ddr_clk < 180 * MHz)
690 else if(ddr_clk < 200 * MHz)
692 else if(ddr_clk < 220 * MHz)
694 else if(ddr_clk < 240 * MHz)
696 else if(ddr_clk < 250 * MHz)
698 else if(ddr_clk < 270 * MHz)
700 else if(ddr_clk < 300 * MHz)
702 else if(ddr_clk < 330 * MHz)
704 else if(ddr_clk < 360 * MHz)
706 else if(ddr_clk < 400 * MHz)
708 else if(ddr_clk < 450 * MHz)
710 else if(ddr_clk < 500 * MHz)
712 else if(ddr_clk < 550 * MHz)
714 else if(ddr_clk < 600 * MHz)
716 else if(ddr_clk < 650 * MHz)
718 else if(ddr_clk < 700 * MHz)
720 else if(ddr_clk < 750 * MHz)
722 else if(ddr_clk < 800 * MHz)
724 else if(ddr_clk < 850 * MHz)
726 else if(ddr_clk < 900 * MHz)
728 else if(ddr_clk < 950 * MHz)
730 else if(ddr_clk < 1000 * MHz)
732 else if(ddr_clk < 1050 * MHz)
734 else if(ddr_clk < 1100* MHz)
736 else if(ddr_clk < 1150* MHz)
738 else if(ddr_clk < 1200 * MHz)
740 else if(ddr_clk < 1250 * MHz)
742 else if(ddr_clk < 1300 * MHz)
744 else if(ddr_clk < 1350 * MHz)
746 else if(ddr_clk < 1400* MHz)
748 else if(ddr_clk < 1450* MHz)
750 else if(ddr_clk <= 1500* MHz)
754 test_data[0] = val << 1;
755 dwc_phy_test_wr(dsi, code_hs_rx_lane0, test_data, 1);
757 test_data[0] = prediv- 1;
758 dwc_phy_test_wr(dsi, code_pll_input_div_rat, test_data, 1);
760 test_data[0] = (fbdiv - 1) & 0x1f; //0x14;
761 dwc_phy_test_wr(dsi, code_pll_loop_div_rat, test_data, 1);
763 test_data[0] = (fbdiv - 1) >> 5 | 0x80; //0x82
764 dwc_phy_test_wr(dsi, code_pll_loop_div_rat, test_data, 1);
767 dwc_phy_test_wr(dsi, code_pll_input_loop_div_rat, test_data, 1);
771 // dwc_phy_test_wr(dsi, 0x60, test_data, 1);
774 // dwc_phy_test_wr(dsi, 0x61, test_data, 1);
777 // dwc_phy_test_wr(dsi, 0x62, test_data, 1);
779 test_data[0] = 0x80 | 15;
780 dwc_phy_test_wr(dsi, code_hstxdatalanerequsetstatetime, test_data, 1);
782 test_data[0] = 0x80 | 85;
783 dwc_phy_test_wr(dsi, code_hstxdatalanepreparestatetime, test_data, 1);
785 test_data[0] = 0x40 | 10;
786 dwc_phy_test_wr(dsi, code_hstxdatalanehszerostatetime, test_data, 1);
789 // test_data[0] = 0x80 | 127;
790 // dwc_phy_test_wr(dsi, 0x71, test_data, 1);
792 // test_data[0] = 0x3;
793 // dwc_phy_test_wr(dsi, 0x57, test_data, 1);
798 static int rk_mipi_dsi_phy_power_up(struct dsi *dsi)
800 #if defined(CONFIG_MFD_RK616) || defined(CONFIG_ARCH_RK319X)
801 return inno_phy_power_up(dsi);
803 return rk32_phy_power_up(dsi);
808 static int rk_mipi_dsi_phy_power_down(struct dsi *dsi)
810 #if defined(CONFIG_MFD_RK616) || defined(CONFIG_ARCH_RK319X)
811 return inno_phy_power_down(dsi);
813 return rk32_phy_power_down(dsi);
818 static int rk_mipi_dsi_phy_init(struct dsi *dsi)
820 #if defined(CONFIG_MFD_RK616) || defined(CONFIG_ARCH_RK319X)
821 return inno_phy_init(dsi);
823 return rk32_phy_init(dsi);
828 static int rk_mipi_dsi_host_power_up(struct dsi *dsi)
833 //disable all interrupt
834 #ifdef DWC_DSI_VERSION_0x3131302A
835 dsi_set_bits(dsi, 0x1fffff, ERROR_MSK0);
836 dsi_set_bits(dsi, 0x1ffff, ERROR_MSK1);
838 dsi_set_bits(dsi, 0x1fffff, INT_MKS0);
839 dsi_set_bits(dsi, 0x1ffff, INT_MKS1);
842 rk_mipi_dsi_is_enable(dsi, 1);
845 while(!dsi_get_bits(dsi, phylock) && val--) {
851 MIPI_TRACE("%s:phylock fail\n", __func__);
855 while(!dsi_get_bits(dsi, phystopstateclklane) && val--) {
862 static int rk_mipi_dsi_host_power_down(struct dsi *dsi)
864 rk_mipi_dsi_enable_video_mode(dsi, 0);
865 rk_mipi_dsi_enable_hs_clk(dsi, 0);
866 rk_mipi_dsi_is_enable(dsi, 0);
870 static int rk_mipi_dsi_host_init(struct dsi *dsi)
872 u32 val = 0, bytes_px = 0;
873 struct mipi_dsi_screen *screen = &dsi->screen;
874 u32 decimals = dsi->phy.Ttxbyte_clk, temp = 0, i = 0;
875 u32 m = 1, lane = dsi->host.lane, Tpclk = dsi->phy.Tpclk,
876 Ttxbyte_clk = dsi->phy.Ttxbyte_clk;
877 #ifdef CONFIG_MFD_RK616
879 dsi_write_reg(dsi, CRU_CRU_CLKSEL1_CON, &val);
881 dsi_set_bits(dsi, dsi->host.lane - 1, n_lanes);
882 dsi_set_bits(dsi, dsi->vid, dpi_vcid);
884 switch(screen->face) {
886 dsi_set_bits(dsi, 5, dpi_color_coding);
891 dsi_set_bits(dsi, 3, dpi_color_coding);
892 dsi_set_bits(dsi, 1, en18_loosely);
896 dsi_set_bits(dsi, 0, dpi_color_coding);
902 dsi_set_bits(dsi, 1, hsync_active_low);
903 dsi_set_bits(dsi, 1, vsync_active_low);
905 dsi_set_bits(dsi, 0, dataen_active_low);
906 dsi_set_bits(dsi, 0, colorm_active_low);
907 dsi_set_bits(dsi, 0, shutd_active_low);
909 dsi_set_bits(dsi, dsi->host.video_mode, vid_mode_type); //burst mode
910 switch(dsi->host.video_mode) {
912 if(screen->type == SCREEN_DUAL_MIPI)
913 dsi_set_bits(dsi, screen->x_res / 2 + 4, vid_pkt_size);
915 dsi_set_bits(dsi, screen->x_res, vid_pkt_size);
919 for(i = 8; i < 32; i++){
920 temp = i * lane * Tpclk % Ttxbyte_clk;
921 if(decimals > temp) {
928 #ifdef CONFIG_MFD_RK616
929 dsi_set_bits(dsi, 1, en_multi_pkt);
931 dsi_set_bits(dsi, screen->x_res / m + 1, num_chunks);
932 dsi_set_bits(dsi, m, vid_pkt_size);
933 temp = m * lane * Tpclk / Ttxbyte_clk - m * bytes_px;
934 MIPI_DBG("%s:%d, %d\n", __func__, m, temp);
936 #ifdef CONFIG_MFD_RK616
937 dsi_set_bits(dsi, 1, en_null_pkt);
939 dsi_set_bits(dsi, temp - 12, null_pkt_size);
946 //dsi_set_bits(dsi, 0, CMD_MODE_CFG << 16);
947 if(rk_mipi_get_dsi_num() ==1){
948 dsi_set_bits(dsi, dsi->phy.Tpclk * (screen->x_res + screen->left_margin +
949 screen->hsync_len + screen->right_margin) \
950 / dsi->phy.Ttxbyte_clk, vid_hline_time);
953 dsi_set_bits(dsi, dsi->phy.Tpclk * (screen->x_res + 8 + screen->left_margin +
954 screen->hsync_len + screen->right_margin) \
955 / dsi->phy.Ttxbyte_clk, vid_hline_time);
957 dsi_set_bits(dsi, dsi->phy.Tpclk * (screen->left_margin) / dsi->phy.Ttxbyte_clk,
959 dsi_set_bits(dsi, dsi->phy.Tpclk * (screen->hsync_len) / dsi->phy.Ttxbyte_clk,
962 dsi_set_bits(dsi, screen->y_res , vid_active_lines);
963 dsi_set_bits(dsi, screen->lower_margin, vid_vfp_lines);
964 dsi_set_bits(dsi, screen->upper_margin, vid_vbp_lines);
965 dsi_set_bits(dsi, screen->vsync_len, vid_vsa_lines);
967 dsi->phy.txclkesc = 20 * MHz;
968 val = dsi->phy.txbyte_clk / dsi->phy.txclkesc + 1;
969 dsi->phy.txclkesc = dsi->phy.txbyte_clk / val;
970 dsi_set_bits(dsi, val, TX_ESC_CLK_DIVISION);
972 dsi_set_bits(dsi, 10, TO_CLK_DIVISION);
973 dsi_set_bits(dsi, 1000, hstx_to_cnt); //no sure
974 dsi_set_bits(dsi, 1000, lprx_to_cnt);
975 dsi_set_bits(dsi, 100, phy_stop_wait_time);
977 //dsi_set_bits(dsi, 0, outvact_lpcmd_time); //byte
978 //dsi_set_bits(dsi, 0, invact_lpcmd_time);
980 dsi_set_bits(dsi, 20, phy_hs2lp_time);
981 dsi_set_bits(dsi, 16, phy_lp2hs_time);
983 #if defined(CONFIG_ARCH_RK3288)
984 // dsi_set_bits(dsi, 87, phy_hs2lp_time_clk_lane); //no sure
985 // dsi_set_bits(dsi, 25, phy_hs2hs_time_clk_lane); //no sure
988 dsi_set_bits(dsi, 10000, max_rd_time);
989 #ifdef DWC_DSI_VERSION_0x3131302A
990 dsi_set_bits(dsi, 1, dpicolom);
991 dsi_set_bits(dsi, 1, dpishutdn);
994 dsi_set_bits(dsi, 1, lp_hfp_en);
995 //dsi_set_bits(dsi, 1, lp_hbp_en); //no sure
996 dsi_set_bits(dsi, 1, lp_vact_en);
997 dsi_set_bits(dsi, 1, lp_vfp_en);
998 dsi_set_bits(dsi, 1, lp_vbp_en);
999 dsi_set_bits(dsi, 1, lp_vsa_en);
1001 //dsi_set_bits(dsi, 1, frame_bta_ack_en);
1002 dsi_set_bits(dsi, 1, phy_enableclk);
1003 dsi_set_bits(dsi, 0, phy_tx_triggers);
1004 //dsi_set_bits(dsi, 1, phy_txexitulpslan);
1005 //dsi_set_bits(dsi, 1, phy_txexitulpsclk);
1010 mipi protocol layer definition
1012 static int rk_mipi_dsi_init(void *arg, u32 n)
1014 u32 decimals = 1000, i = 0, pre = 0;
1015 struct dsi *dsi = arg;
1016 struct mipi_dsi_screen *screen = &dsi->screen;
1021 if((screen->type != SCREEN_MIPI) && (screen->type != SCREEN_DUAL_MIPI) ) {
1022 MIPI_TRACE("only mipi dsi lcd is supported!\n");
1026 if(((screen->type == SCREEN_DUAL_MIPI) && (rk_mipi_get_dsi_num() == 1)) || ((screen->type == SCREEN_MIPI) && (rk_mipi_get_dsi_num() == 2))){
1027 MIPI_TRACE("dsi number and mipi type not match!\n");
1031 #ifdef CONFIG_MIPI_DSI_FT
1032 dsi->phy.pclk = screen->pixclock;
1033 dsi->phy.ref_clk = MIPI_DSI_MCLK;
1036 dsi->phy.Tpclk = rk_fb_get_prmry_screen_pixclock();
1038 printk("dsi->phy.Tpclk=%d\n",dsi->phy.Tpclk);
1040 #if defined(CONFIG_MFD_RK616)
1042 dsi->phy.ref_clk = clk_get_rate(dsi_rk616->mclk);
1043 #elif defined(CONFIG_ARCH_RK319X)
1045 dsi->phy.ref_clk = clk_get_rate(dsi->phy.refclk) / 2; // 1/2 of input refclk
1046 #endif /* CONFIG_MFD_RK616 */
1047 //dsi->phy.ref_clk = 24 * MHz;
1048 #endif /* CONFIG_MIPI_DSI_FT */
1051 dsi->phy.ref_clk = clk_get_rate(dsi->phy.refclk) ;
1053 dsi->phy.sys_clk = dsi->phy.ref_clk;
1057 "dsi->phy.sys_clk =%d\n",dsi->phy.sys_clk );
1059 #ifndef CONFIG_ARCH_RK3288
1060 if((screen->hs_tx_clk <= 80 * MHz) || (screen->hs_tx_clk >= 1000 * MHz))
1061 dsi->phy.ddr_clk = 1000 * MHz; //default is 1HGz
1063 dsi->phy.ddr_clk = screen->hs_tx_clk;
1065 if((screen->hs_tx_clk <= 90 * MHz) || (screen->hs_tx_clk >= 1500 * MHz))
1066 dsi->phy.ddr_clk = 1500 * MHz; //default is 1.5HGz
1068 dsi->phy.ddr_clk = screen->hs_tx_clk;
1073 dsi->phy.ddr_clk = n;
1077 decimals = dsi->phy.ref_clk;
1078 for(i = 1; i < 6; i++) {
1079 pre = dsi->phy.ref_clk / i;
1080 if((decimals > (dsi->phy.ddr_clk % pre)) && (dsi->phy.ddr_clk / pre < 512)) {
1081 decimals = dsi->phy.ddr_clk % pre;
1082 dsi->phy.prediv = i;
1083 dsi->phy.fbdiv = dsi->phy.ddr_clk / pre;
1089 MIPI_DBG("prediv:%d, fbdiv:%d,dsi->phy.ddr_clk:%d\n", dsi->phy.prediv, dsi->phy.fbdiv,dsi->phy.ref_clk / dsi->phy.prediv * dsi->phy.fbdiv);
1091 dsi->phy.ddr_clk = dsi->phy.ref_clk / dsi->phy.prediv * dsi->phy.fbdiv;
1092 MIPI_DBG("dsi->phy.ddr_clk =%d\n",dsi->phy.ddr_clk);
1093 dsi->phy.txbyte_clk = dsi->phy.ddr_clk / 8;
1095 dsi->phy.txclkesc = 20 * MHz; // < 20MHz
1096 dsi->phy.txclkesc = dsi->phy.txbyte_clk / (dsi->phy.txbyte_clk / dsi->phy.txclkesc + 1);
1098 #ifdef CONFIG_MIPI_DSI_FT
1099 dsi->phy.Tpclk = fre_to_period(dsi->phy.pclk);
1100 dsi->phy.Ttxclkesc = fre_to_period(dsi->phy.txclkesc);
1101 dsi->phy.Tsys_clk = fre_to_period(dsi->phy.sys_clk);
1102 dsi->phy.Tddr_clk = fre_to_period(dsi->phy.ddr_clk);
1103 dsi->phy.Ttxbyte_clk = fre_to_period(dsi->phy.txbyte_clk);
1105 dsi->phy.pclk = div_u64(1000000000000llu, dsi->phy.Tpclk);
1106 dsi->phy.Ttxclkesc = div_u64(1000000000000llu, dsi->phy.txclkesc);
1107 dsi->phy.Tsys_clk = div_u64(1000000000000llu, dsi->phy.sys_clk);
1108 dsi->phy.Tddr_clk = div_u64(1000000000000llu, dsi->phy.ddr_clk);
1109 dsi->phy.Ttxbyte_clk = div_u64(1000000000000llu, dsi->phy.txbyte_clk);
1112 dsi->phy.UI = dsi->phy.Tddr_clk;
1115 if(screen->dsi_lane > 0 && screen->dsi_lane <= 4)
1116 dsi->host.lane = screen->dsi_lane;
1120 dsi->host.video_mode = VM_BM;
1122 MIPI_DBG("UI:%d\n", dsi->phy.UI);
1123 MIPI_DBG("ref_clk:%d\n", dsi->phy.ref_clk);
1124 MIPI_DBG("pclk:%d, Tpclk:%d\n", dsi->phy.pclk, dsi->phy.Tpclk);
1125 MIPI_DBG("sys_clk:%d, Tsys_clk:%d\n", dsi->phy.sys_clk, dsi->phy.Tsys_clk);
1126 MIPI_DBG("ddr_clk:%d, Tddr_clk:%d\n", dsi->phy.ddr_clk, dsi->phy.Tddr_clk);
1127 MIPI_DBG("txbyte_clk:%d, Ttxbyte_clk:%d\n", dsi->phy.txbyte_clk,
1128 dsi->phy.Ttxbyte_clk);
1129 MIPI_DBG("txclkesc:%d, Ttxclkesc:%d\n", dsi->phy.txclkesc, dsi->phy.Ttxclkesc);
1131 rk_mipi_dsi_phy_power_up(dsi);
1132 rk_mipi_dsi_host_power_up(dsi);
1133 rk_mipi_dsi_phy_init(dsi);
1134 rk_mipi_dsi_host_init(dsi);
1137 After the core reset, DPI waits for the first VSYNC active transition to start signal sampling, including
1138 pixel data, and preventing image transmission in the middle of a frame.
1141 dsi_set_bits(dsi, 0, shutdownz);
1142 rk_mipi_dsi_enable_video_mode(dsi, 1);
1143 #ifdef CONFIG_MFD_RK616
1144 rk616_display_router_cfg(dsi_rk616, g_rk29fd_screen, 0);
1146 dsi_set_bits(dsi, 1, shutdownz);
1152 int rk_mipi_dsi_init_lite(struct dsi *dsi)
1154 u32 decimals = 1000, i = 0, pre = 0, ref_clk = 0;
1155 struct mipi_dsi_screen *screen = &dsi->screen;
1160 if(rk_mipi_dsi_is_active(dsi) == 0)
1162 #if defined(CONFIG_MFD_RK616)
1163 ref_clk = clk_get_rate(dsi_rk616->mclk);
1164 #elif defined(CONFIG_ARCH_RK319X)
1165 ref_clk = clk_get_rate(dsi->phy.refclk);
1167 if(dsi->phy.ref_clk == ref_clk)
1170 dsi->phy.ref_clk = ref_clk;
1171 dsi->phy.sys_clk = dsi->phy.ref_clk;
1173 if((screen->hs_tx_clk <= 80 * MHz) || (screen->hs_tx_clk >= 1000 * MHz))
1174 dsi->phy.ddr_clk = 1000 * MHz; //default is 1HGz
1176 dsi->phy.ddr_clk = screen->hs_tx_clk;
1178 decimals = dsi->phy.ref_clk;
1179 for(i = 1; i < 6; i++) {
1180 pre = dsi->phy.ref_clk / i;
1181 if((decimals > (dsi->phy.ddr_clk % pre)) && (dsi->phy.ddr_clk / pre < 512)) {
1182 decimals = dsi->phy.ddr_clk % pre;
1183 dsi->phy.prediv = i;
1184 dsi->phy.fbdiv = dsi->phy.ddr_clk / pre;
1190 MIPI_DBG("prediv:%d, fbdiv:%d\n", dsi->phy.prediv, dsi->phy.fbdiv);
1191 dsi->phy.ddr_clk = dsi->phy.ref_clk / dsi->phy.prediv * dsi->phy.fbdiv;
1192 dsi->phy.txbyte_clk = dsi->phy.ddr_clk / 8;
1194 dsi->phy.txclkesc = 20 * MHz; // < 20MHz
1195 dsi->phy.txclkesc = dsi->phy.txbyte_clk / (dsi->phy.txbyte_clk / dsi->phy.txclkesc + 1);
1197 dsi->phy.pclk = div_u64(1000000000000llu, dsi->phy.Tpclk);
1198 dsi->phy.Ttxclkesc = div_u64(1000000000000llu, dsi->phy.txclkesc);
1199 dsi->phy.Tsys_clk = div_u64(1000000000000llu, dsi->phy.sys_clk);
1200 dsi->phy.Tddr_clk = div_u64(1000000000000llu, dsi->phy.ddr_clk);
1201 dsi->phy.Ttxbyte_clk = div_u64(1000000000000llu, dsi->phy.txbyte_clk);
1202 dsi->phy.UI = dsi->phy.Tddr_clk;
1204 MIPI_DBG("UI:%d\n", dsi->phy.UI);
1205 MIPI_DBG("ref_clk:%d\n", dsi->phy.ref_clk);
1206 MIPI_DBG("pclk:%d, Tpclk:%d\n", dsi->phy.pclk, dsi->phy.Tpclk);
1207 MIPI_DBG("sys_clk:%d, Tsys_clk:%d\n", dsi->phy.sys_clk, dsi->phy.Tsys_clk);
1208 MIPI_DBG("ddr_clk:%d, Tddr_clk:%d\n", dsi->phy.ddr_clk, dsi->phy.Tddr_clk);
1209 MIPI_DBG("txbyte_clk:%d, Ttxbyte_clk:%d\n", dsi->phy.txbyte_clk, dsi->phy.Ttxbyte_clk);
1210 MIPI_DBG("txclkesc:%d, Ttxclkesc:%d\n", dsi->phy.txclkesc, dsi->phy.Ttxclkesc);
1212 rk_mipi_dsi_host_power_down(dsi);
1213 rk_mipi_dsi_phy_power_down(dsi);
1214 rk_mipi_dsi_phy_power_up(dsi);
1215 rk_mipi_dsi_phy_init(dsi);
1216 //rk_mipi_dsi_host_power_up(dsi);
1217 //rk_mipi_dsi_host_init(dsi);
1218 //dsi_set_bits(dsi, 0, shutdownz);
1219 rk_mipi_dsi_enable_hs_clk(dsi, 1);
1220 rk_mipi_dsi_enable_video_mode(dsi, 1);
1221 rk_mipi_dsi_is_enable(dsi, 1);
1225 static int rk_mipi_dsi_is_enable(void *arg, u32 enable)
1227 struct dsi *dsi = arg;
1229 dsi_set_bits(dsi, enable, shutdownz);
1234 static int rk_mipi_dsi_enable_video_mode(void *arg, u32 enable)
1236 struct dsi *dsi = arg;
1237 #ifdef DWC_DSI_VERSION_0x3131302A
1238 dsi_set_bits(dsi, enable, en_video_mode);
1240 dsi_set_bits(dsi, !enable, cmd_video_mode);
1246 static int rk_mipi_dsi_enable_command_mode(void *arg, u32 enable)
1248 struct dsi *dsi = arg;
1249 #ifdef DWC_DSI_VERSION_0x3131302A
1250 dsi_set_bits(dsi, enable, en_cmd_mode);
1252 dsi_set_bits(dsi, enable, cmd_video_mode);
1257 static int rk_mipi_dsi_enable_hs_clk(void *arg, u32 enable)
1259 struct dsi *dsi = arg;
1260 dsi_set_bits(dsi, enable, phy_txrequestclkhs);
1264 static int rk_mipi_dsi_is_active(void *arg)
1266 struct dsi *dsi = arg;
1267 return dsi_get_bits(dsi, shutdownz);
1270 static int rk_mipi_dsi_send_packet(struct dsi *dsi, u32 type, unsigned char regs[], u32 n)
1272 u32 data = 0, i = 0, j = 0;
1273 #ifdef DWC_DSI_VERSION_0x3131302A
1276 if((n == 0) && (type != DTYPE_GEN_SWRITE_0P))
1278 #ifndef CONFIG_MFD_RK616
1279 if(dsi_get_bits(dsi, gen_cmd_full) == 1) {
1280 MIPI_TRACE("gen_cmd_full\n");
1285 #ifdef DWC_DSI_VERSION_0x3131302A
1286 if(dsi_get_bits(dsi, en_video_mode) == 1) {
1287 //rk_mipi_dsi_enable_video_mode(dsi, 0);
1291 //rk_mipi_dsi_enable_command_mode(dsi, 1);
1297 printk("type=0x%x\n", type);
1299 for(i = 0; i < n; i++) {
1301 data |= regs[i] << (j * 8);
1302 if(j == 3 || ((i + 1) == n)) {
1303 #ifndef CONFIG_MFD_RK616
1304 if(dsi_get_bits(dsi, gen_pld_w_full) == 1) {
1305 MIPI_TRACE("gen_pld_w_full :%d\n", i);
1309 dsi_set_bits(dsi, data, GEN_PLD_DATA);
1310 MIPI_DBG("write GEN_PLD_DATA:%d, %08x\n", i, data);
1314 data = (dsi->vid << 6) | type;
1315 data |= (n & 0xffff) << 8;
1319 if(type == DTYPE_GEN_SWRITE_0P)
1320 data = (dsi->vid << 6) | (n << 4) | type;
1322 data = (dsi->vid << 6) | ((n-1) << 4) | type;
1324 data |= regs[0] << 8;
1326 data |= regs[1] << 16;
1330 for(i = 0; i < n; i++) {
1332 data |= regs[i] << (j * 8);
1333 if(j == 3 || ((i + 1) == n)) {
1334 #ifndef CONFIG_MFD_RK616
1335 if(dsi_get_bits(dsi, gen_pld_w_full) == 1) {
1336 MIPI_TRACE("gen_pld_w_full :%d\n", i);
1340 dsi_set_bits(dsi, data, GEN_PLD_DATA);
1341 MIPI_DBG("write GEN_PLD_DATA:%d, %08x\n", i, data);
1345 data = (dsi->vid << 6) | type;
1346 data |= (n & 0xffff) << 8;
1349 MIPI_DBG("write GEN_HDR:%08x\n", data);
1350 dsi_set_bits(dsi, data, GEN_HDR);
1351 #ifndef CONFIG_MFD_RK616
1353 while(!dsi_get_bits(dsi, gen_cmd_empty) && i--) {
1360 #ifdef DWC_DSI_VERSION_0x3131302A
1361 //rk_mipi_dsi_enable_command_mode(dsi, 0);
1363 // rk_mipi_dsi_enable_video_mode(dsi, 1);
1369 static int rk_mipi_dsi_send_dcs_packet(void *arg, unsigned char regs[], u32 n)
1371 struct dsi *dsi = arg;
1373 if((regs[1] ==0x2c) || (regs[1] ==0x3c))
1375 dsi_set_bits(dsi, regs[0], dcs_sw_0p_tx);
1376 rk_mipi_dsi_send_packet(dsi, DTYPE_DCS_LWRITE, regs + 1, n);
1380 dsi_set_bits(dsi, regs[0], dcs_sw_0p_tx);
1382 dsi_set_bits(dsi, regs[0], dcs_sw_1p_tx);
1383 rk_mipi_dsi_send_packet(dsi, DTYPE_DCS_SWRITE_0P, regs + 1, n);
1385 dsi_set_bits(dsi, regs[0], dcs_lw_tx);
1386 rk_mipi_dsi_send_packet(dsi, DTYPE_DCS_LWRITE, regs + 1, n);
1388 MIPI_DBG("***%s:%d command sent in %s size:%d\n", __func__, __LINE__, regs[0] ? "LP mode" : "HS mode", n);
1392 static int rk_mipi_dsi_send_gen_packet(void *arg, void *data, u32 n)
1394 struct dsi *dsi = arg;
1395 unsigned char *regs = data;
1399 dsi_set_bits(dsi, regs[0], gen_sw_1p_tx);
1400 rk_mipi_dsi_send_packet(dsi, DTYPE_GEN_LWRITE, regs + 1, n);
1405 dsi_set_bits(dsi, regs[0], gen_sw_2p_tx);
1407 dsi_set_bits(dsi, regs[0], gen_sw_1p_tx);
1409 dsi_set_bits(dsi, regs[0], gen_sw_0p_tx);
1410 rk_mipi_dsi_send_packet(dsi, DTYPE_GEN_SWRITE_0P, regs + 1, n);
1412 dsi_set_bits(dsi, regs[0], gen_lw_tx);
1413 rk_mipi_dsi_send_packet(dsi, DTYPE_GEN_LWRITE, regs + 1, n);
1416 MIPI_DBG("***%s:%d command sent in %s size:%d\n", __func__, __LINE__, regs[0] ? "LP mode" : "HS mode", n);
1420 static int rk_mipi_dsi_read_dcs_packet(void *arg, unsigned char *data1, u32 n)
1422 struct dsi *dsi = arg;
1424 //unsigned char *regs = data;
1425 unsigned char regs[2];
1431 dsi_set_bits(dsi, regs[0], dcs_sr_0p_tx);
1434 /* if(type == DTYPE_GEN_SWRITE_0P)
1435 data = (dsi->vid << 6) | (n << 4) | type;
1437 data = (dsi->vid << 6) | ((n-1) << 4) | type;*/
1439 data |= regs[1] << 8 | type;
1441 // data |= regs[1] << 16;
1443 MIPI_DBG("write GEN_HDR:%08x\n", data);
1444 dsi_set_bits(dsi, data, GEN_HDR);
1447 // dsi_set_bits(dsi, regs[0], gen_sr_0p_tx);
1449 printk("rk_mipi_dsi_read_dcs_packet==0x%x\n",dsi_get_bits(dsi, GEN_PLD_DATA));
1452 // dsi_set_bits(dsi, regs[0], max_rd_pkt_size);
1455 // printk("_____rk_mipi_dsi_read_dcs_packet==0x%x\n",dsi_get_bits(dsi, GEN_PLD_DATA));
1461 static int rk_mipi_dsi_power_up(void *arg)
1463 struct dsi *dsi = arg;
1464 rk_mipi_dsi_phy_power_up(dsi);
1465 rk_mipi_dsi_host_power_up(dsi);
1469 static int rk_mipi_dsi_power_down(void *arg)
1472 struct dsi *dsi = arg;
1473 struct mipi_dsi_screen *screen = &dsi->screen;
1478 if(!screen->standby) {
1479 rk_mipi_dsi_enable_video_mode(dsi, 0);
1481 dcs[1] = dcs_set_display_off;
1482 rk_mipi_dsi_send_dcs_packet(dsi, dcs, 2);
1485 dcs[1] = dcs_enter_sleep_mode;
1486 rk_mipi_dsi_send_dcs_packet(dsi, dcs, 2);
1492 rk_mipi_dsi_host_power_down(dsi);
1493 rk_mipi_dsi_phy_power_down(dsi);
1494 #if defined(CONFIG_ARCH_RK319X)
1495 clk_disable(dsi->dsi_pd);
1496 clk_disable(dsi->dsi_pclk);
1498 MIPI_TRACE("%s:%d\n", __func__, __LINE__);
1502 static int rk_mipi_dsi_get_id(void *arg)
1505 struct dsi *dsi = arg;
1506 id = dsi_get_bits(dsi, VERSION);
1510 /* the most top level of mipi dsi init */
1511 static int rk_mipi_dsi_probe(struct dsi *dsi)
1515 register_dsi_ops(dsi->dsi_id, &dsi->ops);
1517 ret = dsi_probe_current_chip(dsi->dsi_id);
1519 MIPI_TRACE("mipi dsi probe fail\n");
1526 #ifdef MIPI_DSI_REGISTER_IO
1527 #include <linux/proc_fs.h>
1528 #include <asm/uaccess.h>
1529 #include <linux/slab.h>
1531 int reg_proc_write(struct file *file, const char __user *buff, size_t count, loff_t *offp)
1533 int ret = -1, i = 0;
1535 char *buf = kmalloc(count, GFP_KERNEL);
1540 memset(buf, 0, count);
1541 ret = copy_from_user((void*)buf, buff, count);
1542 data = strstr(data, "-");
1544 goto reg_proc_write_exit;
1545 command = *(++data);
1549 data = strstr(data, "0x");
1551 goto reg_proc_write_exit;
1553 sscanf(data, "0x%llx", ®s_val);
1554 if((regs_val & 0xffff00000000ULL) == 0)
1555 goto reg_proc_write_exit;
1556 read_val = regs_val & 0xffffffff;
1557 printk("regs_val=0x%llx\n",regs_val);
1558 dsi_write_reg(dsi0, regs_val >> 32, &read_val);
1559 dsi_read_reg(dsi0, regs_val >> 32, &read_val);
1560 regs_val &= 0xffffffff;
1561 if(read_val != regs_val)
1562 MIPI_TRACE("%s fail:0x%08x\n", __func__, read_val);
1569 data = strstr(data, "0x");
1571 goto reg_proc_write_exit;
1573 sscanf(data, "0x%llx", ®s_val);
1574 dsi_read_reg(dsi0, (u16)regs_val, &read_val);
1575 MIPI_TRACE("*%04x : %08x\n", (u16)regs_val, read_val);
1580 while(*(++data) == ' ');
1581 sscanf(data, "%d", &read_val);
1583 read_val = 11289600;
1586 #ifdef CONFIG_MFD_RK616
1587 clk_set_rate(dsi_rk616->mclk, read_val);
1589 //rk_mipi_dsi_init_lite(dsi);
1594 while(*(++data) == ' ');
1596 MIPI_TRACE("****%d:%d\n", data-buf, count);
1600 MIPI_TRACE("payload entry is larger than 32\n");
1603 sscanf(data, "%x,", str + i); //-c 1,29,02,03,05,06,> pro
1604 data = strstr(data, ",");
1616 rk_mipi_dsi_send_dcs_packet(dsi0, str, read_val);
1618 rk_mipi_dsi_send_gen_packet(dsi0, str, read_val);
1630 reg_proc_write_exit:
1636 int reg_proc_read(struct file *file, char __user *buff, size_t count,
1643 for(i = VERSION; i < (VERSION + (0xdc<<16)); i += 4<<16) {
1644 val = dsi_get_bits(dsi0, i);
1645 MIPI_TRACE("%04x: %08x\n", i>>16, val);
1650 /*for(i = DPHY_REGISTER0; i <= DPHY_REGISTER4; i += 4<<16) {
1651 val = dsi_get_bits(dsi0, i);
1652 MIPI_TRACE("%04x: %08x\n", i>>16, val);
1656 i = DPHY_REGISTER20;
1657 val = dsi_get_bits(dsi0, i);
1658 MIPI_TRACE("%04x: %08x\n", i>>16, val);
1662 for(i = (DPHY_CLOCK_OFFSET + DSI_DPHY_BITS(0x0000, 32, 0)); i <= ((DPHY_CLOCK_OFFSET + DSI_DPHY_BITS(0x0048, 32, 0))); i += 4<<16) {
1663 val = dsi_get_bits(dsi0, i);
1664 MIPI_TRACE("%04x: %08x\n", i>>16, val);
1669 for(i = (DPHY_LANE0_OFFSET + DSI_DPHY_BITS(0x0000, 32, 0)); i <= ((DPHY_LANE0_OFFSET + DSI_DPHY_BITS(0x0048, 32, 0))); i += 4<<16) {
1670 val = dsi_get_bits(dsi0, i);
1671 MIPI_TRACE("%04x: %08x\n", i>>16, val);
1676 for(i = (DPHY_LANE1_OFFSET + DSI_DPHY_BITS(0x0000, 32, 0)); i <= ((DPHY_LANE1_OFFSET + DSI_DPHY_BITS(0x0048, 32, 0))); i += 4<<16) {
1677 val = dsi_get_bits(dsi0, i);
1678 MIPI_TRACE("%04x: %08x\n", i>>16, val);
1683 for(i = (DPHY_LANE2_OFFSET + DSI_DPHY_BITS(0x0000, 32, 0)); i <= ((DPHY_LANE2_OFFSET + DSI_DPHY_BITS(0x0048, 32, 0))); i += 4<<16) {
1684 val = dsi_get_bits(dsi0, i);
1685 MIPI_TRACE("%04x: %08x\n", i>>16, val);
1690 for(i = (DPHY_LANE3_OFFSET + DSI_DPHY_BITS(0x0000, 32, 0)); i <= ((DPHY_LANE3_OFFSET + DSI_DPHY_BITS(0x0048, 32, 0))); i += 4<<16) {
1691 val = dsi_get_bits(dsi0, i);
1692 MIPI_TRACE("%04x: %08x\n", i>>16, val);
1698 int reg_proc_open(struct inode *inode, struct file *file)
1703 int reg_proc_close(struct inode *inode, struct file *file)
1708 struct file_operations reg_proc_fops = {
1709 .owner = THIS_MODULE,
1710 .open = reg_proc_open,
1711 .release= reg_proc_close,
1712 .write = reg_proc_write,
1713 .read = reg_proc_read,
1717 int reg_proc_write1(struct file *file, const char __user *buff, size_t count, loff_t *offp)
1719 int ret = -1, i = 0;
1721 char *buf = kmalloc(count, GFP_KERNEL);
1726 memset(buf, 0, count);
1727 ret = copy_from_user((void*)buf, buff, count);
1729 data = strstr(data, "-");
1731 goto reg_proc_write_exit;
1732 command = *(++data);
1738 data = strstr(data, "0x");
1740 goto reg_proc_write_exit;
1741 sscanf(data, "0x%llx", ®s_val);
1742 if((regs_val & 0xffff00000000ULL) == 0)
1743 goto reg_proc_write_exit;
1744 read_val = regs_val & 0xffffffff;
1745 dsi_write_reg(dsi1, regs_val >> 32, &read_val);
1746 dsi_read_reg(dsi1, regs_val >> 32, &read_val);
1747 regs_val &= 0xffffffff;
1748 if(read_val != regs_val)
1749 MIPI_TRACE("%s fail:0x%08x\n", __func__, read_val);
1757 data = strstr(data, "0x");
1759 goto reg_proc_write_exit;
1760 sscanf(data, "0x%llx", ®s_val);
1761 dsi_read_reg(dsi1, (u16)regs_val, &read_val);
1762 MIPI_TRACE("*%04x : %08x\n", (u16)regs_val, read_val);
1767 while(*(++data) == ' ');
1768 sscanf(data, "%d", &read_val);
1770 read_val = 11289600;
1773 #ifdef CONFIG_MFD_RK616
1774 clk_set_rate(dsi_rk616->mclk, read_val);
1776 //rk_mipi_dsi_init_lite(dsi);
1781 while(*(++data) == ' ');
1783 MIPI_TRACE("****%d:%d\n", data-buf, count);
1787 MIPI_TRACE("payload entry is larger than 32\n");
1790 sscanf(data, "%x,", str + i); //-c 1,29,02,03,05,06,> pro
1791 data = strstr(data, ",");
1803 rk_mipi_dsi_send_dcs_packet(dsi1, str, read_val);
1805 rk_mipi_dsi_send_gen_packet(dsi1, str, read_val);
1817 reg_proc_write_exit:
1823 int reg_proc_read1(struct file *file, char __user *buff, size_t count,
1829 for(i = VERSION; i < (VERSION + (0xdc<<16)); i += 4<<16) {
1830 val = dsi_get_bits(dsi1, i);
1831 MIPI_TRACE("%04x: %08x\n", i>>16, val);
1836 /* for(i = DPHY_REGISTER0; i <= DPHY_REGISTER4; i += 4<<16) {
1837 val = dsi_get_bits(dsi1, i);
1838 MIPI_TRACE("%04x: %08x\n", i>>16, val);
1842 i = DPHY_REGISTER20;
1843 val = dsi_get_bits(dsi1, i);
1844 MIPI_TRACE("%04x: %08x\n", i>>16, val);
1848 for(i = (DPHY_CLOCK_OFFSET + DSI_DPHY_BITS(0x0000, 32, 0)); i <= ((DPHY_CLOCK_OFFSET + DSI_DPHY_BITS(0x0048, 32, 0))); i += 4<<16) {
1849 val = dsi_get_bits(dsi1, i);
1850 MIPI_TRACE("%04x: %08x\n", i>>16, val);
1855 for(i = (DPHY_LANE0_OFFSET + DSI_DPHY_BITS(0x0000, 32, 0)); i <= ((DPHY_LANE0_OFFSET + DSI_DPHY_BITS(0x0048, 32, 0))); i += 4<<16) {
1856 val = dsi_get_bits(dsi1, i);
1857 MIPI_TRACE("%04x: %08x\n", i>>16, val);
1862 for(i = (DPHY_LANE1_OFFSET + DSI_DPHY_BITS(0x0000, 32, 0)); i <= ((DPHY_LANE1_OFFSET + DSI_DPHY_BITS(0x0048, 32, 0))); i += 4<<16) {
1863 val = dsi_get_bits(dsi1, i);
1864 MIPI_TRACE("%04x: %08x\n", i>>16, val);
1869 for(i = (DPHY_LANE2_OFFSET + DSI_DPHY_BITS(0x0000, 32, 0)); i <= ((DPHY_LANE2_OFFSET + DSI_DPHY_BITS(0x0048, 32, 0))); i += 4<<16) {
1870 val = dsi_get_bits(dsi1, i);
1871 MIPI_TRACE("%04x: %08x\n", i>>16, val);
1876 for(i = (DPHY_LANE3_OFFSET + DSI_DPHY_BITS(0x0000, 32, 0)); i <= ((DPHY_LANE3_OFFSET + DSI_DPHY_BITS(0x0048, 32, 0))); i += 4<<16) {
1877 val = dsi_get_bits(dsi1, i);
1878 MIPI_TRACE("%04x: %08x\n", i>>16, val);
1884 int reg_proc_open1(struct inode *inode, struct file *file)
1889 int reg_proc_close1(struct inode *inode, struct file *file)
1894 struct file_operations reg_proc_fops1 = {
1895 .owner = THIS_MODULE,
1896 .open = reg_proc_open1,
1897 .release= reg_proc_close1,
1898 .write = reg_proc_write1,
1899 .read = reg_proc_read1,
1903 static int reg_proc_init(char *name)
1907 #ifdef CONFIG_MFD_RK616
1908 //debugfs_create_file("mipi", S_IRUSR, dsi_rk616->debugfs_dir, dsi_rk616,
1912 static struct proc_dir_entry *reg_proc_entry;
1913 reg_proc_entry = create_proc_entry(name, 0666, NULL);
1914 /*if(reg_proc_entry == NULL) {
1915 //MIPI_TRACE("Couldn't create proc entry : %s!\n", name);
1920 MIPI_TRACE("Create proc entry:%s success!\n", name);
1921 reg_proc_entry->proc_fops = ®_proc_fops;
1927 static int __init rk_mipi_dsi_reg(void)
1929 return 0;//reg_proc_init("mipi_dsi");
1931 module_init(rk_mipi_dsi_reg);
1936 #ifdef CONFIG_MIPI_DSI_FT
1937 static struct mipi_dsi_screen ft_screen;
1939 static u32 fre_to_period(u32 fre)
1943 interger = 1000000000UL / fre;
1944 decimals = 1000000000UL % fre;
1945 if(decimals <= 40000000)
1946 decimals = (decimals * 100) / (fre/10);
1947 else if(decimals <= 400000000)
1948 decimals = (decimals * 10) / (fre/100);
1950 decimals = decimals / (fre/1000);
1951 interger = interger * 1000 + decimals;
1956 static int rk616_mipi_dsi_set_screen_info(void)
1958 g_screen = &ft_screen;
1959 g_screen->type = SCREEN_MIPI;
1960 g_screen->face = MIPI_DSI_OUT_FACE;
1961 g_screen->pixclock = MIPI_DSI_DCLK;
1962 g_screen->left_margin = MIPI_DSI_H_BP;
1963 g_screen->right_margin = MIPI_DSI_H_FP;
1964 g_screen->hsync_len = MIPI_DSI_H_PW;
1965 g_screen->upper_margin = MIPI_DSI_V_BP;
1966 g_screen->lower_margin = MIPI_DSI_V_FP;
1967 g_screen->vsync_len = MIPI_DSI_V_PW;
1968 g_screen->x_res = MIPI_DSI_H_VD;
1969 g_screen->y_res = MIPI_DSI_V_VD;
1970 g_screen->pin_hsync = MIPI_DSI_HSYNC_POL;
1971 g_screen->pin_vsync = MIPI_DSI_VSYNC_POL;
1972 g_screen->pin_den = MIPI_DSI_DEN_POL;
1973 g_screen->pin_dclk = MIPI_DSI_DCLK_POL;
1974 g_screen->dsi_lane = MIPI_DSI_LANE;
1975 g_screen->hs_tx_clk = MIPI_DSI_HS_CLK;
1976 g_screen->init = NULL;
1977 g_screen->standby = NULL;
1981 int rk616_mipi_dsi_ft_init(void)
1983 rk616_mipi_dsi_set_screen_info();
1984 rk_mipi_dsi_init(g_screen, 0);
1987 #endif /* end of CONFIG_MIPI_DSI_FT */
1989 #ifdef CONFIG_MIPI_DSI_LINUX
1991 #ifdef CONFIG_HAS_EARLYSUSPEND
1992 void rk616_mipi_dsi_suspend(void)
1996 if(!g_screen->standby) {
1997 rk_mipi_dsi_enable_video_mode(dsi, 0);
1999 dcs[1] = dcs_set_display_off;
2000 rk_mipi_dsi_send_dcs_packet(dsi, dcs, 2);
2003 dcs[1] = dcs_enter_sleep_mode;
2004 rk_mipi_dsi_send_dcs_packet(dsi, dcs, 2);
2007 g_screen->standby(1);
2010 rk_mipi_dsi_host_power_down(dsi);
2011 rk_mipi_dsi_phy_power_down(dsi);
2012 #if defined(CONFIG_ARCH_RK319X)
2013 clk_disable(dsi->dsi_pd);
2014 clk_disable(dsi->dsi_pclk);
2016 MIPI_TRACE("%s:%d\n", __func__, __LINE__);
2019 void rk616_mipi_dsi_resume(void)
2022 #if defined(CONFIG_ARCH_RK319X)
2023 clk_enable(dsi->dsi_pd);
2024 clk_enable(dsi->dsi_pclk);
2026 rk_mipi_dsi_phy_power_up(dsi);
2027 rk_mipi_dsi_host_power_up(dsi);
2029 #ifdef CONFIG_MFD_RK616
2030 rk_mipi_recover_reg();
2032 rk_mipi_dsi_phy_init(dsi);
2033 rk_mipi_dsi_host_init(dsi);
2036 /* if(!g_screen->standby) {
2037 rk_mipi_dsi_enable_hs_clk(dsi, 1);
2039 dcs[1] = dcs_exit_sleep_mode;
2040 rk_mipi_dsi_send_dcs_packet(dsi, dcs, 2);
2043 dcs[1] = dcs_set_display_on;
2044 rk_mipi_dsi_send_dcs_packet(dsi, dcs, 2);
2047 g_screen->standby(0);
2050 rk_mipi_dsi_is_enable(dsi, 0);
2051 rk_mipi_dsi_enable_video_mode(dsi, 1);
2053 #ifdef CONFIG_MFD_RK616
2054 dsi_rk616->resume = 1;
2055 rk616_display_router_cfg(dsi_rk616, g_rk29fd_screen, 0);
2056 dsi_rk616->resume = 0;
2058 rk_mipi_dsi_is_enable(dsi, 1, shutdownz);
2059 MIPI_TRACE("%s:%d\n", __func__, __LINE__);
2063 #ifdef CONFIG_HAS_EARLYSUSPEND
2064 static void rk616_mipi_dsi_early_suspend(struct early_suspend *h)
2066 rk616_mipi_dsi_suspend();
2069 static void rk616_mipi_dsi_late_resume(struct early_suspend *h)
2071 rk616_mipi_dsi_resume();
2073 #endif /* end of CONFIG_HAS_EARLYSUSPEND */
2077 #ifdef CONFIG_MFD_RK616
2078 static int rk616_mipi_dsi_notifier_event(struct notifier_block *this,
2079 unsigned long event, void *ptr) {
2081 #ifdef CONFIG_RK616_MIPI_DSI_RST
2084 g_screen->standby(0);
2086 rk616_mipi_dsi_suspend();
2091 rk_mipi_dsi_init_lite(dsi);
2093 g_screen->standby(1);
2095 rk616_mipi_dsi_resume();
2098 rk_mipi_dsi_init_lite(dsi);
2103 struct notifier_block mipi_dsi_nb= {
2104 .notifier_call = rk616_mipi_dsi_notifier_event,
2108 #ifndef CONFIG_MFD_RK616
2109 static irqreturn_t rk616_mipi_dsi_irq_handler(int irq, void *data)
2116 static int rk32_dsi_enable(void)
2118 MIPI_DBG("rk32_dsi_enable-------\n");
2120 dsi_init(0, NULL, 0);
2121 if (rk_mipi_get_dsi_num() ==2)
2122 dsi_init(1, NULL, 0);
2124 rk_mipi_screen_standby(0);
2127 After the core reset, DPI waits for the first VSYNC active transition to start signal sampling, including
2128 pixel data, and preventing image transmission in the middle of a frame.
2130 dsi_is_enable(0, 0);
2131 if (rk_mipi_get_dsi_num() ==2)
2132 dsi_is_enable(1, 0);
2134 dsi_enable_video_mode(0, 1);
2135 dsi_enable_video_mode(1, 1);
2137 #ifdef CONFIG_MFD_RK616
2138 rk616_display_router_cfg(dsi_rk616, g_rk29fd_screen, 0);
2141 dsi_is_enable(0, 1);
2142 if (rk_mipi_get_dsi_num() ==2)
2143 dsi_is_enable(1, 1);
2148 static int rk32_dsi_disable(void)
2150 MIPI_DBG("rk32_dsi_disable-------\n");
2152 rk_mipi_screen_standby(1);
2154 if (rk_mipi_get_dsi_num() ==2)
2161 static struct rk_fb_trsm_ops trsm_dsi_ops =
2163 .enable = rk32_dsi_enable,
2164 .disable = rk32_dsi_disable,
2167 static void rk32_init_phy_mode(int lcdc_id)
2169 int val0 = 0, val1 = 0;
2171 MIPI_DBG("rk32_init_phy_mode----------lcdc_id=%d\n",lcdc_id);
2173 if( rk_mipi_get_dsi_num() ==1 ){
2176 //val0 =0x1 << 25 | 0x1 << 9;
2177 val0 = 0x1 << 22 | 0x1 << 6; //1'b1: VOP LIT output to DSI host0;1'b0: VOP BIG output to DSI host0
2179 val0 = 0x1 << 22 | 0x0 << 6;
2181 writel_relaxed(val0, RK_GRF_VIRT + RK3288_GRF_SOC_CON6);
2185 val0 = 0x1 << 25 | 0x1 << 9 | 0x1 << 22 | 0x1 << 6;
2186 val1 = 0x1 << 31 | 0x1 << 30 | 0x0 << 15 | 0x1 << 14;
2189 val0 = 0x1 << 25 | 0x0 << 9 | 0x1 << 22 | 0x0 << 14;
2190 val1 = 0x1 << 31 | 0x1 << 30 | 0x0 << 15 | 0x1 << 14;
2193 writel_relaxed(val0, RK_GRF_VIRT + RK3288_GRF_SOC_CON6);
2194 writel_relaxed(val1, RK_GRF_VIRT + RK3288_GRF_SOC_CON14);
2199 static int rk616_mipi_dsi_probe(struct platform_device *pdev)
2203 struct mipi_dsi_ops *ops;
2204 struct rk_screen *screen;
2205 struct mipi_dsi_screen *dsi_screen;
2208 #if defined(CONFIG_ARCH_RK319X) || defined(CONFIG_ARCH_RK3288)
2209 struct resource *res_host, *res_phy, *res_irq;
2211 #if defined(CONFIG_MFD_RK616)
2212 struct mfd_rk616 *rk616;
2214 dsi = devm_kzalloc(&pdev->dev, sizeof(struct dsi), GFP_KERNEL);
2216 dev_err(&pdev->dev,"request struct dsi fail!\n");
2220 #if defined(CONFIG_MFD_RK616)
2221 rk616 = dev_get_drvdata(pdev->dev.parent);
2223 dev_err(&pdev->dev,"null mfd device rk616!\n");
2229 clk_notifier_register(rk616->mclk, &mipi_dsi_nb);
2230 #elif defined(CONFIG_ARCH_RK319X)
2231 res_host = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mipi_dsi_host");
2233 dev_err(&pdev->dev, "get resource mipi_dsi_host fail\n");
2237 if (!request_mem_region(res_host->start, resource_size(res_host), pdev->name)) {
2238 dev_err(&pdev->dev, "host memory region already claimed\n");
2242 dsi->host.iobase = res_host->start;
2243 dsi->host.membase = ioremap_nocache(res_host->start, resource_size(res_host));
2244 if (!dsi->host.membase) {
2245 dev_err(&pdev->dev, "ioremap mipi_dsi_host fail\n");
2250 res_phy = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mipi_dsi_phy");
2252 dev_err(&pdev->dev, "get resource mipi_dsi_phy fail\n");
2256 if (!request_mem_region(res_phy->start, resource_size(res_phy), pdev->name)) {
2257 dev_err(&pdev->dev, "phy memory region already claimed\n");
2261 dsi->phy.iobase = res_phy->start;
2262 dsi->phy.membase = ioremap_nocache(res_phy->start, resource_size(res_phy));
2263 if (!dsi->phy.membase) {
2264 dev_err(&pdev->dev, "ioremap mipi_dsi_phy fail\n");
2269 res_irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
2271 dev_err(&pdev->dev, "get resource mipi_dsi irq fail\n");
2275 dsi->host.irq = res_irq->start;
2276 ret = request_irq(dsi->host.irq, rk616_mipi_dsi_irq_handler, 0,
2277 dev_name(&pdev->dev), dsi);
2279 dev_err(&pdev->dev, "request mipi_dsi irq fail\n");
2283 disable_irq(dsi->host.irq);
2285 dsi->phy.refclk = clk_get(NULL, "mipi_ref");
2286 if (unlikely(IS_ERR(dsi->phy.refclk))) {
2287 dev_err(&pdev->dev, "get mipi_ref clock fail\n");
2288 ret = PTR_ERR(dsi->phy.refclk);
2291 dsi->dsi_pclk = clk_get(NULL, "pclk_mipi_dsi");
2292 if (unlikely(IS_ERR(dsi->dsi_pclk))) {
2293 dev_err(&pdev->dev, "get pclk_mipi_dsi clock fail\n");
2294 ret = PTR_ERR(dsi->dsi_pclk);
2297 dsi->dsi_pd = clk_get(NULL, "pd_mipi_dsi");
2298 if (unlikely(IS_ERR(dsi->dsi_pd))) {
2299 dev_err(&pdev->dev, "get pd_mipi_dsi clock fail\n");
2300 ret = PTR_ERR(dsi->dsi_pd);
2304 clk_enable(dsi->dsi_pd);
2305 clk_enable(dsi->dsi_pclk);
2306 clk_enable(clk_get(NULL, "pclk_mipiphy_dsi"));
2308 #elif defined(CONFIG_ARCH_RK3288)
2310 res_host = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2311 dsi->host.membase = devm_request_and_ioremap(&pdev->dev, res_host);
2312 if (!dsi->host.membase)
2315 dsi->phy.refclk = devm_clk_get(&pdev->dev, "clk_mipi_24m");
2316 if (unlikely(IS_ERR(dsi->phy.refclk))) {
2317 dev_err(&pdev->dev, "get mipi_ref clock fail\n");
2318 ret = PTR_ERR(dsi->phy.refclk);
2322 dsi->dsi_pclk = devm_clk_get(&pdev->dev, "pclk_mipi_dsi");
2323 if (unlikely(IS_ERR(dsi->dsi_pclk))) {
2324 dev_err(&pdev->dev, "get pclk_mipi_dsi clock fail\n");
2325 ret = PTR_ERR(dsi->dsi_pclk);
2331 // printk("dsi->phy.refclk =%x\n",dsi->phy.refclk);
2333 //clk_prepare_enable(dsi->phy.refclk);
2335 //clk_disable_unprepare(dsi->phy.refclk);
2338 dsi->host.irq = platform_get_irq(pdev, 0);
2339 if (dsi->host.irq < 0) {
2340 dev_err(&pdev->dev, "no irq resource?\n");
2341 return dsi->host.irq;
2344 ret = request_irq(dsi->host.irq, rk616_mipi_dsi_irq_handler, 0,dev_name(&pdev->dev), dsi);
2346 dev_err(&pdev->dev, "request mipi_dsi irq fail\n");
2350 printk("dsi->host.irq =%d\n",dsi->host.irq);
2352 disable_irq(dsi->host.irq);
2354 #endif /* CONFIG_MFD_RK616 */
2356 screen = devm_kzalloc(&pdev->dev, sizeof(struct rk_screen), GFP_KERNEL);
2358 dev_err(&pdev->dev,"request struct rk_screen fail!\n");
2361 rk_fb_get_prmry_screen(screen);
2363 #ifdef CONFIG_MFD_RK616
2364 g_rk29fd_screen = screen;
2370 ops->id = DWC_DSI_VERSION,
2371 ops->get_id = rk_mipi_dsi_get_id,
2372 ops->dsi_send_packet = rk_mipi_dsi_send_gen_packet,
2373 ops->dsi_send_dcs_packet = rk_mipi_dsi_send_dcs_packet,
2374 ops->dsi_read_dcs_packet = rk_mipi_dsi_read_dcs_packet,
2375 ops->dsi_enable_video_mode = rk_mipi_dsi_enable_video_mode,
2376 ops->dsi_enable_command_mode = rk_mipi_dsi_enable_command_mode,
2377 ops->dsi_enable_hs_clk = rk_mipi_dsi_enable_hs_clk,
2378 ops->dsi_is_active = rk_mipi_dsi_is_active,
2379 ops->dsi_is_enable= rk_mipi_dsi_is_enable,
2380 ops->power_up = rk_mipi_dsi_power_up,
2381 ops->power_down = rk_mipi_dsi_power_down,
2382 ops->dsi_init = rk_mipi_dsi_init,
2384 dsi_screen = &dsi->screen;
2385 dsi_screen->type = screen->type;
2386 dsi_screen->face = screen->face;
2387 dsi_screen->lcdc_id = screen->lcdc_id;
2388 dsi_screen->screen_id = screen->screen_id;
2389 dsi_screen->pixclock = screen->mode.pixclock;
2390 dsi_screen->left_margin = screen->mode.left_margin;
2391 dsi_screen->right_margin = screen->mode.right_margin;
2392 dsi_screen->hsync_len = screen->mode.hsync_len;
2393 dsi_screen->upper_margin = screen->mode.upper_margin;
2394 dsi_screen->lower_margin = screen->mode.lower_margin;
2395 dsi_screen->vsync_len = screen->mode.vsync_len;
2396 dsi_screen->x_res = screen->mode.xres;
2397 dsi_screen->y_res = screen->mode.yres;
2398 dsi_screen->pin_hsync = screen->pin_hsync;
2399 dsi_screen->pin_vsync = screen->pin_vsync;
2400 dsi_screen->pin_den = screen->pin_den;
2401 dsi_screen->pin_dclk = screen->pin_dclk;
2402 dsi_screen->dsi_lane = rk_mipi_get_dsi_lane();
2403 // dsi_screen->dsi_video_mode = screen->dsi_video_mode; //no sure
2404 dsi_screen->dsi_lane = rk_mipi_get_dsi_lane();
2405 dsi_screen->hs_tx_clk = rk_mipi_get_dsi_clk();
2406 dsi_screen->lcdc_id = 1;
2408 dsi->dsi_id = id++;//of_alias_get_id(pdev->dev.of_node, "dsi");
2410 sprintf(ops->name, "rk_mipi_dsi.%d", dsi->dsi_id);
2411 platform_set_drvdata(pdev, dsi);
2413 #ifdef CONFIG_MFD_RK616
2414 host_mem = kzalloc(MIPI_DSI_HOST_SIZE, GFP_KERNEL);
2416 dev_err(&pdev->dev,"request host_mem fail!\n");
2420 phy_mem = kzalloc(MIPI_DSI_PHY_SIZE, GFP_KERNEL);
2423 dev_err(&pdev->dev,"request phy_mem fail!\n");
2428 memset(host_mem, 0xaa, MIPI_DSI_HOST_SIZE);
2429 memset(phy_mem, 0xaa, MIPI_DSI_PHY_SIZE);
2432 ret = rk_mipi_dsi_probe(dsi);
2434 dev_err(&pdev->dev,"rk mipi_dsi probe fail!\n");
2435 dev_err(&pdev->dev,"%s\n", RK_MIPI_DSI_VERSION_AND_TIME);
2438 #ifdef CONFIG_HAS_EARLYSUSPEND
2439 dsi->early_suspend.suspend = rk616_mipi_dsi_early_suspend;
2440 dsi->early_suspend.resume = rk616_mipi_dsi_late_resume;
2441 dsi->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1;
2442 register_early_suspend(&dsi->early_suspend);
2446 rk32_init_phy_mode(dsi_screen->lcdc_id);
2447 rk_fb_trsm_ops_register(&trsm_dsi_ops, SCREEN_MIPI);
2449 #ifdef MIPI_DSI_REGISTER_IO
2450 debugfs_create_file("mipidsi0", S_IFREG | S_IRUGO, dsi->debugfs_dir, dsi,
2458 #ifdef MIPI_DSI_REGISTER_IO
2459 debugfs_create_file("mipidsi1", S_IFREG | S_IRUGO, dsi->debugfs_dir, dsi,
2465 dev_info(&pdev->dev,"rk mipi_dsi probe success!\n");
2466 dev_info(&pdev->dev,"%s\n", RK_MIPI_DSI_VERSION_AND_TIME);
2470 #ifdef CONFIG_MFD_RK616
2477 #if defined(CONFIG_ARCH_RK319X)
2478 clk_put(dsi->dsi_pd);
2480 clk_put(dsi->dsi_pclk);
2482 clk_put(dsi->phy.refclk);
2484 free_irq(dsi->host.irq, dsi);
2486 iounmap(dsi->phy.membase);
2488 release_mem_region(res_phy->start, resource_size(res_phy));
2490 iounmap(dsi->host.membase);
2492 release_mem_region(res_host->start, resource_size(res_host));
2501 static int rk616_mipi_dsi_remove(struct platform_device *pdev)
2503 //struct dsi *dsi = platform_get_drvdata(pdev);
2504 #ifdef CONFIG_MFD_RK616
2505 clk_notifier_unregister(dsi_rk616->mclk, &mipi_dsi_nb);
2510 static void rk616_mipi_dsi_shutdown(struct platform_device *pdev)
2513 struct dsi *dsi = platform_get_drvdata(pdev);
2515 if(!dsi->screen.standby) {
2516 rk_mipi_dsi_enable_video_mode(dsi, 0);
2518 dcs[1] = dcs_set_display_off;
2519 rk_mipi_dsi_send_dcs_packet(dsi, dcs, 2);
2522 dcs[1] = dcs_enter_sleep_mode;
2523 rk_mipi_dsi_send_dcs_packet(dsi, dcs, 2);
2526 dsi->screen.standby(1);
2529 rk_mipi_dsi_host_power_down(dsi);
2530 rk_mipi_dsi_phy_power_down(dsi);
2532 MIPI_TRACE("%s:%d\n", __func__, __LINE__);
2537 static const struct of_device_id of_rk_mipi_dsi_match[] = {
2538 { .compatible = "rockchip,rk32-dsi" },
2543 static struct platform_driver rk616_mipi_dsi_driver = {
2545 .name = "rk616-mipi",
2547 .of_match_table = of_rk_mipi_dsi_match,
2549 .owner = THIS_MODULE,
2551 .probe = rk616_mipi_dsi_probe,
2552 .remove = rk616_mipi_dsi_remove,
2553 .shutdown = rk616_mipi_dsi_shutdown,
2556 static int __init rk616_mipi_dsi_init(void)
2558 return platform_driver_register(&rk616_mipi_dsi_driver);
2560 fs_initcall(rk616_mipi_dsi_init);
2562 static void __exit rk616_mipi_dsi_exit(void)
2564 platform_driver_unregister(&rk616_mipi_dsi_driver);
2566 module_exit(rk616_mipi_dsi_exit);
2567 #endif /* end of CONFIG_MIPI_DSI_LINUX */