Some controllers do not provide clock information in their capabilities (in the Samsung case, it is because there are multiple clock sources available to the controller). Add hooks to allow the system to supply clock information. Signed-off-by: Ben Dooks Index: linux.git/drivers/mmc/host/sdhci.c =================================================================== --- linux.git.orig/drivers/mmc/host/sdhci.c 2008-10-21 10:49:19.000000000 +0100 +++ linux.git/drivers/mmc/host/sdhci.c 2008-10-21 11:01:38.000000000 +0100 @@ -1604,17 +1604,23 @@ int sdhci_add_host(struct sdhci_host *ho mmc_dev(host->mmc)->dma_mask = &host->dma_mask; } - host->max_clk = - (caps & SDHCI_CLOCK_BASE_MASK) >> SDHCI_CLOCK_BASE_SHIFT; + if (host->ops->get_max_clock) + host->max_clk = host->ops->get_max_clock(host); + else { + host->max_clk = (caps & SDHCI_CLOCK_BASE_MASK) >> SDHCI_CLOCK_BASE_SHIFT; + host->max_clk *= 1000000; + } if (host->max_clk == 0) { printk(KERN_ERR "%s: Hardware doesn't specify base clock " "frequency.\n", mmc_hostname(mmc)); return -ENODEV; } - host->max_clk *= 1000000; - host->timeout_clk = - (caps & SDHCI_TIMEOUT_CLK_MASK) >> SDHCI_TIMEOUT_CLK_SHIFT; + if (host->ops->get_timeout_clock) + host->timeout_clk = host->ops->get_timeout_clock(host); + else + host->timeout_clk = + (caps & SDHCI_TIMEOUT_CLK_MASK) >> SDHCI_TIMEOUT_CLK_SHIFT; if (host->timeout_clk == 0) { printk(KERN_ERR "%s: Hardware doesn't specify timeout clock " "frequency.\n", mmc_hostname(mmc)); Index: linux.git/drivers/mmc/host/sdhci.h =================================================================== --- linux.git.orig/drivers/mmc/host/sdhci.h 2008-10-21 10:49:19.000000000 +0100 +++ linux.git/drivers/mmc/host/sdhci.h 2008-10-21 11:01:38.000000000 +0100 @@ -267,6 +267,8 @@ struct sdhci_host { struct sdhci_ops { int (*enable_dma)(struct sdhci_host *host); + unsigned int (*get_max_clock)(struct sdhci_host *host); + unsigned int (*get_timeout_clock)(struct sdhci_host *host); }; -- Ben (ben@fluff.org, http://www.fluff.org/) 'a smiley only costs 4 bytes'