@@ -89,6 +89,9 @@ static unsigned long brownstone_pin_config[] __initdata = {
GPIO41_MMC2_CMD | MFP_PULL_HIGH,
GPIO42_MMC2_CLK,
+ GPIO57_GPIO | MFP_LPM_DRIVE_HIGH | MFP_PULL_HIGH,
+ GPIO58_GPIO | MFP_LPM_DRIVE_HIGH | MFP_PULL_HIGH,
+
/* MMC2 */
GPIO165_MMC3_DAT7 | MFP_PULL_HIGH,
GPIO162_MMC3_DAT6 | MFP_PULL_HIGH,@@ -180,12 +183,66 @@ static struct sdhci_pxa_platdata mmp2_sdh_platdata_mmc0 = {
.clk_delay_cycles = 0x1f,
};
+static struct sdhci_pxa_platdata mmp2_sdh_platdata_mmc1 = {
+ .flags = PXA_FLAG_CARD_PERMANENT,
+};
+
static struct sdhci_pxa_platdata mmp2_sdh_platdata_mmc2 = {
.clk_delay_cycles = 0x1f,
.flags = PXA_FLAG_CARD_PERMANENT
| PXA_FLAG_SD_8_BIT_CAPABLE_SLOT,
};
+static struct regulator_consumer_supply sdio_power_supplies[] = {
+ REGULATOR_SUPPLY("vsdio", "sdhci-pxav3.1"),
+};
+
+static struct regulator_init_data sdio_power_data = {
+ .constraints = {
+ .valid_ops_mask = REGULATOR_CHANGE_STATUS,
+ },
+ .num_consumer_supplies = ARRAY_SIZE(sdio_power_supplies),
+ .consumer_supplies = sdio_power_supplies,
+};
+
+static struct fixed_voltage_config sdio_power = {
+ .supply_name = "vsdio",
+ .microvolts = 3000000,
+ .gpio = mfp_to_gpio(MFP_PIN_GPIO57),
+ .enable_high = 1,
+ .enabled_at_boot = 0,
+ .init_data = &sdio_power_data,
+};
+
+static struct platform_device sdio_power_device = {
+ .name = "reg-fixed-voltage",
+ .id = 2,
+ .dev = {
+ .platform_data = &sdio_power,
+ },
+};
+
+static int __init brownstone_init_mmc(void)
+{
+ /*
+ * PDn: GPIO58; RESETn: GPIO57
+ * 8787, RESETn keeps high, PDn control power
+ * on: PDn 1; off: PDn 0;
+ */
+ int RESETn = mfp_to_gpio(MFP_PIN_GPIO58);
+
+ if (gpio_request(RESETn, "sdio RESETn")) {
+ pr_err("Failed to request sdio RESETn gpio\n");
+ return -EIO;
+ }
+ gpio_direction_output(RESETn, 1);
+ gpio_free(RESETn);
+
+ platform_device_register(&sdio_power_device);
+ mmp2_add_sdhost(0, &mmp2_sdh_platdata_mmc0); /* SD/MMC */
+ mmp2_add_sdhost(1, &mmp2_sdh_platdata_mmc1); /* sdio */
+ mmp2_add_sdhost(2, &mmp2_sdh_platdata_mmc2); /* eMMC */
+}
static void __init brownstone_init(void)
{@@ -195,8 +252,7 @@ static void __init brownstone_init(void)
mmp2_add_uart(1);
mmp2_add_uart(3);
mmp2_add_twsi(1, NULL, ARRAY_AND_SIZE(brownstone_twsi1_info));
- mmp2_add_sdhost(0, &mmp2_sdh_platdata_mmc0); /* SD/MMC */
- mmp2_add_sdhost(2, &mmp2_sdh_platdata_mmc2); /* eMMC */
+ brownstone_init_mmc();
/* enable 5v regulator */
platform_device_register(&brownstone_v_5vp_device);