1 /******************************************************************************
\r
2 ** File Name: sprdfb_main.h *
\r
5 ** Copyright: 2005 Spreatrum, Incoporated. All Rights Reserved. *
\r
7 ******************************************************************************/
\r
8 /******************************************************************************
\r
10 **---------------------------------------------------------------------------*
\r
11 ** DATE NAME DESCRIPTION *
\r
13 ******************************************************************************/
\r
17 #include <asm/errno.h>
\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
25 #include <asm/arch/sc8810_reg_global.h>
\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
36 void *lcd_base = NULL; /* Start of framebuffer memory */
\r
37 void *lcd_console_address; /* Start of console buffer */
\r
39 int lcd_line_length;
\r
48 extern int sprdfb_panel_probe(struct sprdfb_device *dev);
\r
49 extern void sprdfb_panel_remove(struct sprdfb_device *dev);
\r
51 extern struct display_ctrl sprdfb_dispc_ctrl ;
\r
53 static struct sprdfb_device s_sprdfb_dev = {0};
\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};
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
67 static void __raw_bits_and(unsigned int v, unsigned int a)
\r
69 __raw_writel((__raw_readl(a) & v), a);
\r
72 static void __raw_bits_or(unsigned int v, unsigned int a)
\r
74 __raw_writel((__raw_readl(a) | v), a);
\r
77 static void LCD_SetPwmRatio(unsigned short value)
\r
79 #if defined CONFIG_SC8830 || (defined CONFIG_SC9630)
\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
93 void LCD_SetBackLightBrightness( unsigned long value)
\r
95 unsigned long duty_mod= 0;
\r
96 if(value > LCD_PWM_MOD_VALUE)
\r
97 value = LCD_PWM_MOD_VALUE;
\r
104 duty_mod = (value << 8) | LCD_PWM_MOD_VALUE;
\r
105 LCD_SetPwmRatio(duty_mod);
\r
108 static uint32 get_adie_chipid(void)
\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
116 void sprd_white_led_init(void)
\r
118 __raw_writel(0xc000,0x400388d8);
\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
125 __raw_writel(0x0100,0x40038020);
\r
127 __raw_writel(0x0081,0x400388d4);
\r
128 // __raw_writel(0xff80,0x400388d8);
\r
131 #if (!defined(CONFIG_ARCH_SCX35L))
133 void (*lcd_panel_cabc_pwm_bl)(int brightness) = NULL;
136 void set_backlight(uint32_t value)
\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
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
153 __raw_writel(0x0000, 0x40260060);
\r
154 printf("sprd backlight power off. brightness = %d (use PWM3 for external backlight control)\n", value);
\r
156 value = (value & 0xff) >> 2;
\r
158 __raw_bits_or((0x1 << 7), 0x402e0000);
\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
169 #if (defined(CONFIG_SP8830) || defined(CONFIG_SPX15))
\r
172 #if (defined(CONFIG_SPX15))
\r
173 #if (defined(CONFIG_EMMC_BOOT))
\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
179 printf("CONFIG_EMMC_BOOT is set, and the adie chip id is 0x2711A000, therefore, white_led=1\n");
\r
183 printf("CONFIG_EMMC_BOOT is set, but the adie chip id is NOT 0x2711A000, therefore, white_led=0\n");
\r
187 printf("CONFIG_EMMC_BOOT is NOT set, therefore, white_led=0\n");
\r
191 printf("CONFIG_SP8830 is set and CONFIG_SPX15 is NOT set, therefore, white_led=1\n");
\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
199 ANA_REG_SET(0x400388d4,0);
\r
200 printf("sprd backlight power off (SPX15 use WHITE_LED backlight control)\n");
\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
206 //============================================both white led and pwm
\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
211 __raw_writel(0x0000, 0x40260040);
\r
212 printf("sprd backlight power off (SPX15 use PWM2 for external backlight control)\n");
\r
215 value = (value & 0xff) >> 2;
\r
217 __raw_bits_or((0x1 << 6), 0x402e0000);
\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
226 //============================================both white led and pwm
\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
232 __raw_writel(0x0000, 0x40260040);
\r
233 printf("sprd backlight power off (SPX15 use PWM2 for external backlight control)\n");
\r
236 value = (value & 0xff) >> 2;
\r
238 __raw_bits_or((0x1 << 6), 0x402e0000);
\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
248 /*backlight is driven by whiteled */
\r
250 ANA_REG_SET(0x40038894,0);
\r
251 printf("sprd backlight power off (SP8830 use WHITE_LED backlight control)\n");
\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
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
261 static int is_init = 0;
\r
263 #if defined(CONFIG_PIKEAYOUNG2DTV)
\r
264 #define PWM_BACKLIGHT_GPIO 234
\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
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
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
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
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
298 sprd_gpio_request(NULL, 190);
\r
299 sprd_gpio_direction_output(NULL, 190, 0);
\r
301 sprd_gpio_set(NULL, 190, 0);
\r
304 sprd_gpio_set(NULL, 190, 1);
\r
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 */
312 /*backlight is driven by PWMC (PWMC=PWM2) */
313 // __raw_bits_or((0x1 << 0), 0x402d0040);//use ext_26m for clk_pwm2 parent clk^M
315 __raw_writel(0x0000, 0x40260040);
316 printf("sprd backlight power off (SPX15 use PWM2 for external backlight control)\n");
319 __raw_bits_or((0x1 << 6), 0x402e0000);
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");
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
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
349 //if (gpio_request(143, "LCD_BL")) {
\r
350 // FB_PRINT("Failed ro request LCD_BL GPIO_%d \n",
\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
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
374 void save_lcd_id_to_kernel(uint32_t id)
\r
376 lcd_id_to_kernel = id;
\r
379 uint32_t load_lcd_id_to_kernel(void)
\r
381 return lcd_id_to_kernel;
\r
386 static char byte2hex(unsigned char b)
392 if (b >= 10 && b <= 15)
393 return 'a' + (b - 10);
397 static void hex_encoder(unsigned char *in, char *out, int sz)
401 for (i = 0; i < sz; i++) {
402 *out = byte2hex((in[i] & 0xF0) >> 4);
404 *out = byte2hex((in[i] & 0x0F));
409 void save_mtp_offset_to_kernel(uint8_t *mtp)
411 hex_encoder((unsigned char *)mtp, mtp_offset, (MTP_LEN + 6));
412 mtp_offset[(MTP_LEN + 6) * 2] = '\0';
415 uint8_t *load_mtp_offset_to_kernel(void)
420 void save_elvss_offset_to_kernel(uint8_t elvss)
422 elvss_offset = elvss;
425 uint8_t load_elvss_offset_to_kernel(void)
430 void save_hbm_offset_to_kernel(uint8_t *hbm)
432 hex_encoder((unsigned char *)hbm, hbm_g, 15);
433 hbm_g[15 * 2] = '\0';
436 uint8_t *load_hbm_offset_to_kernel(void)
441 static int real_refresh(struct sprdfb_device *dev)
\r
445 FB_PRINT("sprdfb: [%s]\n", __FUNCTION__);
\r
447 if(NULL == dev->panel){
\r
448 printf("sprdfb: [%s] fail (no panel!)\n", __FUNCTION__);
\r
452 ret = dev->ctrl->refresh(dev);
\r
454 printf("sprdfb: failed to refresh !!!!\n");
\r
460 static int sprdfb_probe(void * lcdbase)
\r
462 struct sprdfb_device *dev = &s_sprdfb_dev;
\r
464 printf("sprdfb:[%s]\n", __FUNCTION__);
\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
474 #ifdef CONFIG_GARDA
\r
475 LDO_SetVoltLevel(LDO_LDO_SIM1, LDO_VOLT_LEVEL2);
\r
476 LDO_TurnOnLDO(LDO_LDO_SIM1);
\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);
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
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
494 dev->ctrl = &sprdfb_dispc_ctrl;
\r
495 dev->ctrl->early_init(dev);
\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
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
509 dev->display_width = dev->panel->width;
\r
510 dev->display_height = dev->panel->height;
\r
514 dev->smem_start = ((uint32_t)lcdbase);
\r
515 dev->ctrl->init(dev);
\r
520 void lcd_initcolregs(void)
\r
522 FB_PRINT("sprdfb:[%s]\n", __FUNCTION__);
\r
525 void lcd_disable(void)
\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
533 /* References in this function refer to respective Linux kernel sources */
\r
534 void lcd_enable(void)
\r
536 FB_PRINT("sprdfb:[%s]\n", __FUNCTION__);
\r
539 void lcd_ctrl_init(void *lcdbase)
\r
541 FB_PRINT("sprdfb:[%s]\n", __FUNCTION__);
\r
542 sprdfb_probe(lcdbase);
\r
545 void lcd_display(void)
\r
547 printf("sprdfb:[%s]\n", __FUNCTION__);
\r
548 real_refresh(&s_sprdfb_dev);
\r
551 #ifdef CONFIG_LCD_INFO
\r
553 extern nand_info_t nand_info[];
\r
555 void lcd_show_board_info(void)
\r
557 ulong dram_size, nand_size;
\r
562 for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++)
\r
563 dram_size += gd->bd->bi_dram[i].size;
\r
565 for (i = 0; i < CONFIG_SYS_MAX_NAND_DEVICE; i++)
\r
566 nand_size += nand_info[i].size;
\r
568 lcd_printf("\n%s\n", U_BOOT_VERSION);
\r
569 lcd_printf(" %ld MB SDRAM, %ld MB NAND\n",
\r
572 lcd_printf(" Board : esd ARM9 \n");
\r
573 lcd_printf(" Mach-type : %lu\n", gd->bd->bi_arch_number);
\r
575 #endif /* CONFIG_LCD_INFO */
\r