tizen 2.4 release
[kernel/u-boot-tm1.git] / drivers / video / sprdfb / 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/sprd_lcd.h>\r
20 #include <asm/arch/ldo.h>\r
21 #if defined CONFIG_SC8830 || (defined CONFIG_SC9630)\r
22 #include <asm/arch/sprd_reg_global.h>\r
23 #include <asm/arch/adi_hal_internal.h>\r
24 #else\r
25 #include <asm/arch/sc8810_reg_global.h>\r
26 #endif\r
27 #include <asm/arch/regs_global.h>\r
28 #include <asm/arch/regs_cpc.h>\r
29 #include <asm/arch/sprd_reg.h>\r
30 \r
31 #include "sprdfb.h"\r
32
33 #define MTP_LEN 0x21
34 \r
35 \r
36 void *lcd_base = NULL;          /* Start of framebuffer memory  */\r
37 void *lcd_console_address;      /* Start of console buffer      */\r
38 \r
39 int lcd_line_length;\r
40 int lcd_color_fg;\r
41 int lcd_color_bg;\r
42 \r
43 short console_col;\r
44 short console_row;\r
45 \r
46 \r
47 \r
48 extern int sprdfb_panel_probe(struct sprdfb_device *dev);\r
49 extern void sprdfb_panel_remove(struct sprdfb_device *dev);\r
50 \r
51 extern struct display_ctrl sprdfb_dispc_ctrl ;\r
52 \r
53 static struct sprdfb_device s_sprdfb_dev = {0};\r
54 \r
55 static uint32_t lcd_id_to_kernel = 0;\r
56 static unsigned char mtp_offset[((MTP_LEN + 6) * 2) + 1] = {0};
57 static uint8_t elvss_offset = 0;
58 static unsigned char hbm_g[(15 * 2) + 1] = {0};
59 \r
60 \r
61 #define WHTLED_CTL              ANA_LED_CTL\r
62 #define WHTLED_PD_SET           BIT_0\r
63 #define WHTLED_PD_RST           BIT_1\r
64 #define WHTLED_V_SHIFT          2\r
65 #define WHTLED_V_MSK            (0x1F << WHTLED_V_SHIFT)\r
66 \r
67 static void __raw_bits_and(unsigned int v, unsigned int a)\r
68 {\r
69         __raw_writel((__raw_readl(a) & v), a);\r
70 }\r
71 \r
72 static void __raw_bits_or(unsigned int v, unsigned int a)\r
73 {\r
74         __raw_writel((__raw_readl(a) | v), a);\r
75 }\r
76 \r
77 static void LCD_SetPwmRatio(unsigned short value)\r
78 {\r
79 #if defined CONFIG_SC8830 || (defined CONFIG_SC9630)\r
80         // to do\r
81 #else\r
82         __raw_bits_or(CLK_PWM0_EN, GR_CLK_EN);\r
83         __raw_bits_or(CLK_PWM0_SEL, GR_CLK_EN);\r
84         __raw_bits_or(PIN_PWM0_MOD_VALUE, CPC_LCD_PWM_REG);\r
85         __raw_writel(LCD_PWM_PRESCALE_VALUE, SPRD_PWM0_PRESCALE);\r
86         __raw_writel(value, SPRD_PWM0_CNT);\r
87         __raw_writel(PWM_REG_MSK_VALUE, SPRD_PWM0_PAT_LOW);\r
88         __raw_writel(PWM_REG_MSK_VALUE, SPRD_PWM0_PAT_HIG);\r
89         __raw_bits_or(LCD_PWM0_EN, SPRD_PWM0_PRESCALE);\r
90 #endif\r
91 }\r
92 \r
93 void LCD_SetBackLightBrightness( unsigned long  value)\r
94 {\r
95         unsigned long duty_mod= 0;\r
96         if(value > LCD_PWM_MOD_VALUE)\r
97                 value = LCD_PWM_MOD_VALUE;\r
98 \r
99 /*\r
100         if(value < 0)\r
101                 value = 0;\r
102 */\r
103 \r
104         duty_mod = (value << 8) | LCD_PWM_MOD_VALUE;\r
105         LCD_SetPwmRatio(duty_mod);\r
106 }\r
107 \r
108 static uint32 get_adie_chipid(void)\r
109 {\r
110        uint32 chip_id;\r
111        chip_id = (ANA_REG_GET(ANA_REG_GLB_CHIP_ID_HIGH) & 0xffff) << 16;\r
112        chip_id |= ANA_REG_GET(ANA_REG_GLB_CHIP_ID_LOW) & 0xffff;\r
113        return chip_id;\r
114 }\r
115 \r
116 void sprd_white_led_init(void)\r
117 {\r
118         __raw_writel(0xc000,0x400388d8);\r
119 \r
120         __raw_writel(0x0100,0x40038020);\r
121         __raw_writel(0xffff,0x40038024);\r
122         __raw_writel(0xffff,0x4003802c);\r
123         __raw_writel(0xffff,0x40038030);\r
124 \r
125         __raw_writel(0x0100,0x40038020);\r
126 \r
127         __raw_writel(0x0081,0x400388d4);\r
128 //      __raw_writel(0xff80,0x400388d8);\r
129 }\r
130 \r
131 #if (!defined(CONFIG_ARCH_SCX35L))
132
133 void (*lcd_panel_cabc_pwm_bl)(int brightness) = NULL;
134
135 #ifndef CONFIG_SPX20
136 void set_backlight(uint32_t value)\r
137 {\r
138 #if (defined(CONFIG_SP8830GGA) || \\r
139         defined(CONFIG_SP8830GEA) || \\r
140         defined(CONFIG_SP8730SEA) || \
141         defined(CONFIG_SP7730GGA) || \\r
142         defined(CONFIG_SP7731GEA) || defined(CONFIG_SP7731GEA_HD) || defined(CONFIG_SP8730SEEA_QHD) || defined(CONFIG_SP8730SEEA_JIG) || defined(CONFIG_SP7731GEA_HD2) || defined(CONFIG_SP7731GEA_HD) || defined(CONFIG_SP7731GEA_HDR) || defined(CONFIG_SP7731GEA_QHD) || defined(CONFIG_SP7731GEA_FWVGA) || defined(CONFIG_SP7731GEAOPENPHONE) || \\r
143         defined(CONFIG_SP7731GEA_LC) || \\r
144         defined(CONFIG_SP7731GGA_LC) || defined(CONFIG_SP7730GGA_LC) || \\r
145         defined(CONFIG_SP7730GGAOPENPHONE) || \\r
146         defined(CONFIG_SP5735C2EA) || \\r
147         defined(CONFIG_SC9620OPENPHONE) || \\r
148         defined(CONFIG_SC9620REFERPHONE) ||defined(CONFIG_SP7720))\r
149         \r
150         /*backlight is driven by PWMD (PWMD=PWM3) */\r
151         __raw_bits_or((0x1 << 0), 0x402d0044);//use ext_26m for clk_pwm3 parent clk\r
152         if(0 == value) {\r
153                 __raw_writel(0x0000, 0x40260060);\r
154                 printf("sprd backlight power off. brightness = %d (use PWM3 for external backlight control)\n", value);\r
155         } else {\r
156                 value = (value & 0xff) >> 2;\r
157                 /*enbale pwm3*/\r
158                 __raw_bits_or((0x1 << 7), 0x402e0000);\r
159                 /*config pwm3*/\r
160                 __raw_writel((value << 8) | 0xff, 0x40260064);\r
161                 __raw_writel(0xffff, 0x4026006c);\r
162                 __raw_writel(0xffff, 0x40260070);\r
163                 __raw_writel(0x0100, 0x40260060);\r
164                 printf("sprd backlight power on. brightness = %d (use PWM3 for external backlight control)\n", value);\r
165         }\r
166         return;\r
167 #endif\r
168
169 #if (defined(CONFIG_SP8830) || defined(CONFIG_SPX15))\r
170 \r
171 int white_led = 0;\r
172 #if (defined(CONFIG_SPX15))\r
173         #if (defined(CONFIG_EMMC_BOOT))\r
174                 uint32 chip_id;\r
175                 chip_id = get_adie_chipid();\r
176                 printf("adie chip id: 0x%08X\n", chip_id);\r
177                 if(0x2711A000 == chip_id) {\r
178                         white_led = 1;\r
179                         printf("CONFIG_EMMC_BOOT is set, and the adie chip id is 0x2711A000, therefore, white_led=1\n");\r
180                 }\r
181                 else {\r
182                         white_led = 0;\r
183                         printf("CONFIG_EMMC_BOOT is set, but the adie chip id is NOT 0x2711A000, therefore, white_led=0\n");\r
184                 }\r
185         #else\r
186                 white_led = 0;\r
187                 printf("CONFIG_EMMC_BOOT is NOT set, therefore, white_led=0\n");\r
188         #endif\r
189 #else\r
190         white_led = 1;\r
191         printf("CONFIG_SP8830 is set and CONFIG_SPX15 is NOT set, therefore, white_led=1\n");\r
192 #endif\r
193 \r
194 #if (defined(CONFIG_SPX15))\r
195         if(1 == white_led) {\r
196                 /*backlight is driven by whiteled */\r
197                 sprd_white_led_init();\r
198                 if (value == 0) {\r
199                         ANA_REG_SET(0x400388d4,0);\r
200                         printf("sprd backlight power off (SPX15 use WHITE_LED backlight control)\n");\r
201                 } else {\r
202                         __raw_writel(0x0181,0x400388d4);\r
203                         __raw_writel(0x0480,0x400388d8);\r
204                         printf("sprd backlight power on (SPX15 use WHITE_LED backlight control)\n");\r
205                 }\r
206         //============================================both white led and pwm\r
207                 {\r
208                         /*backlight is driven by PWMC (PWMC=PWM2) */\r
209                         __raw_bits_or((0x1 << 0), 0x402d0040);//use ext_26m for clk_pwm2 parent clk\r
210                         if(0 == value) {\r
211                                 __raw_writel(0x0000, 0x40260040);\r
212                                 printf("sprd backlight power off (SPX15 use PWM2 for external backlight control)\n");\r
213                         }\r
214                         else {\r
215                                 value = (value & 0xff) >> 2;\r
216                                 /*enbale pwm2*/\r
217                                 __raw_bits_or((0x1 << 6), 0x402e0000);\r
218                                 /*config pwm2*/\r
219                                 __raw_writel((value << 8) | 0xff, 0x40260044);\r
220                                 __raw_writel(0xffff, 0x4026004c);\r
221                                 __raw_writel(0xffff, 0x40260050);\r
222                                 __raw_writel(0x0100, 0x40260040);\r
223                                 printf("sprd backlight power on (SPX15 use PWM2 for external backlight control)\n");\r
224                         }\r
225                 }\r
226         //============================================both white led and pwm\r
227         }\r
228         else {\r
229                 /*backlight is driven by PWMC (PWMC=PWM2) */\r
230                 __raw_bits_or((0x1 << 0), 0x402d0040);//use ext_26m for clk_pwm2 parent clk\r
231                 if(0 == value) {\r
232                         __raw_writel(0x0000, 0x40260040);\r
233                         printf("sprd backlight power off (SPX15 use PWM2 for external backlight control)\n");\r
234                 }\r
235                 else {\r
236                         value = (value & 0xff) >> 2;\r
237                         /*enbale pwm2*/\r
238                         __raw_bits_or((0x1 << 6), 0x402e0000);\r
239                         /*config pwm2*/\r
240                         __raw_writel((value << 8) | 0xff, 0x40260044);\r
241                         __raw_writel(0xffff, 0x4026004c);\r
242                         __raw_writel(0xffff, 0x40260050);\r
243                         __raw_writel(0x0100, 0x40260040);\r
244                         printf("sprd backlight power on (SPX15 use PWM2 for external backlight control)\n");\r
245                 }\r
246         }\r
247 #else\r
248         /*backlight is driven by whiteled */\r
249         if (value == 0) {\r
250                 ANA_REG_SET(0x40038894,0);\r
251                 printf("sprd backlight power off (SP8830 use WHITE_LED backlight control)\n");\r
252         } else {\r
253                 ANA_REG_SET(0x40038894,(ANA_REG_GET(0x40038894)|(0x3 << 7)));\r
254                 printf("sprd backlight power on (SP8830 use WHITE_LED backlight control)\n");\r
255         }\r
256 #endif\r
257 \r
258 #elif defined(CONFIG_KANAS_W) || defined(CONFIG_KANAS_TD) || defined(CONFIG_PIKEAYOUNG2DTV) || defined(CONFIG_GRANDPRIME3G_VE) || defined(CONFIG_GRANDPRIME_DTV) || defined(CONFIG_TIZENZ3_3G)
259         FB_PRINT("set_backlight\n");\r
260         /* GPIO214 */\r
261         static int is_init = 0;\r
262 \r
263 #if defined(CONFIG_PIKEAYOUNG2DTV)\r
264 #define PWM_BACKLIGHT_GPIO 234\r
265 #endif\r
266 \r
267         if (!is_init) {\r
268                 sprd_gpio_request(NULL, BACKLIGHT_GPIO);\r
269                 sprd_gpio_direction_output(NULL, BACKLIGHT_GPIO, 0);\r
270 #if defined(CONFIG_GRANDPRIME3G_VE) || defined(CONFIG_GRANDPRIME_DTV) || defined(CONFIG_TIZENZ3_3G)
271                 sprd_gpio_request(NULL, LCD_LDO_EN_GPIO);\r
272                 sprd_gpio_direction_output(NULL, LCD_LDO_EN_GPIO, 1);\r
273 #endif
274                 #if defined(CONFIG_PIKEAYOUNG2DTV)\r
275                 sprd_gpio_request(NULL, PWM_BACKLIGHT_GPIO);\r
276                 sprd_gpio_direction_output(NULL, PWM_BACKLIGHT_GPIO, 0);\r
277                 #endif          \r
278                 is_init = 1;\r
279         }\r
280 \r
281         if (0 == value) {\r
282                 sprd_gpio_set(NULL, BACKLIGHT_GPIO, 0);\r
283                 #if defined(CONFIG_PIKEAYOUNG2DTV)\r
284                 sprd_gpio_set(NULL, PWM_BACKLIGHT_GPIO, 0);\r
285                 #endif\r
286         }\r
287         else {\r
288                 sprd_gpio_set(NULL, BACKLIGHT_GPIO, 1);\r
289                 #if defined(CONFIG_PIKEAYOUNG2DTV)\r
290                 sprd_gpio_set(NULL, PWM_BACKLIGHT_GPIO, 1);\r
291                 #endif\r
292         }\r
293 #endif\r
294 \r
295 #if defined (CONFIG_POCKET2) || defined (CONFIG_CORSICA_VE) ||defined (CONFIG_VIVALTO) || defined (CONFIG_YOUNG2)\r
296         FB_PRINT("sprdfb: [%s] turn on the backlight\n", __FUNCTION__);\r
297 \r
298         sprd_gpio_request(NULL, 190);\r
299         sprd_gpio_direction_output(NULL, 190, 0);\r
300         if(0 == value){\r
301                 sprd_gpio_set(NULL, 190, 0);\r
302         }else\r
303         {\r
304             sprd_gpio_set(NULL, 190, 1);\r
305         }\r
306 #endif\r
307
308 #if (defined(CONFIG_TSHARKWSAMSUNG) || defined(CONFIG_CORE3) || defined(CONFIG_COREPRIME3G_VE) || defined(CONFIG_TSHARK2J2_3G) || defined(CONFIG_TIZENZ3_3G) || defined(CONFIG_GRANDPRIME_DTV)) || defined(CONFIG_GRANDPRIME3G_VE)
309         if (lcd_panel_cabc_pwm_bl) {
310                 lcd_panel_cabc_pwm_bl(value); /* lcd panel CABC PWM auto control */
311         } else {
312                 /*backlight is driven by PWMC (PWMC=PWM2) */
313 //                __raw_bits_or((0x1 << 0), 0x402d0040);//use ext_26m for clk_pwm2 parent clk^M
314                 if(0 == value) {
315                         __raw_writel(0x0000, 0x40260040);
316                         printf("sprd backlight power off (SPX15 use PWM2 for external backlight control)\n");
317                 }else {
318                         /*enbale pwm2*/
319                         __raw_bits_or((0x1 << 6), 0x402e0000);
320                         /*config pwm2*/
321                         __raw_writel((value << 8) | 0xff, 0x40260044);
322                         __raw_writel(0xffff, 0x4026004c);
323                         __raw_writel(0xffff, 0x40260050);
324                         __raw_writel(0x0100, 0x40260040);
325                         printf("sprd backlight power on (SPX15 use PWM2 for external backlight control)\n");
326                 }
327         }
328 #endif
329
330 #if defined (CONFIG_SP8825) || defined (CONFIG_SP8825EA) || defined (CONFIG_SP8825EB) ||defined(CONFIG_GARDA)\r
331         __raw_writel(0x101, 0x4C000138);\r
332         __raw_bits_or((1<<5), 0x4B000008);\r
333         __raw_bits_or((1<<8), 0x4A000384);\r
334         __raw_bits_or((1<<8), 0x4A000388);\r
335         __raw_bits_or((1<<8), 0x4A000380);\r
336 #endif\r
337 \r
338 \r
339 #ifdef CONFIG_SC8810_OPENPHONE\r
340         ANA_REG_AND(WHTLED_CTL, ~(WHTLED_PD_SET | WHTLED_PD_RST));\r
341         ANA_REG_OR(WHTLED_CTL,  WHTLED_PD_RST);\r
342         ANA_REG_MSK_OR (WHTLED_CTL, ( (value << WHTLED_V_SHIFT) &WHTLED_V_MSK), WHTLED_V_MSK);\r
343 #elif CONFIG_MACH_CORI\r
344         __raw_bits_or((1<<5),  0x8B000008);\r
345         __raw_bits_or((1<<10), 0x8A000384);\r
346         __raw_bits_or((1<<10), 0x8A000388);\r
347         __raw_bits_or((1<<10), 0x8A000380);\r
348 #else\r
349         //if (gpio_request(143, "LCD_BL")) {\r
350         //      FB_PRINT("Failed ro request LCD_BL GPIO_%d \n",\r
351         //              143);\r
352         //      return -ENODEV;\r
353         //}\r
354         //gpio_direction_output(143, 1);\r
355         //gpio_set_value(143, 1);\r
356         //__raw_bits_or((1<<5),  0x8B000008);\r
357         //__raw_bits_or((1<<15), 0x8A000384);\r
358         //__raw_bits_or((1<<15), 0x8A000388);\r
359         //__raw_bits_or((1<<15), 0x8A000380);\r
360 #ifndef CONFIG_SP8810EA\r
361         LCD_SetBackLightBrightness(value);\r
362 #else\r
363         __raw_writel(0x101, 0x8C0003e0);\r
364         __raw_bits_or((1<<5),  0x8B000008);\r
365         __raw_bits_or((1<<15), 0x8A000384);\r
366         __raw_bits_or((1<<15), 0x8A000388);\r
367         __raw_bits_or((1<<15), 0x8A000380);\r
368 #endif\r
369 \r
370 #endif\r
371 }\r
372 #endif\r
373 #endif
374 void save_lcd_id_to_kernel(uint32_t id)\r
375 {\r
376         lcd_id_to_kernel = id;\r
377 }\r
378 \r
379 uint32_t load_lcd_id_to_kernel(void)\r
380 {\r
381         return lcd_id_to_kernel;\r
382 }\r
383 \r
384 \r
385
386 static char byte2hex(unsigned char b)
387 {
388         if (b >= 16)
389                 return '0';
390         if (b <= 9)
391                 return '0' + b;
392         if (b >= 10 && b <= 15)
393                 return 'a' + (b - 10);
394 /*      return '0'; */
395 }
396
397 static void hex_encoder(unsigned char *in, char *out, int sz)
398 {
399         int i = 0;
400
401         for (i = 0; i < sz; i++) {
402                 *out = byte2hex((in[i] & 0xF0) >> 4);
403                 out++;
404                 *out = byte2hex((in[i] & 0x0F));
405                 out++;
406         }
407 }
408
409 void save_mtp_offset_to_kernel(uint8_t *mtp)
410 {
411         hex_encoder((unsigned char *)mtp, mtp_offset, (MTP_LEN + 6));
412         mtp_offset[(MTP_LEN + 6) * 2] = '\0';
413 }
414
415 uint8_t *load_mtp_offset_to_kernel(void)
416 {
417         return mtp_offset;
418 }
419
420 void save_elvss_offset_to_kernel(uint8_t elvss)
421 {
422         elvss_offset = elvss;
423 }
424
425 uint8_t load_elvss_offset_to_kernel(void)
426 {
427         return elvss_offset;
428 }
429
430 void save_hbm_offset_to_kernel(uint8_t *hbm)
431 {
432         hex_encoder((unsigned char *)hbm, hbm_g, 15);
433         hbm_g[15 * 2] = '\0';
434 }
435
436 uint8_t *load_hbm_offset_to_kernel(void)
437 {
438         return hbm_g;
439 }
440
441 static int real_refresh(struct sprdfb_device *dev)\r
442 {\r
443         int32_t ret;\r
444 \r
445         FB_PRINT("sprdfb: [%s]\n", __FUNCTION__);\r
446 \r
447         if(NULL == dev->panel){\r
448                 printf("sprdfb: [%s] fail (no panel!)\n", __FUNCTION__);\r
449                 return -1;\r
450         }\r
451 \r
452         ret = dev->ctrl->refresh(dev);\r
453         if (ret) {\r
454                 printf("sprdfb: failed to refresh !!!!\n");\r
455                 return -1;\r
456         }\r
457 \r
458         return 0;\r
459 }\r
460 static int sprdfb_probe(void * lcdbase)\r
461 {\r
462         struct sprdfb_device *dev = &s_sprdfb_dev;\r
463 \r
464         printf("sprdfb:[%s]\n", __FUNCTION__);\r
465 \r
466         set_backlight(0);\r
467 \r
468 #ifdef CONFIG_MACH_CORI\r
469         LDO_SetVoltLevel(LDO_LDO_SIM3, LDO_VOLT_LEVEL1);\r
470         LDO_TurnOnLDO(LDO_LDO_SIM3);\r
471         LDO_SetVoltLevel(LDO_LDO_VDD28, LDO_VOLT_LEVEL3);\r
472         LDO_TurnOnLDO(LDO_LDO_VDD28);\r
473 #endif\r
474 #ifdef CONFIG_GARDA\r
475         LDO_SetVoltLevel(LDO_LDO_SIM1, LDO_VOLT_LEVEL2);\r
476         LDO_TurnOnLDO(LDO_LDO_SIM1);\r
477 #endif\r
478 #ifdef LCD_VDD_2V8_TO_3V0
479         //need to set v_lcd_3.0v for lcd. LDO_VDD28_V default is 0xA0 =2.8v, 10mv/step, 0xb4=3.0v
480         sci_adi_write(ANA_REG_GLB_LDO_V_CTRL3, 0xB4, 0xFF);        
481 #endif
482 /*\r
483         __raw_writel((__raw_readl(0x20900208) | 0xAFE), 0x20900208);\r
484         __raw_writel((__raw_readl(0x20900200) | 0xFFFFFFFF), 0x20900200);\r
485         __raw_writel((__raw_readl(0x20900220) | 0x00500000), 0x20900220);\r
486 */\r
487 #ifdef CONFIG_SPX15\r
488 #if !defined (CONFIG_POCKET2) && !defined (CONFIG_CORSICA_VE) && !defined (CONFIG_VIVALTO) && !defined (CONFIG_YOUNG2)\r
489         sprd_gpio_request(NULL, 190);\r
490         sprd_gpio_direction_output(NULL, 190, 1);\r
491 #endif\r
492 #endif\r
493 \r
494         dev->ctrl = &sprdfb_dispc_ctrl;\r
495         dev->ctrl->early_init(dev);\r
496 \r
497         if (0 != sprdfb_panel_probe(dev)) {\r
498                 sprdfb_panel_remove(dev);\r
499                 dev->ctrl->uninit(dev);\r
500                 printf("sprdfb: failed to probe\n");\r
501                 return -EFAULT;\r
502         }\r
503 \r
504 #ifdef CONFIG_FB_LOW_RES_SIMU\r
505 #if (defined LCD_DISPLAY_WIDTH) && (defined LCD_DISPLAY_HEIGHT)\r
506         dev->display_width = LCD_DISPLAY_WIDTH;\r
507         dev->display_height = LCD_DISPLAY_HEIGHT;\r
508 #else\r
509         dev->display_width = dev->panel->width;\r
510         dev->display_height = dev->panel->height;\r
511 #endif\r
512 #endif\r
513 \r
514         dev->smem_start = ((uint32_t)lcdbase);\r
515         dev->ctrl->init(dev);\r
516         return 0;\r
517 }\r
518 \r
519 \r
520 void lcd_initcolregs(void)\r
521 {\r
522         FB_PRINT("sprdfb:[%s]\n", __FUNCTION__);\r
523 }\r
524 \r
525 void lcd_disable(void)\r
526 {\r
527         printf("sprdfb:[%s]\n", __FUNCTION__);\r
528         sprdfb_panel_remove(&s_sprdfb_dev);\r
529         s_sprdfb_dev.ctrl->uninit(&s_sprdfb_dev);\r
530 }\r
531 \r
532 \r
533 /* References in this function refer to respective Linux kernel sources */\r
534 void lcd_enable(void)\r
535 {\r
536         FB_PRINT("sprdfb:[%s]\n", __FUNCTION__);\r
537 }\r
538 \r
539 void lcd_ctrl_init(void *lcdbase)\r
540 {\r
541         FB_PRINT("sprdfb:[%s]\n", __FUNCTION__);\r
542         sprdfb_probe(lcdbase);\r
543 }\r
544 \r
545 void lcd_display(void)\r
546 {\r
547         printf("sprdfb:[%s]\n", __FUNCTION__);\r
548         real_refresh(&s_sprdfb_dev);\r
549 }\r
550 \r
551 #ifdef CONFIG_LCD_INFO\r
552 #include <nand.h>\r
553 extern nand_info_t nand_info[];\r
554 \r
555 void lcd_show_board_info(void)\r
556 {\r
557     ulong dram_size, nand_size;\r
558     int i;\r
559     char temp[32];\r
560 \r
561     dram_size = 0;\r
562     for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++)\r
563       dram_size += gd->bd->bi_dram[i].size;\r
564     nand_size = 0;\r
565     for (i = 0; i < CONFIG_SYS_MAX_NAND_DEVICE; i++)\r
566       nand_size += nand_info[i].size;\r
567 \r
568     lcd_printf("\n%s\n", U_BOOT_VERSION);\r
569     lcd_printf("  %ld MB SDRAM, %ld MB NAND\n",\r
570                 dram_size >> 20,\r
571                 nand_size >> 20 );\r
572     lcd_printf("  Board            : esd ARM9 \n");\r
573     lcd_printf("  Mach-type        : %lu\n", gd->bd->bi_arch_number);\r
574 }\r
575 #endif /* CONFIG_LCD_INFO */\r
576 \r