sdhci-pxa.c sets f_max after sdhci_add_host was called. Rather then do this after the call, define a callback to allow f_max to be obtained from platform specific code if the callback is defined. We cannot use the quirk SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN since the clock is not broken and on mmp2 is fixed at 200MHz. On some pxa platforms and changing this value a) does not work b) causes bad clock dividers c) mmc errors On other platforms defining SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN is the right thing to do (pxa168 and pxa910) since the clock is configured via system registers and not known via the CAPABILITY Register. Signed-off-by: Philip Rakity <prakity@xxxxxxxxxxx> --- drivers/mmc/host/sdhci-pxa.c | 16 +++++++++++++--- 1 files changed, 13 insertions(+), 3 deletions(-) diff --git a/drivers/mmc/host/sdhci-pxa.c b/drivers/mmc/host/sdhci-pxa.c index 0afc763..4c2a252 100644 --- a/drivers/mmc/host/sdhci-pxa.c +++ b/drivers/mmc/host/sdhci-pxa.c @@ -53,7 +53,15 @@ static void enable_clock(struct sdhci_host *host) } } +static unsigned int get_f_max_clock(struct sdhci_host *host) +{ + struct sdhci_pxa *pxa = sdhci_priv(host); + + return pxa->pdata->max_speed; +} + static struct sdhci_ops sdhci_pxa_ops = { + .get_f_max_clock = NULL, }; /*****************************************************************************\ @@ -131,15 +139,17 @@ static int __devinit sdhci_pxa_probe(struct platform_device *pdev) /* do not rely on u-boot to enable the clocks */ enable_clock(host); + if (pxa->pdata->max_speed) + sdhci_pxa_ops.get_f_max_clock = get_f_max_clock; + else + sdhci_pxa_ops.get_f_max_clock = NULL; + ret = sdhci_add_host(host); if (ret) { dev_err(&pdev->dev, "failed to add host\n"); goto out; } - if (pxa->pdata->max_speed) - host->mmc->f_max = pxa->pdata->max_speed; - platform_set_drvdata(pdev, host); return 0; -- 1.7.0.4 -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html