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/tiger_lcd.h>
\r
20 #include <asm/arch-sc8825/ldo.h>
\r
22 #include <asm/arch/sc8810_reg_global.h>
\r
24 #include <asm/arch/regs_global.h>
\r
25 #include <asm/arch/regs_cpc.h>
\r
30 void *lcd_base; /* Start of framebuffer memory */
\r
31 void *lcd_console_address; /* Start of console buffer */
\r
33 int lcd_line_length;
\r
42 extern int sprdfb_panel_probe(struct sprdfb_device *dev);
\r
43 extern void sprdfb_panel_remove(struct sprdfb_device *dev);
\r
45 extern struct display_ctrl sprdfb_dispc_ctrl ;
\r
47 static struct sprdfb_device tigerdev = {0};
\r
49 static uint32_t lcd_id_to_kernel = 0;
\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
58 static void __raw_bits_and(unsigned int v, unsigned int a)
\r
60 __raw_writel((__raw_readl(a) & v), a);
\r
63 static void __raw_bits_or(unsigned int v, unsigned int a)
\r
65 __raw_writel((__raw_readl(a) | v), a);
\r
68 static void LCD_SetPwmRatio(unsigned short value)
\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
78 __raw_bits_or(LCD_PWM0_EN, SPRD_PWM0_PRESCALE);
\r
81 void LCD_SetBackLightBrightness( unsigned long value)
\r
83 unsigned long duty_mod= 0;
\r
84 if(value > LCD_PWM_MOD_VALUE)
\r
85 value = LCD_PWM_MOD_VALUE;
\r
92 duty_mod = (value << 8) | LCD_PWM_MOD_VALUE;
\r
93 LCD_SetPwmRatio(duty_mod);
\r
97 void set_backlight(uint32_t value)
\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
103 __raw_writel(0x101, 0x4C000138);
\r
104 #endif /*#if defined (CONFIG_SP6825GA) || defined (CONFIG_SP6825GB)*/
\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
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
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
129 //if (gpio_request(143, "LCD_BL")) {
\r
130 // FB_PRINT("Failed ro request LCD_BL GPIO_%d \n",
\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
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
153 void save_lcd_id_to_kernel(uint32_t id)
\r
155 lcd_id_to_kernel = id;
\r
158 uint32_t load_lcd_id_to_kernel(void)
\r
160 return lcd_id_to_kernel;
\r
164 static int real_refresh(struct sprdfb_device *dev)
\r
168 FB_PRINT("sprdfb: [%s]\n", __FUNCTION__);
\r
170 if(NULL == dev->panel){
\r
171 FB_PRINT("sprdfb: [%s] fail (no panel!)\n", __FUNCTION__);
\r
175 ret = dev->ctrl->refresh(dev);
\r
177 FB_PRINT("sprdfb: failed to refresh !!!!\n");
\r
183 static int tiger_probe(void * lcdbase)
\r
185 struct sprdfb_device *dev = &tigerdev;
\r
187 FB_PRINT("sprdfb:[%s]\n", __FUNCTION__);
\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
195 #ifdef CONFIG_GARDA
\r
196 LDO_SetVoltLevel(LDO_LDO_SIM1, LDO_VOLT_LEVEL2);
\r
197 LDO_TurnOnLDO(LDO_LDO_SIM1);
\r
199 #ifdef CONFIG_MACH_SP7720G2
\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
208 dev->ctrl = &sprdfb_dispc_ctrl;
\r
209 dev->ctrl->early_init(dev);
\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
218 dev->smem_start = (uint32_t)lcdbase;
\r
220 dev->ctrl->init(dev);
\r
225 void lcd_initcolregs(void)
\r
227 FB_PRINT("sprdfb:[%s]\n", __FUNCTION__);
\r
230 void lcd_disable(void)
\r
232 FB_PRINT("sprdfb:[%s]\n", __FUNCTION__);
\r
233 sprdfb_panel_remove(&tigerdev);
\r
234 tigerdev.ctrl->uninit(&tigerdev);
\r
238 /* References in this function refer to respective Linux kernel sources */
\r
239 void lcd_enable(void)
\r
241 FB_PRINT("sprdfb:[%s]\n", __FUNCTION__);
\r
244 void lcd_ctrl_init(void *lcdbase)
\r
246 FB_PRINT("sprdfb:[%s]\n", __FUNCTION__);
\r
247 tiger_probe(lcdbase);
\r
250 void lcd_display(void)
\r
252 FB_PRINT("sprdfb:[%s]\n", __FUNCTION__);
\r
253 real_refresh(&tigerdev);
\r
256 #ifdef CONFIG_LCD_INFO
\r
258 extern nand_info_t nand_info[];
\r
260 void lcd_show_board_info(void)
\r
262 ulong dram_size, nand_size;
\r
267 for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++)
\r
268 dram_size += gd->bd->bi_dram[i].size;
\r
270 for (i = 0; i < CONFIG_SYS_MAX_NAND_DEVICE; i++)
\r
271 nand_size += nand_info[i].size;
\r
273 lcd_printf("\n%s\n", U_BOOT_VERSION);
\r
274 lcd_printf(" %ld MB SDRAM, %ld MB NAND\n",
\r
277 lcd_printf(" Board : esd ARM9 \n");
\r
278 lcd_printf(" Mach-type : %lu\n", gd->bd->bi_arch_number);
\r
280 #endif /* CONFIG_LCD_INFO */
\r