Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq
[pandora-kernel.git] / arch / arm / mach-omap2 / board-devkit8000.c
index 922b746..2205c20 100644 (file)
@@ -33,6 +33,7 @@
 #include <linux/i2c/twl.h>
 
 #include <mach/hardware.h>
+#include <mach/id.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
@@ -58,9 +59,6 @@
 #include "mux.h"
 #include "hsmmc.h"
 
-#define GPMC_CS0_BASE  0x60
-#define GPMC_CS_SIZE   0x30
-
 #define NAND_BLOCK_SIZE                SZ_128K
 
 #define OMAP_DM9000_GPIO_IRQ   25
@@ -104,20 +102,6 @@ static struct omap_nand_platform_data devkit8000_nand_data = {
        .dma_channel    = -1,           /* disable DMA in OMAP NAND driver */
 };
 
-static struct resource devkit8000_nand_resource = {
-       .flags          = IORESOURCE_MEM,
-};
-
-static struct platform_device devkit8000_nand_device = {
-       .name           = "omap2-nand",
-       .id             = -1,
-       .dev            = {
-               .platform_data  = &devkit8000_nand_data,
-       },
-       .num_resources  = 1,
-       .resource       = &devkit8000_nand_resource,
-};
-
 static struct omap2_hsmmc_info mmc[] = {
        {
                .mmc            = 1,
@@ -126,54 +110,50 @@ static struct omap2_hsmmc_info mmc[] = {
        },
        {}      /* Terminator */
 };
-static struct omap_board_config_kernel devkit8000_config[] __initdata = {
-};
 
 static int devkit8000_panel_enable_lcd(struct omap_dss_device *dssdev)
 {
        twl_i2c_write_u8(TWL4030_MODULE_GPIO, 0x80, REG_GPIODATADIR1);
        twl_i2c_write_u8(TWL4030_MODULE_LED, 0x0, 0x0);
 
+       if (gpio_is_valid(dssdev->reset_gpio))
+               gpio_set_value(dssdev->reset_gpio, 1);
        return 0;
 }
 
 static void devkit8000_panel_disable_lcd(struct omap_dss_device *dssdev)
 {
+       if (gpio_is_valid(dssdev->reset_gpio))
+               gpio_set_value(dssdev->reset_gpio, 0);
 }
+
 static int devkit8000_panel_enable_dvi(struct omap_dss_device *dssdev)
 {
+       if (gpio_is_valid(dssdev->reset_gpio))
+               gpio_set_value(dssdev->reset_gpio, 1);
        return 0;
 }
 
 static void devkit8000_panel_disable_dvi(struct omap_dss_device *dssdev)
 {
+       if (gpio_is_valid(dssdev->reset_gpio))
+               gpio_set_value(dssdev->reset_gpio, 0);
 }
 
-static int devkit8000_panel_enable_tv(struct omap_dss_device *dssdev)
-{
+static struct regulator_consumer_supply devkit8000_vmmc1_supply =
+       REGULATOR_SUPPLY("vmmc", "mmci-omap-hs.0");
 
-       return 0;
-}
-
-static void devkit8000_panel_disable_tv(struct omap_dss_device *dssdev)
-{
-}
-
-
-static struct regulator_consumer_supply devkit8000_vmmc1_supply = {
-       .supply                 = "vmmc",
-};
-
-static struct regulator_consumer_supply devkit8000_vsim_supply = {
-       .supply                 = "vmmc_aux",
-};
 
+/* ads7846 on SPI */
+static struct regulator_consumer_supply devkit8000_vio_supply =
+       REGULATOR_SUPPLY("vcc", "spi2.0");
 
 static struct omap_dss_device devkit8000_lcd_device = {
        .name                   = "lcd",
-       .driver_name            = "innolux_at_panel",
+       .driver_name            = "generic_panel",
        .type                   = OMAP_DISPLAY_TYPE_DPI,
        .phy.dpi.data_lines     = 24,
+       .reset_gpio             = -EINVAL, /* will be replaced */
        .platform_enable        = devkit8000_panel_enable_lcd,
        .platform_disable       = devkit8000_panel_disable_lcd,
 };
@@ -182,6 +162,7 @@ static struct omap_dss_device devkit8000_dvi_device = {
        .driver_name            = "generic_panel",
        .type                   = OMAP_DISPLAY_TYPE_DPI,
        .phy.dpi.data_lines     = 24,
+       .reset_gpio             = -EINVAL, /* will be replaced */
        .platform_enable        = devkit8000_panel_enable_dvi,
        .platform_disable       = devkit8000_panel_disable_dvi,
 };
@@ -191,8 +172,6 @@ static struct omap_dss_device devkit8000_tv_device = {
        .driver_name            = "venc",
        .type                   = OMAP_DISPLAY_TYPE_VENC,
        .phy.venc.type          = OMAP_DSS_VENC_TYPE_SVIDEO,
-       .platform_enable        = devkit8000_panel_enable_tv,
-       .platform_disable       = devkit8000_panel_disable_tv,
 };
 
 
@@ -216,10 +195,8 @@ static struct platform_device devkit8000_dss_device = {
        },
 };
 
-static struct regulator_consumer_supply devkit8000_vdda_dac_supply = {
-       .supply = "vdda_dac",
-       .dev    = &devkit8000_dss_device.dev,
-};
+static struct regulator_consumer_supply devkit8000_vdda_dac_supply =
+       REGULATOR_SUPPLY("vdda_dac", "omapdss");
 
 static int board_keymap[] = {
        KEY(0, 0, KEY_1),
@@ -266,7 +243,21 @@ static int devkit8000_twl_gpio_setup(struct device *dev,
 
        /* link regulators to MMC adapters */
        devkit8000_vmmc1_supply.dev = mmc[0].dev;
-       devkit8000_vsim_supply.dev = mmc[0].dev;
+
+       /* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */
+       gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1;
+
+        /* gpio + 1 is "LCD_PWREN" (out, active high) */
+       devkit8000_lcd_device.reset_gpio = gpio + 1;
+       gpio_request(devkit8000_lcd_device.reset_gpio, "LCD_PWREN");
+       /* Disable until needed */
+       gpio_direction_output(devkit8000_lcd_device.reset_gpio, 0);
+
+       /* gpio + 7 is "DVI_PD" (out, active low) */
+       devkit8000_dvi_device.reset_gpio = gpio + 7;
+       gpio_request(devkit8000_dvi_device.reset_gpio, "DVI PowerDown");
+       /* Disable until needed */
+       gpio_direction_output(devkit8000_dvi_device.reset_gpio, 0);
 
        return 0;
 }
@@ -282,16 +273,8 @@ static struct twl4030_gpio_platform_data devkit8000_gpio_data = {
        .setup          = devkit8000_twl_gpio_setup,
 };
 
-static struct regulator_consumer_supply devkit8000_vpll2_supplies[] = {
-       {
-       .supply         = "vdvi",
-       .dev            = &devkit8000_lcd_device.dev,
-       },
-       {
-       .supply         = "vdds_dsi",
-       .dev            = &devkit8000_dss_device.dev,
-       }
-};
+static struct regulator_consumer_supply devkit8000_vpll1_supply =
+       REGULATOR_SUPPLY("vdds_dsi", "omapdss");
 
 /* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */
 static struct regulator_init_data devkit8000_vmmc1 = {
@@ -308,21 +291,6 @@ static struct regulator_init_data devkit8000_vmmc1 = {
        .consumer_supplies      = &devkit8000_vmmc1_supply,
 };
 
-/* VSIM for MMC1 pins DAT4..DAT7 (2 mA, plus card == max 50 mA) */
-static struct regulator_init_data devkit8000_vsim = {
-       .constraints = {
-               .min_uV                 = 1800000,
-               .max_uV                 = 3000000,
-               .valid_modes_mask       = REGULATOR_MODE_NORMAL
-                                       | REGULATOR_MODE_STANDBY,
-               .valid_ops_mask         = REGULATOR_CHANGE_VOLTAGE
-                                       | REGULATOR_CHANGE_MODE
-                                       | REGULATOR_CHANGE_STATUS,
-       },
-       .num_consumer_supplies  = 1,
-       .consumer_supplies      = &devkit8000_vsim_supply,
-};
-
 /* VDAC for DSS driving S-Video (8 mA unloaded, max 65 mA) */
 static struct regulator_init_data devkit8000_vdac = {
        .constraints = {
@@ -337,10 +305,9 @@ static struct regulator_init_data devkit8000_vdac = {
        .consumer_supplies      = &devkit8000_vdda_dac_supply,
 };
 
-/* VPLL2 for digital video outputs */
-static struct regulator_init_data devkit8000_vpll2 = {
+/* VPLL1 for digital video outputs */
+static struct regulator_init_data devkit8000_vpll1 = {
        .constraints = {
-               .name                   = "VDVI",
                .min_uV                 = 1800000,
                .max_uV                 = 1800000,
                .valid_modes_mask       = REGULATOR_MODE_NORMAL
@@ -348,8 +315,23 @@ static struct regulator_init_data devkit8000_vpll2 = {
                .valid_ops_mask         = REGULATOR_CHANGE_MODE
                                        | REGULATOR_CHANGE_STATUS,
        },
-       .num_consumer_supplies  = ARRAY_SIZE(devkit8000_vpll2_supplies),
-       .consumer_supplies      = devkit8000_vpll2_supplies,
+       .num_consumer_supplies  = 1,
+       .consumer_supplies      = &devkit8000_vpll1_supply,
+};
+
+/* VAUX4 for ads7846 and nubs */
+static struct regulator_init_data devkit8000_vio = {
+       .constraints = {
+               .min_uV                 = 1800000,
+               .max_uV                 = 1800000,
+               .apply_uV               = true,
+               .valid_modes_mask       = REGULATOR_MODE_NORMAL
+                       | REGULATOR_MODE_STANDBY,
+               .valid_ops_mask         = REGULATOR_CHANGE_MODE
+                       | REGULATOR_CHANGE_STATUS,
+       },
+       .num_consumer_supplies  = 1,
+       .consumer_supplies      = &devkit8000_vio_supply,
 };
 
 static struct twl4030_usb_data devkit8000_usb_data = {
@@ -374,15 +356,15 @@ static struct twl4030_platform_data devkit8000_twldata = {
        .gpio           = &devkit8000_gpio_data,
        .codec          = &devkit8000_codec_data,
        .vmmc1          = &devkit8000_vmmc1,
-       .vsim           = &devkit8000_vsim,
        .vdac           = &devkit8000_vdac,
-       .vpll2          = &devkit8000_vpll2,
+       .vpll1          = &devkit8000_vpll1,
+       .vio            = &devkit8000_vio,
        .keypad         = &devkit8000_kp_data,
 };
 
 static struct i2c_board_info __initdata devkit8000_i2c_boardinfo[] = {
        {
-               I2C_BOARD_INFO("twl4030", 0x48),
+               I2C_BOARD_INFO("tps65930", 0x48),
                .flags = I2C_CLIENT_WAKE,
                .irq = INT_34XX_SYS_NIRQ,
                .platform_data = &devkit8000_twldata,
@@ -464,8 +446,6 @@ static struct platform_device keys_gpio = {
 
 static void __init devkit8000_init_irq(void)
 {
-       omap_board_config = devkit8000_config;
-       omap_board_config_size = ARRAY_SIZE(devkit8000_config);
        omap2_init_common_hw(mt46h32m32lf6_sdrc_params,
                             mt46h32m32lf6_sdrc_params);
        omap_init_irq();
@@ -560,6 +540,9 @@ static struct platform_device omap_dm9000_dev = {
 
 static void __init omap_dm9000_init(void)
 {
+       unsigned char *eth_addr = omap_dm9000_platdata.dev_addr;
+       struct omap_die_id odi;
+
        if (gpio_request(OMAP_DM9000_GPIO_IRQ, "dm9000 irq") < 0) {
                printk(KERN_ERR "Failed to request GPIO%d for dm9000 IRQ\n",
                        OMAP_DM9000_GPIO_IRQ);
@@ -567,6 +550,16 @@ static void __init omap_dm9000_init(void)
                }
 
        gpio_direction_input(OMAP_DM9000_GPIO_IRQ);
+
+       /* init the mac address using DIE id */
+       omap_get_die_id(&odi);
+
+       eth_addr[0] = 0x02; /* locally administered */
+       eth_addr[1] = odi.id_1 & 0xff;
+       eth_addr[2] = (odi.id_0 & 0xff000000) >> 24;
+       eth_addr[3] = (odi.id_0 & 0x00ff0000) >> 16;
+       eth_addr[4] = (odi.id_0 & 0x0000ff00) >> 8;
+       eth_addr[5] = (odi.id_0 & 0x000000ff);
 }
 
 static struct platform_device *devkit8000_devices[] __initdata = {
@@ -581,8 +574,6 @@ static void __init devkit8000_flash_init(void)
        u8 cs = 0;
        u8 nandcs = GPMC_CS_NUM + 1;
 
-       u32 gpmc_base_add = OMAP34XX_GPMC_VIRT;
-
        /* find out the chip-select on which NAND exists */
        while (cs < GPMC_CS_NUM) {
                u32 ret = 0;
@@ -604,13 +595,9 @@ static void __init devkit8000_flash_init(void)
 
        if (nandcs < GPMC_CS_NUM) {
                devkit8000_nand_data.cs = nandcs;
-               devkit8000_nand_data.gpmc_cs_baseaddr = (void *)
-                       (gpmc_base_add + GPMC_CS0_BASE + nandcs * GPMC_CS_SIZE);
-               devkit8000_nand_data.gpmc_baseaddr = (void *)
-                       (gpmc_base_add);
 
                printk(KERN_INFO "Registering NAND on CS%d\n", nandcs);
-               if (platform_device_register(&devkit8000_nand_device) < 0)
+               if (gpmc_nand_init(&devkit8000_nand_data) < 0)
                        printk(KERN_ERR "Unable to register NAND device\n");
        }
 }
@@ -797,8 +784,6 @@ static void __init devkit8000_init(void)
        devkit8000_i2c_init();
        platform_add_devices(devkit8000_devices,
                        ARRAY_SIZE(devkit8000_devices));
-       omap_board_config = devkit8000_config;
-       omap_board_config_size = ARRAY_SIZE(devkit8000_config);
 
        spi_register_board_info(devkit8000_spi_board_info,
        ARRAY_SIZE(devkit8000_spi_board_info));
@@ -814,17 +799,9 @@ static void __init devkit8000_init(void)
        omap_mux_init_signal("sdrc_cke1", OMAP_PIN_OUTPUT);
 }
 
-static void __init devkit8000_map_io(void)
-{
-       omap2_set_globals_343x();
-       omap34xx_map_common_io();
-}
-
 MACHINE_START(DEVKIT8000, "OMAP3 Devkit8000")
-       .phys_io        = 0x48000000,
-       .io_pg_offst    = ((0xd8000000) >> 18) & 0xfffc,
        .boot_params    = 0x80000100,
-       .map_io         = devkit8000_map_io,
+       .map_io         = omap3_map_io,
        .reserve        = omap_reserve,
        .init_irq       = devkit8000_init_irq,
        .init_machine   = devkit8000_init,