Commit f060bc9c authored by Jerry Huang's avatar Jerry Huang Committed by Chris Ball

mmc: esdhc: Workaround for data crc error on p1010rdb

SD card read was failing (data crc error) on some cards at
maximum possible frequency on P1010 (CCB frequency set to 400MHz).
Some clock deviations are also observed at this frequency.
Hence reduced the mmc clock freq.
Signed-off-by: default avatarPriyanka Jain <Priyanka.Jain@freescale.com>
Singed-off-by: default avatarJerry Huang <Chang-Ming.Huang@freescale.com>
Acked-by: default avatarAnton Vorontsov <cbouatmailru@gmail.com>
Signed-off-by: default avatarChris Ball <cjb@laptop.org>
parent 7b2fd4f2
/* /*
* Freescale eSDHC controller driver. * Freescale eSDHC controller driver.
* *
* Copyright (c) 2007, 2010 Freescale Semiconductor, Inc. * Copyright (c) 2007, 2010, 2012 Freescale Semiconductor, Inc.
* Copyright (c) 2009 MontaVista Software, Inc. * Copyright (c) 2009 MontaVista Software, Inc.
* *
* Authors: Xiaobo Xie <X.Xie@freescale.com> * Authors: Xiaobo Xie <X.Xie@freescale.com>
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
*/ */
#include <linux/io.h> #include <linux/io.h>
#include <linux/of.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/mmc/host.h> #include <linux/mmc/host.h>
...@@ -114,6 +115,20 @@ static unsigned int esdhc_of_get_min_clock(struct sdhci_host *host) ...@@ -114,6 +115,20 @@ static unsigned int esdhc_of_get_min_clock(struct sdhci_host *host)
return pltfm_host->clock / 256 / 16; return pltfm_host->clock / 256 / 16;
} }
static void esdhc_of_set_clock(struct sdhci_host *host, unsigned int clock)
{
/* Workaround to reduce the clock frequency for p1010 esdhc */
if (of_find_compatible_node(NULL, NULL, "fsl,p1010-esdhc")) {
if (clock > 20000000)
clock -= 5000000;
if (clock > 40000000)
clock -= 5000000;
}
/* Set the clock */
esdhc_set_clock(host, clock);
}
#ifdef CONFIG_PM #ifdef CONFIG_PM
static u32 esdhc_proctl; static u32 esdhc_proctl;
static void esdhc_of_suspend(struct sdhci_host *host) static void esdhc_of_suspend(struct sdhci_host *host)
...@@ -135,7 +150,7 @@ static struct sdhci_ops sdhci_esdhc_ops = { ...@@ -135,7 +150,7 @@ static struct sdhci_ops sdhci_esdhc_ops = {
.write_l = sdhci_be32bs_writel, .write_l = sdhci_be32bs_writel,
.write_w = esdhc_writew, .write_w = esdhc_writew,
.write_b = esdhc_writeb, .write_b = esdhc_writeb,
.set_clock = esdhc_set_clock, .set_clock = esdhc_of_set_clock,
.enable_dma = esdhc_of_enable_dma, .enable_dma = esdhc_of_enable_dma,
.get_max_clock = esdhc_of_get_max_clock, .get_max_clock = esdhc_of_get_max_clock,
.get_min_clock = esdhc_of_get_min_clock, .get_min_clock = esdhc_of_get_min_clock,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment