diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2012-10-03 21:11:06 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2012-10-03 21:11:06 +0200 |
commit | a3cd9a7ebe2c21bd96542c0f840eb92208f7cec6 (patch) | |
tree | 87a8e21c0813a9b3e1f32310ce56ae4dd5cd2612 /drivers/nor | |
parent | e5c12670d37c7afd577b4990c7fe93532f7f5228 (diff) | |
parent | 7d4d295d4ef5b6cddbe14003ae78098687904356 (diff) | |
download | barebox-a3cd9a7ebe2c21bd96542c0f840eb92208f7cec6.tar.gz barebox-a3cd9a7ebe2c21bd96542c0f840eb92208f7cec6.tar.xz |
Merge branch 'for-next/mtd'
Diffstat (limited to 'drivers/nor')
-rw-r--r-- | drivers/nor/cfi_flash.c | 8 | ||||
-rw-r--r-- | drivers/nor/cfi_flash.h | 2 | ||||
-rw-r--r-- | drivers/nor/m25p80.c | 74 | ||||
-rw-r--r-- | drivers/nor/m25p80.h | 2 |
4 files changed, 78 insertions, 8 deletions
diff --git a/drivers/nor/cfi_flash.c b/drivers/nor/cfi_flash.c index a8eebf50d7..246a2a7bed 100644 --- a/drivers/nor/cfi_flash.c +++ b/drivers/nor/cfi_flash.c @@ -917,7 +917,6 @@ struct file_operations cfi_ops = { .memmap = generic_memmap_ro, }; -#ifdef CONFIG_PARTITION_NEED_MTD static int cfi_mtd_read(struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf) { @@ -977,7 +976,6 @@ static void cfi_init_mtd(struct flash_info *info) mtd->flags = MTD_CAP_NORFLASH; info->cdev.mtd = mtd; } -#endif static int cfi_probe (struct device_d *dev) { @@ -1012,9 +1010,9 @@ static int cfi_probe (struct device_d *dev) info->cdev.ops = &cfi_ops; info->cdev.priv = info; -#ifdef CONFIG_PARTITION_NEED_MTD - cfi_init_mtd(info); -#endif + if (IS_ENABLED(CONFIG_PARTITION_NEED_MTD)) + cfi_init_mtd(info); + devfs_create(&info->cdev); if (dev->device_node) diff --git a/drivers/nor/cfi_flash.h b/drivers/nor/cfi_flash.h index fec08940ab..1bfe81c381 100644 --- a/drivers/nor/cfi_flash.h +++ b/drivers/nor/cfi_flash.h @@ -75,9 +75,7 @@ struct flash_info { ulong addr_unlock2; /* unlock address 2 for AMD flash roms */ struct cfi_cmd_set *cfi_cmd_set; struct cdev cdev; -#ifdef CONFIG_PARTITION_NEED_MTD struct mtd_info mtd; -#endif int numeraseregions; struct mtd_erase_region_info *eraseregions; void *base; diff --git a/drivers/nor/m25p80.c b/drivers/nor/m25p80.c index f718483e6c..e3b5b95443 100644 --- a/drivers/nor/m25p80.c +++ b/drivers/nor/m25p80.c @@ -648,6 +648,9 @@ static const struct spi_device_id m25p_ids[] = { { "cat25c09", CAT25_INFO( 128, 8, 32, 2) }, { "cat25c17", CAT25_INFO( 256, 8, 32, 2) }, { "cat25128", CAT25_INFO(2048, 8, 64, 2) }, + + /* Micron */ + { "n25q128", INFO(0x20ba18, 0, 64 * 1024, 256, 0) }, { }, }; @@ -694,6 +697,74 @@ static struct file_operations m25p80_ops = { .lseek = dev_lseek_default, }; +static int m25p_mtd_read(struct mtd_info *mtd, loff_t from, size_t len, + size_t *retlen, u_char *buf) +{ + struct m25p *flash = container_of(mtd, struct m25p, mtd); + ssize_t ret; + + ret = flash->cdev.ops->read(&flash->cdev, buf, len, from, 0); + if (ret < 0) { + *retlen = 0; + return ret; + } + + *retlen = ret; + return 0; +} + +static int m25p_mtd_write(struct mtd_info *mtd, loff_t to, size_t len, + size_t *retlen, const u_char *buf) +{ + struct m25p *flash = container_of(mtd, struct m25p, mtd); + ssize_t ret; + + ret = flash->cdev.ops->write(&flash->cdev, buf, len, to, 0); + if (ret < 0) { + *retlen = 0; + return ret; + } + + *retlen = ret; + return 0; +} + +static int m25p_mtd_erase(struct mtd_info *mtd, struct erase_info *instr) +{ + struct m25p *flash = container_of(mtd, struct m25p, mtd); + ssize_t ret; + + ret = flash->cdev.ops->erase(&flash->cdev, instr->len, instr->addr); + + if (ret) { + instr->state = MTD_ERASE_FAILED; + return -EIO; + } + + instr->state = MTD_ERASE_DONE; + mtd_erase_callback(instr); + + return 0; +} + +static void m25p_init_mtd(struct m25p *flash) +{ + struct mtd_info *mtd = &flash->mtd; + + mtd->read = m25p_mtd_read; + mtd->write = m25p_mtd_write; + mtd->erase = m25p_mtd_erase; + mtd->size = flash->size; + mtd->name = flash->cdev.name; + mtd->erasesize = flash->erasesize; + mtd->writesize = 1; + mtd->subpage_sft = 0; + mtd->eraseregions = NULL; + mtd->numeraseregions = 0; + mtd->flags = MTD_CAP_NORFLASH; + flash->cdev.mtd = mtd; +} + /* * board specific setup should have ensured the SPI clock used here * matches what the READ command supports, at least until this driver @@ -825,6 +896,9 @@ static int m25p_probe(struct device_d *dev) dev_info(dev, "%s (%lld Kbytes)\n", id->name, (long long)flash->size >> 10); + if (IS_ENABLED(CONFIG_PARTITION_NEED_MTD)) + m25p_init_mtd(flash); + devfs_create(&flash->cdev); return 0; diff --git a/drivers/nor/m25p80.h b/drivers/nor/m25p80.h index 34bf2e259a..957900e3a2 100644 --- a/drivers/nor/m25p80.h +++ b/drivers/nor/m25p80.h @@ -46,7 +46,7 @@ struct spi_device_id { struct m25p { struct spi_device *spi; struct flash_info *info; - struct mtd_info mtd; + struct mtd_info mtd; struct cdev cdev; char *name; u32 erasesize; |