Re: [PATCHv2] drivers: mtd: spinand: Add generic spinand frameowrk.
Hello, Le jeudi 4 juillet 2013 10:13:43 Sourav Poddar a écrit : Can this somehow be made a runtime thing? Ahh..I think we might opt for a device tree entry and based on that check for ECC. Ok, sounds good too. [snip] + if (count oob_num ops-oobbuf chip-oobbuf) { + int size; + int offset, len, temp; + + /* repack spare to oob */ + memset(chip-oobbuf, 0, info-ecclayout-oobavail); + + temp = 0; + offset = info-ecclayout-oobfree[0].offset; + len = info-ecclayout-oobfree[0].length; + memcpy(chip-oobbuf + temp, + chip-buf + info-page_main_size + offset, len); Sounds like a for look might be useful here I dont think so, there is a while loop above under which it happens. We are increasing count at the bottom of the while loop. So, I think this should work fine. What I meant here, is that you could use a for loop to repeat 4 times the same following pattern, such that it becomes: for (j = 0; j 4; j++0 { temp += len; offset = info-ecclayout-oobfree[j].offset; len = info-ecclayout-oobfree[j].length; memcpy(chip-oobbuf + temp, chip-buf + info-page_main_size + offset, len); } Or even make it a helper function which is inlined if that is deemed more elegant. -- Florian -- To unsubscribe from this list: send the line unsubscribe linux-omap in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCHv2] drivers: mtd: spinand: Add generic spinand frameowrk.
From: Mona Anonuevo manonu...@micron.com This patch adds support for a generic spinand framework(spinand_mtd.c). This frameowrk can be used for other spi based flash devices. The idea is to have a common model under drivers/mtd, as also present for other non spi devices(there is a generic framework and device part simply attaches itself to it.) Signed-off-by: Mona Anonuevo manonu...@micron.com Signed-off-by: Tuan Nguyen tqngu...@micron.com Signed-off-by: Sourav Poddar sourav.pod...@ti.com This patch was sent as a part of a series[1]; but this can go in as a standalone patch. [1]: https://lkml.org/lkml/2013/6/26/83 v1-v2: seperated the specific micron driver, flash devices can attach itself seperately to this generic framework. drivers/mtd/Kconfig |2 + drivers/mtd/Makefile |2 + drivers/mtd/spinand/Kconfig | 24 ++ drivers/mtd/spinand/Makefile |8 + drivers/mtd/spinand/spinand_mtd.c | 690 + include/linux/mtd/spinand.h | 155 + 6 files changed, 881 insertions(+), 0 deletions(-) create mode 100644 drivers/mtd/spinand/Kconfig create mode 100644 drivers/mtd/spinand/Makefile create mode 100644 drivers/mtd/spinand/spinand_mtd.c create mode 100644 include/linux/mtd/spinand.h diff --git a/drivers/mtd/Kconfig b/drivers/mtd/Kconfig index 5fab4e6..c9e6c60 100644 --- a/drivers/mtd/Kconfig +++ b/drivers/mtd/Kconfig @@ -318,6 +318,8 @@ source drivers/mtd/nand/Kconfig source drivers/mtd/onenand/Kconfig +source drivers/mtd/spinand/Kconfig + source drivers/mtd/lpddr/Kconfig source drivers/mtd/ubi/Kconfig diff --git a/drivers/mtd/Makefile b/drivers/mtd/Makefile index 4cfb31e..cce68db 100644 --- a/drivers/mtd/Makefile +++ b/drivers/mtd/Makefile @@ -32,4 +32,6 @@ inftl-objs:= inftlcore.o inftlmount.o obj-y += chips/ lpddr/ maps/ devices/ nand/ onenand/ tests/ +obj-y += spinand/ + obj-$(CONFIG_MTD_UBI) += ubi/ diff --git a/drivers/mtd/spinand/Kconfig b/drivers/mtd/spinand/Kconfig new file mode 100644 index 000..38c739f --- /dev/null +++ b/drivers/mtd/spinand/Kconfig @@ -0,0 +1,24 @@ +# +# linux/drivers/mtd/spinand/Kconfig +# + +menuconfig MTD_SPINAND + tristate SPINAND Device Support + depends on MTD + help +This enables support for accessing Micron SPI NAND flash +devices. + +if MTD_SPINAND + +config MTD_SPINAND_ONDIEECC + bool Use SPINAND internal ECC + help +Internel ECC + +config MTD_SPINAND_SWECC + bool Use software ECC + depends on MTD_NAND + help +software ECC +endif diff --git a/drivers/mtd/spinand/Makefile b/drivers/mtd/spinand/Makefile new file mode 100644 index 000..be18de7 --- /dev/null +++ b/drivers/mtd/spinand/Makefile @@ -0,0 +1,8 @@ +# +# Makefile for the SPI NAND MTD +# + +# Core functionality. +obj-$(CONFIG_MTD_SPINAND) += spinand.o + +spinand-objs := spinand_mtd.o diff --git a/drivers/mtd/spinand/spinand_mtd.c b/drivers/mtd/spinand/spinand_mtd.c new file mode 100644 index 000..8bfff86 --- /dev/null +++ b/drivers/mtd/spinand/spinand_mtd.c @@ -0,0 +1,690 @@ +/* +spinand_mtd.c + +Copyright (c) 2009-2010 Micron Technology, Inc. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +*/ + +#include linux/kernel.h +#include linux/module.h +#include linux/init.h +#include linux/sched.h +#include linux/delay.h +#include linux/interrupt.h +#include linux/jiffies.h +#include linux/mtd/mtd.h +#include linux/mtd/partitions.h +#include linux/mtd/spinand.h +#include linux/mtd/nand_ecc.h + +/** + * spinand_get_device - [GENERIC] Get chip for selected access + * @param mtd MTD device structure + * @param new_statethe state which is requested + * + * Get the device and lock it for exclusive access + */ +#define mu_spi_nand_driver_version Beagle-MTD_01.00_Linux2.6.33_20100507 + +static int spinand_get_device(struct mtd_info *mtd, int new_state) +{ + struct spinand_chip *this = mtd-priv; + DECLARE_WAITQUEUE(wait, current); + + /* +* Grab the lock and see if the device is available +*/ + while (1) { + spin_lock(this-chip_lock); + if (this-state == FL_READY) { + this-state = new_state; + spin_unlock(this-chip_lock); + break; + } + if (new_state == FL_PM_SUSPENDED) { + spin_unlock(this-chip_lock); + return
Re: [PATCHv2] drivers: mtd: spinand: Add generic spinand frameowrk.
Hello, 2013/7/3 Sourav Poddar sourav.pod...@ti.com: From: Mona Anonuevo manonu...@micron.com This patch adds support for a generic spinand framework(spinand_mtd.c). This frameowrk can be used for other spi based flash devices. The idea is to have a common model under drivers/mtd, as also present for other non spi devices(there is a generic framework and device part simply attaches itself to it.) Resending my comments since your previous submissino Signed-off-by: Mona Anonuevo manonu...@micron.com Signed-off-by: Tuan Nguyen tqngu...@micron.com Signed-off-by: Sourav Poddar sourav.pod...@ti.com [snip] +if MTD_SPINAND + +config MTD_SPINAND_ONDIEECC + bool Use SPINAND internal ECC + help +Internel ECC + +config MTD_SPINAND_SWECC + bool Use software ECC + depends on MTD_NAND + help +software ECC Can this somehow be made a runtime thing? [snip] + if (count oob_num ops-oobbuf chip-oobbuf) { + int size; + int offset, len, temp; + + /* repack spare to oob */ + memset(chip-oobbuf, 0, info-ecclayout-oobavail); + + temp = 0; + offset = info-ecclayout-oobfree[0].offset; + len = info-ecclayout-oobfree[0].length; + memcpy(chip-oobbuf + temp, + chip-buf + info-page_main_size + offset, len); Sounds like a for look might be useful here + + temp += len; + offset = info-ecclayout-oobfree[1].offset; + len = info-ecclayout-oobfree[1].length; + memcpy(chip-oobbuf + temp, + chip-buf + info-page_main_size + offset, len); + + temp += len; + offset = info-ecclayout-oobfree[2].offset; + len = info-ecclayout-oobfree[2].length; + memcpy(chip-oobbuf + temp, + chip-buf + info-page_main_size + offset, len); + + temp += len; + offset = info-ecclayout-oobfree[3].offset; + len = info-ecclayout-oobfree[3].length; + memcpy(chip-oobbuf + temp, + chip-buf + info-page_main_size + offset, len); + [snip] + /* repack oob to spare */ + temp = 0; + offset = info-ecclayout-oobfree[0].offset; + len = info-ecclayout-oobfree[0].length; + memcpy(chip-buf + info-page_main_size + offset, + chip-oobbuf + temp, len); And here too. + + temp += len; + offset = info-ecclayout-oobfree[1].offset; + len = info-ecclayout-oobfree[1].length; + memcpy(chip-buf + info-page_main_size + offset, + chip-oobbuf + temp, len); + + temp += len; + offset = info-ecclayout-oobfree[2].offset; + len = info-ecclayout-oobfree[2].length; + memcpy(chip-buf + info-page_main_size + offset, + chip-oobbuf + temp, len); + + temp += len; + offset = info-ecclayout-oobfree[3].offset; + len = info-ecclayout-oobfree[3].length; + memcpy(chip-buf + info-page_main_size + offset, + chip-oobbuf + temp, len); + } [snip] +++ b/include/linux/mtd/spinand.h @@ -0,0 +1,155 @@ +/* + * linux/include/linux/mtd/spinand.h + * Copyright (c) 2009-2010 Micron Technology, Inc. + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. +/bin/bash: 4: command not found + * + * based on nand.h + */ +#ifndef __LINUX_MTD_SPI_NAND_H +#define __LINUX_MTD_SPI_NAND_H + +#include linux/wait.h +#include linux/spinlock.h +#include linux/mtd/mtd.h + +/* cmd */ +#define CMD_READ 0x13 +#define CMD_READ_RDM 0x03 +#define CMD_PROG_PAGE_CLRCACHE 0x02 +#define CMD_PROG_PAGE 0x84 +#define CMD_PROG_PAGE_EXC 0x10 +#define CMD_ERASE_BLK 0xd8 +#define
Re: [PATCHv2] drivers: mtd: spinand: Add generic spinand frameowrk.
Hi, On Wednesday 03 July 2013 10:47 PM, Florian Fainelli wrote: Hello, 2013/7/3 Sourav Poddarsourav.pod...@ti.com: From: Mona Anonuevomanonu...@micron.com This patch adds support for a generic spinand framework(spinand_mtd.c). This frameowrk can be used for other spi based flash devices. The idea is to have a common model under drivers/mtd, as also present for other non spi devices(there is a generic framework and device part simply attaches itself to it.) Resending my comments since your previous submissino Signed-off-by: Mona Anonuevomanonu...@micron.com Signed-off-by: Tuan Nguyentqngu...@micron.com Signed-off-by: Sourav Poddarsourav.pod...@ti.com [snip] +if MTD_SPINAND + +config MTD_SPINAND_ONDIEECC + bool Use SPINAND internal ECC + help +Internel ECC + +config MTD_SPINAND_SWECC + bool Use software ECC + depends on MTD_NAND + help +software ECC Can this somehow be made a runtime thing? Ahh..I think we might opt for a device tree entry and based on that check for ECC. [snip] + if (count oob_num ops-oobbuf chip-oobbuf) { + int size; + int offset, len, temp; + + /* repack spare to oob */ + memset(chip-oobbuf, 0, info-ecclayout-oobavail); + + temp = 0; + offset = info-ecclayout-oobfree[0].offset; + len = info-ecclayout-oobfree[0].length; + memcpy(chip-oobbuf + temp, + chip-buf + info-page_main_size + offset, len); Sounds like a for look might be useful here I dont think so, there is a while loop above under which it happens. We are increasing count at the bottom of the while loop. So, I think this should work fine. + + temp += len; + offset = info-ecclayout-oobfree[1].offset; + len = info-ecclayout-oobfree[1].length; + memcpy(chip-oobbuf + temp, + chip-buf + info-page_main_size + offset, len); + + temp += len; + offset = info-ecclayout-oobfree[2].offset; + len = info-ecclayout-oobfree[2].length; + memcpy(chip-oobbuf + temp, + chip-buf + info-page_main_size + offset, len); + + temp += len; + offset = info-ecclayout-oobfree[3].offset; + len = info-ecclayout-oobfree[3].length; + memcpy(chip-oobbuf + temp, + chip-buf + info-page_main_size + offset, len); + [snip] + /* repack oob to spare */ + temp = 0; + offset = info-ecclayout-oobfree[0].offset; + len = info-ecclayout-oobfree[0].length; + memcpy(chip-buf + info-page_main_size + offset, + chip-oobbuf + temp, len); And here too. Same as above. + + temp += len; + offset = info-ecclayout-oobfree[1].offset; + len = info-ecclayout-oobfree[1].length; + memcpy(chip-buf + info-page_main_size + offset, + chip-oobbuf + temp, len); + + temp += len; + offset = info-ecclayout-oobfree[2].offset; + len = info-ecclayout-oobfree[2].length; + memcpy(chip-buf + info-page_main_size + offset, + chip-oobbuf + temp, len); + + temp += len; + offset = info-ecclayout-oobfree[3].offset; + len = info-ecclayout-oobfree[3].length; + memcpy(chip-buf + info-page_main_size + offset, + chip-oobbuf + temp, len); + } [snip] +++ b/include/linux/mtd/spinand.h @@ -0,0 +1,155 @@ +/* + * linux/include/linux/mtd/spinand.h + * Copyright (c) 2009-2010 Micron Technology, Inc. + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. +/bin/bash: 4: command not found + * + * based on nand.h + */ +#ifndef __LINUX_MTD_SPI_NAND_H +#define __LINUX_MTD_SPI_NAND_H + +#includelinux/wait.h +#includelinux/spinlock.h +#includelinux/mtd/mtd.h + +/* cmd */ +#define CMD_READ 0x13 +#define CMD_READ_RDM