|
@@ -831,6 +831,19 @@ static void tmio_mmc_power_off(struct tmio_mmc_host *host)
|
|
|
host->set_pwr(host->pdev, 0);
|
|
|
}
|
|
|
|
|
|
+static void tmio_mmc_set_bus_width(struct tmio_mmc_host *host,
|
|
|
+ unsigned char bus_width)
|
|
|
+{
|
|
|
+ switch (bus_width) {
|
|
|
+ case MMC_BUS_WIDTH_1:
|
|
|
+ sd_ctrl_write16(host, CTL_SD_MEM_CARD_OPT, 0x80e0);
|
|
|
+ break;
|
|
|
+ case MMC_BUS_WIDTH_4:
|
|
|
+ sd_ctrl_write16(host, CTL_SD_MEM_CARD_OPT, 0x00e0);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
/* Set MMC clock / power.
|
|
|
* Note: This controller uses a simple divider scheme therefore it cannot
|
|
|
* run a MMC card at full speed (20MHz). The max clock is 24MHz on SD, but as
|
|
@@ -914,16 +927,8 @@ static void tmio_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (host->power != TMIO_MMC_OFF_STOP) {
|
|
|
- switch (ios->bus_width) {
|
|
|
- case MMC_BUS_WIDTH_1:
|
|
|
- sd_ctrl_write16(host, CTL_SD_MEM_CARD_OPT, 0x80e0);
|
|
|
- break;
|
|
|
- case MMC_BUS_WIDTH_4:
|
|
|
- sd_ctrl_write16(host, CTL_SD_MEM_CARD_OPT, 0x00e0);
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
+ if (host->power != TMIO_MMC_OFF_STOP)
|
|
|
+ tmio_mmc_set_bus_width(host, ios->bus_width);
|
|
|
|
|
|
/* Let things settle. delay taken from winCE driver */
|
|
|
udelay(140);
|