Message ID | 1348659527-4200-12-git-send-email-keyuan.liu@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
> + if (pdata && pdata->signal_voltage_switch) > + pdata->signal_voltage_switch(set); > +} > + > #ifdef CONFIG_OF > diff --git a/include/linux/platform_data/pxa_sdhci.h b/include/linux/platform_data/pxa_sdhci.h > index fdf38d6..3b94ab1 100644 > --- a/include/linux/platform_data/pxa_sdhci.h > +++ b/include/linux/platform_data/pxa_sdhci.h > @@ -40,6 +40,7 @@ > * @quirks: quirks of platfrom > * @quirks2: quirks2 of platfrom > * @pm_caps: pm_caps of platfrom > + * @signal_voltage_switch: soc/platfrom handling needed for voltage switch > */ > struct sdhci_pxa_platdata { > unsigned int flags; > @@ -54,6 +55,7 @@ struct sdhci_pxa_platdata { > unsigned int quirks; > unsigned int quirks2; > unsigned int pm_caps; > + void (*signal_voltage_switch)(unsigned int set); > }; > Using callback from pdata is in-acceptable. DT can not doing such way. /Zhangfei -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/mmc/host/sdhci-pxav3.c b/drivers/mmc/host/sdhci-pxav3.c index 04db9f1..2746bb5 100644 --- a/drivers/mmc/host/sdhci-pxav3.c +++ b/drivers/mmc/host/sdhci-pxav3.c @@ -163,10 +163,35 @@ static int pxav3_set_uhs_signaling(struct sdhci_host *host, unsigned int uhs) return 0; } +static void pxav3_signal_voltage_switch(struct sdhci_host *host, u8 vol) +{ + struct platform_device *pdev = to_platform_device(mmc_dev(host->mmc)); + struct sdhci_pxa_platdata *pdata = pdev->dev.platform_data; + unsigned int set; + + switch (vol) { + case MMC_SIGNAL_VOLTAGE_330: + set = 3300000; + break; + case MMC_SIGNAL_VOLTAGE_180: + set = 1800000; + break; + case MMC_SIGNAL_VOLTAGE_120: + set = 1200000; + break; + default: + set = 3300000; + break; + } + if (pdata && pdata->signal_voltage_switch) + pdata->signal_voltage_switch(set); +} + static struct sdhci_ops pxav3_sdhci_ops = { .platform_reset_exit = pxav3_set_private_registers, .set_uhs_signaling = pxav3_set_uhs_signaling, .platform_send_init_74_clocks = pxav3_gen_init_74_clocks, + .signal_voltage_switch = pxav3_signal_voltage_switch, }; #ifdef CONFIG_OF diff --git a/include/linux/platform_data/pxa_sdhci.h b/include/linux/platform_data/pxa_sdhci.h index fdf38d6..3b94ab1 100644 --- a/include/linux/platform_data/pxa_sdhci.h +++ b/include/linux/platform_data/pxa_sdhci.h @@ -40,6 +40,7 @@ * @quirks: quirks of platfrom * @quirks2: quirks2 of platfrom * @pm_caps: pm_caps of platfrom + * @signal_voltage_switch: soc/platfrom handling needed for voltage switch */ struct sdhci_pxa_platdata { unsigned int flags; @@ -54,6 +55,7 @@ struct sdhci_pxa_platdata { unsigned int quirks; unsigned int quirks2; unsigned int pm_caps; + void (*signal_voltage_switch)(unsigned int set); }; struct sdhci_pxa {