@@ -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
@@ -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 {