Index: drivers/mtd/devices/m25p80.c
===================================================================
--- drivers/mtd/devices/m25p80.c	(revision 3333)
+++ drivers/mtd/devices/m25p80.c	(working copy)
@@ -212,7 +212,7 @@
 {
 	DEBUG(MTD_DEBUG_LEVEL3, "%s: %s %dKiB at 0x%08x\n",
 			dev_name(&flash->spi->dev), __func__,
-			flash->mtd.erasesize / 1024, offset);
+			flash->mtd.writesize / 1024, offset);
 
 	/* Wait until finished previous write command. */
 	if (wait_till_ready(flash))
@@ -255,7 +255,7 @@
 	/* sanity checks */
 	if (instr->addr + instr->len > flash->mtd.size)
 		return -EINVAL;
-	div_u64_rem(instr->len, mtd->erasesize, &rem);
+	div_u64_rem(instr->len, mtd->writesize, &rem);
 	if (rem)
 		return -EINVAL;
 
@@ -286,8 +286,8 @@
 				return -EIO;
 			}
 
-			addr += mtd->erasesize;
-			len -= mtd->erasesize;
+			addr += mtd->writesize;
+			len -= mtd->writesize;
 		}
 	}
 
@@ -831,9 +831,8 @@
 	else
 		flash->mtd.name = dev_name(&spi->dev);
 
-	flash->mtd.type = MTD_NORFLASH;
-	flash->mtd.writesize = 1;
-	flash->mtd.flags = MTD_CAP_NORFLASH;
+	flash->mtd.type = MTD_DATAFLASH;
+	flash->mtd.flags = MTD_WRITEABLE;
 	flash->mtd.size = info->sector_size * info->n_sectors;
 	flash->mtd.erase = m25p80_erase;
 	flash->mtd.read = m25p80_read;
@@ -845,12 +844,13 @@
 		flash->mtd.write = m25p80_write;
 
 	/* prefer "small sector" erase if possible */
-	if (info->flags & SECT_4K) {
+	flash->mtd.erasesize = info->sector_size;
+	if (info->flags & SECT_4K && (info->sector_size%4096)==0 ) {
 		flash->erase_opcode = OPCODE_BE_4K;
-		flash->mtd.erasesize = 4096;
+		flash->mtd.writesize = 4096;
 	} else {
 		flash->erase_opcode = OPCODE_SE;
-		flash->mtd.erasesize = info->sector_size;
+		flash->mtd.writesize = info->sector_size;
 	}
 
 	flash->mtd.dev.parent = &spi->dev;
@@ -860,10 +860,11 @@
 
 	DEBUG(MTD_DEBUG_LEVEL2,
 		"mtd .name = %s, .size = 0x%llx (%lldMiB) "
-			".erasesize = 0x%.8x (%uKiB) .numeraseregions = %d\n",
+			".erasesize = 0x%.8x (%uKiB) .writesize = 0x%.8x (%uKiB) .numeraseregions = %d\n",
 		flash->mtd.name,
 		(long long)flash->mtd.size, (long long)(flash->mtd.size >> 20),
 		flash->mtd.erasesize, flash->mtd.erasesize / 1024,
+		flash->mtd.writesize, flash->mtd.writesize / 1024,
 		flash->mtd.numeraseregions);
 
 	if (flash->mtd.numeraseregions)
