|
@@ -39,10 +39,17 @@ static void tx4938ide_tune_ebusc(unsigned int ebus_ch,
|
|
|
/* Address-valid to DIOR/DIOW setup */
|
|
|
shwt = DIV_ROUND_UP(t->setup, cycle);
|
|
|
|
|
|
+ /* -DIOx recovery time (SHWT * 4) and cycle time requirement */
|
|
|
+ while ((shwt * 4 + wt + (wt ? 2 : 3)) * cycle < t->cycle)
|
|
|
+ shwt++;
|
|
|
+ if (shwt > 7) {
|
|
|
+ pr_warning("tx4938ide: SHWT violation (%d)\n", shwt);
|
|
|
+ shwt = 7;
|
|
|
+ }
|
|
|
pr_debug("tx4938ide: ebus %d, bus cycle %dns, WT %d, SHWT %d\n",
|
|
|
ebus_ch, cycle, wt, shwt);
|
|
|
|
|
|
- __raw_writeq((cr & ~(0x3f007ull)) | (wt << 12) | shwt,
|
|
|
+ __raw_writeq((cr & ~0x3f007ull) | (wt << 12) | shwt,
|
|
|
&tx4938_ebuscptr->cr[ebus_ch]);
|
|
|
}
|
|
|
|