Merge tag 'multiplatform-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[cascardo/linux.git] / arch / arm / mach-ux500 / board-mop500.c
index 0d59e1a..a15dd6b 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/init.h>
 #include <linux/interrupt.h>
 #include <linux/platform_device.h>
+#include <linux/clk.h>
 #include <linux/io.h>
 #include <linux/i2c.h>
 #include <linux/platform_data/i2c-nomadik.h>
@@ -24,6 +25,8 @@
 #include <linux/mfd/abx500/ab8500.h>
 #include <linux/regulator/ab8500.h>
 #include <linux/regulator/fixed.h>
+#include <linux/regulator/driver.h>
+#include <linux/regulator/gpio-regulator.h>
 #include <linux/mfd/tc3589x.h>
 #include <linux/mfd/tps6105x.h>
 #include <linux/mfd/abx500/ab8500-gpio.h>
@@ -89,6 +92,37 @@ static struct platform_device snowball_gpio_en_3v3_regulator_dev = {
        },
 };
 
+/* Dynamically populated. */
+static struct gpio sdi0_reg_gpios[] = {
+       { 0, GPIOF_OUT_INIT_LOW, "mmci_vsel" },
+};
+
+static struct gpio_regulator_state sdi0_reg_states[] = {
+       { .value = 2900000, .gpios = (0 << 0) },
+       { .value = 1800000, .gpios = (1 << 0) },
+};
+
+static struct gpio_regulator_config sdi0_reg_info = {
+       .supply_name            = "ext-mmc-level-shifter",
+       .gpios                  = sdi0_reg_gpios,
+       .nr_gpios               = ARRAY_SIZE(sdi0_reg_gpios),
+       .states                 = sdi0_reg_states,
+       .nr_states              = ARRAY_SIZE(sdi0_reg_states),
+       .type                   = REGULATOR_VOLTAGE,
+       .enable_high            = 1,
+       .enabled_at_boot        = 0,
+       .init_data              = &sdi0_reg_init_data,
+       .startup_delay          = 100,
+};
+
+static struct platform_device sdi0_regulator = {
+       .name = "gpio-regulator",
+       .id   = -1,
+       .dev  = {
+               .platform_data = &sdi0_reg_info,
+       },
+};
+
 static struct abx500_gpio_platform_data ab8500_gpio_pdata = {
        .gpio_base              = MOP500_AB8500_PIN_GPIO(1),
 };
@@ -198,10 +232,7 @@ static struct platform_device snowball_sbnet_dev = {
 
 struct ab8500_platform_data ab8500_platdata = {
        .irq_base       = MOP500_AB8500_IRQ_BASE,
-       .regulator_reg_init = ab8500_regulator_reg_init,
-       .num_regulator_reg_init = ARRAY_SIZE(ab8500_regulator_reg_init),
-       .regulator      = ab8500_regulators,
-       .num_regulator  = ARRAY_SIZE(ab8500_regulators),
+       .regulator      = &ab8500_regulator_plat_data,
        .gpio           = &ab8500_gpio_pdata,
        .codec          = &ab8500_codec_pdata,
 };
@@ -382,6 +413,15 @@ static void mop500_prox_deactivate(struct device *dev)
        regulator_put(prox_regulator);
 }
 
+void mop500_snowball_ethernet_clock_enable(void)
+{
+       struct clk *clk;
+
+       clk = clk_get_sys("fsmc", NULL);
+       if (!IS_ERR(clk))
+               clk_prepare_enable(clk);
+}
+
 static struct cryp_platform_data u8500_cryp1_platform_data = {
                .mem_to_engine = {
                                .dir = STEDMA40_MEM_TO_PERIPH,
@@ -424,6 +464,7 @@ static struct hash_platform_data u8500_hash1_platform_data = {
 /* add any platform devices here - TODO */
 static struct platform_device *mop500_platform_devs[] __initdata = {
        &mop500_gpio_keys_device,
+       &sdi0_regulator,
 };
 
 #ifdef CONFIG_STE_DMA40
@@ -566,6 +607,7 @@ static struct platform_device *snowball_platform_devs[] __initdata = {
        &snowball_sbnet_dev,
        &snowball_gpio_en_3v3_regulator_dev,
        &u8500_cpufreq_cooling_device,
+       &sdi0_regulator,
 };
 
 static void __init mop500_init_machine(void)
@@ -577,6 +619,9 @@ static void __init mop500_init_machine(void)
        platform_device_register(&db8500_prcmu_device);
        mop500_gpio_keys[0].gpio = GPIO_PROX_SENSOR;
 
+       sdi0_reg_info.enable_gpio = GPIO_SDMMC_EN;
+       sdi0_reg_info.gpios[0].gpio = GPIO_SDMMC_1V8_3V_SEL;
+
        mop500_pinmaps_init();
        parent = u8500_init_devices(&ab8500_platdata);
 
@@ -610,6 +655,10 @@ static void __init snowball_init_machine(void)
        int i;
 
        platform_device_register(&db8500_prcmu_device);
+
+       sdi0_reg_info.enable_gpio = SNOWBALL_SDMMC_EN_GPIO;
+       sdi0_reg_info.gpios[0].gpio = SNOWBALL_SDMMC_1V8_3V_GPIO;
+
        snowball_pinmaps_init();
        parent = u8500_init_devices(&ab8500_platdata);
 
@@ -625,6 +674,8 @@ static void __init snowball_init_machine(void)
        mop500_audio_init(parent);
        mop500_uart_init(parent);
 
+       mop500_snowball_ethernet_clock_enable();
+
        /* This board has full regulator constraints */
        regulator_has_full_constraints();
 }
@@ -643,6 +694,9 @@ static void __init hrefv60_init_machine(void)
         */
        mop500_gpio_keys[0].gpio = HREFV60_PROX_SENSE_GPIO;
 
+       sdi0_reg_info.enable_gpio = HREFV60_SDMMC_EN_GPIO;
+       sdi0_reg_info.gpios[0].gpio = HREFV60_SDMMC_1V8_3V_GPIO;
+
        hrefv60_pinmaps_init();
        parent = u8500_init_devices(&ab8500_platdata);