tizen 2.4 release
[profile/mobile/platform/kernel/u-boot-tm1.git] / drivers / video / sc8825fb / sprdfb_main.c
1 /******************************************************************************\r
2  ** File Name:    sprdfb_main.h                                            *\r
3  ** Author:                                                           *\r
4  ** DATE:                                                           *\r
5  ** Copyright:    2005 Spreatrum, Incoporated. All Rights Reserved.           *\r
6  ** Description:                                                            *\r
7  ******************************************************************************/\r
8 /******************************************************************************\r
9  **                   Edit    History                                         *\r
10  **---------------------------------------------------------------------------*\r
11  ** DATE          NAME            DESCRIPTION                                 *\r
12  **\r
13  ******************************************************************************/\r
14 \r
15 #include <common.h>\r
16 #include <asm/io.h>\r
17 #include <asm/errno.h>\r
18 \r
19 #include <asm/arch/tiger_lcd.h>\r
20 #include <asm/arch-sc8825/ldo.h>\r
21 \r
22 #include <asm/arch/sc8810_reg_global.h>\r
23 \r
24 #include <asm/arch/regs_global.h>\r
25 #include <asm/arch/regs_cpc.h>\r
26 \r
27 #include "sprdfb.h"\r
28 \r
29 \r
30 void *lcd_base;         /* Start of framebuffer memory  */\r
31 void *lcd_console_address;      /* Start of console buffer      */\r
32 \r
33 int lcd_line_length;\r
34 int lcd_color_fg;\r
35 int lcd_color_bg;\r
36 \r
37 short console_col;\r
38 short console_row;\r
39 \r
40 \r
41 \r
42 extern int sprdfb_panel_probe(struct sprdfb_device *dev);\r
43 extern void sprdfb_panel_remove(struct sprdfb_device *dev);\r
44 \r
45 extern struct display_ctrl sprdfb_dispc_ctrl ;\r
46 \r
47 static struct sprdfb_device tigerdev = {0};\r
48 \r
49 static uint32_t lcd_id_to_kernel = 0;\r
50 \r
51 \r
52 #define WHTLED_CTL              ANA_LED_CTL\r
53 #define WHTLED_PD_SET           BIT_0\r
54 #define WHTLED_PD_RST           BIT_1\r
55 #define WHTLED_V_SHIFT          2\r
56 #define WHTLED_V_MSK            (0x1F << WHTLED_V_SHIFT)\r
57 \r
58 static void __raw_bits_and(unsigned int v, unsigned int a)\r
59 {\r
60         __raw_writel((__raw_readl(a) & v), a);\r
61 }\r
62 \r
63 static void __raw_bits_or(unsigned int v, unsigned int a)\r
64 {\r
65         __raw_writel((__raw_readl(a) | v), a);\r
66 }\r
67 \r
68 static void LCD_SetPwmRatio(unsigned short value)\r
69 {\r
70         __raw_bits_or(CLK_PWM0_EN, GR_CLK_EN);\r
71         __raw_bits_or(CLK_PWM0_SEL, GR_CLK_EN);\r
72         __raw_bits_or(PIN_PWM0_MOD_VALUE, CPC_LCD_PWM_REG);\r
73         __raw_writel(LCD_PWM_PRESCALE_VALUE, SPRD_PWM0_PRESCALE);\r
74         __raw_writel(value, SPRD_PWM0_CNT);\r
75         __raw_writel(PWM_REG_MSK_VALUE, SPRD_PWM0_PAT_LOW);\r
76         __raw_writel(PWM_REG_MSK_VALUE, SPRD_PWM0_PAT_HIG);\r
77 \r
78         __raw_bits_or(LCD_PWM0_EN, SPRD_PWM0_PRESCALE);\r
79 }\r
80 \r
81 void LCD_SetBackLightBrightness( unsigned long  value)\r
82 {\r
83         unsigned long duty_mod= 0;\r
84         if(value > LCD_PWM_MOD_VALUE)\r
85                 value = LCD_PWM_MOD_VALUE;\r
86 \r
87 /*\r
88         if(value < 0)\r
89                 value = 0;\r
90 */\r
91 \r
92         duty_mod = (value << 8) | LCD_PWM_MOD_VALUE;\r
93         LCD_SetPwmRatio(duty_mod);\r
94 }\r
95 \r
96 \r
97 void set_backlight(uint32_t value)\r
98 {\r
99 #if defined (CONFIG_SP8825) || defined (CONFIG_SP8825EA) || defined (CONFIG_SP8825EB) ||defined(CONFIG_GARDA)\r
100         #if defined (CONFIG_SP6825GA) || defined (CONFIG_SP6825GB)\r
101         __raw_writel(0x121, 0x4C000138);\r
102         #else\r
103         __raw_writel(0x101, 0x4C000138);\r
104         #endif  /*#if defined (CONFIG_SP6825GA) || defined (CONFIG_SP6825GB)*/\r
105 \r
106         __raw_bits_or((1<<5), 0x4B000008);\r
107         __raw_bits_or((1<<8), 0x4A000384);\r
108         __raw_bits_or((1<<8), 0x4A000388);\r
109         __raw_bits_or((1<<8), 0x4A000380);\r
110 #endif\r
111 #if defined (CONFIG_MACH_SP7720G2)\r
112         //gpio8, default gpio func, 2nd pwm function   \r
113         __raw_bits_or((1<<8), 0x8A000004);\r
114         __raw_bits_or((1<<8), 0x8A000008);\r
115         __raw_bits_or((1<<8), 0x8A000000);\r
116 #endif\r
117 \r
118 \r
119 #ifdef CONFIG_SC8810_OPENPHONE\r
120         ANA_REG_AND(WHTLED_CTL, ~(WHTLED_PD_SET | WHTLED_PD_RST));\r
121         ANA_REG_OR(WHTLED_CTL,  WHTLED_PD_RST);\r
122         ANA_REG_MSK_OR (WHTLED_CTL, ( (value << WHTLED_V_SHIFT) &WHTLED_V_MSK), WHTLED_V_MSK);\r
123 #elif CONFIG_MACH_CORI\r
124         __raw_bits_or((1<<5),  0x8B000008);\r
125         __raw_bits_or((1<<10), 0x8A000384);\r
126         __raw_bits_or((1<<10), 0x8A000388);\r
127         __raw_bits_or((1<<10), 0x8A000380);\r
128 #else\r
129         //if (gpio_request(143, "LCD_BL")) {\r
130         //      FB_PRINT("Failed ro request LCD_BL GPIO_%d \n",\r
131         //              143);\r
132         //      return -ENODEV;\r
133         //}\r
134         //gpio_direction_output(143, 1);\r
135         //gpio_set_value(143, 1);\r
136         //__raw_bits_or((1<<5),  0x8B000008);\r
137         //__raw_bits_or((1<<15), 0x8A000384);\r
138         //__raw_bits_or((1<<15), 0x8A000388);\r
139         //__raw_bits_or((1<<15), 0x8A000380);\r
140 #ifndef CONFIG_SP8810EA\r
141         LCD_SetBackLightBrightness(value);\r
142 #else\r
143         __raw_writel(0x101, 0x8C0003e0);\r
144         __raw_bits_or((1<<5),  0x8B000008);\r
145         __raw_bits_or((1<<15), 0x8A000384);\r
146         __raw_bits_or((1<<15), 0x8A000388);\r
147         __raw_bits_or((1<<15), 0x8A000380);\r
148 #endif\r
149 \r
150 #endif\r
151 }\r
152 \r
153 void save_lcd_id_to_kernel(uint32_t id)\r
154 {\r
155         lcd_id_to_kernel = id;\r
156 }\r
157 \r
158 uint32_t load_lcd_id_to_kernel(void)\r
159 {\r
160         return lcd_id_to_kernel;\r
161 }\r
162 \r
163 \r
164 static int real_refresh(struct sprdfb_device *dev)\r
165 {\r
166         int32_t ret;\r
167 \r
168         FB_PRINT("sprdfb: [%s]\n", __FUNCTION__);\r
169 \r
170         if(NULL == dev->panel){\r
171                 FB_PRINT("sprdfb: [%s] fail (no panel!)\n", __FUNCTION__);\r
172                 return -1;\r
173         }\r
174 \r
175         ret = dev->ctrl->refresh(dev);\r
176         if (ret) {\r
177                 FB_PRINT("sprdfb: failed to refresh !!!!\n");\r
178                 return -1;\r
179         }\r
180 \r
181         return 0;\r
182 }\r
183 static int tiger_probe(void * lcdbase)\r
184 {\r
185         struct sprdfb_device *dev = &tigerdev;\r
186 \r
187         FB_PRINT("sprdfb:[%s]\n", __FUNCTION__);\r
188 \r
189 #ifdef CONFIG_MACH_CORI\r
190         LDO_SetVoltLevel(LDO_LDO_SIM3, LDO_VOLT_LEVEL1);\r
191         LDO_TurnOnLDO(LDO_LDO_SIM3);\r
192         LDO_SetVoltLevel(LDO_LDO_VDD28, LDO_VOLT_LEVEL3);\r
193         LDO_TurnOnLDO(LDO_LDO_VDD28);\r
194 #endif\r
195 #ifdef CONFIG_GARDA\r
196         LDO_SetVoltLevel(LDO_LDO_SIM1, LDO_VOLT_LEVEL2);\r
197         LDO_TurnOnLDO(LDO_LDO_SIM1);\r
198 #endif\r
199 #ifdef CONFIG_MACH_SP7720G2\r
200 \r
201 #endif\r
202 /*\r
203         __raw_writel((__raw_readl(0x20900208) | 0xAFE), 0x20900208);\r
204         __raw_writel((__raw_readl(0x20900200) | 0xFFFFFFFF), 0x20900200);\r
205         __raw_writel((__raw_readl(0x20900220) | 0x00500000), 0x20900220);\r
206 */\r
207 \r
208         dev->ctrl = &sprdfb_dispc_ctrl;\r
209         dev->ctrl->early_init(dev);\r
210 \r
211         if (0 != sprdfb_panel_probe(dev)) {\r
212                 sprdfb_panel_remove(dev);\r
213                 dev->ctrl->uninit(dev);\r
214                 FB_PRINT("sprdfb: failed to probe\n");\r
215                 return -EFAULT;\r
216         }\r
217 \r
218         dev->smem_start = (uint32_t)lcdbase;\r
219 \r
220         dev->ctrl->init(dev);\r
221         return 0;\r
222 }\r
223 \r
224 \r
225 void lcd_initcolregs(void)\r
226 {\r
227         FB_PRINT("sprdfb:[%s]\n", __FUNCTION__);\r
228 }\r
229 \r
230 void lcd_disable(void)\r
231 {\r
232         FB_PRINT("sprdfb:[%s]\n", __FUNCTION__);\r
233         sprdfb_panel_remove(&tigerdev);\r
234         tigerdev.ctrl->uninit(&tigerdev);\r
235 }\r
236 \r
237 \r
238 /* References in this function refer to respective Linux kernel sources */\r
239 void lcd_enable(void)\r
240 {\r
241         FB_PRINT("sprdfb:[%s]\n", __FUNCTION__);\r
242 }\r
243 \r
244 void lcd_ctrl_init(void *lcdbase)\r
245 {\r
246         FB_PRINT("sprdfb:[%s]\n", __FUNCTION__);\r
247         tiger_probe(lcdbase);\r
248 }\r
249 \r
250 void lcd_display(void)\r
251 {\r
252         FB_PRINT("sprdfb:[%s]\n", __FUNCTION__);\r
253         real_refresh(&tigerdev);\r
254 }\r
255 \r
256 #ifdef CONFIG_LCD_INFO\r
257 #include <nand.h>\r
258 extern nand_info_t nand_info[];\r
259 \r
260 void lcd_show_board_info(void)\r
261 {\r
262     ulong dram_size, nand_size;\r
263     int i;\r
264     char temp[32];\r
265 \r
266     dram_size = 0;\r
267     for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++)\r
268       dram_size += gd->bd->bi_dram[i].size;\r
269     nand_size = 0;\r
270     for (i = 0; i < CONFIG_SYS_MAX_NAND_DEVICE; i++)\r
271       nand_size += nand_info[i].size;\r
272 \r
273     lcd_printf("\n%s\n", U_BOOT_VERSION);\r
274     lcd_printf("  %ld MB SDRAM, %ld MB NAND\n",\r
275                 dram_size >> 20,\r
276                 nand_size >> 20 );\r
277     lcd_printf("  Board            : esd ARM9 \n");\r
278     lcd_printf("  Mach-type        : %lu\n", gd->bd->bi_arch_number);\r
279 }\r
280 #endif /* CONFIG_LCD_INFO */\r
281 \r