Commit 5897d657 authored by Alex Dubov's avatar Alex Dubov Committed by Pierre Ossman

tifm_sd: fix resume handler

Resume should not explicitly check for media type. Instead, it may relay
on success of socket initialization.
Small changes are introduced to tifm_sd_initialize to make it more robust.
Signed-off-by: default avatarAlex Dubov <oakad@yahoo.com>
Signed-off-by: default avatarPierre Ossman <drzeus@drzeus.cx>
parent 72dc9d96
...@@ -36,7 +36,6 @@ module_param(fixed_timeout, bool, 0644); ...@@ -36,7 +36,6 @@ module_param(fixed_timeout, bool, 0644);
#define TIFM_MMCSD_INAB 0x0080 /* abort / initialize command */ #define TIFM_MMCSD_INAB 0x0080 /* abort / initialize command */
#define TIFM_MMCSD_READ 0x8000 #define TIFM_MMCSD_READ 0x8000
#define TIFM_MMCSD_DATAMASK 0x401d /* set bits: CERR, EOFB, BRS, CB, EOC */
#define TIFM_MMCSD_ERRMASK 0x01e0 /* set bits: CCRC, CTO, DCRC, DTO */ #define TIFM_MMCSD_ERRMASK 0x01e0 /* set bits: CCRC, CTO, DCRC, DTO */
#define TIFM_MMCSD_EOC 0x0001 /* end of command phase */ #define TIFM_MMCSD_EOC 0x0001 /* end of command phase */
#define TIFM_MMCSD_CB 0x0004 /* card enter busy state */ #define TIFM_MMCSD_CB 0x0004 /* card enter busy state */
...@@ -731,7 +730,7 @@ static int tifm_sd_initialize_host(struct tifm_sd *host) ...@@ -731,7 +730,7 @@ static int tifm_sd_initialize_host(struct tifm_sd *host)
sock->addr + SOCK_MMCSD_CONFIG); sock->addr + SOCK_MMCSD_CONFIG);
/* wait up to 0.51 sec for reset */ /* wait up to 0.51 sec for reset */
for (rc = 2; rc <= 256; rc <<= 1) { for (rc = 32; rc <= 256; rc <<= 1) {
if (1 & readl(sock->addr + SOCK_MMCSD_SYSTEM_STATUS)) { if (1 & readl(sock->addr + SOCK_MMCSD_SYSTEM_STATUS)) {
rc = 0; rc = 0;
break; break;
...@@ -740,8 +739,8 @@ static int tifm_sd_initialize_host(struct tifm_sd *host) ...@@ -740,8 +739,8 @@ static int tifm_sd_initialize_host(struct tifm_sd *host)
} }
if (rc) { if (rc) {
printk(KERN_ERR DRIVER_NAME printk(KERN_ERR "%s : controller failed to reset\n",
": controller failed to reset\n"); sock->dev.bus_id);
return -ENODEV; return -ENODEV;
} }
...@@ -754,8 +753,7 @@ static int tifm_sd_initialize_host(struct tifm_sd *host) ...@@ -754,8 +753,7 @@ static int tifm_sd_initialize_host(struct tifm_sd *host)
writel(64, sock->addr + SOCK_MMCSD_COMMAND_TO); writel(64, sock->addr + SOCK_MMCSD_COMMAND_TO);
writel(TIFM_MMCSD_INAB, sock->addr + SOCK_MMCSD_COMMAND); writel(TIFM_MMCSD_INAB, sock->addr + SOCK_MMCSD_COMMAND);
/* INAB should take much less than reset */ for (rc = 16; rc <= 64; rc <<= 1) {
for (rc = 1; rc <= 16; rc <<= 1) {
host_status = readl(sock->addr + SOCK_MMCSD_STATUS); host_status = readl(sock->addr + SOCK_MMCSD_STATUS);
writel(host_status, sock->addr + SOCK_MMCSD_STATUS); writel(host_status, sock->addr + SOCK_MMCSD_STATUS);
if (!(host_status & TIFM_MMCSD_ERRMASK) if (!(host_status & TIFM_MMCSD_ERRMASK)
...@@ -767,12 +765,14 @@ static int tifm_sd_initialize_host(struct tifm_sd *host) ...@@ -767,12 +765,14 @@ static int tifm_sd_initialize_host(struct tifm_sd *host)
} }
if (rc) { if (rc) {
printk(KERN_ERR DRIVER_NAME printk(KERN_ERR
": card not ready - probe failed on initialization\n"); "%s : card not ready - probe failed on initialization\n",
sock->dev.bus_id);
return -ENODEV; return -ENODEV;
} }
writel(TIFM_MMCSD_DATAMASK | TIFM_MMCSD_ERRMASK, writel(TIFM_MMCSD_CERR | TIFM_MMCSD_BRS | TIFM_MMCSD_EOC
| TIFM_MMCSD_ERRMASK,
sock->addr + SOCK_MMCSD_INT_ENABLE); sock->addr + SOCK_MMCSD_INT_ENABLE);
mmiowb(); mmiowb();
...@@ -887,14 +887,17 @@ static int tifm_sd_resume(struct tifm_dev *sock) ...@@ -887,14 +887,17 @@ static int tifm_sd_resume(struct tifm_dev *sock)
{ {
struct mmc_host *mmc = tifm_get_drvdata(sock); struct mmc_host *mmc = tifm_get_drvdata(sock);
struct tifm_sd *host = mmc_priv(mmc); struct tifm_sd *host = mmc_priv(mmc);
int rc;
if (sock->type != TIFM_TYPE_SD rc = tifm_sd_initialize_host(host);
|| tifm_sd_initialize_host(host)) { dev_dbg(&sock->dev, "resume initialize %d\n", rc);
tifm_eject(sock);
return 0; if (rc)
} else { host->eject = 1;
return mmc_resume_host(mmc); else
} rc = mmc_resume_host(mmc);
return rc;
} }
#else #else
......
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