diff --git a/drivers/mtd/chips/cfi_cmdset_0002.c b/drivers/mtd/chips/cfi_cmdset_0002.c
index 22d0493..8ce3b44 100644
--- a/drivers/mtd/chips/cfi_cmdset_0002.c
+++ b/drivers/mtd/chips/cfi_cmdset_0002.c
@@ -48,6 +48,9 @@
 #define SST49LF008A		0x005a
 #define AT49BV6416		0x00d6
 
+/* Write operation timeout, ms */
+#define WRITE_TIEMEOUT 2
+
 static int cfi_amdstd_read (struct mtd_info *, loff_t, size_t, size_t *, u_char *);
 static int cfi_amdstd_write_words(struct mtd_info *, loff_t, size_t, size_t *, const u_char *);
 static int cfi_amdstd_write_buffers(struct mtd_info *, loff_t, size_t, size_t *, const u_char *);
@@ -1143,17 +1146,6 @@ static int cfi_amdstd_secsi_read (struct mtd_info *mtd, loff_t from, size_t len,
 static int __xipram do_write_oneword(struct map_info *map, struct flchip *chip, unsigned long adr, map_word datum)
 {
 	struct cfi_private *cfi = map->fldrv_priv;
-	unsigned long timeo = jiffies + HZ;
-	/*
-	 * We use a 1ms + 1 jiffies generic timeout for writes (most devices
-	 * have a max write time of a few hundreds usec). However, we should
-	 * use the maximum timeout value given by the chip at probe time
-	 * instead.  Unfortunately, struct flchip does have a field for
-	 * maximum timeout, only for typical which can be far too short
-	 * depending of the conditions.	 The ' + 1' is to avoid having a
-	 * timeout of 0 jiffies if HZ is smaller than 1000.
-	 */
-	unsigned long uWriteTimeout = ( HZ / 1000 ) + 1;
 	int ret = 0;
 	map_word oldd;
 	int retry_cnt = 0;
@@ -1197,8 +1189,6 @@ static int __xipram do_write_oneword(struct map_info *map, struct flchip *chip,
 				adr, map_bankwidth(map),
 				chip->word_write_time);
 
-	/* See comment above for timeout value. */
-	timeo = jiffies + uWriteTimeout;
 	for (;;) {
 		if (chip->state != FL_WRITING) {
 			/* Someone's suspended the write. Sleep */
@@ -1207,20 +1197,18 @@ static int __xipram do_write_oneword(struct map_info *map, struct flchip *chip,
 			set_current_state(TASK_UNINTERRUPTIBLE);
 			add_wait_queue(&chip->wq, &wait);
 			mutex_unlock(&chip->mutex);
-			schedule();
+			ret = schedule_timeout(msecs_to_jiffies(WRITE_TIEMEOUT));
 			remove_wait_queue(&chip->wq, &wait);
-			timeo = jiffies + (HZ / 2); /* FIXME */
 			mutex_lock(&chip->mutex);
+			if (!ret) {
+				xip_enable(map, chip, adr);
+				printk(KERN_WARNING "MTD %s(): software timeout\n", __func__);
+				xip_disable(map, chip, adr);
+				break;
+			}
 			continue;
 		}
 
-		if (time_after(jiffies, timeo) && !chip_ready(map, adr)){
-			xip_enable(map, chip, adr);
-			printk(KERN_WARNING "MTD %s(): software timeout\n", __func__);
-			xip_disable(map, chip, adr);
-			break;
-		}
-
 		if (chip_ready(map, adr))
 			break;
 
