summaryrefslogtreecommitdiffstats
path: root/drivers/mci/atmel_mci.c
diff options
context:
space:
mode:
authorJean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>2013-01-25 16:17:42 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2013-01-25 19:52:43 +0100
commit14b2c8f15b10661ddb57a894df08a13a5accb7ac (patch)
tree86b87763c98a16f3826bb0d1bca56d405eddc786 /drivers/mci/atmel_mci.c
parent40a333b0623ebb4f188f9fb2820ed873f3415e41 (diff)
downloadbarebox-14b2c8f15b10661ddb57a894df08a13a5accb7ac.tar.gz
barebox-14b2c8f15b10661ddb57a894df08a13a5accb7ac.tar.xz
atmel_mci: on version 0x0 we need to reset the IP at each request
Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/mci/atmel_mci.c')
-rw-r--r--drivers/mci/atmel_mci.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/mci/atmel_mci.c b/drivers/mci/atmel_mci.c
index bf0adb0ad0..1b603481f9 100644
--- a/drivers/mci/atmel_mci.c
+++ b/drivers/mci/atmel_mci.c
@@ -30,6 +30,7 @@
struct atmel_mci_caps {
bool has_rwproof;
bool has_odd_clk_div;
+ bool need_reset_after_xfer;
};
struct atmel_mci {
@@ -411,6 +412,12 @@ static int atmci_request(struct mci_host *mci, struct mci_cmd *cmd, struct mci_d
u32 stat, cmdat = 0;
int ret;
+ if (host->caps.need_reset_after_xfer) {
+ atmci_writel(host, ATMCI_CR, ATMCI_CR_SWRST);
+ atmci_writel(host, ATMCI_CR, ATMCI_CR_MCIEN);
+ atmci_writel(host, ATMCI_MR, host->mode_reg);
+ }
+
if (cmd->resp_type != MMC_RSP_NONE)
cmdat |= ATMCI_CMDR_MAXLAT_64CYC;
@@ -471,6 +478,8 @@ static void atmci_get_cap(struct atmel_mci *host)
dev_info(host->hw_dev, "version: 0x%x\n", version);
+ host->caps.need_reset_after_xfer = 1;
+
switch (version & 0xf00) {
case 0x500:
host->caps.has_odd_clk_div = 1;
@@ -479,6 +488,7 @@ static void atmci_get_cap(struct atmel_mci *host)
case 0x200:
host->caps.has_rwproof = 1;
case 0x100:
+ host->caps.need_reset_after_xfer = 0;
case 0x0:
break;
default: