Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a8e98d6d authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* git://git.infradead.org/mtd-2.6: (120 commits)
  [MTD] Fix mtdoops.c compilation
  [MTD] [NOR] fix startup lock when using multiple nor flash chips
  [MTD] [DOC200x] eccbuf is statically defined and always evaluate to true
  [MTD] Fix maps/physmap.c compilation with CONFIG_PM
  [MTD] onenand: Add panic_write function to the onenand driver
  [MTD] mtdoops: Use the panic_write function when present
  [MTD] Add mtd panic_write function pointer
  [MTD] [NAND] Freescale enhanced Local Bus Controller FCM NAND support.
  [MTD] physmap.c: Add support for multiple resources
  [MTD] [NAND] Fix misparenthesization introduced by commit 78b65179...
  [MTD] [NAND] Fix Blackfin NFC ECC calculating bug with page size 512 bytes
  [MTD] [NAND] Remove wrong operation in PM function of the BF54x NFC driver
  [MTD] [NAND] Remove unused variable in plat_nand_remove
  [MTD] Unlocking all Intel flash that is locked on power up.
  [MTD] [NAND] at91_nand: Make mtdparts option can override board info
  [MTD] mtdoops: Various minor cleanups
  [MTD] mtdoops: Ensure sequential write to the buffer
  [MTD] mtdoops: Perform write operations in a workqueue
  [MTD] mtdoops: Add further error return code checking
  [MTD] [NOR] Test devtype, not definition in flash_probe(), drivers/mtd/devices/lart.c
  ...
parents f0f1b336 f9f7dd22
Loading
Loading
Loading
Loading
+11 −0
Original line number Original line Diff line number Diff line
@@ -150,6 +150,14 @@ config MTD_AFS_PARTS
	  for your particular device. It won't happen automatically. The
	  for your particular device. It won't happen automatically. The
	  'armflash' map driver (CONFIG_MTD_ARMFLASH) does this, for example.
	  'armflash' map driver (CONFIG_MTD_ARMFLASH) does this, for example.


config MTD_OF_PARTS
	tristate "Flash partition map based on OF description"
	depends on PPC_OF && MTD_PARTITIONS
	help
	  This provides a partition parsing function which derives
	  the partition map from the children of the flash node,
	  as described in Documentation/powerpc/booting-without-of.txt.

comment "User Modules And Translation Layers"
comment "User Modules And Translation Layers"


config MTD_CHAR
config MTD_CHAR
@@ -286,6 +294,9 @@ config MTD_OOPS
	  buffer in a flash partition where it can be read back at some
	  buffer in a flash partition where it can be read back at some
	  later point.
	  later point.


	  To use, add console=ttyMTDx to the kernel command line,
	  where x is the MTD device number to use.

source "drivers/mtd/chips/Kconfig"
source "drivers/mtd/chips/Kconfig"


source "drivers/mtd/maps/Kconfig"
source "drivers/mtd/maps/Kconfig"
+1 −0
Original line number Original line Diff line number Diff line
@@ -11,6 +11,7 @@ obj-$(CONFIG_MTD_CONCAT) += mtdconcat.o
obj-$(CONFIG_MTD_REDBOOT_PARTS) += redboot.o
obj-$(CONFIG_MTD_REDBOOT_PARTS) += redboot.o
obj-$(CONFIG_MTD_CMDLINE_PARTS) += cmdlinepart.o
obj-$(CONFIG_MTD_CMDLINE_PARTS) += cmdlinepart.o
obj-$(CONFIG_MTD_AFS_PARTS)	+= afs.o
obj-$(CONFIG_MTD_AFS_PARTS)	+= afs.o
obj-$(CONFIG_MTD_OF_PARTS)      += ofpart.o


# 'Users' - code which presents functionality to userspace.
# 'Users' - code which presents functionality to userspace.
obj-$(CONFIG_MTD_CHAR)		+= mtdchar.o
obj-$(CONFIG_MTD_CHAR)		+= mtdchar.o
+71 −7
Original line number Original line Diff line number Diff line
@@ -50,6 +50,7 @@
#define I82802AC	0x00ac
#define I82802AC	0x00ac
#define MANUFACTURER_ST         0x0020
#define MANUFACTURER_ST         0x0020
#define M50LPW080       0x002F
#define M50LPW080       0x002F
#define AT49BV640D	0x02de


static int cfi_intelext_read (struct mtd_info *, loff_t, size_t, size_t *, u_char *);
static int cfi_intelext_read (struct mtd_info *, loff_t, size_t, size_t *, u_char *);
static int cfi_intelext_write_words(struct mtd_info *, loff_t, size_t, size_t *, const u_char *);
static int cfi_intelext_write_words(struct mtd_info *, loff_t, size_t, size_t *, const u_char *);
@@ -157,6 +158,47 @@ static void cfi_tell_features(struct cfi_pri_intelext *extp)
}
}
#endif
#endif


/* Atmel chips don't use the same PRI format as Intel chips */
static void fixup_convert_atmel_pri(struct mtd_info *mtd, void *param)
{
	struct map_info *map = mtd->priv;
	struct cfi_private *cfi = map->fldrv_priv;
	struct cfi_pri_intelext *extp = cfi->cmdset_priv;
	struct cfi_pri_atmel atmel_pri;
	uint32_t features = 0;

	/* Reverse byteswapping */
	extp->FeatureSupport = cpu_to_le32(extp->FeatureSupport);
	extp->BlkStatusRegMask = cpu_to_le16(extp->BlkStatusRegMask);
	extp->ProtRegAddr = cpu_to_le16(extp->ProtRegAddr);

	memcpy(&atmel_pri, extp, sizeof(atmel_pri));
	memset((char *)extp + 5, 0, sizeof(*extp) - 5);

	printk(KERN_ERR "atmel Features: %02x\n", atmel_pri.Features);

	if (atmel_pri.Features & 0x01) /* chip erase supported */
		features |= (1<<0);
	if (atmel_pri.Features & 0x02) /* erase suspend supported */
		features |= (1<<1);
	if (atmel_pri.Features & 0x04) /* program suspend supported */
		features |= (1<<2);
	if (atmel_pri.Features & 0x08) /* simultaneous operations supported */
		features |= (1<<9);
	if (atmel_pri.Features & 0x20) /* page mode read supported */
		features |= (1<<7);
	if (atmel_pri.Features & 0x40) /* queued erase supported */
		features |= (1<<4);
	if (atmel_pri.Features & 0x80) /* Protection bits supported */
		features |= (1<<6);

	extp->FeatureSupport = features;

	/* burst write mode not supported */
	cfi->cfiq->BufWriteTimeoutTyp = 0;
	cfi->cfiq->BufWriteTimeoutMax = 0;
}

#ifdef CMDSET0001_DISABLE_ERASE_SUSPEND_ON_WRITE
#ifdef CMDSET0001_DISABLE_ERASE_SUSPEND_ON_WRITE
/* Some Intel Strata Flash prior to FPO revision C has bugs in this area */
/* Some Intel Strata Flash prior to FPO revision C has bugs in this area */
static void fixup_intel_strataflash(struct mtd_info *mtd, void* param)
static void fixup_intel_strataflash(struct mtd_info *mtd, void* param)
@@ -227,13 +269,20 @@ static void fixup_use_write_buffers(struct mtd_info *mtd, void *param)
/*
/*
 * Some chips power-up with all sectors locked by default.
 * Some chips power-up with all sectors locked by default.
 */
 */
static void fixup_use_powerup_lock(struct mtd_info *mtd, void *param)
static void fixup_unlock_powerup_lock(struct mtd_info *mtd, void *param)
{
{
	struct map_info *map = mtd->priv;
	struct cfi_private *cfi = map->fldrv_priv;
	struct cfi_pri_intelext *cfip = cfi->cmdset_priv;

	if (cfip->FeatureSupport&32) {
		printk(KERN_INFO "Using auto-unlock on power-up/resume\n" );
		printk(KERN_INFO "Using auto-unlock on power-up/resume\n" );
	mtd->flags |= MTD_STUPID_LOCK;
		mtd->flags |= MTD_POWERUP_LOCK;
	}
}
}


static struct cfi_fixup cfi_fixup_table[] = {
static struct cfi_fixup cfi_fixup_table[] = {
	{ CFI_MFR_ATMEL, CFI_ID_ANY, fixup_convert_atmel_pri, NULL },
#ifdef CMDSET0001_DISABLE_ERASE_SUSPEND_ON_WRITE
#ifdef CMDSET0001_DISABLE_ERASE_SUSPEND_ON_WRITE
	{ CFI_MFR_ANY, CFI_ID_ANY, fixup_intel_strataflash, NULL },
	{ CFI_MFR_ANY, CFI_ID_ANY, fixup_intel_strataflash, NULL },
#endif
#endif
@@ -245,7 +294,7 @@ static struct cfi_fixup cfi_fixup_table[] = {
#endif
#endif
	{ CFI_MFR_ST, 0x00ba, /* M28W320CT */ fixup_st_m28w320ct, NULL },
	{ CFI_MFR_ST, 0x00ba, /* M28W320CT */ fixup_st_m28w320ct, NULL },
	{ CFI_MFR_ST, 0x00bb, /* M28W320CB */ fixup_st_m28w320cb, NULL },
	{ CFI_MFR_ST, 0x00bb, /* M28W320CB */ fixup_st_m28w320cb, NULL },
	{ MANUFACTURER_INTEL, 0x891c,	      fixup_use_powerup_lock, NULL, },
	{ MANUFACTURER_INTEL, CFI_ID_ANY, fixup_unlock_powerup_lock, NULL, },
	{ 0, 0, NULL, NULL }
	{ 0, 0, NULL, NULL }
};
};


@@ -277,7 +326,7 @@ read_pri_intelext(struct map_info *map, __u16 adr)
		return NULL;
		return NULL;


	if (extp->MajorVersion != '1' ||
	if (extp->MajorVersion != '1' ||
	    (extp->MinorVersion < '0' || extp->MinorVersion > '4')) {
	    (extp->MinorVersion < '0' || extp->MinorVersion > '5')) {
		printk(KERN_ERR "  Unknown Intel/Sharp Extended Query "
		printk(KERN_ERR "  Unknown Intel/Sharp Extended Query "
		       "version %c.%c.\n",  extp->MajorVersion,
		       "version %c.%c.\n",  extp->MajorVersion,
		       extp->MinorVersion);
		       extp->MinorVersion);
@@ -752,6 +801,7 @@ static int chip_ready (struct map_info *map, struct flchip *chip, unsigned long
static int get_chip(struct map_info *map, struct flchip *chip, unsigned long adr, int mode)
static int get_chip(struct map_info *map, struct flchip *chip, unsigned long adr, int mode)
{
{
	int ret;
	int ret;
	DECLARE_WAITQUEUE(wait, current);


 retry:
 retry:
	if (chip->priv && (mode == FL_WRITING || mode == FL_ERASING
	if (chip->priv && (mode == FL_WRITING || mode == FL_ERASING
@@ -808,6 +858,20 @@ static int get_chip(struct map_info *map, struct flchip *chip, unsigned long adr
			spin_unlock(contender->mutex);
			spin_unlock(contender->mutex);
		}
		}


		/* Check if we already have suspended erase
		 * on this chip. Sleep. */
		if (mode == FL_ERASING && shared->erasing
		    && shared->erasing->oldstate == FL_ERASING) {
			spin_unlock(&shared->lock);
			set_current_state(TASK_UNINTERRUPTIBLE);
			add_wait_queue(&chip->wq, &wait);
			spin_unlock(chip->mutex);
			schedule();
			remove_wait_queue(&chip->wq, &wait);
			spin_lock(chip->mutex);
			goto retry;
		}

		/* We now own it */
		/* We now own it */
		shared->writing = chip;
		shared->writing = chip;
		if (mode == FL_ERASING)
		if (mode == FL_ERASING)
@@ -2294,7 +2358,7 @@ static int cfi_intelext_suspend(struct mtd_info *mtd)
	struct flchip *chip;
	struct flchip *chip;
	int ret = 0;
	int ret = 0;


	if ((mtd->flags & MTD_STUPID_LOCK)
	if ((mtd->flags & MTD_POWERUP_LOCK)
	    && extp && (extp->FeatureSupport & (1 << 5)))
	    && extp && (extp->FeatureSupport & (1 << 5)))
		cfi_intelext_save_locks(mtd);
		cfi_intelext_save_locks(mtd);


@@ -2405,7 +2469,7 @@ static void cfi_intelext_resume(struct mtd_info *mtd)
		spin_unlock(chip->mutex);
		spin_unlock(chip->mutex);
	}
	}


	if ((mtd->flags & MTD_STUPID_LOCK)
	if ((mtd->flags & MTD_POWERUP_LOCK)
	    && extp && (extp->FeatureSupport & (1 << 5)))
	    && extp && (extp->FeatureSupport & (1 << 5)))
		cfi_intelext_restore_locks(mtd);
		cfi_intelext_restore_locks(mtd);
}
}
+10 −4
Original line number Original line Diff line number Diff line
@@ -185,6 +185,10 @@ static void fixup_convert_atmel_pri(struct mtd_info *mtd, void *param)
		extp->TopBottom = 2;
		extp->TopBottom = 2;
	else
	else
		extp->TopBottom = 3;
		extp->TopBottom = 3;

	/* burst write mode not supported */
	cfi->cfiq->BufWriteTimeoutTyp = 0;
	cfi->cfiq->BufWriteTimeoutMax = 0;
}
}


static void fixup_use_secsi(struct mtd_info *mtd, void *param)
static void fixup_use_secsi(struct mtd_info *mtd, void *param)
@@ -213,10 +217,11 @@ static void fixup_use_atmel_lock(struct mtd_info *mtd, void *param)
{
{
	mtd->lock = cfi_atmel_lock;
	mtd->lock = cfi_atmel_lock;
	mtd->unlock = cfi_atmel_unlock;
	mtd->unlock = cfi_atmel_unlock;
	mtd->flags |= MTD_STUPID_LOCK;
	mtd->flags |= MTD_POWERUP_LOCK;
}
}


static struct cfi_fixup cfi_fixup_table[] = {
static struct cfi_fixup cfi_fixup_table[] = {
	{ CFI_MFR_ATMEL, CFI_ID_ANY, fixup_convert_atmel_pri, NULL },
#ifdef AMD_BOOTLOC_BUG
#ifdef AMD_BOOTLOC_BUG
	{ CFI_MFR_AMD, CFI_ID_ANY, fixup_amd_bootblock, NULL },
	{ CFI_MFR_AMD, CFI_ID_ANY, fixup_amd_bootblock, NULL },
#endif
#endif
@@ -229,7 +234,6 @@ static struct cfi_fixup cfi_fixup_table[] = {
#if !FORCE_WORD_WRITE
#if !FORCE_WORD_WRITE
	{ CFI_MFR_ANY, CFI_ID_ANY, fixup_use_write_buffers, NULL, },
	{ CFI_MFR_ANY, CFI_ID_ANY, fixup_use_write_buffers, NULL, },
#endif
#endif
	{ CFI_MFR_ATMEL, CFI_ID_ANY, fixup_convert_atmel_pri, NULL },
	{ 0, 0, NULL, NULL }
	{ 0, 0, NULL, NULL }
};
};
static struct cfi_fixup jedec_fixup_table[] = {
static struct cfi_fixup jedec_fixup_table[] = {
@@ -338,10 +342,12 @@ struct mtd_info *cfi_cmdset_0002(struct map_info *map, int primary)
		/* Modify the unlock address if we are in compatibility mode */
		/* Modify the unlock address if we are in compatibility mode */
		if (	/* x16 in x8 mode */
		if (	/* x16 in x8 mode */
			((cfi->device_type == CFI_DEVICETYPE_X8) &&
			((cfi->device_type == CFI_DEVICETYPE_X8) &&
				(cfi->cfiq->InterfaceDesc == 2)) ||
				(cfi->cfiq->InterfaceDesc ==
					CFI_INTERFACE_X8_BY_X16_ASYNC)) ||
			/* x32 in x16 mode */
			/* x32 in x16 mode */
			((cfi->device_type == CFI_DEVICETYPE_X16) &&
			((cfi->device_type == CFI_DEVICETYPE_X16) &&
				(cfi->cfiq->InterfaceDesc == 4)))
				(cfi->cfiq->InterfaceDesc ==
					CFI_INTERFACE_X16_BY_X32_ASYNC)))
		{
		{
			cfi->addr_unlock1 = 0xaaa;
			cfi->addr_unlock1 = 0xaaa;
			cfi->addr_unlock2 = 0x555;
			cfi->addr_unlock2 = 0x555;
+6 −6
Original line number Original line Diff line number Diff line
@@ -370,27 +370,27 @@ static void print_cfi_ident(struct cfi_ident *cfip)
	printk("Device size: 0x%X bytes (%d MiB)\n", 1 << cfip->DevSize, 1<< (cfip->DevSize - 20));
	printk("Device size: 0x%X bytes (%d MiB)\n", 1 << cfip->DevSize, 1<< (cfip->DevSize - 20));
	printk("Flash Device Interface description: 0x%4.4X\n", cfip->InterfaceDesc);
	printk("Flash Device Interface description: 0x%4.4X\n", cfip->InterfaceDesc);
	switch(cfip->InterfaceDesc) {
	switch(cfip->InterfaceDesc) {
	case 0:
	case CFI_INTERFACE_X8_ASYNC:
		printk("  - x8-only asynchronous interface\n");
		printk("  - x8-only asynchronous interface\n");
		break;
		break;


	case 1:
	case CFI_INTERFACE_X16_ASYNC:
		printk("  - x16-only asynchronous interface\n");
		printk("  - x16-only asynchronous interface\n");
		break;
		break;


	case 2:
	case CFI_INTERFACE_X8_BY_X16_ASYNC:
		printk("  - supports x8 and x16 via BYTE# with asynchronous interface\n");
		printk("  - supports x8 and x16 via BYTE# with asynchronous interface\n");
		break;
		break;


	case 3:
	case CFI_INTERFACE_X32_ASYNC:
		printk("  - x32-only asynchronous interface\n");
		printk("  - x32-only asynchronous interface\n");
		break;
		break;


	case 4:
	case CFI_INTERFACE_X16_BY_X32_ASYNC:
		printk("  - supports x16 and x32 via Word# with asynchronous interface\n");
		printk("  - supports x16 and x32 via Word# with asynchronous interface\n");
		break;
		break;


	case 65535:
	case CFI_INTERFACE_NOT_ALLOWED:
		printk("  - Not Allowed / Reserved\n");
		printk("  - Not Allowed / Reserved\n");
		break;
		break;


Loading