diff options
author | Atsushi Nemoto <anemo@mba.ocn.ne.jp> | 2008-11-02 15:40:09 -0500 |
---|---|---|
committer | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2008-11-02 15:40:09 -0500 |
commit | 630a8b2500c8d04e87e597c4afa5e1fafff04591 (patch) | |
tree | 846c569c1f4f16bf6c1fdef1071850ce48f2c920 /drivers/ide/tx4938ide.c | |
parent | ccd32e221c3e3797ac56305c554ad8b07c13c815 (diff) |
tx4938ide: Check minimum cycle time and SHWT range (v2)
SHWT value is used as address valid to -CSx assertion and -CSx to -DIOx
assertion setup time, and contrarywise, -DIOx to -CSx release and -CSx
release to address invalid hold time, so it actualy applies 4 times and
so constitutes -DIOx recovery time. Check requirement of the recovery
time and cycle time. Also check SHWT maximum value.
Suggested-by: Sergei Shtylyov <sshtylyov@ru.mvista.com>
Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Cc: ralf@linux-mips.org
Acked-by: Sergei Shtylyov <sshtylyov@ru.mvista.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Diffstat (limited to 'drivers/ide/tx4938ide.c')
-rw-r--r-- | drivers/ide/tx4938ide.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/ide/tx4938ide.c b/drivers/ide/tx4938ide.c index fa660f931a11..9c518e722707 100644 --- a/drivers/ide/tx4938ide.c +++ b/drivers/ide/tx4938ide.c | |||
@@ -39,10 +39,17 @@ static void tx4938ide_tune_ebusc(unsigned int ebus_ch, | |||
39 | /* Address-valid to DIOR/DIOW setup */ | 39 | /* Address-valid to DIOR/DIOW setup */ |
40 | shwt = DIV_ROUND_UP(t->setup, cycle); | 40 | shwt = DIV_ROUND_UP(t->setup, cycle); |
41 | 41 | ||
42 | /* -DIOx recovery time (SHWT * 4) and cycle time requirement */ | ||
43 | while ((shwt * 4 + wt + (wt ? 2 : 3)) * cycle < t->cycle) | ||
44 | shwt++; | ||
45 | if (shwt > 7) { | ||
46 | pr_warning("tx4938ide: SHWT violation (%d)\n", shwt); | ||
47 | shwt = 7; | ||
48 | } | ||
42 | pr_debug("tx4938ide: ebus %d, bus cycle %dns, WT %d, SHWT %d\n", | 49 | pr_debug("tx4938ide: ebus %d, bus cycle %dns, WT %d, SHWT %d\n", |
43 | ebus_ch, cycle, wt, shwt); | 50 | ebus_ch, cycle, wt, shwt); |
44 | 51 | ||
45 | __raw_writeq((cr & ~(0x3f007ull)) | (wt << 12) | shwt, | 52 | __raw_writeq((cr & ~0x3f007ull) | (wt << 12) | shwt, |
46 | &tx4938_ebuscptr->cr[ebus_ch]); | 53 | &tx4938_ebuscptr->cr[ebus_ch]); |
47 | } | 54 | } |
48 | 55 | ||