2 * Copyright (C) 2014 ROCKCHIP, Inc.
3 * drivers/video/display/transmitter/rk32_mipi_dsi.c
4 * author: libing@rock-chips.com
5 * create date: 2014-04-10
6 * debug /sys/kernel/debug/mipidsi*
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 #ifndef CONFIG_RK32_MIPI_DSI
22 #ifdef CONFIG_RK32_MIPI_DSI
23 #define MIPI_DSI_REGISTER_IO 0
24 #define CONFIG_MIPI_DSI_LINUX 0
26 #define DWC_DSI_VERSION 0x3133302A
28 #ifdef CONFIG_RK_3288_DSI_UBOOT
33 #include <linux/ctype.h>
34 #include <linux/math64.h>
36 #include "rk32_mipi_dsi.h"
38 #include <asm/arch/rkplat.h>
41 #include <linux/rk_screen.h>
44 #include <linux/kernel.h>
45 #include <linux/init.h>
46 #include <linux/platform_device.h>
47 #include <linux/slab.h>
48 #include <linux/rk_fb.h>
49 #include <linux/rk_screen.h>
50 #include <linux/delay.h>
51 #include <linux/clk.h>
52 #include <linux/interrupt.h>
53 #include <asm/div64.h>
56 #include <linux/debugfs.h>
57 #include <linux/seq_file.h>
58 #include <linux/regulator/machine.h>
60 #include <linux/dma-mapping.h>
62 #include "rk32_mipi_dsi.h"
63 #include <linux/rockchip/iomap.h>
65 #ifdef CONFIG_RK32_MIPI_DSI
66 #define MIPI_DBG(x...) //printk(KERN_INFO x)
67 #elif defined CONFIG_RK_3288_DSI_UBOOT
68 #define MIPI_DBG(x...) //printf( x)
69 #define printk(x...) //printf( x)
71 #define MIPI_DBG(x...)
74 #ifdef CONFIG_MIPI_DSI_LINUX
75 #define MIPI_TRACE(x...) //printk(KERN_INFO x)
77 #define MIPI_TRACE(...) \
89 *v1.0 : this driver is rk32 mipi dsi driver of rockchip;
90 *v1.1 : add test eye pattern;
94 #define RK_MIPI_DSI_VERSION_AND_TIME "rockchip mipi_dsi v1.1 2014-06-17"
96 static struct dsi *dsi0;
97 static struct dsi *dsi1;
99 static int rk32_mipi_dsi_is_active(void *arg);
100 static int rk32_mipi_dsi_enable_hs_clk(void *arg, u32 enable);
101 static int rk32_mipi_dsi_enable_video_mode(void *arg, u32 enable);
102 static int rk32_mipi_dsi_enable_command_mode(void *arg, u32 enable);
103 static int rk32_mipi_dsi_is_enable(void *arg, u32 enable);
104 int rk_mipi_screen_standby(u8 enable);
106 #ifdef CONFIG_RK_3288_DSI_UBOOT
107 DECLARE_GLOBAL_DATA_PTR;
108 extern int rk_mipi_screen_probe(void);
109 extern void writel_relaxed(uint32 val, uint32 addr);
110 #define msleep(a) udelay(a * 1000)
113 clocks = <&clk_gates5 15>, <&clk_gates16 4>;
114 clock-names = "clk_mipi_24m", "pclk_mipi_dsi";
117 clocks = <&clk_gates5 15>, <&clk_gates16 5>;
118 clock-names = "clk_mipi_24m", "pclk_mipi_dsi";
121 int rk32_mipi_dsi_clk_enable(struct dsi *dsi)
124 val = 0x80000000;//bit31~bit16
125 writel(val, RK3288_CRU_PHYS + 0x174); /*24M*/
130 writel(val, RK3288_CRU_PHYS + 0x1a0); /*pclk*/
133 int rk32_mipi_dsi_clk_disable(struct dsi *dsi)
137 val = (1 << 20)|(1 << 4);
139 val = (1 << 21)|(1 << 5);
140 writel(val, RK3288_CRU_PHYS + 0x1a0); /*pclk*/
142 val = 0x80008000;//bit31~bit16
143 writel(val, RK3288_CRU_PHYS + 0x174); /*24M*/
148 static int rk32_dsi_read_reg(struct dsi *dsi, u16 reg, u32 *pval)
150 *pval = __raw_readl(dsi->host.membase + (reg - MIPI_DSI_HOST_OFFSET));
154 static int rk32_dsi_write_reg(struct dsi *dsi, u16 reg, u32 *pval)
156 __raw_writel(*pval, dsi->host.membase + (reg - MIPI_DSI_HOST_OFFSET));
160 static int rk32_dsi_get_bits(struct dsi *dsi, u32 reg)
163 u32 bits = (reg >> 8) & 0xff;
164 u16 reg_addr = (reg >> 16) & 0xffff;
165 u8 offset = reg & 0xff;
168 bits = (1 << bits) - 1;
172 rk32_dsi_read_reg(dsi, reg_addr, &val);
179 static int rk32_dsi_set_bits(struct dsi *dsi, u32 data, u32 reg)
182 u32 bits = (reg >> 8) & 0xff;
183 u16 reg_addr = (reg >> 16) & 0xffff;
184 u8 offset = reg & 0xff;
187 bits = (1 << bits) - 1;
191 if(bits != 0xffffffff)
192 rk32_dsi_read_reg(dsi, reg_addr, &val);
194 val &= ~(bits << offset);
195 val |= (data & bits) << offset;
196 rk32_dsi_write_reg(dsi, reg_addr, &val);
199 MIPI_TRACE("%s error reg_addr:0x%04x, offset:%d, bits:0x%04x, value:0x%04x\n",
200 __func__, reg_addr, offset, bits, data);
206 static int rk32_dwc_phy_test_rd(struct dsi *dsi, unsigned char test_code)
209 rk32_dsi_set_bits(dsi, 1, phy_testclk);
210 rk32_dsi_set_bits(dsi, test_code, phy_testdin);
211 rk32_dsi_set_bits(dsi, 1, phy_testen);
212 rk32_dsi_set_bits(dsi, 0, phy_testclk);
213 rk32_dsi_set_bits(dsi, 0, phy_testen);;
215 rk32_dsi_set_bits(dsi, 0, phy_testen);
216 val = rk32_dsi_get_bits(dsi,phy_testdout);
217 rk32_dsi_set_bits(dsi, 1, phy_testclk);
218 rk32_dsi_set_bits(dsi, 0, phy_testclk);
223 static int rk32_dwc_phy_test_wr(struct dsi *dsi, unsigned char test_code, unsigned char *test_data, unsigned char size)
227 MIPI_DBG("test_code=0x%x,test_data=0x%x\n", test_code,test_data[0]);
228 rk32_dsi_set_bits(dsi, 0x10000 | test_code, PHY_TEST_CTRL1);
229 rk32_dsi_set_bits(dsi, 0x2, PHY_TEST_CTRL0);
230 rk32_dsi_set_bits(dsi, 0x0, PHY_TEST_CTRL0);
232 for(i = 0; i < size; i++) {
233 rk32_dsi_set_bits(dsi, test_data[i], PHY_TEST_CTRL1);
234 rk32_dsi_set_bits(dsi, 0x2, PHY_TEST_CTRL0);
235 rk32_dsi_set_bits(dsi, 0x0, PHY_TEST_CTRL0);
236 MIPI_DBG("rk32_dwc_phy_test_wr:%08x\n", rk32_dsi_get_bits(dsi, PHY_TEST_CTRL1));
241 static int rk32_phy_power_up(struct dsi *dsi)
244 #ifdef CONFIG_RK_3288_DSI_UBOOT
245 rk32_mipi_dsi_clk_enable(dsi);
247 clk_prepare_enable(dsi->phy.refclk);
248 clk_prepare_enable(dsi->dsi_pclk);
249 clk_prepare_enable(dsi->dsi_pd);
253 switch(dsi->host.lane) {
255 rk32_dsi_set_bits(dsi, 3, n_lanes);
258 rk32_dsi_set_bits(dsi, 2, n_lanes);
261 rk32_dsi_set_bits(dsi, 1, n_lanes);
264 rk32_dsi_set_bits(dsi, 0, n_lanes);
269 rk32_dsi_set_bits(dsi, 1, phy_shutdownz);
270 rk32_dsi_set_bits(dsi, 1, phy_rstz);
271 rk32_dsi_set_bits(dsi, 1, phy_enableclk);
272 rk32_dsi_set_bits(dsi, 1, phy_forcepll);
277 static int rk32_phy_power_down(struct dsi *dsi)
279 rk32_dsi_set_bits(dsi, 0, phy_shutdownz);
280 #ifdef CONFIG_RK_3288_DSI_UBOOT
281 rk32_mipi_dsi_clk_disable(dsi);
283 clk_disable_unprepare(dsi->phy.refclk);
284 clk_disable_unprepare(dsi->dsi_pclk);
285 clk_disable_unprepare(dsi->dsi_pd);
290 static int rk32_phy_init(struct dsi *dsi)
292 u32 val = 0 , ddr_clk = 0, fbdiv = 0, prediv = 0;
293 unsigned char test_data[2] = {0};
295 ddr_clk = dsi->phy.ddr_clk;
296 prediv = dsi->phy.prediv;
297 fbdiv = dsi->phy.fbdiv;
299 if(ddr_clk < 200 * MHz)
301 else if(ddr_clk < 300 * MHz)
303 else if(ddr_clk < 500 * MHz)
305 else if(ddr_clk < 700 * MHz)
307 else if(ddr_clk < 900 * MHz)
309 else if(ddr_clk < 1100 * MHz)
311 else if(ddr_clk < 1300 * MHz)
313 else if(ddr_clk <= 1500 * MHz)
316 test_data[0] = 0x80 | val << 3 | 0x3;
317 rk32_dwc_phy_test_wr(dsi, 0x10, test_data, 1);
320 rk32_dwc_phy_test_wr(dsi, 0x11, test_data, 1);
322 test_data[0] = 0x80 | 0x40;
323 rk32_dwc_phy_test_wr(dsi, 0x12, test_data, 1);
325 if(ddr_clk < 90 * MHz)
327 else if(ddr_clk < 100 * MHz)
329 else if(ddr_clk < 110 * MHz)
331 else if(ddr_clk < 130 * MHz)
333 else if(ddr_clk < 140 * MHz)
335 else if(ddr_clk < 150 * MHz)
337 else if(ddr_clk < 170 * MHz)
339 else if(ddr_clk < 180 * MHz)
341 else if(ddr_clk < 200 * MHz)
343 else if(ddr_clk < 220 * MHz)
345 else if(ddr_clk < 240 * MHz)
347 else if(ddr_clk < 250 * MHz)
349 else if(ddr_clk < 270 * MHz)
351 else if(ddr_clk < 300 * MHz)
353 else if(ddr_clk < 330 * MHz)
355 else if(ddr_clk < 360 * MHz)
357 else if(ddr_clk < 400 * MHz)
359 else if(ddr_clk < 450 * MHz)
361 else if(ddr_clk < 500 * MHz)
363 else if(ddr_clk < 550 * MHz)
365 else if(ddr_clk < 600 * MHz)
367 else if(ddr_clk < 650 * MHz)
369 else if(ddr_clk < 700 * MHz)
371 else if(ddr_clk < 750 * MHz)
373 else if(ddr_clk < 800 * MHz)
375 else if(ddr_clk < 850 * MHz)
377 else if(ddr_clk < 900 * MHz)
379 else if(ddr_clk < 950 * MHz)
381 else if(ddr_clk < 1000 * MHz)
383 else if(ddr_clk < 1050 * MHz)
385 else if(ddr_clk < 1100* MHz)
387 else if(ddr_clk < 1150* MHz)
389 else if(ddr_clk < 1200 * MHz)
391 else if(ddr_clk < 1250 * MHz)
393 else if(ddr_clk < 1300 * MHz)
395 else if(ddr_clk < 1350 * MHz)
397 else if(ddr_clk < 1400* MHz)
399 else if(ddr_clk < 1450* MHz)
401 else if(ddr_clk <= 1500* MHz)
404 test_data[0] = val << 1;
405 rk32_dwc_phy_test_wr(dsi, code_hs_rx_lane0, test_data, 1);
407 test_data[0] = prediv- 1;
408 rk32_dwc_phy_test_wr(dsi, code_pll_input_div_rat, test_data, 1);
410 test_data[0] = (fbdiv - 1) & 0x1f;
411 rk32_dwc_phy_test_wr(dsi, code_pll_loop_div_rat, test_data, 1);
413 test_data[0] = (fbdiv - 1) >> 5 | 0x80;
414 rk32_dwc_phy_test_wr(dsi, code_pll_loop_div_rat, test_data, 1);
417 rk32_dwc_phy_test_wr(dsi, code_pll_input_loop_div_rat, test_data, 1);
421 rk32_dwc_phy_test_wr(dsi, 0x20, test_data, 1);
424 rk32_dwc_phy_test_wr(dsi, 0x21, test_data, 1);
427 rk32_dwc_phy_test_wr(dsi, 0x21, test_data, 1);
430 rk32_dwc_phy_test_wr(dsi, 0x22, test_data, 1);
432 test_data[0] = 0x80 | 0x7;
433 rk32_dwc_phy_test_wr(dsi, 0x22, test_data, 1);
435 test_data[0] = 0x80 | 15;
436 rk32_dwc_phy_test_wr(dsi, code_hstxdatalanerequsetstatetime, test_data, 1);
438 test_data[0] = 0x80 | 85;
439 rk32_dwc_phy_test_wr(dsi, code_hstxdatalanepreparestatetime, test_data, 1);
441 test_data[0] = 0x40 | 10;
442 rk32_dwc_phy_test_wr(dsi, code_hstxdatalanehszerostatetime, test_data, 1);
447 static int rk32_mipi_dsi_host_power_up(struct dsi *dsi)
452 //disable all interrupt
453 rk32_dsi_set_bits(dsi, 0x1fffff, INT_MKS0);
454 rk32_dsi_set_bits(dsi, 0x3ffff, INT_MKS1);
456 rk32_mipi_dsi_is_enable(dsi, 1);
459 while(!rk32_dsi_get_bits(dsi, phylock) && val--) {
465 MIPI_TRACE("%s:phylock fail.\n", __func__);
469 while(!rk32_dsi_get_bits(dsi, phystopstateclklane) && val--) {
476 static int rk32_mipi_dsi_host_power_down(struct dsi *dsi)
478 rk32_mipi_dsi_enable_video_mode(dsi, 0);
479 rk32_mipi_dsi_enable_hs_clk(dsi, 0);
480 rk32_mipi_dsi_is_enable(dsi, 0);
484 static int rk32_mipi_dsi_host_init(struct dsi *dsi)
486 u32 val = 0, bytes_px = 0;
487 struct mipi_dsi_screen *screen = &dsi->screen;
488 u32 decimals = dsi->phy.Ttxbyte_clk, temp = 0, i = 0;
489 u32 m = 1, lane = dsi->host.lane, Tpclk = dsi->phy.Tpclk,
490 Ttxbyte_clk = dsi->phy.Ttxbyte_clk;
492 rk32_dsi_set_bits(dsi, dsi->host.lane - 1, n_lanes);
493 rk32_dsi_set_bits(dsi, dsi->vid, dpi_vcid);
495 switch(screen->face) {
497 rk32_dsi_set_bits(dsi, 5, dpi_color_coding);
504 rk32_dsi_set_bits(dsi, 3, dpi_color_coding);
505 rk32_dsi_set_bits(dsi, 1, en18_loosely);
510 rk32_dsi_set_bits(dsi, 0, dpi_color_coding);
517 rk32_dsi_set_bits(dsi, 1, hsync_active_low);
518 rk32_dsi_set_bits(dsi, 1, vsync_active_low);
520 rk32_dsi_set_bits(dsi, 0, dataen_active_low);
521 rk32_dsi_set_bits(dsi, 0, colorm_active_low);
522 rk32_dsi_set_bits(dsi, 0, shutd_active_low);
524 rk32_dsi_set_bits(dsi, dsi->host.video_mode, vid_mode_type); //burst mode
526 switch(dsi->host.video_mode) {
529 if(screen->type == SCREEN_DUAL_MIPI)
530 rk32_dsi_set_bits(dsi, screen->x_res / 2 + 4, vid_pkt_size);
532 rk32_dsi_set_bits(dsi, screen->x_res, vid_pkt_size);
538 for(i = 8; i < 32; i++){
539 temp = i * lane * Tpclk % Ttxbyte_clk;
540 if(decimals > temp) {
548 rk32_dsi_set_bits(dsi, screen->x_res / m + 1, num_chunks);
549 rk32_dsi_set_bits(dsi, m, vid_pkt_size);
550 temp = m * lane * Tpclk / Ttxbyte_clk - m * bytes_px;
551 MIPI_DBG("%s:%d, %d\n", __func__, m, temp);
554 rk32_dsi_set_bits(dsi, temp - 12, null_pkt_size);
563 //rk32_dsi_set_bits(dsi, 0, CMD_MODE_CFG << 16);
564 if(screen->type == SCREEN_MIPI){
565 rk32_dsi_set_bits(dsi, dsi->phy.Tpclk * (screen->x_res + screen->left_margin +
566 screen->hsync_len + screen->right_margin) \
567 / dsi->phy.Ttxbyte_clk, vid_hline_time);
570 rk32_dsi_set_bits(dsi, dsi->phy.Tpclk * (screen->x_res + 8 + screen->left_margin +
571 screen->hsync_len + screen->right_margin) \
572 / dsi->phy.Ttxbyte_clk, vid_hline_time);
574 rk32_dsi_set_bits(dsi, dsi->phy.Tpclk * (screen->left_margin) / dsi->phy.Ttxbyte_clk,
576 rk32_dsi_set_bits(dsi, dsi->phy.Tpclk * (screen->hsync_len) / dsi->phy.Ttxbyte_clk,
579 rk32_dsi_set_bits(dsi, screen->y_res , vid_active_lines);
580 rk32_dsi_set_bits(dsi, screen->lower_margin, vid_vfp_lines);
581 rk32_dsi_set_bits(dsi, screen->upper_margin, vid_vbp_lines);
582 rk32_dsi_set_bits(dsi, screen->vsync_len, vid_vsa_lines);
584 dsi->phy.txclkesc = 20 * MHz;
585 val = dsi->phy.txbyte_clk / dsi->phy.txclkesc + 1;
586 dsi->phy.txclkesc = dsi->phy.txbyte_clk / val;
587 rk32_dsi_set_bits(dsi, val, TX_ESC_CLK_DIVISION);
589 rk32_dsi_set_bits(dsi, 10, TO_CLK_DIVISION);
590 rk32_dsi_set_bits(dsi, 1000, hstx_to_cnt); //no sure
591 rk32_dsi_set_bits(dsi, 1000, lprx_to_cnt);
592 rk32_dsi_set_bits(dsi, 100, phy_stop_wait_time);
594 //rk32_dsi_set_bits(dsi, 0, outvact_lpcmd_time); //byte
595 //rk32_dsi_set_bits(dsi, 0, invact_lpcmd_time);
597 rk32_dsi_set_bits(dsi, 20, phy_hs2lp_time);
598 rk32_dsi_set_bits(dsi, 16, phy_lp2hs_time);
600 // rk32_dsi_set_bits(dsi, 87, phy_hs2lp_time_clk_lane); //no sure
601 // rk32_dsi_set_bits(dsi, 25, phy_hs2hs_time_clk_lane); //no sure
603 rk32_dsi_set_bits(dsi, 10000, max_rd_time);
605 rk32_dsi_set_bits(dsi, 1, lp_hfp_en);
606 //rk32_dsi_set_bits(dsi, 1, lp_hbp_en); //no sure
607 rk32_dsi_set_bits(dsi, 1, lp_vact_en);
608 rk32_dsi_set_bits(dsi, 1, lp_vfp_en);
609 rk32_dsi_set_bits(dsi, 1, lp_vbp_en);
610 rk32_dsi_set_bits(dsi, 1, lp_vsa_en);
612 //rk32_dsi_set_bits(dsi, 1, frame_bta_ack_en);
613 rk32_dsi_set_bits(dsi, 1, phy_enableclk);
614 rk32_dsi_set_bits(dsi, 0, phy_tx_triggers);
615 //rk32_dsi_set_bits(dsi, 1, phy_txexitulpslan);
616 //rk32_dsi_set_bits(dsi, 1, phy_txexitulpsclk);
621 * mipi protocol layer definition
623 static int rk_mipi_dsi_init(void *arg, u32 n)
625 u32 decimals = 1000, i = 0, pre = 0;
626 struct dsi *dsi = arg;
627 struct mipi_dsi_screen *screen = &dsi->screen;
632 if((screen->type != SCREEN_MIPI) && (screen->type != SCREEN_DUAL_MIPI) ) {
633 MIPI_TRACE("only mipi dsi lcd is supported!\n");
637 if(((screen->type == SCREEN_DUAL_MIPI) && (rk_mipi_get_dsi_num() == 1)) || ((screen->type == SCREEN_MIPI) && (rk_mipi_get_dsi_num() == 2))){
638 MIPI_TRACE("dsi number and mipi type not match!\n");
641 #ifdef CONFIG_RK_3288_DSI_UBOOT
642 dsi->phy.Tpclk = div_u64(1000000000000llu, screen->pixclock);
643 dsi->phy.ref_clk = 24*MHZ;
645 dsi->phy.Tpclk = rk_fb_get_prmry_screen_pixclock();
648 dsi->phy.ref_clk = clk_get_rate(dsi->phy.refclk) ;
650 dsi->phy.sys_clk = dsi->phy.ref_clk;
652 printk("dsi->phy.sys_clk =%d\n",dsi->phy.sys_clk );
654 if((screen->hs_tx_clk <= 90 * MHz) || (screen->hs_tx_clk >= 1500 * MHz))
655 dsi->phy.ddr_clk = 1500 * MHz; //default is 1.5HGz
657 dsi->phy.ddr_clk = screen->hs_tx_clk;
660 dsi->phy.ddr_clk = n;
662 decimals = dsi->phy.ref_clk;
663 for(i = 1; i < 6; i++) {
664 pre = dsi->phy.ref_clk / i;
665 if((decimals > (dsi->phy.ddr_clk % pre)) && (dsi->phy.ddr_clk / pre < 512)) {
666 decimals = dsi->phy.ddr_clk % pre;
668 dsi->phy.fbdiv = dsi->phy.ddr_clk / pre;
674 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);
676 dsi->phy.ddr_clk = dsi->phy.ref_clk / dsi->phy.prediv * dsi->phy.fbdiv;
677 MIPI_DBG("dsi->phy.ddr_clk =%d\n",dsi->phy.ddr_clk);
678 dsi->phy.txbyte_clk = dsi->phy.ddr_clk / 8;
680 dsi->phy.txclkesc = 20 * MHz; // < 20MHz
681 dsi->phy.txclkesc = dsi->phy.txbyte_clk / (dsi->phy.txbyte_clk / dsi->phy.txclkesc + 1);
683 dsi->phy.pclk = div_u64(1000000000000llu, dsi->phy.Tpclk);
684 dsi->phy.Ttxclkesc = div_u64(1000000000000llu, dsi->phy.txclkesc);
685 dsi->phy.Tsys_clk = div_u64(1000000000000llu, dsi->phy.sys_clk);
686 dsi->phy.Tddr_clk = div_u64(1000000000000llu, dsi->phy.ddr_clk);
687 dsi->phy.Ttxbyte_clk = div_u64(1000000000000llu, dsi->phy.txbyte_clk);
689 dsi->phy.UI = dsi->phy.Tddr_clk;
692 if(screen->dsi_lane > 0 && screen->dsi_lane <= 4)
693 dsi->host.lane = screen->dsi_lane;
697 dsi->host.video_mode = VM_BM;
699 MIPI_DBG("UI:%d\n", dsi->phy.UI);
700 MIPI_DBG("ref_clk:%d\n", dsi->phy.ref_clk);
701 MIPI_DBG("pclk:%d, Tpclk:%d\n", dsi->phy.pclk, dsi->phy.Tpclk);
702 MIPI_DBG("sys_clk:%d, Tsys_clk:%d\n", dsi->phy.sys_clk, dsi->phy.Tsys_clk);
703 MIPI_DBG("ddr_clk:%d, Tddr_clk:%d\n", dsi->phy.ddr_clk, dsi->phy.Tddr_clk);
704 MIPI_DBG("txbyte_clk:%d, Ttxbyte_clk:%d\n", dsi->phy.txbyte_clk,
705 dsi->phy.Ttxbyte_clk);
706 MIPI_DBG("txclkesc:%d, Ttxclkesc:%d\n", dsi->phy.txclkesc, dsi->phy.Ttxclkesc);
708 rk32_phy_power_up(dsi);
709 rk32_mipi_dsi_host_power_up(dsi);
711 rk32_mipi_dsi_host_init(dsi);
716 static int rk32_mipi_dsi_is_enable(void *arg, u32 enable)
718 struct dsi *dsi = arg;
720 rk32_dsi_set_bits(dsi, enable, shutdownz);
725 static int rk32_mipi_dsi_enable_video_mode(void *arg, u32 enable)
727 struct dsi *dsi = arg;
729 rk32_dsi_set_bits(dsi, !enable, cmd_video_mode);
734 static int rk32_mipi_dsi_enable_command_mode(void *arg, u32 enable)
736 struct dsi *dsi = arg;
738 rk32_dsi_set_bits(dsi, enable, cmd_video_mode);
743 static int rk32_mipi_dsi_enable_hs_clk(void *arg, u32 enable)
745 struct dsi *dsi = arg;
747 rk32_dsi_set_bits(dsi, enable, phy_txrequestclkhs);
751 static int rk32_mipi_dsi_is_active(void *arg)
753 struct dsi *dsi = arg;
755 return rk32_dsi_get_bits(dsi, shutdownz);
758 static int rk32_mipi_dsi_send_packet(void *arg, unsigned char cmds[], u32 length)
760 struct dsi *dsi = arg;
762 u32 type, liTmp = 0, i = 0, j = 0, data = 0;
764 if(rk32_dsi_get_bits(dsi, gen_cmd_full) == 1) {
765 MIPI_TRACE("gen_cmd_full\n");
768 #ifdef CONFIG_MIPI_DSI_LINUX
769 regs = kmalloc(0x400, GFP_KERNEL);
771 printk("request regs fail!\n");
775 #ifdef CONFIG_RK_3288_DSI_UBOOT
776 regs = calloc(1, 0x400);
778 printf("request regs fail!\n");
782 memcpy(regs,cmds,length);
789 case DTYPE_DCS_SWRITE_0P:
790 rk32_dsi_set_bits(dsi, regs[0], dcs_sw_0p_tx);
791 data = regs[2] << 8 | type;
794 case DTYPE_DCS_SWRITE_1P:
795 rk32_dsi_set_bits(dsi, regs[0], dcs_sw_1p_tx);
796 data = regs[2] << 8 | type;
797 data |= regs[3] << 16;
800 case DTYPE_DCS_LWRITE:
801 rk32_dsi_set_bits(dsi, regs[0], dcs_lw_tx);
803 for(i = 0; i < liTmp; i++){
807 for(i = 0; i < liTmp; i++) {
810 data |= regs[i] << (j * 8);
811 if(j == 3 || ((i + 1) == liTmp)) {
812 if(rk32_dsi_get_bits(dsi, gen_pld_w_full) == 1) {
813 MIPI_TRACE("gen_pld_w_full :%d\n", i);
817 rk32_dsi_set_bits(dsi, data, GEN_PLD_DATA);
818 MIPI_DBG("write GEN_PLD_DATA:%d, %08x\n", i, data);
824 data |= (liTmp & 0xffff) << 8;
828 case DTYPE_GEN_LWRITE:
829 rk32_dsi_set_bits(dsi, regs[0], gen_lw_tx);
831 for(i = 0; i < liTmp; i++){
835 for(i = 0; i < liTmp; i++) {
838 data |= regs[i] << (j * 8);
839 if(j == 3 || ((i + 1) == liTmp)) {
840 if(rk32_dsi_get_bits(dsi, gen_pld_w_full) == 1) {
841 MIPI_TRACE("gen_pld_w_full :%d\n", i);
845 rk32_dsi_set_bits(dsi, data, GEN_PLD_DATA);
846 MIPI_DBG("write GEN_PLD_DATA:%d, %08x\n", i, data);
851 data = (dsi->vid << 6) | type;
852 data |= (liTmp & 0xffff) << 8;
855 case DTYPE_GEN_SWRITE_2P:
857 rk32_dsi_set_bits(dsi, regs[0], gen_sw_2p_tx);
858 for(i = 0; i < liTmp; i++){
862 for(i = 0; i < liTmp; i++) {
864 data |= regs[i] << (j * 8);
865 if(j == 3 || ((i + 1) == liTmp)) {
866 if(rk32_dsi_get_bits(dsi, gen_pld_w_full) == 1) {
867 MIPI_TRACE("gen_pld_w_full :%d\n", i);
871 rk32_dsi_set_bits(dsi, data, GEN_PLD_DATA);
872 MIPI_DBG("write GEN_PLD_DATA:%d, %08x\n", i, data);
877 data |= (liTmp & 0xffff) << 8;
881 case DTYPE_GEN_SWRITE_1P:
882 rk32_dsi_set_bits(dsi, regs[0], gen_sw_1p_tx);
884 data |= regs[2] << 8;
885 data |= regs[3] << 16;
888 case DTYPE_GEN_SWRITE_0P:
889 rk32_dsi_set_bits(dsi, regs[0], gen_sw_0p_tx);
891 data |= regs[2] << 8;
895 printk("0x%x:this type not suppport!\n",type);
899 MIPI_DBG("%d command sent in %s size:%d\n", __LINE__, regs[0] ? "LP mode" : "HS mode", liTmp);
901 MIPI_DBG("write GEN_HDR:%08x\n", data);
902 rk32_dsi_set_bits(dsi, data, GEN_HDR);
905 while(!rk32_dsi_get_bits(dsi, gen_cmd_empty) && i--) {
910 #ifdef CONFIG_MIPI_DSI_LINUX
913 #ifdef CONFIG_RK_3288_DSI_UBOOT
919 static int rk32_mipi_dsi_read_dcs_packet(void *arg, unsigned char *data1, u32 n)
921 struct dsi *dsi = arg;
923 //unsigned char *regs = data;
924 unsigned char regs[2];
932 rk32_dsi_set_bits(dsi, regs[0], dcs_sr_0p_tx);
934 /* if(type == DTYPE_GEN_SWRITE_0P)
935 data = (dsi->vid << 6) | (n << 4) | type;
937 data = (dsi->vid << 6) | ((n-1) << 4) | type;*/
939 data |= regs[1] << 8 | type;
941 // data |= regs[1] << 16;
943 MIPI_DBG("write GEN_HDR:%08x\n", data);
944 rk32_dsi_set_bits(dsi, data, GEN_HDR);
947 // rk32_dsi_set_bits(dsi, regs[0], gen_sr_0p_tx);
949 printk("rk32_mipi_dsi_read_dcs_packet==0x%x\n",rk32_dsi_get_bits(dsi, GEN_PLD_DATA));
952 // rk32_dsi_set_bits(dsi, regs[0], max_rd_pkt_size);
955 // printk("_____rk32_mipi_dsi_read_dcs_packet==0x%x\n",rk32_dsi_get_bits(dsi, GEN_PLD_DATA));
961 static int rk32_mipi_dsi_power_up(void *arg)
963 struct dsi *dsi = arg;
965 rk32_phy_power_up(dsi);
966 rk32_mipi_dsi_host_power_up(dsi);
970 static int rk32_mipi_dsi_power_down(void *arg)
972 struct dsi *dsi = arg;
973 struct mipi_dsi_screen *screen = &dsi->screen;
978 rk32_mipi_dsi_host_power_down(dsi);
979 rk32_phy_power_down(dsi);
981 MIPI_TRACE("%s:%d\n", __func__, __LINE__);
985 static int rk32_mipi_dsi_get_id(void *arg)
988 struct dsi *dsi = arg;
990 id = rk32_dsi_get_bits(dsi, VERSION);
995 /* the most top level of mipi dsi init */
996 static int rk_mipi_dsi_probe(struct dsi *dsi)
1000 register_dsi_ops(dsi->dsi_id, &dsi->ops);
1002 ret = dsi_probe_current_chip(dsi->dsi_id);
1004 MIPI_TRACE("mipi dsi probe fail\n");
1011 #ifdef MIPI_DSI_REGISTER_IO
1012 #include <linux/proc_fs.h>
1013 #include <asm/uaccess.h>
1014 #include <linux/slab.h>
1016 int reg_proc_write(struct file *file, const char __user *buff, size_t count, loff_t *offp)
1018 int ret = -1, i = 0;
1020 char *buf = kmalloc(count, GFP_KERNEL);
1025 memset(buf, 0, count);
1026 ret = copy_from_user((void*)buf, buff, count);
1027 data = strstr(data, "-");
1029 goto reg_proc_write_exit;
1030 command = *(++data);
1034 data = strstr(data, "0x");
1036 goto reg_proc_write_exit;
1038 sscanf(data, "0x%llx", ®s_val);
1039 if((regs_val & 0xffff00000000ULL) == 0)
1040 goto reg_proc_write_exit;
1041 read_val = regs_val & 0xffffffff;
1042 printk("regs_val=0x%llx\n",regs_val);
1043 rk32_dsi_write_reg(dsi0, regs_val >> 32, &read_val);
1044 rk32_dsi_read_reg(dsi0, regs_val >> 32, &read_val);
1045 regs_val &= 0xffffffff;
1046 if(read_val != regs_val)
1047 MIPI_TRACE("%s fail:0x%08x\n", __func__, read_val);
1054 data = strstr(data, "0x");
1056 goto reg_proc_write_exit;
1058 sscanf(data, "0x%llx", ®s_val);
1059 rk32_dsi_read_reg(dsi0, (u16)regs_val, &read_val);
1060 MIPI_TRACE("*%04x : %08x\n", (u16)regs_val, read_val);
1065 while(*(++data) == ' ');
1066 sscanf(data, "%d", &read_val);
1068 read_val = 11289600;
1072 //rk32_mipi_dsi_init_lite(dsi);
1077 while(*(++data) == ' ');
1079 MIPI_TRACE("****%d:%d\n", data-buf, count);
1083 MIPI_TRACE("payload entry is larger than 32\n");
1086 sscanf(data, "%x,", (unsigned int *)(str + i)); //-c 1,29,02,03,05,06,> pro
1087 data = strstr(data, ",");
1099 rk32_mipi_dsi_send_packet(dsi0, str, read_val);
1101 rk32_mipi_dsi_send_packet(dsi0, str, read_val);
1113 reg_proc_write_exit:
1119 int reg_proc_read(struct file *file, char __user *buff, size_t count,
1125 for(i = VERSION; i < (VERSION + (0xdc<<16)); i += 4<<16) {
1126 val = rk32_dsi_get_bits(dsi0, i);
1127 MIPI_TRACE("%04x: %08x\n", i>>16, val);
1136 int reg_proc_open(struct inode *inode, struct file *file)
1141 int reg_proc_close(struct inode *inode, struct file *file)
1146 struct file_operations reg_proc_fops = {
1147 .owner = THIS_MODULE,
1148 .open = reg_proc_open,
1149 .release= reg_proc_close,
1150 .write = reg_proc_write,
1151 .read = reg_proc_read,
1155 int reg_proc_write1(struct file *file, const char __user *buff, size_t count, loff_t *offp)
1157 int ret = -1, i = 0;
1159 char *buf = kmalloc(count, GFP_KERNEL);
1164 memset(buf, 0, count);
1165 ret = copy_from_user((void*)buf, buff, count);
1167 data = strstr(data, "-");
1169 goto reg_proc_write_exit;
1170 command = *(++data);
1176 data = strstr(data, "0x");
1178 goto reg_proc_write_exit;
1179 sscanf(data, "0x%llx", ®s_val);
1180 if((regs_val & 0xffff00000000ULL) == 0)
1181 goto reg_proc_write_exit;
1182 read_val = regs_val & 0xffffffff;
1183 rk32_dsi_write_reg(dsi1, regs_val >> 32, &read_val);
1184 rk32_dsi_read_reg(dsi1, regs_val >> 32, &read_val);
1185 regs_val &= 0xffffffff;
1186 if(read_val != regs_val)
1187 MIPI_TRACE("%s fail:0x%08x\n", __func__, read_val);
1195 data = strstr(data, "0x");
1197 goto reg_proc_write_exit;
1198 sscanf(data, "0x%llx", ®s_val);
1199 rk32_dsi_read_reg(dsi1, (u16)regs_val, &read_val);
1200 MIPI_TRACE("*%04x : %08x\n", (u16)regs_val, read_val);
1205 while(*(++data) == ' ');
1206 sscanf(data, "%d", &read_val);
1208 read_val = 11289600;
1212 //rk32_mipi_dsi_init_lite(dsi);
1217 while(*(++data) == ' ');
1219 MIPI_TRACE("****%d:%d\n", data-buf, count);
1223 MIPI_TRACE("payload entry is larger than 32\n");
1226 sscanf(data, "%x,", (unsigned int *)(str + i)); //-c 1,29,02,03,05,06,> pro
1227 data = strstr(data, ",");
1239 rk32_mipi_dsi_send_packet(dsi1, str, read_val);
1241 rk32_mipi_dsi_send_packet(dsi1, str, read_val);
1253 reg_proc_write_exit:
1259 int reg_proc_read1(struct file *file, char __user *buff, size_t count,
1265 for(i = VERSION; i < (VERSION + (0xdc<<16)); i += 4<<16) {
1266 val = rk32_dsi_get_bits(dsi1, i);
1267 MIPI_TRACE("%04x: %08x\n", i>>16, val);
1275 int reg_proc_open1(struct inode *inode, struct file *file)
1280 int reg_proc_close1(struct inode *inode, struct file *file)
1285 struct file_operations reg_proc_fops1 = {
1286 .owner = THIS_MODULE,
1287 .open = reg_proc_open1,
1288 .release= reg_proc_close1,
1289 .write = reg_proc_write1,
1290 .read = reg_proc_read1,
1293 #if 0//def CONFIG_MIPI_DSI_LINUX
1294 static irqreturn_t rk32_mipi_dsi_irq_handler(int irq, void *data)
1296 printk("-------rk32_mipi_dsi_irq_handler-------\n");
1300 #ifdef CONFIG_RK_3288_DSI_UBOOT
1301 int rk32_dsi_sync(void)
1304 After the core reset, DPI waits for the first VSYNC active transition to start signal sampling, including
1305 pixel data, and preventing image transmission in the middle of a frame.
1307 dsi_is_enable(0, 0);
1308 if (rk_mipi_get_dsi_num() ==2)
1309 dsi_is_enable(1, 0);
1311 dsi_enable_video_mode(0, 1);
1312 dsi_enable_video_mode(1, 1);
1314 dsi_is_enable(0, 1);
1315 if (rk_mipi_get_dsi_num() ==2)
1316 dsi_is_enable(1, 1);
1322 static int dwc_phy_test_rd(struct dsi *dsi, unsigned char test_code)
1326 rk32_dsi_set_bits(dsi, 0x10000 | test_code, PHY_TEST_CTRL1);
1327 rk32_dsi_set_bits(dsi, 0x2, PHY_TEST_CTRL0);
1328 rk32_dsi_set_bits(dsi, 0x0, PHY_TEST_CTRL0);
1330 val = rk32_dsi_get_bits(dsi, PHY_TEST_CTRL1);
1336 static int rk32_dsi_enable(void)
1338 MIPI_DBG("rk32_dsi_enable-------\n");
1340 if (rk_mipi_get_dsi_num() ==2)
1343 rk_mipi_screen_standby(0);
1346 After the core reset, DPI waits for the first VSYNC active transition to start signal sampling, including
1347 pixel data, and preventing image transmission in the middle of a frame.
1349 dsi_is_enable(0, 0);
1350 if (rk_mipi_get_dsi_num() ==2)
1351 dsi_is_enable(1, 0);
1353 dsi_enable_video_mode(0, 1);
1354 dsi_enable_video_mode(1, 1);
1356 dsi_is_enable(0, 1);
1357 if (rk_mipi_get_dsi_num() ==2)
1358 dsi_is_enable(1, 1);
1363 #ifdef CONFIG_MIPI_DSI_LINUX
1364 static int rk32_dsi_disable(void)
1366 MIPI_DBG("rk32_dsi_disable-------\n");
1368 rk_mipi_screen_standby(1);
1370 if (rk_mipi_get_dsi_num() ==2)
1376 static struct rk_fb_trsm_ops trsm_dsi_ops =
1378 .enable = rk32_dsi_enable,
1379 .disable = rk32_dsi_disable,
1382 static void rk32_init_phy_mode(int lcdc_id)
1384 int val0 = 0, val1 = 0;
1386 MIPI_DBG("rk32_init_phy_mode----------lcdc_id=%d\n",lcdc_id);
1388 if( rk_mipi_get_dsi_num() ==1 ){
1391 //val0 =0x1 << 25 | 0x1 << 9;
1392 val0 = 0x1 << 22 | 0x1 << 6; //1'b1: VOP LIT output to DSI host0;1'b0: VOP BIG output to DSI host0
1394 val0 = 0x1 << 22 | 0x0 << 6;
1396 writel_relaxed(val0, RK_GRF_VIRT + RK3288_GRF_SOC_CON6);
1400 val0 = 0x1 << 25 | 0x1 << 9 | 0x1 << 22 | 0x1 << 6;
1401 val1 = 0x1 << 31 | 0x1 << 30 | 0x0 << 15 | 0x1 << 14;
1404 val0 = 0x1 << 25 | 0x0 << 9 | 0x1 << 22 | 0x0 << 14;
1405 val1 = 0x1 << 31 | 0x1 << 30 | 0x0 << 15 | 0x1 << 14;
1408 writel_relaxed(val0, RK_GRF_VIRT + RK3288_GRF_SOC_CON6);
1409 writel_relaxed(val1, RK_GRF_VIRT + RK3288_GRF_SOC_CON14);
1412 #ifdef CONFIG_RK_3288_DSI_UBOOT
1413 #ifdef CONFIG_OF_LIBFDT
1414 int rk_dsi_host_parse_dt(const void *blob, struct dsi *dsi)
1418 node = fdtdec_next_compatible(blob, 0, COMPAT_ROCKCHIP_DSIHOST);
1420 printf("mipi dts get node failed, node = %d.\n", node);
1425 if(fdtdec_get_int(blob, node, "rockchip,prop", -1) != dsi->dsi_id){
1426 node = fdtdec_next_compatible(blob, node, COMPAT_ROCKCHIP_DSIHOST);
1428 printf("mipi dts get node failed, node = %d.\n", node);
1436 //fdtdec_get_addr_size(blob,node,"reg",&length);
1437 dsi->host.membase = (void __iomem *)fdtdec_get_int(blob, node, "reg", -1);
1438 //fdt_getprop(blob, node, "reg", &length);
1439 MIPI_DBG("dsi->host.membase 0x%08lx.\n",(unsigned long)dsi->host.membase);
1442 #endif /* #ifdef CONFIG_OF_LIBFDT */
1444 int rk32_mipi_enable(vidinfo_t *vid)
1448 struct mipi_dsi_ops *ops;
1449 struct rk_screen *screen;
1450 struct mipi_dsi_screen *dsi_screen;
1453 rk_mipi_screen_probe();
1456 dsi = calloc(1, sizeof(struct dsi));
1458 MIPI_DBG("request struct dsi.%d fail!\n",id);
1463 #ifdef CONFIG_OF_LIBFDT
1464 rk_dsi_host_parse_dt(gd->fdt_blob,dsi);
1465 #endif /* #ifdef CONFIG_OF_LIBFDT */
1466 screen = calloc(1, sizeof(struct rk_screen));
1468 MIPI_DBG("request struct rk_screen fail!\n");
1470 //rk_fb_get_prmry_screen(screen);
1473 ops->id = DWC_DSI_VERSION,
1474 ops->get_id = rk32_mipi_dsi_get_id,
1475 ops->dsi_send_packet = rk32_mipi_dsi_send_packet;
1476 ops->dsi_read_dcs_packet = rk32_mipi_dsi_read_dcs_packet,
1477 ops->dsi_enable_video_mode = rk32_mipi_dsi_enable_video_mode,
1478 ops->dsi_enable_command_mode = rk32_mipi_dsi_enable_command_mode,
1479 ops->dsi_enable_hs_clk = rk32_mipi_dsi_enable_hs_clk,
1480 ops->dsi_is_active = rk32_mipi_dsi_is_active,
1481 ops->dsi_is_enable= rk32_mipi_dsi_is_enable,
1482 ops->power_up = rk32_mipi_dsi_power_up,
1483 ops->power_down = rk32_mipi_dsi_power_down,
1484 ops->dsi_init = rk_mipi_dsi_init,
1486 dsi_screen = &dsi->screen;
1487 dsi_screen->type = screen->type = vid->screen_type;
1488 dsi_screen->face = screen->face = vid->lcd_face;
1489 //dsi_screen->lcdc_id = screen->lcdc_id;
1490 //dsi_screen->screen_id = screen->screen_id;
1491 //printf("xjh:vid->vl_freq %d vid->real_freq %d\n",vid->vl_freq, vid->real_freq);
1492 //dsi_screen->pixclock = screen->mode.pixclock = vid->vl_freq *MHZ ;
1493 dsi_screen->pixclock = screen->mode.pixclock = vid->real_freq;
1494 dsi_screen->left_margin = screen->mode.left_margin = vid->vl_hbpd;
1495 dsi_screen->right_margin = screen->mode.right_margin = vid->vl_hfpd;
1496 dsi_screen->hsync_len = screen->mode.hsync_len = vid->vl_hspw;
1497 dsi_screen->upper_margin = screen->mode.upper_margin = vid->vl_vbpd;
1498 dsi_screen->lower_margin = screen->mode.lower_margin = vid->vl_vfpd;
1499 dsi_screen->vsync_len = screen->mode.vsync_len = vid->vl_vspw;
1500 dsi_screen->x_res = screen->mode.xres = vid->vl_width;
1501 dsi_screen->y_res = screen->mode.yres = vid->vl_height;
1502 //dsi_screen->pin_hsync = screen->pin_hsync;
1503 //dsi_screen->pin_vsync = screen->pin_vsync;
1504 //dsi_screen->pin_den = screen->pin_den;
1505 //dsi_screen->pin_dclk = screen->pin_dclk;
1506 dsi_screen->dsi_lane = rk_mipi_get_dsi_lane();
1507 // dsi_screen->dsi_video_mode = screen->dsi_video_mode; //no sure
1508 dsi_screen->dsi_lane = rk_mipi_get_dsi_lane();
1509 dsi_screen->hs_tx_clk = rk_mipi_get_dsi_clk();
1510 dsi_screen->lcdc_id = 1;
1511 dsi->dsi_id = id++;//of_alias_get_id(pdev->dev.of_node, "dsi");
1512 sprintf(ops->name, "rk_mipi_dsi.%d", dsi->dsi_id);
1514 ret = rk_mipi_dsi_probe(dsi);
1516 MIPI_DBG("rk mipi_dsi probe fail!\n");
1517 MIPI_DBG("%s\n", RK_MIPI_DSI_VERSION_AND_TIME);
1521 rk32_init_phy_mode(dsi_screen->lcdc_id);
1522 //rk_fb_trsm_ops_register(&trsm_dsi_ops, SCREEN_MIPI);
1527 //if(vid->screen_type == SCREEN_DUAL_MIPI){
1528 if( rk_mipi_get_dsi_num() == 2 ){
1542 // printf("MIPI HOST dump regs\n");
1543 for(reg=0x0;reg<0xc4;){
1544 // printf("reg[0x%04x]=0x%08x ",reg,
1545 // __raw_readl(dsi0->host.membase + reg));
1546 __raw_readl(dsi0->host.membase + reg);
1552 MIPI_DBG("rk mipi_dsi probe success!\n");
1553 MIPI_DBG("%s\n", RK_MIPI_DSI_VERSION_AND_TIME);
1559 #ifdef CONFIG_MIPI_DSI_LINUX
1560 int rk32_mipi_power_down_DDR(void)
1562 dsi_is_enable(0, 0);
1563 if (rk_mipi_get_dsi_num() ==2)
1564 dsi_is_enable(1, 0);
1567 EXPORT_SYMBOL(rk32_mipi_power_down_DDR);
1568 int rk32_mipi_power_up_DDR(void)
1570 dsi_is_enable(0, 0);
1571 if (rk_mipi_get_dsi_num() ==2)
1572 dsi_is_enable(1, 0);
1573 dsi_enable_video_mode(0, 1);
1574 dsi_enable_video_mode(1, 1);
1575 dsi_is_enable(0, 1);
1576 if (rk_mipi_get_dsi_num() ==2)
1577 dsi_is_enable(1, 1);
1580 EXPORT_SYMBOL(rk32_mipi_power_up_DDR);
1582 static int rk32_mipi_dsi_probe(struct platform_device *pdev)
1587 struct mipi_dsi_ops *ops;
1588 struct rk_screen *screen;
1589 struct mipi_dsi_screen *dsi_screen;
1590 struct resource *res_host;
1592 dsi = devm_kzalloc(&pdev->dev, sizeof(struct dsi), GFP_KERNEL);
1594 dev_err(&pdev->dev,"request struct dsi fail!\n");
1598 res_host = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1599 dsi->host.membase = devm_request_and_ioremap(&pdev->dev, res_host);
1600 if (!dsi->host.membase){
1601 dev_err(&pdev->dev, "get resource mipi host membase fail!\n");
1605 dsi->phy.refclk = devm_clk_get(&pdev->dev, "clk_mipi_24m");
1606 if (unlikely(IS_ERR(dsi->phy.refclk))) {
1607 dev_err(&pdev->dev, "get clk_mipi_24m clock fail\n");
1608 return PTR_ERR(dsi->phy.refclk);
1611 dsi->dsi_pclk = devm_clk_get(&pdev->dev, "pclk_mipi_dsi");
1612 if (unlikely(IS_ERR(dsi->dsi_pclk))) {
1613 dev_err(&pdev->dev, "get pclk_mipi_dsi clock fail\n");
1614 return PTR_ERR(dsi->dsi_pclk);
1617 dsi->dsi_pd = devm_clk_get(&pdev->dev, "pd_mipi_dsi");
1618 if (unlikely(IS_ERR(dsi->dsi_pd))) {
1619 dev_err(&pdev->dev, "get pd_mipi_dsi clock fail\n");
1620 return PTR_ERR(dsi->dsi_pd);
1623 dsi->host.irq = platform_get_irq(pdev, 0);
1624 if (dsi->host.irq < 0) {
1625 dev_err(&pdev->dev, "no irq resource?\n");
1626 return dsi->host.irq;
1629 //ret = request_irq(dsi->host.irq, rk32_mipi_dsi_irq_handler, 0,dev_name(&pdev->dev), dsi);
1631 // dev_err(&pdev->dev, "request mipi_dsi irq fail\n");
1634 printk("dsi->host.irq =%d\n",dsi->host.irq);
1636 disable_irq(dsi->host.irq);
1638 screen = devm_kzalloc(&pdev->dev, sizeof(struct rk_screen), GFP_KERNEL);
1640 dev_err(&pdev->dev,"request struct rk_screen fail!\n");
1643 rk_fb_get_prmry_screen(screen);
1648 ops->id = DWC_DSI_VERSION,
1649 ops->get_id = rk32_mipi_dsi_get_id,
1650 ops->dsi_send_packet = rk32_mipi_dsi_send_packet;
1651 ops->dsi_read_dcs_packet = rk32_mipi_dsi_read_dcs_packet,
1652 ops->dsi_enable_video_mode = rk32_mipi_dsi_enable_video_mode,
1653 ops->dsi_enable_command_mode = rk32_mipi_dsi_enable_command_mode,
1654 ops->dsi_enable_hs_clk = rk32_mipi_dsi_enable_hs_clk,
1655 ops->dsi_is_active = rk32_mipi_dsi_is_active,
1656 ops->dsi_is_enable= rk32_mipi_dsi_is_enable,
1657 ops->power_up = rk32_mipi_dsi_power_up,
1658 ops->power_down = rk32_mipi_dsi_power_down,
1659 ops->dsi_init = rk_mipi_dsi_init,
1661 dsi_screen = &dsi->screen;
1662 dsi_screen->type = screen->type;
1663 dsi_screen->face = screen->face;
1664 dsi_screen->lcdc_id = screen->lcdc_id;
1665 dsi_screen->screen_id = screen->screen_id;
1666 dsi_screen->pixclock = screen->mode.pixclock;
1667 dsi_screen->left_margin = screen->mode.left_margin;
1668 dsi_screen->right_margin = screen->mode.right_margin;
1669 dsi_screen->hsync_len = screen->mode.hsync_len;
1670 dsi_screen->upper_margin = screen->mode.upper_margin;
1671 dsi_screen->lower_margin = screen->mode.lower_margin;
1672 dsi_screen->vsync_len = screen->mode.vsync_len;
1673 dsi_screen->x_res = screen->mode.xres;
1674 dsi_screen->y_res = screen->mode.yres;
1675 dsi_screen->pin_hsync = screen->pin_hsync;
1676 dsi_screen->pin_vsync = screen->pin_vsync;
1677 dsi_screen->pin_den = screen->pin_den;
1678 dsi_screen->pin_dclk = screen->pin_dclk;
1679 dsi_screen->dsi_lane = rk_mipi_get_dsi_lane();
1680 // dsi_screen->dsi_video_mode = screen->dsi_video_mode; //no sure
1681 dsi_screen->dsi_lane = rk_mipi_get_dsi_lane();
1682 dsi_screen->hs_tx_clk = rk_mipi_get_dsi_clk();
1683 dsi_screen->lcdc_id = 1;
1687 sprintf(ops->name, "rk_mipi_dsi.%d", dsi->dsi_id);
1688 platform_set_drvdata(pdev, dsi);
1690 ret = rk_mipi_dsi_probe(dsi);
1692 dev_err(&pdev->dev,"rk mipi_dsi probe fail!\n");
1693 dev_err(&pdev->dev,"%s\n", RK_MIPI_DSI_VERSION_AND_TIME);
1699 if(!support_uboot_display())
1700 rk32_init_phy_mode(dsi_screen->lcdc_id);
1701 rk_fb_trsm_ops_register(&trsm_dsi_ops, SCREEN_MIPI);
1703 #ifdef MIPI_DSI_REGISTER_IO
1704 debugfs_create_file("mipidsi0", S_IFREG | S_IRUGO, dsi->debugfs_dir, dsi,
1711 #ifdef MIPI_DSI_REGISTER_IO
1712 debugfs_create_file("mipidsi1", S_IFREG | S_IRUGO, dsi->debugfs_dir, dsi,
1718 if(support_uboot_display()){
1719 clk_prepare_enable(dsi->phy.refclk);
1720 clk_prepare_enable(dsi->dsi_pclk);
1721 clk_prepare_enable(dsi->dsi_pd);
1724 dev_info(&pdev->dev,"rk mipi_dsi probe success!\n");
1725 dev_info(&pdev->dev,"%s\n", RK_MIPI_DSI_VERSION_AND_TIME);
1731 static const struct of_device_id of_rk_mipi_dsi_match[] = {
1732 { .compatible = "rockchip,rk32-dsi" },
1737 static struct platform_driver rk32_mipi_dsi_driver = {
1738 .probe = rk32_mipi_dsi_probe,
1740 .name = "rk32-mipi",
1741 .owner = THIS_MODULE,
1743 .of_match_table = of_rk_mipi_dsi_match,
1748 static int __init rk32_mipi_dsi_init(void)
1750 return platform_driver_register(&rk32_mipi_dsi_driver);
1752 fs_initcall(rk32_mipi_dsi_init);
1754 static void __exit rk32_mipi_dsi_exit(void)
1756 platform_driver_unregister(&rk32_mipi_dsi_driver);
1758 module_exit(rk32_mipi_dsi_exit);