video: sprd: remove build warnings
[profile/mobile/platform/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 struct gpio_chip;
47 extern int sprd_gpio_request(struct gpio_chip *chip, unsigned offset);
48 extern int sprd_gpio_direction_output(struct gpio_chip *chip, unsigned offset, int value);
49 extern void sprd_gpio_set(struct gpio_chip *chip, unsigned offset, int value);
50 \r
51 extern int sprdfb_panel_probe(struct sprdfb_device *dev);\r
52 extern void sprdfb_panel_remove(struct sprdfb_device *dev);\r
53 \r
54 extern struct display_ctrl sprdfb_dispc_ctrl ;\r
55 \r
56 static struct sprdfb_device s_sprdfb_dev = {0};\r
57 \r
58 static uint32_t lcd_id_to_kernel = 0;\r
59 static unsigned char mtp_offset[((MTP_LEN + 6) * 2) + 1] = {0};
60 static uint8_t elvss_offset = 0;
61 static unsigned char hbm_g[(15 * 2) + 1] = {0};
62 \r
63 \r
64 #define WHTLED_CTL              ANA_LED_CTL\r
65 #define WHTLED_PD_SET           BIT_0\r
66 #define WHTLED_PD_RST           BIT_1\r
67 #define WHTLED_V_SHIFT          2\r
68 #define WHTLED_V_MSK            (0x1F << WHTLED_V_SHIFT)\r
69 \r
70 static void __raw_bits_or(unsigned int v, unsigned int a)\r
71 {\r
72         __raw_writel((__raw_readl(a) | v), a);\r
73 }\r
74 \r
75 static void LCD_SetPwmRatio(unsigned short value)\r
76 {\r
77 #if defined CONFIG_SC8830 || (defined CONFIG_SC9630)\r
78         // to do\r
79 #else\r
80         __raw_bits_or(CLK_PWM0_EN, GR_CLK_EN);\r
81         __raw_bits_or(CLK_PWM0_SEL, GR_CLK_EN);\r
82         __raw_bits_or(PIN_PWM0_MOD_VALUE, CPC_LCD_PWM_REG);\r
83         __raw_writel(LCD_PWM_PRESCALE_VALUE, SPRD_PWM0_PRESCALE);\r
84         __raw_writel(value, SPRD_PWM0_CNT);\r
85         __raw_writel(PWM_REG_MSK_VALUE, SPRD_PWM0_PAT_LOW);\r
86         __raw_writel(PWM_REG_MSK_VALUE, SPRD_PWM0_PAT_HIG);\r
87         __raw_bits_or(LCD_PWM0_EN, SPRD_PWM0_PRESCALE);\r
88 #endif\r
89 }\r
90 \r
91 void LCD_SetBackLightBrightness( unsigned long  value)\r
92 {\r
93         unsigned long duty_mod= 0;\r
94         if(value > LCD_PWM_MOD_VALUE)\r
95                 value = LCD_PWM_MOD_VALUE;\r
96 \r
97 /*\r
98         if(value < 0)\r
99                 value = 0;\r
100 */\r
101 \r
102         duty_mod = (value << 8) | LCD_PWM_MOD_VALUE;\r
103         LCD_SetPwmRatio(duty_mod);\r
104 }\r
105 \r
106 #if defined(CONFIG_SPX15) && defined(CONFIG_EMMC_BOOT)\r
107 static uint32 get_adie_chipid(void)\r
108 {\r
109        uint32 chip_id;\r
110        chip_id = (ANA_REG_GET(ANA_REG_GLB_CHIP_ID_HIGH) & 0xffff) << 16;\r
111        chip_id |= ANA_REG_GET(ANA_REG_GLB_CHIP_ID_LOW) & 0xffff;\r
112        return chip_id;\r
113 }\r
114 #endif\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
395         /* should not be here */
396         return '0';
397 }
398
399 static void hex_encoder(unsigned char *in, char *out, int sz)
400 {
401         int i = 0;
402
403         for (i = 0; i < sz; i++) {
404                 *out = byte2hex((in[i] & 0xF0) >> 4);
405                 out++;
406                 *out = byte2hex((in[i] & 0x0F));
407                 out++;
408         }
409 }
410
411 void save_mtp_offset_to_kernel(uint8_t *mtp)
412 {
413         hex_encoder((unsigned char *)mtp, (char *)mtp_offset, (MTP_LEN + 6));
414         mtp_offset[(MTP_LEN + 6) * 2] = '\0';
415 }
416
417 uint8_t *load_mtp_offset_to_kernel(void)
418 {
419         return mtp_offset;
420 }
421
422 void save_elvss_offset_to_kernel(uint8_t elvss)
423 {
424         elvss_offset = elvss;
425 }
426
427 uint8_t load_elvss_offset_to_kernel(void)
428 {
429         return elvss_offset;
430 }
431
432 void save_hbm_offset_to_kernel(uint8_t *hbm)
433 {
434         hex_encoder((unsigned char *)hbm, (char *)hbm_g, 15);
435         hbm_g[15 * 2] = '\0';
436 }
437
438 uint8_t *load_hbm_offset_to_kernel(void)
439 {
440         return hbm_g;
441 }
442
443 static int real_refresh(struct sprdfb_device *dev)\r
444 {\r
445         int32_t ret;\r
446 \r
447         FB_PRINT("sprdfb: [%s]\n", __FUNCTION__);\r
448 \r
449         if(NULL == dev->panel){\r
450                 printf("sprdfb: [%s] fail (no panel!)\n", __FUNCTION__);\r
451                 return -1;\r
452         }\r
453 \r
454         ret = dev->ctrl->refresh(dev);\r
455         if (ret) {\r
456                 printf("sprdfb: failed to refresh !!!!\n");\r
457                 return -1;\r
458         }\r
459 \r
460         return 0;\r
461 }\r
462 static int sprdfb_probe(void * lcdbase)\r
463 {\r
464         struct sprdfb_device *dev = &s_sprdfb_dev;\r
465 \r
466         printf("sprdfb:[%s]\n", __FUNCTION__);\r
467 \r
468         set_backlight(0);\r
469 \r
470 #ifdef CONFIG_MACH_CORI\r
471         LDO_SetVoltLevel(LDO_LDO_SIM3, LDO_VOLT_LEVEL1);\r
472         LDO_TurnOnLDO(LDO_LDO_SIM3);\r
473         LDO_SetVoltLevel(LDO_LDO_VDD28, LDO_VOLT_LEVEL3);\r
474         LDO_TurnOnLDO(LDO_LDO_VDD28);\r
475 #endif\r
476 #ifdef CONFIG_GARDA\r
477         LDO_SetVoltLevel(LDO_LDO_SIM1, LDO_VOLT_LEVEL2);\r
478         LDO_TurnOnLDO(LDO_LDO_SIM1);\r
479 #endif\r
480 #ifdef LCD_VDD_2V8_TO_3V0
481         //need to set v_lcd_3.0v for lcd. LDO_VDD28_V default is 0xA0 =2.8v, 10mv/step, 0xb4=3.0v
482         sci_adi_write(ANA_REG_GLB_LDO_V_CTRL3, 0xB4, 0xFF);        
483 #endif
484 /*\r
485         __raw_writel((__raw_readl(0x20900208) | 0xAFE), 0x20900208);\r
486         __raw_writel((__raw_readl(0x20900200) | 0xFFFFFFFF), 0x20900200);\r
487         __raw_writel((__raw_readl(0x20900220) | 0x00500000), 0x20900220);\r
488 */\r
489 #ifdef CONFIG_SPX15\r
490 #if !defined (CONFIG_POCKET2) && !defined (CONFIG_CORSICA_VE) && !defined (CONFIG_VIVALTO) && !defined (CONFIG_YOUNG2)\r
491         sprd_gpio_request(NULL, 190);\r
492         sprd_gpio_direction_output(NULL, 190, 1);\r
493 #endif\r
494 #endif\r
495 \r
496         dev->ctrl = &sprdfb_dispc_ctrl;\r
497         dev->ctrl->early_init(dev);\r
498 \r
499         if (0 != sprdfb_panel_probe(dev)) {\r
500                 sprdfb_panel_remove(dev);\r
501                 dev->ctrl->uninit(dev);\r
502                 printf("sprdfb: failed to probe\n");\r
503                 return -EFAULT;\r
504         }\r
505 \r
506 #ifdef CONFIG_FB_LOW_RES_SIMU\r
507 #if (defined LCD_DISPLAY_WIDTH) && (defined LCD_DISPLAY_HEIGHT)\r
508         dev->display_width = LCD_DISPLAY_WIDTH;\r
509         dev->display_height = LCD_DISPLAY_HEIGHT;\r
510 #else\r
511         dev->display_width = dev->panel->width;\r
512         dev->display_height = dev->panel->height;\r
513 #endif\r
514 #endif\r
515 \r
516         dev->smem_start = ((uint32_t)lcdbase);\r
517         dev->ctrl->init(dev);\r
518         return 0;\r
519 }\r
520 \r
521 \r
522 void lcd_initcolregs(void)\r
523 {\r
524         FB_PRINT("sprdfb:[%s]\n", __FUNCTION__);\r
525 }\r
526 \r
527 void lcd_disable(void)\r
528 {\r
529         printf("sprdfb:[%s]\n", __FUNCTION__);\r
530         sprdfb_panel_remove(&s_sprdfb_dev);\r
531         s_sprdfb_dev.ctrl->uninit(&s_sprdfb_dev);\r
532 }\r
533 \r
534 \r
535 /* References in this function refer to respective Linux kernel sources */\r
536 void lcd_enable(void)\r
537 {\r
538         FB_PRINT("sprdfb:[%s]\n", __FUNCTION__);\r
539 }\r
540 \r
541 void lcd_ctrl_init(void *lcdbase)\r
542 {\r
543         FB_PRINT("sprdfb:[%s]\n", __FUNCTION__);\r
544         sprdfb_probe(lcdbase);\r
545 }\r
546 \r
547 void lcd_display(void)\r
548 {\r
549         printf("sprdfb:[%s]\n", __FUNCTION__);\r
550         real_refresh(&s_sprdfb_dev);\r
551 }\r
552 \r
553 #ifdef CONFIG_LCD_INFO\r
554 #include <nand.h>\r
555 extern nand_info_t nand_info[];\r
556 \r
557 void lcd_show_board_info(void)\r
558 {\r
559     ulong dram_size, nand_size;\r
560     int i;\r
561     char temp[32];\r
562 \r
563     dram_size = 0;\r
564     for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++)\r
565       dram_size += gd->bd->bi_dram[i].size;\r
566     nand_size = 0;\r
567     for (i = 0; i < CONFIG_SYS_MAX_NAND_DEVICE; i++)\r
568       nand_size += nand_info[i].size;\r
569 \r
570     lcd_printf("\n%s\n", U_BOOT_VERSION);\r
571     lcd_printf("  %ld MB SDRAM, %ld MB NAND\n",\r
572                 dram_size >> 20,\r
573                 nand_size >> 20 );\r
574     lcd_printf("  Board            : esd ARM9 \n");\r
575     lcd_printf("  Mach-type        : %lu\n", gd->bd->bi_arch_number);\r
576 }\r
577 #endif /* CONFIG_LCD_INFO */\r
578 \r