onenand: OneNAND board dependent probe and Samsung targets fixes
cover onenand: OneNAND board dependent probe and Samsung targets fixes
This patch sets add board dependent onenand probes. Several fixes for GONI and C210_universal targets have been added.
I'd like to ask other users of OneNAND infrastructure to _TEST_ if changes made on the onenand_base common code haven't broken anything.
Tested at:
Samsung S5PC110 GONI
Samsung S5PC210 Universal
Lukasz Majewski (4):
onenand:samsung Target dependent OneNAND chip probe function onenand:samsung OneNAND chip probe functions added for GONI and
C210_Universal
onenand: Replace ONENAND_IS_MLC() test with ONENAND_HAS_4KB()
onenand: samsung: Enable support OneNAND support at Samsung's
S5PC210_Universalboard/samsung/goni/onenand.c | 1 + board/samsung/universal_c210/onenand.c | 2 + drivers/mtd/onenand/onenand_base.c | 88 +++++++++++++++++++++++-------- drivers/mtd/onenand/samsung.c | 10 ++++ include/configs/s5pc210_universal.h | 1 + include/linux/mtd/onenand.h | 5 ++ include/linux/mtd/samsung_onenand.h | 2 + 7 files changed, 86 insertions(+), 23 deletions(-)
Signature · 1 line
1.7.2.3
PATCH 1/4 onenand:samsung Target dependent OneNAND chip probe function
Separate callback for probing OneNAND memory chip.
If no special function is defined, default implementation will be used.
This approach gives more flexibility for OneNAND device probing.
---
./tools/checkpatch.pl -
total: 0 errors, 0 warnings, 108 lines checked
NOTE: Ignored message types: COMPLEX_MACRO CONSIDER_KSTRTO MINMAX MULTISTATEMENT_MACRO_USE_DO_WHILE
--- drivers/mtd/onenand/onenand_base.c | 43 +++++++++++++++++++++++++++++----- drivers/mtd/onenand/samsung.c | 10 ++++++++ include/linux/mtd/onenand.h | 1 + include/linux/mtd/samsung_onenand.h | 2 + 4 files changed, 49 insertions(+), 7 deletions(-)
drivers/mtd/onenand/onenand_base.c +36 -7
@@ -2505,23 +2505,24 @@ out: }/** -* onenand_probe - [OneNAND Interface] Probe the OneNAND device +* onenand_chip_probe - [OneNAND Interface] Probe the OneNAND chip * @param mtd MTD device structure * * OneNAND detection method: * Compare the the values from command with ones from register */ -static int onenand_probe (struct mtd_info *mtd) +static int onenand_chip_probe (struct mtd_info *mtd) {struct onenand_chip *this = mtd->priv; -int bram_maf_id, bram_dev_id, maf_id, dev_id, ver_id; -int density; +int bram_maf_id, bram_dev_id, maf_id, dev_id;int syscfg;/* Save system configuration 1 */ syscfg = this->read_word (this->base +ONENAND_REG_SYS_CFG1 ); +/* Clear Sync. Burst Read mode to read BootRAM */ - this->write_word ((syscfg & ~ONENAND_SYS_CFG1_SYNC_READ ), this->base +ONENAND_REG_SYS_CFG1 ); + this->write_word ((syscfg & ~ONENAND_SYS_CFG1_SYNC_READ ), + this->base +ONENAND_REG_SYS_CFG1 );/* Send the command for reading device ID from BootRAM */ this->write_word (ONENAND_CMD_READID , this->base +ONENAND_BOOTRAM );
@@ -2546,13 +2547,38 @@ static int onenand_probe(struct mtd_info *mtd)/* Read manufacturer and device IDs from Register */ maf_id = this->read_word (this->base +ONENAND_REG_MANUFACTURER_ID ); dev_id = this->read_word (this->base +ONENAND_REG_DEVICE_ID ); - ver_id = this->read_word (this->base +ONENAND_REG_VERSION_ID ); - this->technology = this->read_word (this->base +ONENAND_REG_TECHNOLOGY );/* Check OneNAND device */ if (maf_id != bram_maf_id || dev_id != bram_dev_id)return -ENXIO ; +return 0 ; +} + +/** +* onenand_probe - [OneNAND Interface] Probe the OneNAND device +* @param mtd MTD device structure +* +* OneNAND detection method: +* Compare the the values from command with ones from register +*/ +int onenand_probe (struct mtd_info *mtd) +{ +struct onenand_chip *this = mtd->priv; +int maf_id, dev_id, ver_id; +int density; +int ret; + + ret = this->chip_probe (mtd); +if (ret) +return ret; + +/* Read manufacturer and device IDs from Register */ + maf_id = this->read_word (this->base +ONENAND_REG_MANUFACTURER_ID ); + dev_id = this->read_word (this->base +ONENAND_REG_DEVICE_ID ); + ver_id = this->read_word (this->base +ONENAND_REG_VERSION_ID ); + this->technology = this->read_word (this->base +ONENAND_REG_TECHNOLOGY ); +/* Flash device information */ mtd->name =onenand_print_device_info (dev_id, ver_id); this->device_id = dev_id;
@@ -2659,6 +2685,9 @@ int onenand_scan(struct mtd_info *mtd, int maxchips)if (!this->write_bufferram) this->write_bufferram = onenand_write_bufferram; +if (!this->chip_probe) + this->chip_probe = onenand_chip_probe; +if (!this->block_markbad) this->block_markbad = onenand_default_block_markbad;if (!this->scan_bbt)
drivers/mtd/onenand/samsung.c +10 -0
@@ -590,6 +590,16 @@ static void s3c_set_width_regs(struct onenand_chip *this) }#endif +int s5pc110_chip_probe (struct mtd_info *mtd) +{ +return 0 ; +} + +int s5pc210_chip_probe (struct mtd_info *mtd) +{ +return 0 ; +} +void s3c_onenand_init (struct mtd_info *mtd) {struct onenand_chip *this = mtd->priv;
include/linux/mtd/onenand.h +1 -0
@@ -101,6 +101,7 @@ struct onenand_chip { size_t count);unsigned short (*read_word) (void __iomem *addr);void (*write_word) (unsigned short value,void __iomem *addr); +int (*chip_probe)(struct mtd_info *mtd);void (*mmcontrol) (struct mtd_info *mtd,int sync_read);int (*block_markbad)(struct mtd_info *mtd,loff_t ofs);int (*scan_bbt)(struct mtd_info *mtd);
include/linux/mtd/samsung_onenand.h +2 -0
@@ -127,5 +127,7 @@ struct samsung_onenand {/* common initialize function */ extern void s3c_onenand_init (struct mtd_info *); +extern int s5pc110_chip_probe (struct mtd_info *); +extern int s5pc210_chip_probe (struct mtd_info *);#endif
Signature · 1 line
1.7.2.3
PATCH 1/4 onenand:samsung Target dependent OneNAND chip probe function
Quoted 116 lines
Separate callback for probing OneNAND memory chip.
If no special function is defined, default implementation will be used.This approach gives more flexibility for OneNAND device probing.
Signed-off-by Lukasz Majewski <[email protected]>Signed-off-by Kyungmin Park <[email protected]>---
./tools/checkpatch.pl-
total: 0 errors, 0 warnings, 108 lines checkedNOTE: Ignored message types:
COMPLEX_MACROCONSIDER_KSTRTOMINMAXMULTISTATEMENT_MACRO_USE_DO_WHILE--- drivers/mtd/onenand/onenand_base.c | 43 +++++++++++++++++++++++++++++----- drivers/mtd/onenand/samsung.c | 10 ++++++++ include/linux/mtd/onenand.h | 1 + include/linux/mtd/samsung_onenand.h | 2 + 4 files changed, 49 insertions(+), 7 deletions(-)(quoted diff) +0
-0
b/drivers/mtd/onenand/onenand_base.cindex 24e02c2..a557d48 100644drivers/mtd/onenand/onenand_base.c +4
-5@@ -2505,23 +2505,24 @@ out: }/** -* onenand_probe - [OneNAND Interface] Probe the OneNAND device +* onenand_chip_probe - [OneNAND Interface] Probe the OneNAND chip * @param mtd MTD device structure * * OneNAND detection method: * Compare the the values from command with ones from register */ -static int onenand_probe (struct mtd_info *mtd) +static int onenand_chip_probe (struct mtd_info *mtd) {struct onenand_chip *this = mtd->priv; -int bram_maf_id, bram_dev_id, maf_id, dev_id, ver_id; -int density; +int bram_maf_id, bram_dev_id, maf_id, dev_id;int syscfg;/* Save system configuration 1 */ syscfg = this->read_word (this->base +ONENAND_REG_SYS_CFG1 ); +/* Clear Sync. Burst Read mode to read BootRAM */ - this->write_word((syscfg & ~ONENAND_SYS_CFG1_SYNC_READ), this->base +
ONENAND_REG_SYS_CFG1); + this->write_word((syscfg &
~ONENAND_SYS_CFG1_SYNC_READ),drivers/mtd/onenand/onenand_base.c +31
-2+ this->base + ONENAND_REG_SYS_CFG1);/* Send the command for reading device ID from BootRAM */ this->write_word (ONENAND_CMD_READID , this->base +ONENAND_BOOTRAM );@@ -2546,13 +2547,38 @@ static int onenand_probe(struct mtd_info *mtd)/* Read manufacturer and device IDs from Register */ maf_id = this->read_word (this->base +ONENAND_REG_MANUFACTURER_ID ); dev_id = this->read_word (this->base +ONENAND_REG_DEVICE_ID ); - ver_id = this->read_word (this->base +ONENAND_REG_VERSION_ID ); - this->technology = this->read_word (this->base +ONENAND_REG_TECHNOLOGY );/* Check OneNAND device */ if (maf_id != bram_maf_id || dev_id != bram_dev_id)return -ENXIO ; +return 0 ; +} + +/** +* onenand_probe - [OneNAND Interface] Probe the OneNAND device +* @param mtd MTD device structure +* +* OneNAND detection method: +* Compare the the values from command with ones from register +*/ +int onenand_probe (struct mtd_info *mtd) +{ +struct onenand_chip *this = mtd->priv; +int maf_id, dev_id, ver_id; +int density; +int ret; + + ret = this->chip_probe (mtd); +if (ret) +return ret; + +/* Read manufacturer and device IDs from Register */ + maf_id = this->read_word (this->base +ONENAND_REG_MANUFACTURER_ID ); + dev_id = this->read_word (this->base +ONENAND_REG_DEVICE_ID ); + ver_id = this->read_word (this->base +ONENAND_REG_VERSION_ID ); + this->technology = this->read_word (this->base +ONENAND_REG_TECHNOLOGY ); +/* Flash device information */ mtd->name =onenand_print_device_info (dev_id, ver_id); this->device_id = dev_id;@@ -2659,6 +2685,9 @@ int onenand_scan(struct mtd_info *mtd, int maxchips)if (!this->write_bufferram) this->write_bufferram = onenand_write_bufferram; +if (!this->chip_probe) + this->chip_probe = onenand_chip_probe; +if (!this->block_markbad) this->block_markbad = onenand_default_block_markbad;if (!this->scan_bbt)drivers/mtd/onenand/samsung.c +0
-0@@ -590,6 +590,16 @@ static void s3c_set_width_regs(struct onenand_chip *this) }#endif
drivers/mtd/onenand/samsung.c static void s3c_set_width_regs(struct onenand_chip · line 602
Quoted 10 lines
drivers/mtd/onenand/samsung.c +10
-0+int s5pc110_chip_probe (struct mtd_info *mtd) +{ +return 0 ; +} + +int s5pc210_chip_probe (struct mtd_info *mtd) +{ +return 0 ; +} +
Will there be a problem if you used the default chip_probe() method from the driver ?
Quoted 27 lines
drivers/mtd/onenand/samsung.c +0
-0void s3c_onenand_init (struct mtd_info *mtd) {struct onenand_chip *this = mtd->priv;include/linux/mtd/onenand.h +1
-0@@ -101,6 +101,7 @@ struct onenand_chip { size_t count);unsigned short (*read_word) (void __iomem *addr);void (*write_word) (unsigned short value,void __iomem *addr); +int (*chip_probe)(struct mtd_info *mtd);void (*mmcontrol) (struct mtd_info *mtd,int sync_read);int (*block_markbad)(struct mtd_info *mtd,loff_t ofs);int (*scan_bbt)(struct mtd_info *mtd);(quoted diff) +0
-0
b/include/linux/mtd/samsung_onenand.hindex 021fa27..ddb29bb 100644include/linux/mtd/samsung_onenand.h +2
-0@@ -127,5 +127,7 @@ struct samsung_onenand {/* common initialize function */ extern void s3c_onenand_init (struct mtd_info *); +extern int s5pc110_chip_probe (struct mtd_info *); +extern int s5pc210_chip_probe (struct mtd_info *);#endif
Kyungmin Park
maintainerPATCH 1/4 onenand:samsung Target dependent OneNAND chip probe function
Quoted 116 lines · Marek Vasut
Quoted 116 lines
Separate callback for probing OneNAND memory chip.
If no special function is defined, default implementation will be used.This approach gives more flexibility for OneNAND device probing.
Signed-off-by Lukasz Majewski <[email protected]>Signed-off-by Kyungmin Park <[email protected]>---
./tools/checkpatch.pl-
total: 0 errors, 0 warnings, 108 lines checkedNOTE: Ignored message types:
COMPLEX_MACROCONSIDER_KSTRTOMINMAXMULTISTATEMENT_MACRO_USE_DO_WHILE--- drivers/mtd/onenand/onenand_base.c | 43 +++++++++++++++++++++++++++++----- drivers/mtd/onenand/samsung.c | 10 ++++++++ include/linux/mtd/onenand.h | 1 + include/linux/mtd/samsung_onenand.h | 2 + 4 files changed, 49 insertions(+), 7 deletions(-)(quoted diff) +0
-0
b/drivers/mtd/onenand/onenand_base.cindex 24e02c2..a557d48 100644drivers/mtd/onenand/onenand_base.c +4
-5@@ -2505,23 +2505,24 @@ out: }/** -* onenand_probe - [OneNAND Interface] Probe the OneNAND device +* onenand_chip_probe - [OneNAND Interface] Probe the OneNAND chip * @param mtd MTD device structure * * OneNAND detection method: * Compare the the values from command with ones from register */ -static int onenand_probe (struct mtd_info *mtd) +static int onenand_chip_probe (struct mtd_info *mtd) {struct onenand_chip *this = mtd->priv; -int bram_maf_id, bram_dev_id, maf_id, dev_id, ver_id; -int density; +int bram_maf_id, bram_dev_id, maf_id, dev_id;int syscfg;/* Save system configuration 1 */ syscfg = this->read_word (this->base +ONENAND_REG_SYS_CFG1 ); +/* Clear Sync. Burst Read mode to read BootRAM */ - this->write_word((syscfg & ~ONENAND_SYS_CFG1_SYNC_READ), this->base +
ONENAND_REG_SYS_CFG1); + this->write_word((syscfg &
~ONENAND_SYS_CFG1_SYNC_READ),drivers/mtd/onenand/onenand_base.c +31
-2+ this->base + ONENAND_REG_SYS_CFG1);/* Send the command for reading device ID from BootRAM */ this->write_word (ONENAND_CMD_READID , this->base +ONENAND_BOOTRAM );@@ -2546,13 +2547,38 @@ static int onenand_probe(struct mtd_info *mtd)/* Read manufacturer and device IDs from Register */ maf_id = this->read_word (this->base +ONENAND_REG_MANUFACTURER_ID ); dev_id = this->read_word (this->base +ONENAND_REG_DEVICE_ID ); - ver_id = this->read_word (this->base +ONENAND_REG_VERSION_ID ); - this->technology = this->read_word (this->base +ONENAND_REG_TECHNOLOGY );/* Check OneNAND device */ if (maf_id != bram_maf_id || dev_id != bram_dev_id)return -ENXIO ; +return 0 ; +} + +/** +* onenand_probe - [OneNAND Interface] Probe the OneNAND device +* @param mtd MTD device structure +* +* OneNAND detection method: +* Compare the the values from command with ones from register +*/ +int onenand_probe (struct mtd_info *mtd) +{ +struct onenand_chip *this = mtd->priv; +int maf_id, dev_id, ver_id; +int density; +int ret; + + ret = this->chip_probe (mtd); +if (ret) +return ret; + +/* Read manufacturer and device IDs from Register */ + maf_id = this->read_word (this->base +ONENAND_REG_MANUFACTURER_ID ); + dev_id = this->read_word (this->base +ONENAND_REG_DEVICE_ID ); + ver_id = this->read_word (this->base +ONENAND_REG_VERSION_ID ); + this->technology = this->read_word (this->base +ONENAND_REG_TECHNOLOGY ); +/* Flash device information */ mtd->name =onenand_print_device_info (dev_id, ver_id); this->device_id = dev_id;@@ -2659,6 +2685,9 @@ int onenand_scan(struct mtd_info *mtd, int maxchips)if (!this->write_bufferram) this->write_bufferram = onenand_write_bufferram; +if (!this->chip_probe) + this->chip_probe = onenand_chip_probe; +if (!this->block_markbad) this->block_markbad = onenand_default_block_markbad;if (!this->scan_bbt)drivers/mtd/onenand/samsung.c +0
-0@@ -590,6 +590,16 @@ static void s3c_set_width_regs(struct onenand_chip *this) }#endif
Quoted 13 lines
drivers/mtd/onenand/samsung.c static void s3c_set_width_regs(struct onenand_chip *this) · line 602
Quoted 10 lines
drivers/mtd/onenand/samsung.c +10
-0+int s5pc110_chip_probe (struct mtd_info *mtd) +{ +return 0 ; +} + +int s5pc210_chip_probe (struct mtd_info *mtd) +{ +return 0 ; +} +Will there be a problem if you used the default
chip_probe()method from the driver ?
Samsung SoCs have their own OneNAND controller and difficult to access OneNAND directly. instead it provides the registers which is mapped OneNAND registers.
e.g., Manufacture ID, device ID and so on.
Yes it's Samsung SoCs specific. that's reason introduce chip_probe function. it's same as kernel.
Thank you,
Kyungmin Park
Quoted 33 lines
Quoted 21 lines
drivers/mtd/onenand/samsung.c +0
-0void s3c_onenand_init (struct mtd_info *mtd) {struct onenand_chip *this = mtd->priv;include/linux/mtd/onenand.h +1
-0@@ -101,6 +101,7 @@ struct onenand_chip { size_t count);unsigned short (*read_word) (void __iomem *addr);void (*write_word) (unsigned short value,void __iomem *addr); +int (*chip_probe)(struct mtd_info *mtd);void (*mmcontrol) (struct mtd_info *mtd,int sync_read);int (*block_markbad)(struct mtd_info *mtd,loff_t ofs);int (*scan_bbt)(struct mtd_info *mtd);(quoted diff) +0
-0
b/include/linux/mtd/samsung_onenand.hindex 021fa27..ddb29bb 100644include/linux/mtd/samsung_onenand.h struct samsung_onenand { · line 133
Quoted 7 lines
include/linux/mtd/samsung_onenand.h +2
-0@@ -127,5 +127,7 @@ struct samsung_onenand {/* common initialize function */ extern void s3c_onenand_init (struct mtd_info *); +extern int s5pc110_chip_probe (struct mtd_info *); +extern int s5pc210_chip_probe (struct mtd_info *);#endif _______________________________________________
U-Boot mailing list
U-Boot at lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot
PATCH 2/4 onenand:samsung OneNAND chip probe functions added for GONI and C210_Universal
In reply to Lukasz MajewskiSeparate callback for probing OneNAND memory chip.
Tested at:
Samsung S5PC110 GONI
Samsung S5PC210 Universal
---./tools/checkpatch.pl -
total: 0 errors, 0 warnings, 17 lines checked
NOTE: Ignored message types: COMPLEX_MACRO CONSIDER_KSTRTO MINMAX MULTISTATEMENT_MACRO_USE_DO_WHILE
--- board/samsung/goni/onenand.c | 1 + board/samsung/universal_c210/onenand.c | 2 ++ 2 files changed, 3 insertions(+), 0 deletions(-)
board/samsung/goni/onenand.c +1 -0
@@ -33,4 +33,5 @@ void onenand_board_init(struct mtd_info *mtd) this->base = (void *)CONFIG_SYS_ONENAND_BASE ; this->options |=ONENAND_RUNTIME_BADBLOCK_CHECK ; + this->chip_probe = s5pc110_chip_probe; }
board/samsung/universal_c210/onenand.c +2 -0
@@ -24,6 +24,7 @@#include <common.h> #include <linux/mtd/mtd.h> #include <linux/mtd/onenand.h> +#include <linux/mtd/samsung_onenand.h> void onenand_board_init (struct mtd_info *mtd) {
@@ -31,4 +32,5 @@ void onenand_board_init(struct mtd_info *mtd) this->base = (void *)CONFIG_SYS_ONENAND_BASE ; this->options |=ONENAND_RUNTIME_BADBLOCK_CHECK ; + this->chip_probe = s5pc210_chip_probe; }
Signature · 1 line
1.7.2.3
PATCH 3/4 onenand: Replace ONENAND_IS_MLC() test with ONENAND_HAS_4KB()
In reply to Lukasz MajewskiThis replacement is for causing 4KB page size devices to work properly with u-boot.
The old ONENAND_IS_MLC() behavior has been preserved by explicitly setting ONENAND_HAS_4KB_PAGE for those devices.
This change makes the onenand_base.c file more resembling the respective kernel sources.
Tested at:
Samsung S5PC110 GONI
Samsung S5PC210 Universal
---./tools/checkpatch.pl -
total: 0 errors, 0 warnings, 162 lines checked
NOTE: Ignored message types: COMPLEX_MACRO CONSIDER_KSTRTO MINMAX MULTISTATEMENT_MACRO_USE_DO_WHILE
--- drivers/mtd/onenand/onenand_base.c | 45 +++++++++++++++++++++++------------ include/linux/mtd/onenand.h | 4 +++ 2 files changed, 33 insertions(+), 16 deletions(-)
drivers/mtd/onenand/onenand_base.c +29 -16
@@ -367,7 +367,7 @@ static int onenand_command(struct mtd_info *mtd, int cmd, loff_t addr, this->write_word (value, this->base +ONENAND_REG_START_ADDRESS2 ); -if (ONENAND_IS_MLC (this)) +if (ONENAND_IS_4KB_PAGE (this))ONENAND_SET_BUFFERRAM0 (this);else /* Switch to the next data buffer */
@@ -395,7 +395,7 @@ static int onenand_command(struct mtd_info *mtd, int cmd, loff_t addr,case FLEXONENAND_CMD_RECOVER_LSB :case ONENAND_CMD_READ :case ONENAND_CMD_READOOB : -if (ONENAND_IS_MLC (this)) +if (ONENAND_IS_4KB_PAGE (this)) dataram =ONENAND_SET_BUFFERRAM0 (this);else dataram =ONENAND_SET_NEXT_BUFFERRAM (this);
@@ -893,7 +893,7 @@ static int onenand_read_ops_nolock(struct mtd_info *mtd, loff_t from,while (!ret) {/* If there is more to load then start next load */ from += thislen; -if (!ONENAND_IS_MLC (this) && read + thislen < len) { +if (!ONENAND_IS_4KB_PAGE (this) && read + thislen < len) { this->main_buf = buf + thislen; this->command (mtd,ONENAND_CMD_READ , from, writesize);/*
@@ -927,7 +927,7 @@ static int onenand_read_ops_nolock(struct mtd_info *mtd, loff_t from, oobcolumn =0 ; } -if (ONENAND_IS_MLC (this) && (read + thislen < len)) { +if (ONENAND_IS_4KB_PAGE (this) && (read + thislen < len)) { this->command (mtd,ONENAND_CMD_READ , from, writesize); ret = this->wait (mtd,FL_READING );if (unlikely (ret))
@@ -944,13 +944,13 @@ static int onenand_read_ops_nolock(struct mtd_info *mtd, loff_t from,/* Set up for next read from bufferRAM */ if (unlikely (boundary)) this->write_word (ONENAND_DDP_CHIP1 , this->base +ONENAND_REG_START_ADDRESS2 ); -if (!ONENAND_IS_MLC (this)) +if (!ONENAND_IS_4KB_PAGE (this))ONENAND_SET_NEXT_BUFFERRAM (this); buf += thislen; thislen =min_t (int, writesize, len - read); column =0 ; -if (!ONENAND_IS_MLC (this)) { +if (!ONENAND_IS_4KB_PAGE (this)) {/* Now wait for load */ ret = this->wait (mtd,FL_READING );onenand_update_bufferram (mtd, from, !ret);
@@ -1024,7 +1024,8 @@ static int onenand_read_oob_nolock(struct mtd_info *mtd, loff_t from, stats = mtd->ecc_stats; - readcmd =ONENAND_IS_MLC (this) ?ONENAND_CMD_READ :ONENAND_CMD_READOOB ; + readcmd =ONENAND_IS_4KB_PAGE (this) ? +ONENAND_CMD_READ :ONENAND_CMD_READOOB ;while (read < len) { thislen = oobsize - column;
@@ -1202,7 +1203,8 @@ int onenand_bbt_read_oob(struct mtd_info *mtd, loff_t from,MTDDEBUG (MTD_DEBUG_LEVEL3 ,"onenand_bbt_read_oob: from = 0x%08x, len = %zi\n" , (unsigned int ) from, len); - readcmd =ONENAND_IS_MLC (this) ?ONENAND_CMD_READ :ONENAND_CMD_READOOB ; + readcmd =ONENAND_IS_4KB_PAGE (this) ? +ONENAND_CMD_READ :ONENAND_CMD_READOOB ;/* Initialize return value */ ops->oobretlen =0 ;
@@ -1271,7 +1273,8 @@ static int onenand_verify_oob(struct mtd_info *mtd, const u_char *buf, loff_t tou_char *oob_buf = this->oob_buf;int status, i, readcmd; - readcmd =ONENAND_IS_MLC (this) ?ONENAND_CMD_READ :ONENAND_CMD_READOOB ; + readcmd =ONENAND_IS_4KB_PAGE (this) ? +ONENAND_CMD_READ :ONENAND_CMD_READOOB ; this->command (mtd, readcmd, to, mtd->oobsize);onenand_update_bufferram (mtd, to,0 );
@@ -1560,7 +1563,8 @@ static int onenand_write_oob_nolock(struct mtd_info *mtd, loff_t to, oobbuf = this->oob_buf; - oobcmd =ONENAND_IS_MLC (this) ?ONENAND_CMD_PROG :ONENAND_CMD_PROGOOB ; + oobcmd =ONENAND_IS_4KB_PAGE (this) ? +ONENAND_CMD_PROG :ONENAND_CMD_PROGOOB ;/* Loop until all data write */ while (written < len) {
@@ -1577,7 +1581,7 @@ static int onenand_write_oob_nolock(struct mtd_info *mtd, loff_t to,memcpy (oobbuf + column, buf, thislen); this->write_bufferram (mtd,0 ,ONENAND_SPARERAM , oobbuf,0 , mtd->oobsize); -if (ONENAND_IS_MLC (this)) { +if (ONENAND_IS_4KB_PAGE (this)) {/* Set main area of DataRAM to 0xff*/ memset (this->page_buf,0xff , mtd->writesize); this->write_bufferram(mtd, 0, ONENAND_DATARAM,
@@ -2146,7 +2150,10 @@ static void onenand_check_features(struct mtd_info *mtd)/* Lock scheme */ switch (density) {case ONENAND_DEVICE_DENSITY_4Gb: - this->options |=ONENAND_HAS_2PLANE ; +if (ONENAND_IS_DDP (this)) + this->options |=ONENAND_HAS_2PLANE ; +else + this->options |=ONENAND_HAS_4KB_PAGE ;case ONENAND_DEVICE_DENSITY_2Gb:/* 2Gb DDP don't have 2 plane */
@@ -2168,6 +2175,9 @@ static void onenand_check_features(struct mtd_info *mtd) }if (ONENAND_IS_MLC (this)) + this->options |=ONENAND_HAS_4KB_PAGE ; + +if (ONENAND_IS_4KB_PAGE (this)) this->options &= ~ONENAND_HAS_2PLANE ;if (FLEXONENAND (this)) {
@@ -2181,6 +2191,9 @@ static void onenand_check_features(struct mtd_info *mtd)printk (KERN_DEBUG "Chip support all block unlock\n" );if (this->options &ONENAND_HAS_2PLANE )printk (KERN_DEBUG "Chip has 2 plane\n" ); +if (this->options &ONENAND_HAS_4KB_PAGE ) +printk (KERN_DEBUG "Chip has 4KiB pagesize\n" ); + }/**
@@ -2584,6 +2597,9 @@ int onenand_probe(struct mtd_info *mtd) this->device_id = dev_id; this->version_id = ver_id; +/* Check OneNAND features */ +onenand_check_features (mtd); + density =onenand_get_density (dev_id);if (FLEXONENAND (this)) { this->dies =ONENAND_IS_DDP (this) ?2 :1 ;
@@ -2606,7 +2622,7 @@ int onenand_probe(struct mtd_info *mtd) mtd->writesize = this->read_word (this->base +ONENAND_REG_DATA_BUFFER_SIZE );/* We use the full BufferRAM */ -if (ONENAND_IS_MLC (this)) +if (ONENAND_IS_4KB_PAGE (this)) mtd->writesize <<=1 ; mtd->oobsize = mtd->writesize >>5 ;
@@ -2637,9 +2653,6 @@ int onenand_probe(struct mtd_info *mtd)else mtd->size = this->chipsize; -/* Check OneNAND features */ -onenand_check_features (mtd); - mtd->flags =MTD_CAP_NANDFLASH ; mtd->erase = onenand_erase; mtd->read = onenand_read;
include/linux/mtd/onenand.h +4 -0
@@ -140,6 +140,9 @@ struct onenand_chip {#define ONENAND_IS_DDP (this) \ (this->device_id & ONENAND_DEVICE_IS_DDP) +#define ONENAND_IS_4KB_PAGE (this) \ + (this->options & ONENAND_HAS_4KB_PAGE) +#define ONENAND_IS_2PLANE (this) (0)/*
@@ -148,6 +151,7 @@ struct onenand_chip {#define ONENAND_HAS_CONT_LOCK (0x0001)#define ONENAND_HAS_UNLOCK_ALL (0x0002)#define ONENAND_HAS_2PLANE (0x0004) +#define ONENAND_HAS_4KB_PAGE (0x0008)#define ONENAND_RUNTIME_BADBLOCK_CHECK (0x0200)#define ONENAND_PAGEBUF_ALLOC (0x1000)#define ONENAND_OOBBUF_ALLOC (0x2000)
Signature · 1 line
1.7.2.3
PATCH 4/4 onenand: samsung: Enable support OneNAND support at Samsung's S5PC210_Universal
In reply to Lukasz MajewskiEnable OneNAND support for C210 universal.
---./tools/checkpatch.pl -
total: 0 errors, 0 warnings, 7 lines checked
NOTE: Ignored message types: COMPLEX_MACRO CONSIDER_KSTRTO MINMAX MULTISTATEMENT_MACRO_USE_DO_WHILE
--- include/configs/s5pc210_universal.h | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
include/configs/s5pc210_universal.h +1 -0
@@ -232,6 +232,7 @@#define CONFIG_SYS_MONITOR_LEN (256 << 10)/* Reserve 2 sectors */ #define CONFIG_USE_ONENAND_BOARD_INIT +#define CONFIG_SAMSUNG_ONENAND #define CONFIG_SYS_ONENAND_BASE 0x0C000000#define CONFIG_ENV_IS_IN_MMC 1
Signature · 1 line
1.7.2.3
cover onenand: OneNAND board dependent probe and fixes for Samsung targets
In reply to Lukasz MajewskiThis patch sets add board dependent onenand probes.
Several fixes for GONI and Exynos4210 (C210_universal) targets have been added.
Tested at:
Samsung S5PC110 GONI
Samsung Exynos4210 (S5PC210 Universal)Lukasz Majewski (4):
onenand:samsung Target dependent OneNAND chip probe function onenand:samsung OneNAND chip probe functions added for GONI and
Exynos4210
onenand: Replace ONENAND_IS_MLC() test with ONENAND_HAS_4KB()
onenand: samsung: Enable support OneNAND support at Samsung's
Exynos4210board/samsung/goni/onenand.c | 1 + board/samsung/universal_c210/onenand.c | 2 + drivers/mtd/onenand/onenand_base.c | 88 +++++++++++++++++++++++-------- drivers/mtd/onenand/samsung.c | 10 ++++ include/configs/s5pc210_universal.h | 1 + include/linux/mtd/onenand.h | 5 ++ include/linux/mtd/samsung_onenand.h | 2 + 7 files changed, 86 insertions(+), 23 deletions(-)
Signature · 1 line
1.7.2.3
PATCH RESEND 1/4 onenand:samsung Target dependent OneNAND chip probe function
Separate callback for probing OneNAND memory chip.
If no special function is defined, default implementation will be used.
This approach gives more flexibility for OneNAND device probing.
--- drivers/mtd/onenand/onenand_base.c | 43 +++++++++++++++++++++++++++++----- drivers/mtd/onenand/samsung.c | 10 ++++++++ include/linux/mtd/onenand.h | 1 + include/linux/mtd/samsung_onenand.h | 2 + 4 files changed, 49 insertions(+), 7 deletions(-)
drivers/mtd/onenand/onenand_base.c +36 -7
@@ -2501,23 +2501,24 @@ out: }/** -* onenand_probe - [OneNAND Interface] Probe the OneNAND device +* onenand_chip_probe - [OneNAND Interface] Probe the OneNAND chip * @param mtd MTD device structure * * OneNAND detection method: * Compare the the values from command with ones from register */ -static int onenand_probe (struct mtd_info *mtd) +static int onenand_chip_probe (struct mtd_info *mtd) {struct onenand_chip *this = mtd->priv; -int bram_maf_id, bram_dev_id, maf_id, dev_id, ver_id; -int density; +int bram_maf_id, bram_dev_id, maf_id, dev_id;int syscfg;/* Save system configuration 1 */ syscfg = this->read_word (this->base +ONENAND_REG_SYS_CFG1 ); +/* Clear Sync. Burst Read mode to read BootRAM */ - this->write_word ((syscfg & ~ONENAND_SYS_CFG1_SYNC_READ ), this->base +ONENAND_REG_SYS_CFG1 ); + this->write_word ((syscfg & ~ONENAND_SYS_CFG1_SYNC_READ ), + this->base +ONENAND_REG_SYS_CFG1 );/* Send the command for reading device ID from BootRAM */ this->write_word (ONENAND_CMD_READID , this->base +ONENAND_BOOTRAM );
@@ -2542,13 +2543,38 @@ static int onenand_probe(struct mtd_info *mtd)/* Read manufacturer and device IDs from Register */ maf_id = this->read_word (this->base +ONENAND_REG_MANUFACTURER_ID ); dev_id = this->read_word (this->base +ONENAND_REG_DEVICE_ID ); - ver_id = this->read_word (this->base +ONENAND_REG_VERSION_ID ); - this->technology = this->read_word (this->base +ONENAND_REG_TECHNOLOGY );/* Check OneNAND device */ if (maf_id != bram_maf_id || dev_id != bram_dev_id)return -ENXIO ; +return 0 ; +} + +/** +* onenand_probe - [OneNAND Interface] Probe the OneNAND device +* @param mtd MTD device structure +* +* OneNAND detection method: +* Compare the the values from command with ones from register +*/ +int onenand_probe (struct mtd_info *mtd) +{ +struct onenand_chip *this = mtd->priv; +int maf_id, dev_id, ver_id; +int density; +int ret; + + ret = this->chip_probe (mtd); +if (ret) +return ret; + +/* Read manufacturer and device IDs from Register */ + maf_id = this->read_word (this->base +ONENAND_REG_MANUFACTURER_ID ); + dev_id = this->read_word (this->base +ONENAND_REG_DEVICE_ID ); + ver_id = this->read_word (this->base +ONENAND_REG_VERSION_ID ); + this->technology = this->read_word (this->base +ONENAND_REG_TECHNOLOGY ); +/* Flash device information */ mtd->name =onenand_print_device_info (dev_id, ver_id); this->device_id = dev_id;
@@ -2655,6 +2681,9 @@ int onenand_scan(struct mtd_info *mtd, int maxchips)if (!this->write_bufferram) this->write_bufferram = onenand_write_bufferram; +if (!this->chip_probe) + this->chip_probe = onenand_chip_probe; +if (!this->block_markbad) this->block_markbad = onenand_default_block_markbad;if (!this->scan_bbt)
drivers/mtd/onenand/samsung.c +10 -0
@@ -589,6 +589,16 @@ static void s3c_set_width_regs(struct onenand_chip *this) }#endif +int s5pc110_chip_probe (struct mtd_info *mtd) +{ +return 0 ; +} + +int s5pc210_chip_probe (struct mtd_info *mtd) +{ +return 0 ; +} +void s3c_onenand_init (struct mtd_info *mtd) {struct onenand_chip *this = mtd->priv;
include/linux/mtd/onenand.h +1 -0
@@ -101,6 +101,7 @@ struct onenand_chip { size_t count);unsigned short (*read_word) (void __iomem *addr);void (*write_word) (unsigned short value,void __iomem *addr); +int (*chip_probe)(struct mtd_info *mtd);void (*mmcontrol) (struct mtd_info *mtd,int sync_read);int (*block_markbad)(struct mtd_info *mtd,loff_t ofs);int (*scan_bbt)(struct mtd_info *mtd);
include/linux/mtd/samsung_onenand.h +2 -0
@@ -127,5 +127,7 @@ struct samsung_onenand {/* common initialize function */ extern void s3c_onenand_init (struct mtd_info *); +extern int s5pc110_chip_probe (struct mtd_info *); +extern int s5pc210_chip_probe (struct mtd_info *);#endif
Signature · 1 line
1.7.2.3
PATCH RESEND 2/4 onenand:samsung OneNAND chip probe functions added for GONI and Exynos4210
In reply to Lukasz MajewskiSeparate callback for probing OneNAND memory chip.
Tested at:
Samsung S5PC110 GONI
Samsung Exynos4210 (S5PC210 Universal)
--- board/samsung/goni/onenand.c | 1 + board/samsung/universal_c210/onenand.c | 2 ++ 2 files changed, 3 insertions(+), 0 deletions(-)
board/samsung/goni/onenand.c +1 -0
@@ -33,4 +33,5 @@ void onenand_board_init(struct mtd_info *mtd) this->base = (void *)CONFIG_SYS_ONENAND_BASE ; this->options |=ONENAND_RUNTIME_BADBLOCK_CHECK ; + this->chip_probe = s5pc110_chip_probe; }
board/samsung/universal_c210/onenand.c +2 -0
@@ -24,6 +24,7 @@#include <common.h> #include <linux/mtd/mtd.h> #include <linux/mtd/onenand.h> +#include <linux/mtd/samsung_onenand.h> void onenand_board_init (struct mtd_info *mtd) {
@@ -31,4 +32,5 @@ void onenand_board_init(struct mtd_info *mtd) this->base = (void *)CONFIG_SYS_ONENAND_BASE ; this->options |=ONENAND_RUNTIME_BADBLOCK_CHECK ; + this->chip_probe = s5pc210_chip_probe; }
Signature · 1 line
1.7.2.3
PATCH RESEND 3/4 onenand: Replace ONENAND_IS_MLC() test with ONENAND_HAS_4KB()
In reply to Lukasz MajewskiThis replacement is for causing 4KB page size devices to work properly with u-boot.
The old ONENAND_IS_MLC() behavior has been preserved by explicitly setting ONENAND_HAS_4KB_PAGE for those devices.
This change makes the onenand_base.c file more resembling the respective kernel sources.
Tested at:
Samsung S5PC110 GONI
Samsung S5PC210 Universal
--- drivers/mtd/onenand/onenand_base.c | 45 +++++++++++++++++++++++------------ include/linux/mtd/onenand.h | 4 +++ 2 files changed, 33 insertions(+), 16 deletions(-)
drivers/mtd/onenand/onenand_base.c +29 -16
@@ -367,7 +367,7 @@ static int onenand_command(struct mtd_info *mtd, int cmd, loff_t addr, this->write_word (value, this->base +ONENAND_REG_START_ADDRESS2 ); -if (ONENAND_IS_MLC (this)) +if (ONENAND_IS_4KB_PAGE (this))ONENAND_SET_BUFFERRAM0 (this);else /* Switch to the next data buffer */
@@ -395,7 +395,7 @@ static int onenand_command(struct mtd_info *mtd, int cmd, loff_t addr,case FLEXONENAND_CMD_RECOVER_LSB :case ONENAND_CMD_READ :case ONENAND_CMD_READOOB : -if (ONENAND_IS_MLC (this)) +if (ONENAND_IS_4KB_PAGE (this)) dataram =ONENAND_SET_BUFFERRAM0 (this);else dataram =ONENAND_SET_NEXT_BUFFERRAM (this);
@@ -893,7 +893,7 @@ static int onenand_read_ops_nolock(struct mtd_info *mtd, loff_t from,while (!ret) {/* If there is more to load then start next load */ from += thislen; -if (!ONENAND_IS_MLC (this) && read + thislen < len) { +if (!ONENAND_IS_4KB_PAGE (this) && read + thislen < len) { this->main_buf = buf + thislen; this->command (mtd,ONENAND_CMD_READ , from, writesize);/*
@@ -927,7 +927,7 @@ static int onenand_read_ops_nolock(struct mtd_info *mtd, loff_t from, oobcolumn =0 ; } -if (ONENAND_IS_MLC (this) && (read + thislen < len)) { +if (ONENAND_IS_4KB_PAGE (this) && (read + thislen < len)) { this->command (mtd,ONENAND_CMD_READ , from, writesize); ret = this->wait (mtd,FL_READING );if (unlikely (ret))
@@ -944,13 +944,13 @@ static int onenand_read_ops_nolock(struct mtd_info *mtd, loff_t from,/* Set up for next read from bufferRAM */ if (unlikely (boundary)) this->write_word (ONENAND_DDP_CHIP1 , this->base +ONENAND_REG_START_ADDRESS2 ); -if (!ONENAND_IS_MLC (this)) +if (!ONENAND_IS_4KB_PAGE (this))ONENAND_SET_NEXT_BUFFERRAM (this); buf += thislen; thislen =min_t (int, writesize, len - read); column =0 ; -if (!ONENAND_IS_MLC (this)) { +if (!ONENAND_IS_4KB_PAGE (this)) {/* Now wait for load */ ret = this->wait (mtd,FL_READING );onenand_update_bufferram (mtd, from, !ret);
@@ -1024,7 +1024,8 @@ static int onenand_read_oob_nolock(struct mtd_info *mtd, loff_t from, stats = mtd->ecc_stats; - readcmd =ONENAND_IS_MLC (this) ?ONENAND_CMD_READ :ONENAND_CMD_READOOB ; + readcmd =ONENAND_IS_4KB_PAGE (this) ? +ONENAND_CMD_READ :ONENAND_CMD_READOOB ;while (read < len) { thislen = oobsize - column;
@@ -1202,7 +1203,8 @@ int onenand_bbt_read_oob(struct mtd_info *mtd, loff_t from,MTDDEBUG (MTD_DEBUG_LEVEL3 ,"onenand_bbt_read_oob: from = 0x%08x, len = %zi\n" , (unsigned int ) from, len); - readcmd =ONENAND_IS_MLC (this) ?ONENAND_CMD_READ :ONENAND_CMD_READOOB ; + readcmd =ONENAND_IS_4KB_PAGE (this) ? +ONENAND_CMD_READ :ONENAND_CMD_READOOB ;/* Initialize return value */ ops->oobretlen =0 ;
@@ -1271,7 +1273,8 @@ static int onenand_verify_oob(struct mtd_info *mtd, const u_char *buf, loff_t tou_char *oob_buf = this->oob_buf;int status, i, readcmd; - readcmd =ONENAND_IS_MLC (this) ?ONENAND_CMD_READ :ONENAND_CMD_READOOB ; + readcmd =ONENAND_IS_4KB_PAGE (this) ? +ONENAND_CMD_READ :ONENAND_CMD_READOOB ; this->command (mtd, readcmd, to, mtd->oobsize);onenand_update_bufferram (mtd, to,0 );
@@ -1560,7 +1563,8 @@ static int onenand_write_oob_nolock(struct mtd_info *mtd, loff_t to, oobbuf = this->oob_buf; - oobcmd =ONENAND_IS_MLC (this) ?ONENAND_CMD_PROG :ONENAND_CMD_PROGOOB ; + oobcmd =ONENAND_IS_4KB_PAGE (this) ? +ONENAND_CMD_PROG :ONENAND_CMD_PROGOOB ;/* Loop until all data write */ while (written < len) {
@@ -1577,7 +1581,7 @@ static int onenand_write_oob_nolock(struct mtd_info *mtd, loff_t to,memcpy (oobbuf + column, buf, thislen); this->write_bufferram (mtd,0 ,ONENAND_SPARERAM , oobbuf,0 , mtd->oobsize); -if (ONENAND_IS_MLC (this)) { +if (ONENAND_IS_4KB_PAGE (this)) {/* Set main area of DataRAM to 0xff*/ memset (this->page_buf,0xff , mtd->writesize); this->write_bufferram(mtd, 0, ONENAND_DATARAM,
@@ -2140,7 +2144,10 @@ static void onenand_check_features(struct mtd_info *mtd)/* Lock scheme */ switch (density) {case ONENAND_DEVICE_DENSITY_4Gb: - this->options |=ONENAND_HAS_2PLANE ; +if (ONENAND_IS_DDP (this)) + this->options |=ONENAND_HAS_2PLANE ; +else + this->options |=ONENAND_HAS_4KB_PAGE ;case ONENAND_DEVICE_DENSITY_2Gb:/* 2Gb DDP don't have 2 plane */
@@ -2162,6 +2169,9 @@ static void onenand_check_features(struct mtd_info *mtd) }if (ONENAND_IS_MLC (this)) + this->options |=ONENAND_HAS_4KB_PAGE ; + +if (ONENAND_IS_4KB_PAGE (this)) this->options &= ~ONENAND_HAS_2PLANE ;if (FLEXONENAND (this)) {
@@ -2175,6 +2185,9 @@ static void onenand_check_features(struct mtd_info *mtd)printk (KERN_DEBUG "Chip support all block unlock\n" );if (this->options &ONENAND_HAS_2PLANE )printk (KERN_DEBUG "Chip has 2 plane\n" ); +if (this->options &ONENAND_HAS_4KB_PAGE ) +printk (KERN_DEBUG "Chip has 4KiB pagesize\n" ); + }/**
@@ -2580,6 +2593,9 @@ int onenand_probe(struct mtd_info *mtd) this->device_id = dev_id; this->version_id = ver_id; +/* Check OneNAND features */ +onenand_check_features (mtd); + density =onenand_get_density (dev_id);if (FLEXONENAND (this)) { this->dies =ONENAND_IS_DDP (this) ?2 :1 ;
@@ -2602,7 +2618,7 @@ int onenand_probe(struct mtd_info *mtd) mtd->writesize = this->read_word (this->base +ONENAND_REG_DATA_BUFFER_SIZE );/* We use the full BufferRAM */ -if (ONENAND_IS_MLC (this)) +if (ONENAND_IS_4KB_PAGE (this)) mtd->writesize <<=1 ; mtd->oobsize = mtd->writesize >>5 ;
@@ -2633,9 +2649,6 @@ int onenand_probe(struct mtd_info *mtd)else mtd->size = this->chipsize; -/* Check OneNAND features */ -onenand_check_features (mtd); - mtd->flags =MTD_CAP_NANDFLASH ; mtd->erase = onenand_erase; mtd->read = onenand_read;
include/linux/mtd/onenand.h +4 -0
@@ -140,6 +140,9 @@ struct onenand_chip {#define ONENAND_IS_DDP (this) \ (this->device_id & ONENAND_DEVICE_IS_DDP) +#define ONENAND_IS_4KB_PAGE (this) \ + (this->options & ONENAND_HAS_4KB_PAGE) +#define ONENAND_IS_2PLANE (this) (0)/*
@@ -148,6 +151,7 @@ struct onenand_chip {#define ONENAND_HAS_CONT_LOCK (0x0001)#define ONENAND_HAS_UNLOCK_ALL (0x0002)#define ONENAND_HAS_2PLANE (0x0004) +#define ONENAND_HAS_4KB_PAGE (0x0008)#define ONENAND_RUNTIME_BADBLOCK_CHECK (0x0200)#define ONENAND_PAGEBUF_ALLOC (0x1000)#define ONENAND_OOBBUF_ALLOC (0x2000)
Signature · 1 line
1.7.2.3
PATCH RESEND 4/4 onenand: samsung: Enable support OneNAND support at Samsung's Exynos4210
In reply to Lukasz MajewskiEnable OneNAND support for Exynos4210 (C210 universal).
--- include/configs/s5pc210_universal.h | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
include/configs/s5pc210_universal.h +1 -0
@@ -233,6 +233,7 @@#define CONFIG_SYS_MONITOR_LEN (256 << 10)/* Reserve 2 sectors */ #define CONFIG_USE_ONENAND_BOARD_INIT +#define CONFIG_SAMSUNG_ONENAND #define CONFIG_SYS_ONENAND_BASE 0x0C000000#define CONFIG_ENV_IS_IN_MMC 1
Signature · 1 line
1.7.2.3
Re: [RESEND 0/4] onenand: OneNAND board dependent probe and fixes for Samsung targets
In reply to Lukasz MajewskiQuoted 25 lines · On Mon, 05 Mar 2012 17:41:27 +0100 Lukasz Majewski <[email protected]>…
This patch sets add board dependent onenand probes.
Several fixes for GONI and Exynos4210 (
C210_universal) targets have been added.Tested at:
Samsung S5PC110 GONI Samsung Exynos4210 (S5PC210 Universal)Lukasz Majewski (4):
onenand:samsung Target dependent OneNAND chip probe function onenand:samsung OneNAND chip probe functions added for GONI andExynos4210 onenand: Replace ONENAND_IS_MLC() test with ONENAND_HAS_4KB() onenand: samsung: Enable support OneNAND support at Samsung's Exynos4210board/samsung/goni/onenand.c | 1 + board/samsung/universal_c210/onenand.c | 2 + drivers/mtd/onenand/onenand_base.c | 88 +++++++++++++++++++++++-------- drivers/mtd/onenand/samsung.c | 10 ++++ include/configs/s5pc210_universal.h | 1 + include/linux/mtd/onenand.h | 5 ++ include/linux/mtd/samsung_onenand.h | 2 + 7 files changed, 86
Quoted 2 lines
insertions(+), 23 deletions(-)
I'm very sorry, but this is a wrong mailing list.
It was meant to go to u-boot mailing list, not linux-samsung-soc :-)
Signature · 6 lines
Best regards, Lukasz Majewski Samsung Poland R&D Center Platform Group
cover onenand: OneNAND board dependent probe and fixes for Samsung targets
In reply to Lukasz MajewskiThis patch sets add board dependent onenand probes.
Several fixes for GONI and Exynos4210 (C210_universal) targets have been added.
Tested at:
Samsung S5PC110 GONI
Samsung Exynos4210 (S5PC210 Universal)Lukasz Majewski (4):
onenand:samsung Target dependent OneNAND chip probe function onenand:samsung OneNAND chip probe functions added for GONI and
Exynos4210
onenand: Replace ONENAND_IS_MLC() test with ONENAND_HAS_4KB()
onenand: samsung: Enable support OneNAND support at Samsung's
Exynos4210board/samsung/goni/onenand.c | 1 + board/samsung/universal_c210/onenand.c | 2 + drivers/mtd/onenand/onenand_base.c | 88 +++++++++++++++++++++++-------- drivers/mtd/onenand/samsung.c | 10 ++++ include/configs/s5pc210_universal.h | 1 + include/linux/mtd/onenand.h | 5 ++ include/linux/mtd/samsung_onenand.h | 2 + 7 files changed, 86 insertions(+), 23 deletions(-)
Signature · 1 line
1.7.2.3
PATCH RESEND 1/4 onenand:samsung Target dependent OneNAND chip probe function
Separate callback for probing OneNAND memory chip.
If no special function is defined, default implementation will be used.
This approach gives more flexibility for OneNAND device probing.
--- drivers/mtd/onenand/onenand_base.c | 43 +++++++++++++++++++++++++++++----- drivers/mtd/onenand/samsung.c | 10 ++++++++ include/linux/mtd/onenand.h | 1 + include/linux/mtd/samsung_onenand.h | 2 + 4 files changed, 49 insertions(+), 7 deletions(-)
drivers/mtd/onenand/onenand_base.c +36 -7
@@ -2501,23 +2501,24 @@ out: }/** -* onenand_probe - [OneNAND Interface] Probe the OneNAND device +* onenand_chip_probe - [OneNAND Interface] Probe the OneNAND chip * @param mtd MTD device structure * * OneNAND detection method: * Compare the the values from command with ones from register */ -static int onenand_probe (struct mtd_info *mtd) +static int onenand_chip_probe (struct mtd_info *mtd) {struct onenand_chip *this = mtd->priv; -int bram_maf_id, bram_dev_id, maf_id, dev_id, ver_id; -int density; +int bram_maf_id, bram_dev_id, maf_id, dev_id;int syscfg;/* Save system configuration 1 */ syscfg = this->read_word (this->base +ONENAND_REG_SYS_CFG1 ); +/* Clear Sync. Burst Read mode to read BootRAM */ - this->write_word ((syscfg & ~ONENAND_SYS_CFG1_SYNC_READ ), this->base +ONENAND_REG_SYS_CFG1 ); + this->write_word ((syscfg & ~ONENAND_SYS_CFG1_SYNC_READ ), + this->base +ONENAND_REG_SYS_CFG1 );/* Send the command for reading device ID from BootRAM */ this->write_word (ONENAND_CMD_READID , this->base +ONENAND_BOOTRAM );
@@ -2542,13 +2543,38 @@ static int onenand_probe(struct mtd_info *mtd)/* Read manufacturer and device IDs from Register */ maf_id = this->read_word (this->base +ONENAND_REG_MANUFACTURER_ID ); dev_id = this->read_word (this->base +ONENAND_REG_DEVICE_ID ); - ver_id = this->read_word (this->base +ONENAND_REG_VERSION_ID ); - this->technology = this->read_word (this->base +ONENAND_REG_TECHNOLOGY );/* Check OneNAND device */ if (maf_id != bram_maf_id || dev_id != bram_dev_id)return -ENXIO ; +return 0 ; +} + +/** +* onenand_probe - [OneNAND Interface] Probe the OneNAND device +* @param mtd MTD device structure +* +* OneNAND detection method: +* Compare the the values from command with ones from register +*/ +int onenand_probe (struct mtd_info *mtd) +{ +struct onenand_chip *this = mtd->priv; +int maf_id, dev_id, ver_id; +int density; +int ret; + + ret = this->chip_probe (mtd); +if (ret) +return ret; + +/* Read manufacturer and device IDs from Register */ + maf_id = this->read_word (this->base +ONENAND_REG_MANUFACTURER_ID ); + dev_id = this->read_word (this->base +ONENAND_REG_DEVICE_ID ); + ver_id = this->read_word (this->base +ONENAND_REG_VERSION_ID ); + this->technology = this->read_word (this->base +ONENAND_REG_TECHNOLOGY ); +/* Flash device information */ mtd->name =onenand_print_device_info (dev_id, ver_id); this->device_id = dev_id;
@@ -2655,6 +2681,9 @@ int onenand_scan(struct mtd_info *mtd, int maxchips)if (!this->write_bufferram) this->write_bufferram = onenand_write_bufferram; +if (!this->chip_probe) + this->chip_probe = onenand_chip_probe; +if (!this->block_markbad) this->block_markbad = onenand_default_block_markbad;if (!this->scan_bbt)
drivers/mtd/onenand/samsung.c +10 -0
@@ -589,6 +589,16 @@ static void s3c_set_width_regs(struct onenand_chip *this) }#endif +int s5pc110_chip_probe (struct mtd_info *mtd) +{ +return 0 ; +} + +int s5pc210_chip_probe (struct mtd_info *mtd) +{ +return 0 ; +} +void s3c_onenand_init (struct mtd_info *mtd) {struct onenand_chip *this = mtd->priv;
include/linux/mtd/onenand.h +1 -0
@@ -101,6 +101,7 @@ struct onenand_chip { size_t count);unsigned short (*read_word) (void __iomem *addr);void (*write_word) (unsigned short value,void __iomem *addr); +int (*chip_probe)(struct mtd_info *mtd);void (*mmcontrol) (struct mtd_info *mtd,int sync_read);int (*block_markbad)(struct mtd_info *mtd,loff_t ofs);int (*scan_bbt)(struct mtd_info *mtd);
include/linux/mtd/samsung_onenand.h +2 -0
@@ -127,5 +127,7 @@ struct samsung_onenand {/* common initialize function */ extern void s3c_onenand_init (struct mtd_info *); +extern int s5pc110_chip_probe (struct mtd_info *); +extern int s5pc210_chip_probe (struct mtd_info *);#endif
Signature · 1 line
1.7.2.3
PATCH RESEND 2/4 onenand:samsung OneNAND chip probe functions added for GONI and Exynos4210
In reply to Lukasz MajewskiSeparate callback for probing OneNAND memory chip.
Tested at:
Samsung S5PC110 GONI
Samsung Exynos4210 (S5PC210 Universal)
--- board/samsung/goni/onenand.c | 1 + board/samsung/universal_c210/onenand.c | 2 ++ 2 files changed, 3 insertions(+), 0 deletions(-)
board/samsung/goni/onenand.c +1 -0
@@ -33,4 +33,5 @@ void onenand_board_init(struct mtd_info *mtd) this->base = (void *)CONFIG_SYS_ONENAND_BASE ; this->options |=ONENAND_RUNTIME_BADBLOCK_CHECK ; + this->chip_probe = s5pc110_chip_probe; }
board/samsung/universal_c210/onenand.c +2 -0
@@ -24,6 +24,7 @@#include <common.h> #include <linux/mtd/mtd.h> #include <linux/mtd/onenand.h> +#include <linux/mtd/samsung_onenand.h> void onenand_board_init (struct mtd_info *mtd) {
@@ -31,4 +32,5 @@ void onenand_board_init(struct mtd_info *mtd) this->base = (void *)CONFIG_SYS_ONENAND_BASE ; this->options |=ONENAND_RUNTIME_BADBLOCK_CHECK ; + this->chip_probe = s5pc210_chip_probe; }
Signature · 1 line
1.7.2.3
PATCH RESEND 3/4 onenand: Replace ONENAND_IS_MLC() test with ONENAND_HAS_4KB()
In reply to Lukasz MajewskiThis replacement is for causing 4KB page size devices to work properly with u-boot.
The old ONENAND_IS_MLC() behavior has been preserved by explicitly setting ONENAND_HAS_4KB_PAGE for those devices.
This change makes the onenand_base.c file more resembling the respective kernel sources.
Tested at:
Samsung S5PC110 GONI
Samsung S5PC210 Universal
--- drivers/mtd/onenand/onenand_base.c | 45 +++++++++++++++++++++++------------ include/linux/mtd/onenand.h | 4 +++ 2 files changed, 33 insertions(+), 16 deletions(-)
drivers/mtd/onenand/onenand_base.c +29 -16
@@ -367,7 +367,7 @@ static int onenand_command(struct mtd_info *mtd, int cmd, loff_t addr, this->write_word (value, this->base +ONENAND_REG_START_ADDRESS2 ); -if (ONENAND_IS_MLC (this)) +if (ONENAND_IS_4KB_PAGE (this))ONENAND_SET_BUFFERRAM0 (this);else /* Switch to the next data buffer */
@@ -395,7 +395,7 @@ static int onenand_command(struct mtd_info *mtd, int cmd, loff_t addr,case FLEXONENAND_CMD_RECOVER_LSB :case ONENAND_CMD_READ :case ONENAND_CMD_READOOB : -if (ONENAND_IS_MLC (this)) +if (ONENAND_IS_4KB_PAGE (this)) dataram =ONENAND_SET_BUFFERRAM0 (this);else dataram =ONENAND_SET_NEXT_BUFFERRAM (this);
@@ -893,7 +893,7 @@ static int onenand_read_ops_nolock(struct mtd_info *mtd, loff_t from,while (!ret) {/* If there is more to load then start next load */ from += thislen; -if (!ONENAND_IS_MLC (this) && read + thislen < len) { +if (!ONENAND_IS_4KB_PAGE (this) && read + thislen < len) { this->main_buf = buf + thislen; this->command (mtd,ONENAND_CMD_READ , from, writesize);/*
@@ -927,7 +927,7 @@ static int onenand_read_ops_nolock(struct mtd_info *mtd, loff_t from, oobcolumn =0 ; } -if (ONENAND_IS_MLC (this) && (read + thislen < len)) { +if (ONENAND_IS_4KB_PAGE (this) && (read + thislen < len)) { this->command (mtd,ONENAND_CMD_READ , from, writesize); ret = this->wait (mtd,FL_READING );if (unlikely (ret))
@@ -944,13 +944,13 @@ static int onenand_read_ops_nolock(struct mtd_info *mtd, loff_t from,/* Set up for next read from bufferRAM */ if (unlikely (boundary)) this->write_word (ONENAND_DDP_CHIP1 , this->base +ONENAND_REG_START_ADDRESS2 ); -if (!ONENAND_IS_MLC (this)) +if (!ONENAND_IS_4KB_PAGE (this))ONENAND_SET_NEXT_BUFFERRAM (this); buf += thislen; thislen =min_t (int, writesize, len - read); column =0 ; -if (!ONENAND_IS_MLC (this)) { +if (!ONENAND_IS_4KB_PAGE (this)) {/* Now wait for load */ ret = this->wait (mtd,FL_READING );onenand_update_bufferram (mtd, from, !ret);
@@ -1024,7 +1024,8 @@ static int onenand_read_oob_nolock(struct mtd_info *mtd, loff_t from, stats = mtd->ecc_stats; - readcmd =ONENAND_IS_MLC (this) ?ONENAND_CMD_READ :ONENAND_CMD_READOOB ; + readcmd =ONENAND_IS_4KB_PAGE (this) ? +ONENAND_CMD_READ :ONENAND_CMD_READOOB ;while (read < len) { thislen = oobsize - column;
@@ -1202,7 +1203,8 @@ int onenand_bbt_read_oob(struct mtd_info *mtd, loff_t from,MTDDEBUG (MTD_DEBUG_LEVEL3 ,"onenand_bbt_read_oob: from = 0x%08x, len = %zi\n" , (unsigned int ) from, len); - readcmd =ONENAND_IS_MLC (this) ?ONENAND_CMD_READ :ONENAND_CMD_READOOB ; + readcmd =ONENAND_IS_4KB_PAGE (this) ? +ONENAND_CMD_READ :ONENAND_CMD_READOOB ;/* Initialize return value */ ops->oobretlen =0 ;
@@ -1271,7 +1273,8 @@ static int onenand_verify_oob(struct mtd_info *mtd, const u_char *buf, loff_t tou_char *oob_buf = this->oob_buf;int status, i, readcmd; - readcmd =ONENAND_IS_MLC (this) ?ONENAND_CMD_READ :ONENAND_CMD_READOOB ; + readcmd =ONENAND_IS_4KB_PAGE (this) ? +ONENAND_CMD_READ :ONENAND_CMD_READOOB ; this->command (mtd, readcmd, to, mtd->oobsize);onenand_update_bufferram (mtd, to,0 );
@@ -1560,7 +1563,8 @@ static int onenand_write_oob_nolock(struct mtd_info *mtd, loff_t to, oobbuf = this->oob_buf; - oobcmd =ONENAND_IS_MLC (this) ?ONENAND_CMD_PROG :ONENAND_CMD_PROGOOB ; + oobcmd =ONENAND_IS_4KB_PAGE (this) ? +ONENAND_CMD_PROG :ONENAND_CMD_PROGOOB ;/* Loop until all data write */ while (written < len) {
@@ -1577,7 +1581,7 @@ static int onenand_write_oob_nolock(struct mtd_info *mtd, loff_t to,memcpy (oobbuf + column, buf, thislen); this->write_bufferram (mtd,0 ,ONENAND_SPARERAM , oobbuf,0 , mtd->oobsize); -if (ONENAND_IS_MLC (this)) { +if (ONENAND_IS_4KB_PAGE (this)) {/* Set main area of DataRAM to 0xff*/ memset (this->page_buf,0xff , mtd->writesize); this->write_bufferram(mtd, 0, ONENAND_DATARAM,
@@ -2140,7 +2144,10 @@ static void onenand_check_features(struct mtd_info *mtd)/* Lock scheme */ switch (density) {case ONENAND_DEVICE_DENSITY_4Gb: - this->options |=ONENAND_HAS_2PLANE ; +if (ONENAND_IS_DDP (this)) + this->options |=ONENAND_HAS_2PLANE ; +else + this->options |=ONENAND_HAS_4KB_PAGE ;case ONENAND_DEVICE_DENSITY_2Gb:/* 2Gb DDP don't have 2 plane */
@@ -2162,6 +2169,9 @@ static void onenand_check_features(struct mtd_info *mtd) }if (ONENAND_IS_MLC (this)) + this->options |=ONENAND_HAS_4KB_PAGE ; + +if (ONENAND_IS_4KB_PAGE (this)) this->options &= ~ONENAND_HAS_2PLANE ;if (FLEXONENAND (this)) {
@@ -2175,6 +2185,9 @@ static void onenand_check_features(struct mtd_info *mtd)printk (KERN_DEBUG "Chip support all block unlock\n" );if (this->options &ONENAND_HAS_2PLANE )printk (KERN_DEBUG "Chip has 2 plane\n" ); +if (this->options &ONENAND_HAS_4KB_PAGE ) +printk (KERN_DEBUG "Chip has 4KiB pagesize\n" ); + }/**
@@ -2580,6 +2593,9 @@ int onenand_probe(struct mtd_info *mtd) this->device_id = dev_id; this->version_id = ver_id; +/* Check OneNAND features */ +onenand_check_features (mtd); + density =onenand_get_density (dev_id);if (FLEXONENAND (this)) { this->dies =ONENAND_IS_DDP (this) ?2 :1 ;
@@ -2602,7 +2618,7 @@ int onenand_probe(struct mtd_info *mtd) mtd->writesize = this->read_word (this->base +ONENAND_REG_DATA_BUFFER_SIZE );/* We use the full BufferRAM */ -if (ONENAND_IS_MLC (this)) +if (ONENAND_IS_4KB_PAGE (this)) mtd->writesize <<=1 ; mtd->oobsize = mtd->writesize >>5 ;
@@ -2633,9 +2649,6 @@ int onenand_probe(struct mtd_info *mtd)else mtd->size = this->chipsize; -/* Check OneNAND features */ -onenand_check_features (mtd); - mtd->flags =MTD_CAP_NANDFLASH ; mtd->erase = onenand_erase; mtd->read = onenand_read;
include/linux/mtd/onenand.h +4 -0
@@ -140,6 +140,9 @@ struct onenand_chip {#define ONENAND_IS_DDP (this) \ (this->device_id & ONENAND_DEVICE_IS_DDP) +#define ONENAND_IS_4KB_PAGE (this) \ + (this->options & ONENAND_HAS_4KB_PAGE) +#define ONENAND_IS_2PLANE (this) (0)/*
@@ -148,6 +151,7 @@ struct onenand_chip {#define ONENAND_HAS_CONT_LOCK (0x0001)#define ONENAND_HAS_UNLOCK_ALL (0x0002)#define ONENAND_HAS_2PLANE (0x0004) +#define ONENAND_HAS_4KB_PAGE (0x0008)#define ONENAND_RUNTIME_BADBLOCK_CHECK (0x0200)#define ONENAND_PAGEBUF_ALLOC (0x1000)#define ONENAND_OOBBUF_ALLOC (0x2000)
Signature · 1 line
1.7.2.3
PATCH RESEND 4/4 onenand: samsung: Enable support OneNAND support at Samsung's Exynos4210
In reply to Lukasz MajewskiEnable OneNAND support for Exynos4210 (C210 universal).
--- include/configs/s5pc210_universal.h | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
include/configs/s5pc210_universal.h +1 -0
@@ -233,6 +233,7 @@#define CONFIG_SYS_MONITOR_LEN (256 << 10)/* Reserve 2 sectors */ #define CONFIG_USE_ONENAND_BOARD_INIT +#define CONFIG_SAMSUNG_ONENAND #define CONFIG_SYS_ONENAND_BASE 0x0C000000#define CONFIG_ENV_IS_IN_MMC 1
Signature · 1 line
1.7.2.3
[U-Boot] OneNAND custodian (was: Re: [RESEND 0/4] onenand: OneNAND board dependent probe and fixes for Samsung targets)
In reply to Lukasz MajewskiQuoted 8 lines · Lukasz Majewski
This patch sets add board dependent onenand probes.
Several fixes for GONI and Exynos4210 (
C210_universal) targets have been added.Tested at:
Samsung S5PC110 GONI Samsung Exynos4210 (S5PC210 Universal)
Quoted 7 lines
Lukasz Majewski (4):
onenand:samsung Target dependent OneNAND chip probe function onenand:samsung OneNAND chip probe functions added for GONI andExynos4210 onenand: Replace ONENAND_IS_MLC() test with ONENAND_HAS_4KB() onenand: samsung: Enable support OneNAND support at Samsung's Exynos4210
Is anyone interested in being a OneNAND custodian?
I've taken some OneNAND patches in the past, but it's a completely separate subsystem from NAND, and nobody seems interested in changing that. I not only have no hardware, but also no documentation other than marketing materials. I lack the context to properly review OneNAND patches.
-Scott
[U-Boot] OneNAND custodian (was: Re: [RESEND 0/4] onenand: OneNAND board dependent probe and fixes for Samsung targets)
Quoted 18 lines · Scott Wood
Quoted 9 lines · Lukasz Majewski
This patch sets add board dependent onenand probes.
Several fixes for GONI and Exynos4210 (
C210_universal) targets have been added.Tested at:
Samsung S5PC110 GONI Samsung Exynos4210 (S5PC210 Universal)Quoted 7 lines
Lukasz Majewski (4):
onenand:samsung Target dependent OneNAND chip probe function onenand:samsung OneNAND chip probe functions added for GONI andExynos4210 onenand: Replace ONENAND_IS_MLC() test with ONENAND_HAS_4KB() onenand: samsung: Enable support OneNAND support at Samsung's Exynos4210
Quoted 6 lines
Is anyone interested in being a OneNAND custodian?
I've taken some OneNAND patches in the past, but it's a completely separate subsystem from NAND, and nobody seems interested in changing that. I not only have no hardware, but also no documentation other than marketing materials. I lack the context to properly review OneNAND patches.
Thanks Scott.
Now I'm no more work on OneNAND. It's almost fixed and no more new features. These patches are syncing internal tree with mainline one. and no more changes.
So please until this time, handle this patches.
Next time, Mr. Kang handle both samsung and onenand together. How do you think?
Thank you,
Kyungmin Park
Quoted 8 lines
-Scott
_______________________________________________
U-Boot mailing list
U-Boot at lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot
[U-Boot] OneNAND custodian (was: Re: [RESEND 0/4] onenand: OneNAND board dependent probe and fixes for Samsung targets)
In reply to Scott WoodQuoted 20 lines · On Tue, 6 Mar 2012 19:53:21 +0100 Scott Wood <[email protected]> wrote:
Quoted 9 lines · Lukasz Majewski
This patch sets add board dependent onenand probes.
Several fixes for GONI and Exynos4210 (
C210_universal) targets have been added.Tested at:
Samsung S5PC110 GONI Samsung Exynos4210 (S5PC210 Universal)Quoted 7 lines
Lukasz Majewski (4):
onenand:samsung Target dependent OneNAND chip probe function onenand:samsung OneNAND chip probe functions added for GONI andExynos4210 onenand: Replace ONENAND_IS_MLC() test with ONENAND_HAS_4KB() onenand: samsung: Enable support OneNAND support at Samsung's Exynos4210Is anyone interested in being a OneNAND custodian?
Quoted 7 lines
I've taken some OneNAND patches in the past, but it's a completely separate subsystem from NAND, and nobody seems interested in changing that. I not only have no hardware, but also no documentation other than marketing materials. I lack the context to properly review OneNAND patches.
-Scott
Hi Scott,
Some of our targets still use that kind of memory (Goni and Universal C210).
I can volunteer as a OneNAND custodian.
Signature · 6 lines
Best regards, Lukasz Majewski Samsung Poland R&D Center Platform Group
[U-Boot] OneNAND custodian
Quoted 29 lines · Lukasz Majewski
Quoted 26 lines · On Tue, 6 Mar 2012 19:53:21 +0100 Scott Wood <[email protected]> wrote:
Quoted 9 lines · Lukasz Majewski
This patch sets add board dependent onenand probes.
Several fixes for GONI and Exynos4210 (
C210_universal) targets have been added.Tested at:
Samsung S5PC110 GONI Samsung Exynos4210 (S5PC210 Universal)Quoted 7 lines
Lukasz Majewski (4):
onenand:samsung Target dependent OneNAND chip probe function onenand:samsung OneNAND chip probe functions added for GONI andExynos4210 onenand: Replace ONENAND_IS_MLC() test with ONENAND_HAS_4KB() onenand: samsung: Enable support OneNAND support at Samsung's Exynos4210Is anyone interested in being a OneNAND custodian?
I've taken some OneNAND patches in the past, but it's a completely separate subsystem from NAND, and nobody seems interested in changing that. I not only have no hardware, but also no documentation other than marketing materials. I lack the context to properly review OneNAND patches.
Quoted 7 lines
Quoted 1 line
-Scott
Hi Scott,
Some of our targets still use that kind of memory (Goni and Universal C210).
I can volunteer as a OneNAND custodian.
Wolfgang, is this OK with you?
-Scott
[U-Boot] OneNAND custodian
Dear Scott Wood,
Quoted 4 lines · In message <[email protected]> you wrote:
Quoted 2 lines
I can volunteer as a OneNAND custodian.
Wolfgang, is this OK with you?
Yes, of course.
I plan to post a status summary / custodian update tomorrow.
To all new custodians: I need you SSH public keys.
Best regards,
Wolfgang Denk
Signature · 5 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de Wisdom is one of the few things that looks bigger the further away it is. - Terry Pratchett, _Witches Abroad_