|
@@ -1099,6 +1099,22 @@ void mmc_set_bus_width(struct mmc_host *host, unsigned int width)
|
|
mmc_host_clk_release(host);
|
|
mmc_host_clk_release(host);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * Set initial state after a power cycle or a hw_reset.
|
|
|
|
+ */
|
|
|
|
+void mmc_set_initial_state(struct mmc_host *host)
|
|
|
|
+{
|
|
|
|
+ if (mmc_host_is_spi(host))
|
|
|
|
+ host->ios.chip_select = MMC_CS_HIGH;
|
|
|
|
+ else
|
|
|
|
+ host->ios.chip_select = MMC_CS_DONTCARE;
|
|
|
|
+ host->ios.bus_mode = MMC_BUSMODE_PUSHPULL;
|
|
|
|
+ host->ios.bus_width = MMC_BUS_WIDTH_1;
|
|
|
|
+ host->ios.timing = MMC_TIMING_LEGACY;
|
|
|
|
+
|
|
|
|
+ mmc_set_ios(host);
|
|
|
|
+}
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* mmc_vdd_to_ocrbitnum - Convert a voltage to the OCR bit number
|
|
* mmc_vdd_to_ocrbitnum - Convert a voltage to the OCR bit number
|
|
* @vdd: voltage (mV)
|
|
* @vdd: voltage (mV)
|
|
@@ -1537,15 +1553,9 @@ void mmc_power_up(struct mmc_host *host, u32 ocr)
|
|
mmc_host_clk_hold(host);
|
|
mmc_host_clk_hold(host);
|
|
|
|
|
|
host->ios.vdd = fls(ocr) - 1;
|
|
host->ios.vdd = fls(ocr) - 1;
|
|
- if (mmc_host_is_spi(host))
|
|
|
|
- host->ios.chip_select = MMC_CS_HIGH;
|
|
|
|
- else
|
|
|
|
- host->ios.chip_select = MMC_CS_DONTCARE;
|
|
|
|
- host->ios.bus_mode = MMC_BUSMODE_PUSHPULL;
|
|
|
|
host->ios.power_mode = MMC_POWER_UP;
|
|
host->ios.power_mode = MMC_POWER_UP;
|
|
- host->ios.bus_width = MMC_BUS_WIDTH_1;
|
|
|
|
- host->ios.timing = MMC_TIMING_LEGACY;
|
|
|
|
- mmc_set_ios(host);
|
|
|
|
|
|
+ /* Set initial state and call mmc_set_ios */
|
|
|
|
+ mmc_set_initial_state(host);
|
|
|
|
|
|
/* Try to set signal voltage to 3.3V but fall back to 1.8v or 1.2v */
|
|
/* Try to set signal voltage to 3.3V but fall back to 1.8v or 1.2v */
|
|
if (__mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330) == 0)
|
|
if (__mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330) == 0)
|
|
@@ -1585,14 +1595,9 @@ void mmc_power_off(struct mmc_host *host)
|
|
host->ios.clock = 0;
|
|
host->ios.clock = 0;
|
|
host->ios.vdd = 0;
|
|
host->ios.vdd = 0;
|
|
|
|
|
|
- if (!mmc_host_is_spi(host)) {
|
|
|
|
- host->ios.bus_mode = MMC_BUSMODE_OPENDRAIN;
|
|
|
|
- host->ios.chip_select = MMC_CS_DONTCARE;
|
|
|
|
- }
|
|
|
|
host->ios.power_mode = MMC_POWER_OFF;
|
|
host->ios.power_mode = MMC_POWER_OFF;
|
|
- host->ios.bus_width = MMC_BUS_WIDTH_1;
|
|
|
|
- host->ios.timing = MMC_TIMING_LEGACY;
|
|
|
|
- mmc_set_ios(host);
|
|
|
|
|
|
+ /* Set initial state and call mmc_set_ios */
|
|
|
|
+ mmc_set_initial_state(host);
|
|
|
|
|
|
/*
|
|
/*
|
|
* Some configurations, such as the 802.11 SDIO card in the OLPC
|
|
* Some configurations, such as the 802.11 SDIO card in the OLPC
|
|
@@ -2278,16 +2283,8 @@ static int mmc_do_hw_reset(struct mmc_host *host, int check)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- if (mmc_host_is_spi(host)) {
|
|
|
|
- host->ios.chip_select = MMC_CS_HIGH;
|
|
|
|
- host->ios.bus_mode = MMC_BUSMODE_PUSHPULL;
|
|
|
|
- } else {
|
|
|
|
- host->ios.chip_select = MMC_CS_DONTCARE;
|
|
|
|
- host->ios.bus_mode = MMC_BUSMODE_OPENDRAIN;
|
|
|
|
- }
|
|
|
|
- host->ios.bus_width = MMC_BUS_WIDTH_1;
|
|
|
|
- host->ios.timing = MMC_TIMING_LEGACY;
|
|
|
|
- mmc_set_ios(host);
|
|
|
|
|
|
+ /* Set initial state and call mmc_set_ios */
|
|
|
|
+ mmc_set_initial_state(host);
|
|
|
|
|
|
mmc_host_clk_release(host);
|
|
mmc_host_clk_release(host);
|
|
|
|
|