2 * Copyright (C) 2012 Spreadtrum Communications Inc.
\r
4 * This software is licensed under the terms of the GNU General Public
\r
5 * License version 2, as published by the Free Software Foundation, and
\r
6 * may be copied, distributed, and modified under those terms.
\r
8 * This program is distributed in the hope that it will be useful,
\r
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
11 * GNU General Public License for more details.
\r
15 #include <asm/arch/tiger_lcd.h>
\r
16 #include <asm/arch/dispc_reg.h>
\r
21 extern struct ops_mipi sprdfb_mipi_ops;
\r
23 extern int32_t sprdfb_dsi_init(struct sprdfb_device *dev);
\r
24 extern int32_t sprdfb_dsi_uninit(struct sprdfb_device *dev);
\r
25 extern int32_t sprdfb_dsi_ready(struct sprdfb_device *dev);
\r
27 extern uint32_t rgb_calc_h_timing(struct timing_rgb *timing);
\r
28 extern uint32_t rgb_calc_v_timing(struct timing_rgb *timing);
\r
31 static uint32_t mipi_readid(struct panel_spec *self)
\r
38 static void mipi_dispc_init_config(struct panel_spec *panel)
\r
40 uint32_t reg_val = 0;
\r
42 FB_PRINT("sprdfb: [%s]\n", __FUNCTION__);
\r
45 FB_PRINT("sprdfb: [%s] fail.(Invalid Param)\n", __FUNCTION__);
\r
49 if(SPRDFB_PANEL_TYPE_MIPI != panel->type){
\r
50 FB_PRINT("sprdfb: [%s] fail.(not mcu panel)\n", __FUNCTION__);
\r
54 if(SPRDFB_MIPI_MODE_CMD == panel->info.mipi->work_mode){
\r
55 /*use edpi as interface*/
\r
56 dispc_set_bits((1<<1), DISPC_CTRL);
\r
58 /*use dpi as interface*/
\r
63 if(SPRDFB_POLARITY_NEG == panel->info.mipi->h_sync_pol){
\r
68 if(SPRDFB_POLARITY_NEG == panel->info.mipi->v_sync_pol){
\r
73 if(SPRDFB_POLARITY_NEG == panel->info.mipi->de_pol){
\r
78 if(SPRDFB_MIPI_MODE_VIDEO == panel->info.mipi->work_mode){
\r
79 #ifdef CONFIG_DPI_SINGLE_RUN
\r
84 if(!(panel->cap & PANEL_CAP_NOT_TEAR_SYNC)){
\r
85 FB_PRINT("sprdfb: mipi_dispc_init_config not support TE\n");
\r
90 if(SPRDFB_POLARITY_NEG == panel->info.mipi->te_pol){
\r
98 switch(panel->info.rgb->video_bus_width){
\r
102 reg_val |= (1 << 6);
\r
105 reg_val |= (2 << 6);
\r
111 dispc_write(reg_val, DISPC_DPI_CTRL);
\r
113 FB_PRINT("sprdfb: [%s] DISPC_DPI_CTRL = 0x%x\n", __FUNCTION__, dispc_read(DISPC_DPI_CTRL));
\r
116 static void mipi_dispc_set_timing(struct sprdfb_device *dev)
\r
118 FB_PRINT("sprdfb: [%s]\n", __FUNCTION__);
\r
120 dispc_write(dev->panel_timing.rgb_timing[RGB_LCD_H_TIMING], DISPC_DPI_H_TIMING);
\r
121 dispc_write(dev->panel_timing.rgb_timing[RGB_LCD_V_TIMING], DISPC_DPI_V_TIMING);
\r
124 static int32_t sprdfb_mipi_panel_check(struct panel_spec *panel)
\r
127 FB_PRINT("sprdfb: [%s] fail. (Invalid param)\n", __FUNCTION__);
\r
131 if(SPRDFB_PANEL_TYPE_MIPI != panel->type){
\r
132 FB_PRINT("sprdfb: [%s] fail. (not mipi param)\n", __FUNCTION__);
\r
136 FB_PRINT("sprdfb: [%s]\n",__FUNCTION__);
\r
141 static void sprdfb_mipi_panel_mount(struct sprdfb_device *dev)
\r
143 if((NULL == dev) || (NULL == dev->panel)){
\r
144 FB_PRINT("sprdfb: [%s]: Invalid Param\n", __FUNCTION__);
\r
148 FB_PRINT("sprdfb: [%s]\n",__FUNCTION__);
\r
150 if(SPRDFB_MIPI_MODE_CMD == dev->panel->info.mipi->work_mode){
\r
151 dev->panel_if_type = SPRDFB_PANEL_IF_EDPI;
\r
153 dev->panel_if_type = SPRDFB_PANEL_IF_DPI;
\r
156 dev->panel->info.mipi->ops = &sprdfb_mipi_ops;
\r
158 if(NULL == dev->panel->ops->panel_readid){
\r
159 dev->panel->ops->panel_readid = mipi_readid;
\r
162 dev->panel_timing.rgb_timing[RGB_LCD_H_TIMING] = rgb_calc_h_timing(dev->panel->info.mipi->timing);
\r
163 dev->panel_timing.rgb_timing[RGB_LCD_V_TIMING] = rgb_calc_v_timing(dev->panel->info.mipi->timing);
\r
166 static void sprdfb_mipi_panel_init(struct sprdfb_device *dev)
\r
168 sprdfb_dsi_init(dev);
\r
170 mipi_dispc_init_config(dev->panel);
\r
171 mipi_dispc_set_timing(dev);
\r
174 static void sprdfb_mipi_panel_uninit(struct sprdfb_device *dev)
\r
176 sprdfb_dsi_uninit(dev);
\r
179 static void sprdfb_mipi_panel_ready(struct sprdfb_device *dev)
\r
181 sprdfb_dsi_ready(dev);
\r
184 static void sprdfb_mipi_panel_suspend(struct sprdfb_device *dev)
\r
186 sprdfb_dsi_uninit(dev);
\r
189 static void sprdfb_mipi_panel_resume(struct sprdfb_device *dev)
\r
191 sprdfb_dsi_init(dev);
\r
195 struct panel_if_ctrl sprdfb_mipi_ctrl = {
\r
197 .panel_if_check = sprdfb_mipi_panel_check,
\r
198 .panel_if_mount = sprdfb_mipi_panel_mount,
\r
199 .panel_if_init = sprdfb_mipi_panel_init,
\r
200 .panel_if_uninit = sprdfb_mipi_panel_uninit,
\r
201 .panel_if_ready =sprdfb_mipi_panel_ready,
\r
202 .panel_if_before_refresh = NULL,
\r
203 .panel_if_after_refresh = NULL,
\r
204 .panel_if_suspend = sprdfb_mipi_panel_suspend,
\r
205 .panel_if_resume = sprdfb_mipi_panel_resume,
\r