2 * Copyright (C) 2012 Spreadtrum Communications Inc.
\r
6 #include <asm/arch/sprd_lcd.h>
\r
7 #include <asm/arch/dispc_reg.h>
\r
12 extern struct ops_mipi sprdfb_mipi_ops;
\r
14 extern int32_t sprdfb_dsi_init(struct sprdfb_device *dev);
\r
15 extern int32_t sprdfb_dsi_uninit(struct sprdfb_device *dev);
\r
16 extern int32_t sprdfb_dsi_ready(struct sprdfb_device *dev);
\r
18 extern uint32_t rgb_calc_h_timing(struct timing_rgb *timing);
\r
19 extern uint32_t rgb_calc_v_timing(struct timing_rgb *timing);
\r
22 static uint32_t mipi_readid(struct panel_spec *self)
\r
29 static void mipi_dispc_init_config(struct panel_spec *panel)
\r
31 uint32_t reg_val = 0;
\r
33 FB_PRINT("sprdfb: [%s]\n", __FUNCTION__);
\r
36 printf("sprdfb: [%s] fail.(Invalid Param)\n", __FUNCTION__);
\r
40 if(SPRDFB_PANEL_TYPE_MIPI != panel->type){
\r
41 printf("sprdfb: [%s] fail.(not mcu panel)\n", __FUNCTION__);
\r
45 if(SPRDFB_MIPI_MODE_CMD == panel->info.mipi->work_mode){
\r
46 /*use edpi as interface*/
\r
47 #if defined(CONFIG_SC8830) || defined(CONFIG_SC9630)
\r
48 dispc_write(0x3, DISPC_CTRL);
\r
50 dispc_set_bits((1<<1), DISPC_CTRL);
\r
53 /*use dpi as interface*/
\r
54 #if defined(CONFIG_SC8830) || defined(CONFIG_SC9630)
\r
55 dispc_write(0x1, DISPC_CTRL);
\r
60 if(SPRDFB_POLARITY_NEG == panel->info.mipi->h_sync_pol){
\r
65 if(SPRDFB_POLARITY_NEG == panel->info.mipi->v_sync_pol){
\r
70 if(SPRDFB_POLARITY_NEG == panel->info.mipi->de_pol){
\r
74 if(SPRDFB_MIPI_MODE_VIDEO == panel->info.mipi->work_mode){
\r
75 #ifdef CONFIG_DPI_SINGLE_RUN
\r
80 if(!(panel->cap & PANEL_CAP_NOT_TEAR_SYNC)){
\r
81 printf("sprdfb: mipi_dispc_init_config not support TE\n");
\r
86 if(SPRDFB_POLARITY_NEG == panel->info.mipi->te_pol){
\r
94 switch(panel->info.rgb->video_bus_width){
\r
98 reg_val |= (1 << 6);
\r
101 reg_val |= (2 << 6);
\r
107 dispc_write(reg_val, DISPC_DPI_CTRL);
\r
109 FB_PRINT("sprdfb: [%s] DISPC_DPI_CTRL = 0x%x\n", __FUNCTION__, dispc_read(DISPC_DPI_CTRL));
\r
112 static void mipi_dispc_set_timing(struct sprdfb_device *dev)
\r
114 FB_PRINT("sprdfb: [%s]\n", __FUNCTION__);
\r
116 dispc_write(dev->panel_timing.rgb_timing[RGB_LCD_H_TIMING], DISPC_DPI_H_TIMING);
\r
117 dispc_write(dev->panel_timing.rgb_timing[RGB_LCD_V_TIMING], DISPC_DPI_V_TIMING);
\r
120 static int32_t sprdfb_mipi_panel_check(struct panel_spec *panel)
\r
123 printf("sprdfb: [%s] fail. (Invalid param)\n", __FUNCTION__);
\r
127 if(SPRDFB_PANEL_TYPE_MIPI != panel->type){
\r
128 printf("sprdfb: [%s] fail. (not mipi param)\n", __FUNCTION__);
\r
132 FB_PRINT("sprdfb: [%s]\n",__FUNCTION__);
\r
137 static void sprdfb_mipi_panel_mount(struct sprdfb_device *dev)
\r
139 if((NULL == dev) || (NULL == dev->panel)){
\r
140 printf("sprdfb: [%s]: Invalid Param\n", __FUNCTION__);
\r
144 FB_PRINT("sprdfb: [%s]\n",__FUNCTION__);
\r
146 if(SPRDFB_MIPI_MODE_CMD == dev->panel->info.mipi->work_mode){
\r
147 dev->panel_if_type = SPRDFB_PANEL_IF_EDPI;
\r
149 dev->panel_if_type = SPRDFB_PANEL_IF_DPI;
\r
152 dev->panel->info.mipi->ops = &sprdfb_mipi_ops;
\r
154 if(NULL == dev->panel->ops->panel_readid){
\r
155 dev->panel->ops->panel_readid = mipi_readid;
\r
158 dev->panel_timing.rgb_timing[RGB_LCD_H_TIMING] = rgb_calc_h_timing(dev->panel->info.mipi->timing);
\r
159 dev->panel_timing.rgb_timing[RGB_LCD_V_TIMING] = rgb_calc_v_timing(dev->panel->info.mipi->timing);
\r
162 static void sprdfb_mipi_panel_init(struct sprdfb_device *dev)
\r
164 sprdfb_dsi_init(dev);
\r
166 mipi_dispc_init_config(dev->panel);
\r
167 mipi_dispc_set_timing(dev);
\r
170 static void sprdfb_mipi_panel_uninit(struct sprdfb_device *dev)
\r
172 sprdfb_dsi_uninit(dev);
\r
175 static void sprdfb_mipi_panel_ready(struct sprdfb_device *dev)
\r
177 sprdfb_dsi_ready(dev);
\r
180 static void sprdfb_mipi_panel_suspend(struct sprdfb_device *dev)
\r
182 sprdfb_dsi_uninit(dev);
\r
185 static void sprdfb_mipi_panel_resume(struct sprdfb_device *dev)
\r
187 sprdfb_dsi_init(dev);
\r
191 struct panel_if_ctrl sprdfb_mipi_ctrl = {
\r
193 .panel_if_check = sprdfb_mipi_panel_check,
\r
194 .panel_if_mount = sprdfb_mipi_panel_mount,
\r
195 .panel_if_init = sprdfb_mipi_panel_init,
\r
196 .panel_if_uninit = sprdfb_mipi_panel_uninit,
\r
197 .panel_if_ready =sprdfb_mipi_panel_ready,
\r
198 .panel_if_before_refresh = NULL,
\r
199 .panel_if_after_refresh = NULL,
\r
200 .panel_if_suspend = sprdfb_mipi_panel_suspend,
\r
201 .panel_if_resume = sprdfb_mipi_panel_resume,
\r