|
@@ -616,6 +616,7 @@ static void sdhci_finish_command(struct sdhci_host *host)
|
|
|
static void sdhci_set_clock(struct sdhci_host *host, unsigned int clock)
|
|
|
{
|
|
|
int div;
|
|
|
+ u8 ctrl;
|
|
|
u16 clk;
|
|
|
unsigned long timeout;
|
|
|
|
|
@@ -624,6 +625,13 @@ static void sdhci_set_clock(struct sdhci_host *host, unsigned int clock)
|
|
|
|
|
|
writew(0, host->ioaddr + SDHCI_CLOCK_CONTROL);
|
|
|
|
|
|
+ ctrl = readb(host->ioaddr + SDHCI_HOST_CONTROL);
|
|
|
+ if (clock > 25000000)
|
|
|
+ ctrl |= SDHCI_CTRL_HISPD;
|
|
|
+ else
|
|
|
+ ctrl &= ~SDHCI_CTRL_HISPD;
|
|
|
+ writeb(ctrl, host->ioaddr + SDHCI_HOST_CONTROL);
|
|
|
+
|
|
|
if (clock == 0)
|
|
|
goto out;
|
|
|
|
|
@@ -1291,6 +1299,13 @@ static int __devinit sdhci_probe_slot(struct pci_dev *pdev, int slot)
|
|
|
else if (caps & SDHCI_CAN_VDD_180)
|
|
|
mmc->ocr_avail |= MMC_VDD_17_18|MMC_VDD_18_19;
|
|
|
|
|
|
+ if ((host->max_clk > 25000000) && !(caps & SDHCI_CAN_DO_HISPD)) {
|
|
|
+ printk(KERN_ERR "%s: Controller reports > 25 MHz base clock,"
|
|
|
+ " but no high speed support.\n",
|
|
|
+ host->slot_descr);
|
|
|
+ mmc->f_max = 25000000;
|
|
|
+ }
|
|
|
+
|
|
|
if (mmc->ocr_avail == 0) {
|
|
|
printk(KERN_ERR "%s: Hardware doesn't report any "
|
|
|
"support voltages.\n", host->slot_descr);
|