@@ -1221,6 +1221,26 @@ static void mmc_spi_shutdownsequence(struct mmc_spi_host *host)
}
}
+static inline int mmc_spi_setpower(struct mmc_spi_host *host,
+ unsigned char power_mode,
+ unsigned int vdd)
+{
+ /* switch power on/off if possible, accounting for
+ * max 250msec powerup time if needed.
+ */
+ if (mmc_spi_canpower(host)) {
+ switch (power_mode) {
+ case MMC_POWER_OFF:
+ case MMC_POWER_UP:
+ host->pdata->setpower(&host->spi->dev, vdd);
+ if (power_mode == MMC_POWER_UP)
+ msleep(host->powerup_msecs);
+ }
+ }
+
+ return 0;
+}
+
static char *mmc_powerstring(u8 power_mode)
{
switch (power_mode) {
@@ -1236,24 +1256,23 @@ static void mmc_spi_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
struct mmc_spi_host *host = mmc_priv(mmc);
if (host->power_mode != ios->power_mode) {
+ int ret;
dev_dbg(&host->spi->dev, "mmc_spi: power %s (%d)%s\n",
mmc_powerstring(ios->power_mode),
ios->vdd,
mmc_spi_canpower(host) ? ", can switch" : "");
- /* switch power on/off if possible, accounting for
- * max 250msec powerup time if needed.
- */
- if (mmc_spi_canpower(host)) {
- switch (ios->power_mode) {
- case MMC_POWER_OFF:
- case MMC_POWER_UP:
- host->pdata->setpower(&host->spi->dev,
- ios->vdd);
- if (ios->power_mode == MMC_POWER_UP)
- msleep(host->powerup_msecs);
- }
+ ret = mmc_spi_setpower(host, ios->power_mode, ios->vdd);
+ if (ret) {
+ dev_err(mmc_dev(mmc), "unable to set power\n");
+ /*
+ * The .set_ios() function in the mmc_host_ops
+ * struct return void, and failing to set the
+ * power should be rare so we print an error and
+ * return here.
+ */
+ return;
}
/* See 6.4.1 in the simplified SD card physical spec 2.0 */
Factor out a mmc_spi_setpower() function so to make changing it more elegant without adding too much stuff to mmc_spi_set_ios(). Signed-off-by: Antonio Ospite <ospite@studenti.unina.it> --- drivers/mmc/host/mmc_spi.c | 43 +++++++++++++++++++++++++++++++------------ 1 files changed, 31 insertions(+), 12 deletions(-)