aboutsummaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorAndy Green <andy@openmoko.com>2008-11-19 17:09:57 +0000
committerAndy Green <agreen@pads.home.warmcat.com>2008-11-19 17:09:57 +0000
commit7238eb667b1b4622e37e4a2b40caf9c49312c6bf (patch)
treef594257bd574926fa744c3e9053908d6850d13a9 /drivers
parent0bbf22c374ca069c0c7ae3f039cd5adb272484d1 (diff)
fix-glamo-mci-possible-timeout-overflow.patch
The MMC stack hands us a timeout calibrated in SD_CLK clocks, but the Glamo can only deal with up to 65520 clocks of timeout. If the stack handed us a request bigger than this, it would just wrap and the timeout we actually used would be way too short. With this patch if that happens, we use the longest timeout we can, 65520 clocks and give it our best shot. Signed-off-by: Andy Green <andy@openmoko.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/mfd/glamo/glamo-mci.c19
1 files changed, 10 insertions, 9 deletions
diff --git a/drivers/mfd/glamo/glamo-mci.c b/drivers/mfd/glamo/glamo-mci.c
index 037444604c1..505be5f89b6 100644
--- a/drivers/mfd/glamo/glamo-mci.c
+++ b/drivers/mfd/glamo/glamo-mci.c
@@ -338,6 +338,7 @@ static int glamo_mci_send_command(struct glamo_mci_host *host,
{
u8 u8a[6];
u16 fire = 0;
+ u16 timeout = 0xfff; /* max glamo MMC timeout, in units of 16 clocks */
/* if we can't do it, reject as busy */
if (!readw_dly(host->base + GLAMO_REG_MMC_RB_STAT1) &
@@ -447,15 +448,15 @@ static int glamo_mci_send_command(struct glamo_mci_host *host,
fire |= GLAMO_FIRE_MMC_CC_BASIC; /* "basic command" */
break;
}
- /* enforce timeout */
- if (cmd->data) {
- if (cmd->data->timeout_clks)
- writew_dly(cmd->data->timeout_clks >> 4, /* / 16 clks */
- host->base + GLAMO_REG_MMC_TIMEOUT);
- else
- writew_dly(0xfff, host->base + GLAMO_REG_MMC_TIMEOUT);
- } else
- writew(0xfff, host->base + GLAMO_REG_MMC_TIMEOUT);
+ /* enforce timeout, clipping at default 65520 clocks if larger */
+ if (cmd->data)
+ /* so long as there is one... */
+ if (cmd->data->timeout_clks &&
+ /* ... and it is not longer than we can handle */
+ (cmd->data->timeout_clks <= 0xffff))
+ timeout = cmd->data->timeout_clks >> 4; /* / 16 clks */
+
+ writew(timeout, host->base + GLAMO_REG_MMC_TIMEOUT);
/* Generate interrupt on txfer */
writew_dly((readw_dly(host->base + GLAMO_REG_MMC_BASIC) & 0x3e) |