|
@@ -24,6 +24,7 @@
|
|
|
|
|
|
#include <common.h>
|
|
|
#include <spi.h>
|
|
|
+#include <lcd.h>
|
|
|
#include <asm/io.h>
|
|
|
#include <asm/gpio.h>
|
|
|
#include <asm/arch/adc.h>
|
|
@@ -35,6 +36,8 @@
|
|
|
#include <asm/arch/cpu.h>
|
|
|
#include <max8998_pmic.h>
|
|
|
#include <asm/arch/watchdog.h>
|
|
|
+#include <libtizen.h>
|
|
|
+#include <ld9040.h>
|
|
|
|
|
|
DECLARE_GLOBAL_DATA_PTR;
|
|
|
|
|
@@ -316,6 +319,168 @@ int universal_spi_read(void)
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
+static void init_pmic_lcd(void)
|
|
|
+{
|
|
|
+ unsigned char val;
|
|
|
+ int ret = 0;
|
|
|
+
|
|
|
+ struct pmic *p = get_pmic();
|
|
|
+
|
|
|
+ if (pmic_probe(p))
|
|
|
+ return;
|
|
|
+
|
|
|
+ /* LDO7 1.8V */
|
|
|
+ val = 0x02; /* (1800 - 1600) / 100; */
|
|
|
+ ret |= pmic_reg_write(p, MAX8998_REG_LDO7, val);
|
|
|
+
|
|
|
+ /* LDO17 3.0V */
|
|
|
+ val = 0xe; /* (3000 - 1600) / 100; */
|
|
|
+ ret |= pmic_reg_write(p, MAX8998_REG_LDO17, val);
|
|
|
+
|
|
|
+ /* Disable unneeded regulators */
|
|
|
+ /*
|
|
|
+ * ONOFF1
|
|
|
+ * Buck1 ON, Buck2 OFF, Buck3 ON, Buck4 ON
|
|
|
+ * LDO2 ON, LDO3 OFF, LDO4 OFF, LDO5 ON
|
|
|
+ */
|
|
|
+ val = 0xB9;
|
|
|
+ ret |= pmic_reg_write(p, MAX8998_REG_ONOFF1, val);
|
|
|
+
|
|
|
+ /* ONOFF2
|
|
|
+ * LDO6 OFF, LDO7 ON, LDO8 OFF, LDO9 ON,
|
|
|
+ * LDO10 OFF, LDO11 OFF, LDO12 OFF, LDO13 OFF
|
|
|
+ */
|
|
|
+ val = 0x50;
|
|
|
+ ret |= pmic_reg_write(p, MAX8998_REG_ONOFF2, val);
|
|
|
+
|
|
|
+ /* ONOFF3
|
|
|
+ * LDO14 OFF, LDO15 OFF, LGO16 OFF, LDO17 OFF
|
|
|
+ * EPWRHOLD OFF, EBATTMON OFF, ELBCNFG2 OFF, ELBCNFG1 OFF
|
|
|
+ */
|
|
|
+ val = 0x00;
|
|
|
+ ret |= pmic_reg_write(p, MAX8998_REG_ONOFF3, val);
|
|
|
+
|
|
|
+ if (ret)
|
|
|
+ puts("LCD pmic initialisation error!\n");
|
|
|
+}
|
|
|
+
|
|
|
+static void lcd_cfg_gpio(void)
|
|
|
+{
|
|
|
+ unsigned int i, f3_end = 4;
|
|
|
+
|
|
|
+ for (i = 0; i < 8; i++) {
|
|
|
+ /* set GPF0,1,2[0:7] for RGB Interface and Data lines (32bit) */
|
|
|
+ s5p_gpio_cfg_pin(&gpio1->f0, i, GPIO_FUNC(2));
|
|
|
+ s5p_gpio_cfg_pin(&gpio1->f1, i, GPIO_FUNC(2));
|
|
|
+ s5p_gpio_cfg_pin(&gpio1->f2, i, GPIO_FUNC(2));
|
|
|
+ /* pull-up/down disable */
|
|
|
+ s5p_gpio_set_pull(&gpio1->f0, i, GPIO_PULL_NONE);
|
|
|
+ s5p_gpio_set_pull(&gpio1->f1, i, GPIO_PULL_NONE);
|
|
|
+ s5p_gpio_set_pull(&gpio1->f2, i, GPIO_PULL_NONE);
|
|
|
+
|
|
|
+ /* drive strength to max (24bit) */
|
|
|
+ s5p_gpio_set_drv(&gpio1->f0, i, GPIO_DRV_4X);
|
|
|
+ s5p_gpio_set_rate(&gpio1->f0, i, GPIO_DRV_SLOW);
|
|
|
+ s5p_gpio_set_drv(&gpio1->f1, i, GPIO_DRV_4X);
|
|
|
+ s5p_gpio_set_rate(&gpio1->f1, i, GPIO_DRV_SLOW);
|
|
|
+ s5p_gpio_set_drv(&gpio1->f2, i, GPIO_DRV_4X);
|
|
|
+ s5p_gpio_set_rate(&gpio1->f0, i, GPIO_DRV_SLOW);
|
|
|
+ }
|
|
|
+
|
|
|
+ for (i = 0; i < f3_end; i++) {
|
|
|
+ /* set GPF3[0:3] for RGB Interface and Data lines (32bit) */
|
|
|
+ s5p_gpio_cfg_pin(&gpio1->f3, i, GPIO_FUNC(2));
|
|
|
+ /* pull-up/down disable */
|
|
|
+ s5p_gpio_set_pull(&gpio1->f3, i, GPIO_PULL_NONE);
|
|
|
+ /* drive strength to max (24bit) */
|
|
|
+ s5p_gpio_set_drv(&gpio1->f3, i, GPIO_DRV_4X);
|
|
|
+ s5p_gpio_set_rate(&gpio1->f3, i, GPIO_DRV_SLOW);
|
|
|
+ }
|
|
|
+
|
|
|
+ /* gpio pad configuration for LCD reset. */
|
|
|
+ s5p_gpio_cfg_pin(&gpio2->y4, 5, GPIO_OUTPUT);
|
|
|
+
|
|
|
+ spi_init();
|
|
|
+}
|
|
|
+
|
|
|
+static void reset_lcd(void)
|
|
|
+{
|
|
|
+ s5p_gpio_set_value(&gpio2->y4, 5, 1);
|
|
|
+ udelay(10000);
|
|
|
+ s5p_gpio_set_value(&gpio2->y4, 5, 0);
|
|
|
+ udelay(10000);
|
|
|
+ s5p_gpio_set_value(&gpio2->y4, 5, 1);
|
|
|
+ udelay(100);
|
|
|
+}
|
|
|
+
|
|
|
+static void lcd_power_on(void)
|
|
|
+{
|
|
|
+ struct pmic *p = get_pmic();
|
|
|
+
|
|
|
+ if (pmic_probe(p))
|
|
|
+ return;
|
|
|
+
|
|
|
+ pmic_set_output(p, MAX8998_REG_ONOFF3, MAX8998_LDO17, LDO_ON);
|
|
|
+ pmic_set_output(p, MAX8998_REG_ONOFF2, MAX8998_LDO7, LDO_ON);
|
|
|
+}
|
|
|
+
|
|
|
+vidinfo_t panel_info = {
|
|
|
+ .vl_freq = 60,
|
|
|
+ .vl_col = 480,
|
|
|
+ .vl_row = 800,
|
|
|
+ .vl_width = 480,
|
|
|
+ .vl_height = 800,
|
|
|
+ .vl_clkp = CONFIG_SYS_HIGH,
|
|
|
+ .vl_hsp = CONFIG_SYS_HIGH,
|
|
|
+ .vl_vsp = CONFIG_SYS_HIGH,
|
|
|
+ .vl_dp = CONFIG_SYS_HIGH,
|
|
|
+
|
|
|
+ .vl_bpix = 5, /* Bits per pixel */
|
|
|
+
|
|
|
+ /* LD9040 LCD Panel */
|
|
|
+ .vl_hspw = 2,
|
|
|
+ .vl_hbpd = 16,
|
|
|
+ .vl_hfpd = 16,
|
|
|
+
|
|
|
+ .vl_vspw = 2,
|
|
|
+ .vl_vbpd = 8,
|
|
|
+ .vl_vfpd = 8,
|
|
|
+ .vl_cmd_allow_len = 0xf,
|
|
|
+
|
|
|
+ .win_id = 0,
|
|
|
+ .cfg_gpio = lcd_cfg_gpio,
|
|
|
+ .backlight_on = NULL,
|
|
|
+ .lcd_power_on = lcd_power_on,
|
|
|
+ .reset_lcd = reset_lcd,
|
|
|
+ .dual_lcd_enabled = 0,
|
|
|
+
|
|
|
+ .init_delay = 0,
|
|
|
+ .power_on_delay = 10000,
|
|
|
+ .reset_delay = 10000,
|
|
|
+ .interface_mode = FIMD_RGB_INTERFACE,
|
|
|
+ .mipi_enabled = 0,
|
|
|
+};
|
|
|
+
|
|
|
+void init_panel_info(vidinfo_t *vid)
|
|
|
+{
|
|
|
+ vid->logo_on = 1;
|
|
|
+ vid->resolution = HD_RESOLUTION;
|
|
|
+ vid->rgb_mode = MODE_RGB_P;
|
|
|
+
|
|
|
+#ifdef CONFIG_TIZEN
|
|
|
+ get_tizen_logo_info(vid);
|
|
|
+#endif
|
|
|
+
|
|
|
+ /* for LD9040. */
|
|
|
+ vid->pclk_name = 1; /* MPLL */
|
|
|
+ vid->sclk_div = 1;
|
|
|
+
|
|
|
+ vid->cfg_ldo = ld9040_cfg_ldo;
|
|
|
+ vid->enable_ldo = ld9040_enable_ldo;
|
|
|
+
|
|
|
+ setenv("lcdinfo", "lcd=ld9040");
|
|
|
+}
|
|
|
+
|
|
|
int board_init(void)
|
|
|
{
|
|
|
gpio1 = (struct exynos4_gpio_part1 *) EXYNOS4_GPIO_PART1_BASE;
|
|
@@ -326,6 +491,7 @@ int board_init(void)
|
|
|
|
|
|
#if defined(CONFIG_PMIC)
|
|
|
pmic_init();
|
|
|
+ init_pmic_lcd();
|
|
|
#endif
|
|
|
#ifdef CONFIG_SOFT_SPI
|
|
|
soft_spi_init();
|