pmic: Extend PMIC framework to support multiple instances of PMIC devices
[oweals/u-boot.git] / board / samsung / trats / trats.c
index 3085de1a145064aa1338ca2d4cc0f4be908abb0f..e0a98901f733029e5621813b4a13e3d343401c36 100644 (file)
 #include <asm/arch/mipi_dsim.h>
 #include <asm/arch/watchdog.h>
 #include <asm/arch/power.h>
-#include <pmic.h>
+#include <power/pmic.h>
 #include <usb/s3c_udc.h>
-#include <max8997_pmic.h>
+#include <power/max8997_pmic.h>
+#include <libtizen.h>
 
 #include "setup.h"
 
@@ -53,6 +54,13 @@ u32 get_board_rev(void)
 
 static void check_hw_revision(void);
 
+static int hwrevision(int rev)
+{
+       return (board_rev & 0xf) == rev;
+}
+
+struct s3c_plat_otg_data s5pc210_otg_data;
+
 int board_init(void)
 {
        gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
@@ -61,12 +69,27 @@ int board_init(void)
        printf("HW Revision:\t0x%x\n", board_rev);
 
 #if defined(CONFIG_PMIC)
-       pmic_init();
+       pmic_init(I2C_5);
 #endif
 
        return 0;
 }
 
+void i2c_init_board(void)
+{
+       struct exynos4_gpio_part1 *gpio1 =
+               (struct exynos4_gpio_part1 *)samsung_get_base_gpio_part1();
+       struct exynos4_gpio_part2 *gpio2 =
+               (struct exynos4_gpio_part2 *)samsung_get_base_gpio_part2();
+
+       /* I2C_5 -> PMIC */
+       s5p_gpio_direction_output(&gpio1->b, 7, 1);
+       s5p_gpio_direction_output(&gpio1->b, 6, 1);
+       /* I2C_9 -> FG */
+       s5p_gpio_direction_output(&gpio2->y4, 0, 1);
+       s5p_gpio_direction_output(&gpio2->y4, 1, 1);
+}
+
 int dram_init(void)
 {
        gd->ram_size = get_ram_size((long *)PHYS_SDRAM_1, PHYS_SDRAM_1_SIZE) +
@@ -214,7 +237,10 @@ int board_mmc_init(bd_t *bis)
 static int s5pc210_phy_control(int on)
 {
        int ret = 0;
-       struct pmic *p = get_pmic();
+       u32 val = 0;
+       struct pmic *p = pmic_get("MAX8997_PMIC");
+       if (!p)
+               return -ENODEV;
 
        if (pmic_probe(p))
                return -1;
@@ -222,11 +248,17 @@ static int s5pc210_phy_control(int on)
        if (on) {
                ret |= pmic_set_output(p, MAX8997_REG_SAFEOUTCTRL,
                                      ENSAFEOUT1, LDO_ON);
-               ret |= pmic_reg_write(p, MAX8997_REG_LDO3CTRL, EN_LDO);
-               ret |= pmic_reg_write(p, MAX8997_REG_LDO8CTRL, EN_LDO);
+               ret |= pmic_reg_read(p, MAX8997_REG_LDO3CTRL, &val);
+               ret |= pmic_reg_write(p, MAX8997_REG_LDO3CTRL, EN_LDO | val);
+
+               ret |= pmic_reg_read(p, MAX8997_REG_LDO8CTRL, &val);
+               ret |= pmic_reg_write(p, MAX8997_REG_LDO8CTRL, EN_LDO | val);
        } else {
-               ret |= pmic_reg_write(p, MAX8997_REG_LDO8CTRL, DIS_LDO);
-               ret |= pmic_reg_write(p, MAX8997_REG_LDO3CTRL, DIS_LDO);
+               ret |= pmic_reg_read(p, MAX8997_REG_LDO8CTRL, &val);
+               ret |= pmic_reg_write(p, MAX8997_REG_LDO8CTRL, DIS_LDO | val);
+
+               ret |= pmic_reg_read(p, MAX8997_REG_LDO3CTRL, &val);
+               ret |= pmic_reg_write(p, MAX8997_REG_LDO3CTRL, DIS_LDO | val);
                ret |= pmic_set_output(p, MAX8997_REG_SAFEOUTCTRL,
                                      ENSAFEOUT1, LDO_OFF);
        }
@@ -246,6 +278,12 @@ struct s3c_plat_otg_data s5pc210_otg_data = {
        .usb_phy_ctrl   = EXYNOS4_USBPHY_CONTROL,
        .usb_flags      = PHY0_SLEEP,
 };
+
+void board_usb_init(void)
+{
+       debug("USB_udc_probe\n");
+       s3c_udc_probe(&s5pc210_otg_data);
+}
 #endif
 
 static void pmic_reset(void)
@@ -377,7 +415,9 @@ static void lcd_reset(void)
 static int lcd_power(void)
 {
        int ret = 0;
-       struct pmic *p = get_pmic();
+       struct pmic *p = pmic_get("MAX8997_PMIC");
+       if (!p)
+               return -ENODEV;
 
        if (pmic_probe(p))
                return 0;
@@ -437,7 +477,9 @@ static struct mipi_dsim_lcd_device mipi_lcd_device = {
 static int mipi_power(void)
 {
        int ret = 0;
-       struct pmic *p = get_pmic();
+       struct pmic *p = pmic_get("MAX8997_PMIC");
+       if (!p)
+               return -ENODEV;
 
        if (pmic_probe(p))
                return 0;
@@ -455,42 +497,54 @@ static int mipi_power(void)
        return 0;
 }
 
+vidinfo_t panel_info = {
+       .vl_freq        = 60,
+       .vl_col         = 720,
+       .vl_row         = 1280,
+       .vl_width       = 720,
+       .vl_height      = 1280,
+       .vl_clkp        = CONFIG_SYS_HIGH,
+       .vl_hsp         = CONFIG_SYS_LOW,
+       .vl_vsp         = CONFIG_SYS_LOW,
+       .vl_dp          = CONFIG_SYS_LOW,
+       .vl_bpix        = 5,    /* Bits per pixel, 2^5 = 32 */
+
+       /* s6e8ax0 Panel infomation */
+       .vl_hspw        = 5,
+       .vl_hbpd        = 10,
+       .vl_hfpd        = 10,
+
+       .vl_vspw        = 2,
+       .vl_vbpd        = 1,
+       .vl_vfpd        = 13,
+       .vl_cmd_allow_len = 0xf,
+
+       .win_id         = 3,
+       .cfg_gpio       = NULL,
+       .backlight_on   = NULL,
+       .lcd_power_on   = NULL, /* lcd_power_on in mipi dsi driver */
+       .reset_lcd      = lcd_reset,
+       .dual_lcd_enabled = 0,
+
+       .init_delay     = 0,
+       .power_on_delay = 0,
+       .reset_delay    = 0,
+       .interface_mode = FIMD_RGB_INTERFACE,
+       .mipi_enabled   = 1,
+};
+
 void init_panel_info(vidinfo_t *vid)
 {
-       vid->vl_freq    = 60;
-       vid->vl_col     = 720;
-       vid->vl_row     = 1280;
-       vid->vl_width   = 720;
-       vid->vl_height  = 1280;
-       vid->vl_clkp    = CONFIG_SYS_HIGH;
-       vid->vl_hsp     = CONFIG_SYS_LOW;
-       vid->vl_vsp     = CONFIG_SYS_LOW;
-       vid->vl_dp      = CONFIG_SYS_LOW;
-
-       vid->vl_bpix    = 5;
-       vid->dual_lcd_enabled = 0;
-
-       /* s6e8ax0 Panel */
-       vid->vl_hspw    = 5;
-       vid->vl_hbpd    = 10;
-       vid->vl_hfpd    = 10;
-
-       vid->vl_vspw    = 2;
-       vid->vl_vbpd    = 1;
-       vid->vl_vfpd    = 13;
-       vid->vl_cmd_allow_len = 0xf;
-
-       vid->win_id = 3;
-       vid->cfg_gpio = NULL;
-       vid->backlight_on = NULL;
-       vid->lcd_power_on = NULL;       /* lcd_power_on in mipi dsi driver */
-       vid->reset_lcd = lcd_reset;
-
-       vid->init_delay = 0;
-       vid->power_on_delay = 0;
-       vid->reset_delay = 0;
-       vid->interface_mode = FIMD_RGB_INTERFACE;
-       vid->mipi_enabled = 1;
+       vid->logo_on    = 1,
+       vid->resolution = HD_RESOLUTION,
+       vid->rgb_mode   = MODE_RGB_P,
+
+#ifdef CONFIG_TIZEN
+       get_tizen_logo_info(vid);
+#endif
+
+       if (hwrevision(2))
+               mipi_lcd_device.reverse_panel = 1;
 
        strcpy(s6e8ax0_platform_data.lcd_panel_name, mipi_lcd_device.name);
        s6e8ax0_platform_data.lcd_power = lcd_power;