Commit b33f7a43 authored by Brian Norris's avatar Brian Norris

Merge v4.5-rc1 with MTD -next development

To start from a good base.
Signed-off-by: default avatarBrian Norris <computersforpeace@gmail.com>
parents 92e963f5 8ce06d37
...@@ -66,11 +66,13 @@ static const char *bcm47xxpart_trx_data_part_name(struct mtd_info *master, ...@@ -66,11 +66,13 @@ static const char *bcm47xxpart_trx_data_part_name(struct mtd_info *master,
{ {
uint32_t buf; uint32_t buf;
size_t bytes_read; size_t bytes_read;
int err;
if (mtd_read(master, offset, sizeof(buf), &bytes_read, err = mtd_read(master, offset, sizeof(buf), &bytes_read,
(uint8_t *)&buf) < 0) { (uint8_t *)&buf);
pr_err("mtd_read error while parsing (offset: 0x%X)!\n", if (err && !mtd_is_bitflip(err)) {
offset); pr_err("mtd_read error while parsing (offset: 0x%X): %d\n",
offset, err);
goto out_default; goto out_default;
} }
...@@ -95,6 +97,7 @@ static int bcm47xxpart_parse(struct mtd_info *master, ...@@ -95,6 +97,7 @@ static int bcm47xxpart_parse(struct mtd_info *master,
int trx_part = -1; int trx_part = -1;
int last_trx_part = -1; int last_trx_part = -1;
int possible_nvram_sizes[] = { 0x8000, 0xF000, 0x10000, }; int possible_nvram_sizes[] = { 0x8000, 0xF000, 0x10000, };
int err;
/* /*
* Some really old flashes (like AT45DB*) had smaller erasesize-s, but * Some really old flashes (like AT45DB*) had smaller erasesize-s, but
...@@ -118,8 +121,8 @@ static int bcm47xxpart_parse(struct mtd_info *master, ...@@ -118,8 +121,8 @@ static int bcm47xxpart_parse(struct mtd_info *master,
/* Parse block by block looking for magics */ /* Parse block by block looking for magics */
for (offset = 0; offset <= master->size - blocksize; for (offset = 0; offset <= master->size - blocksize;
offset += blocksize) { offset += blocksize) {
/* Nothing more in higher memory */ /* Nothing more in higher memory on BCM47XX (MIPS) */
if (offset >= 0x2000000) if (config_enabled(CONFIG_BCM47XX) && offset >= 0x2000000)
break; break;
if (curr_part >= BCM47XXPART_MAX_PARTS) { if (curr_part >= BCM47XXPART_MAX_PARTS) {
...@@ -128,10 +131,11 @@ static int bcm47xxpart_parse(struct mtd_info *master, ...@@ -128,10 +131,11 @@ static int bcm47xxpart_parse(struct mtd_info *master,
} }
/* Read beginning of the block */ /* Read beginning of the block */
if (mtd_read(master, offset, BCM47XXPART_BYTES_TO_READ, err = mtd_read(master, offset, BCM47XXPART_BYTES_TO_READ,
&bytes_read, (uint8_t *)buf) < 0) { &bytes_read, (uint8_t *)buf);
pr_err("mtd_read error while parsing (offset: 0x%X)!\n", if (err && !mtd_is_bitflip(err)) {
offset); pr_err("mtd_read error while parsing (offset: 0x%X): %d\n",
offset, err);
continue; continue;
} }
...@@ -254,10 +258,11 @@ static int bcm47xxpart_parse(struct mtd_info *master, ...@@ -254,10 +258,11 @@ static int bcm47xxpart_parse(struct mtd_info *master,
} }
/* Read middle of the block */ /* Read middle of the block */
if (mtd_read(master, offset + 0x8000, 0x4, err = mtd_read(master, offset + 0x8000, 0x4, &bytes_read,
&bytes_read, (uint8_t *)buf) < 0) { (uint8_t *)buf);
pr_err("mtd_read error while parsing (offset: 0x%X)!\n", if (err && !mtd_is_bitflip(err)) {
offset); pr_err("mtd_read error while parsing (offset: 0x%X): %d\n",
offset, err);
continue; continue;
} }
...@@ -277,10 +282,11 @@ static int bcm47xxpart_parse(struct mtd_info *master, ...@@ -277,10 +282,11 @@ static int bcm47xxpart_parse(struct mtd_info *master,
} }
offset = master->size - possible_nvram_sizes[i]; offset = master->size - possible_nvram_sizes[i];
if (mtd_read(master, offset, 0x4, &bytes_read, err = mtd_read(master, offset, 0x4, &bytes_read,
(uint8_t *)buf) < 0) { (uint8_t *)buf);
pr_err("mtd_read error while reading at offset 0x%X!\n", if (err && !mtd_is_bitflip(err)) {
offset); pr_err("mtd_read error while reading (offset 0x%X): %d\n",
offset, err);
continue; continue;
} }
......
...@@ -825,7 +825,7 @@ static void pmecc_correct_data(struct mtd_info *mtd, uint8_t *buf, uint8_t *ecc, ...@@ -825,7 +825,7 @@ static void pmecc_correct_data(struct mtd_info *mtd, uint8_t *buf, uint8_t *ecc,
*(buf + byte_pos) ^= (1 << bit_pos); *(buf + byte_pos) ^= (1 << bit_pos);
pos = sector_num * host->pmecc_sector_size + byte_pos; pos = sector_num * host->pmecc_sector_size + byte_pos;
dev_info(host->dev, "Bit flip in data area, byte_pos: %d, bit_pos: %d, 0x%02x -> 0x%02x\n", dev_dbg(host->dev, "Bit flip in data area, byte_pos: %d, bit_pos: %d, 0x%02x -> 0x%02x\n",
pos, bit_pos, err_byte, *(buf + byte_pos)); pos, bit_pos, err_byte, *(buf + byte_pos));
} else { } else {
/* Bit flip in OOB area */ /* Bit flip in OOB area */
...@@ -835,7 +835,7 @@ static void pmecc_correct_data(struct mtd_info *mtd, uint8_t *buf, uint8_t *ecc, ...@@ -835,7 +835,7 @@ static void pmecc_correct_data(struct mtd_info *mtd, uint8_t *buf, uint8_t *ecc,
ecc[tmp] ^= (1 << bit_pos); ecc[tmp] ^= (1 << bit_pos);
pos = tmp + nand_chip->ecc.layout->eccpos[0]; pos = tmp + nand_chip->ecc.layout->eccpos[0];
dev_info(host->dev, "Bit flip in OOB, oob_byte_pos: %d, bit_pos: %d, 0x%02x -> 0x%02x\n", dev_dbg(host->dev, "Bit flip in OOB, oob_byte_pos: %d, bit_pos: %d, 0x%02x -> 0x%02x\n",
pos, bit_pos, err_byte, ecc[tmp]); pos, bit_pos, err_byte, ecc[tmp]);
} }
...@@ -1486,8 +1486,6 @@ static void atmel_nand_hwctl(struct mtd_info *mtd, int mode) ...@@ -1486,8 +1486,6 @@ static void atmel_nand_hwctl(struct mtd_info *mtd, int mode)
ecc_writel(host->ecc, CR, ATMEL_ECC_RST); ecc_writel(host->ecc, CR, ATMEL_ECC_RST);
} }
static const struct of_device_id atmel_nand_dt_ids[];
static int atmel_of_init_port(struct atmel_nand_host *host, static int atmel_of_init_port(struct atmel_nand_host *host,
struct device_node *np) struct device_node *np)
{ {
...@@ -1498,7 +1496,7 @@ static int atmel_of_init_port(struct atmel_nand_host *host, ...@@ -1498,7 +1496,7 @@ static int atmel_of_init_port(struct atmel_nand_host *host,
enum of_gpio_flags flags = 0; enum of_gpio_flags flags = 0;
host->caps = (struct atmel_nand_caps *) host->caps = (struct atmel_nand_caps *)
of_match_device(atmel_nand_dt_ids, host->dev)->data; of_device_get_match_data(host->dev);
if (of_property_read_u32(np, "atmel,nand-addr-offset", &val) == 0) { if (of_property_read_u32(np, "atmel,nand-addr-offset", &val) == 0) {
if (val >= 32) { if (val >= 32) {
...@@ -1550,7 +1548,7 @@ static int atmel_of_init_port(struct atmel_nand_host *host, ...@@ -1550,7 +1548,7 @@ static int atmel_of_init_port(struct atmel_nand_host *host,
if ((val != 2) && (val != 4) && (val != 8) && (val != 12) && if ((val != 2) && (val != 4) && (val != 8) && (val != 12) &&
(val != 24)) { (val != 24)) {
dev_err(host->dev, dev_err(host->dev,
"Unsupported PMECC correction capability: %d; should be 2, 4, 8, 12 or 24\n", "Required ECC strength not supported: %u\n",
val); val);
return -EINVAL; return -EINVAL;
} }
...@@ -1560,7 +1558,7 @@ static int atmel_of_init_port(struct atmel_nand_host *host, ...@@ -1560,7 +1558,7 @@ static int atmel_of_init_port(struct atmel_nand_host *host,
if (of_property_read_u32(np, "atmel,pmecc-sector-size", &val) == 0) { if (of_property_read_u32(np, "atmel,pmecc-sector-size", &val) == 0) {
if ((val != 512) && (val != 1024)) { if ((val != 512) && (val != 1024)) {
dev_err(host->dev, dev_err(host->dev,
"Unsupported PMECC sector size: %d; should be 512 or 1024 bytes\n", "Required ECC sector size not supported: %u\n",
val); val);
return -EINVAL; return -EINVAL;
} }
......
/* /*
* Freescale GPMI NAND Flash Driver * Freescale GPMI NAND Flash Driver
* *
* Copyright (C) 2010-2011 Freescale Semiconductor, Inc. * Copyright (C) 2010-2015 Freescale Semiconductor, Inc.
* Copyright (C) 2008 Embedded Alley Solutions, Inc. * Copyright (C) 2008 Embedded Alley Solutions, Inc.
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
...@@ -136,7 +136,7 @@ static inline bool gpmi_check_ecc(struct gpmi_nand_data *this) ...@@ -136,7 +136,7 @@ static inline bool gpmi_check_ecc(struct gpmi_nand_data *this)
* *
* We may have available oob space in this case. * We may have available oob space in this case.
*/ */
static bool set_geometry_by_ecc_info(struct gpmi_nand_data *this) static int set_geometry_by_ecc_info(struct gpmi_nand_data *this)
{ {
struct bch_geometry *geo = &this->bch_geometry; struct bch_geometry *geo = &this->bch_geometry;
struct nand_chip *chip = &this->nand; struct nand_chip *chip = &this->nand;
...@@ -145,7 +145,7 @@ static bool set_geometry_by_ecc_info(struct gpmi_nand_data *this) ...@@ -145,7 +145,7 @@ static bool set_geometry_by_ecc_info(struct gpmi_nand_data *this)
unsigned int block_mark_bit_offset; unsigned int block_mark_bit_offset;
if (!(chip->ecc_strength_ds > 0 && chip->ecc_step_ds > 0)) if (!(chip->ecc_strength_ds > 0 && chip->ecc_step_ds > 0))
return false; return -EINVAL;
switch (chip->ecc_step_ds) { switch (chip->ecc_step_ds) {
case SZ_512: case SZ_512:
...@@ -158,19 +158,19 @@ static bool set_geometry_by_ecc_info(struct gpmi_nand_data *this) ...@@ -158,19 +158,19 @@ static bool set_geometry_by_ecc_info(struct gpmi_nand_data *this)
dev_err(this->dev, dev_err(this->dev,
"unsupported nand chip. ecc bits : %d, ecc size : %d\n", "unsupported nand chip. ecc bits : %d, ecc size : %d\n",
chip->ecc_strength_ds, chip->ecc_step_ds); chip->ecc_strength_ds, chip->ecc_step_ds);
return false; return -EINVAL;
} }
geo->ecc_chunk_size = chip->ecc_step_ds; geo->ecc_chunk_size = chip->ecc_step_ds;
geo->ecc_strength = round_up(chip->ecc_strength_ds, 2); geo->ecc_strength = round_up(chip->ecc_strength_ds, 2);
if (!gpmi_check_ecc(this)) if (!gpmi_check_ecc(this))
return false; return -EINVAL;
/* Keep the C >= O */ /* Keep the C >= O */
if (geo->ecc_chunk_size < mtd->oobsize) { if (geo->ecc_chunk_size < mtd->oobsize) {
dev_err(this->dev, dev_err(this->dev,
"unsupported nand chip. ecc size: %d, oob size : %d\n", "unsupported nand chip. ecc size: %d, oob size : %d\n",
chip->ecc_step_ds, mtd->oobsize); chip->ecc_step_ds, mtd->oobsize);
return false; return -EINVAL;
} }
/* The default value, see comment in the legacy_set_geometry(). */ /* The default value, see comment in the legacy_set_geometry(). */
...@@ -242,7 +242,7 @@ static bool set_geometry_by_ecc_info(struct gpmi_nand_data *this) ...@@ -242,7 +242,7 @@ static bool set_geometry_by_ecc_info(struct gpmi_nand_data *this)
+ ALIGN(geo->ecc_chunk_count, 4); + ALIGN(geo->ecc_chunk_count, 4);
if (!this->swap_block_mark) if (!this->swap_block_mark)
return true; return 0;
/* For bit swap. */ /* For bit swap. */
block_mark_bit_offset = mtd->writesize * 8 - block_mark_bit_offset = mtd->writesize * 8 -
...@@ -251,7 +251,7 @@ static bool set_geometry_by_ecc_info(struct gpmi_nand_data *this) ...@@ -251,7 +251,7 @@ static bool set_geometry_by_ecc_info(struct gpmi_nand_data *this)
geo->block_mark_byte_offset = block_mark_bit_offset / 8; geo->block_mark_byte_offset = block_mark_bit_offset / 8;
geo->block_mark_bit_offset = block_mark_bit_offset % 8; geo->block_mark_bit_offset = block_mark_bit_offset % 8;
return true; return 0;
} }
static int legacy_set_geometry(struct gpmi_nand_data *this) static int legacy_set_geometry(struct gpmi_nand_data *this)
...@@ -285,7 +285,8 @@ static int legacy_set_geometry(struct gpmi_nand_data *this) ...@@ -285,7 +285,8 @@ static int legacy_set_geometry(struct gpmi_nand_data *this)
geo->ecc_strength = get_ecc_strength(this); geo->ecc_strength = get_ecc_strength(this);
if (!gpmi_check_ecc(this)) { if (!gpmi_check_ecc(this)) {
dev_err(this->dev, dev_err(this->dev,
"required ecc strength of the NAND chip: %d is not supported by the GPMI controller (%d)\n", "ecc strength: %d cannot be supported by the controller (%d)\n"
"try to use minimum ecc strength that NAND chip required\n",
geo->ecc_strength, geo->ecc_strength,
this->devdata->bch_max_ecc_strength); this->devdata->bch_max_ecc_strength);
return -EINVAL; return -EINVAL;
...@@ -366,10 +367,11 @@ static int legacy_set_geometry(struct gpmi_nand_data *this) ...@@ -366,10 +367,11 @@ static int legacy_set_geometry(struct gpmi_nand_data *this)
int common_nfc_set_geometry(struct gpmi_nand_data *this) int common_nfc_set_geometry(struct gpmi_nand_data *this)
{ {
if (of_property_read_bool(this->dev->of_node, "fsl,use-minimum-ecc") if ((of_property_read_bool(this->dev->of_node, "fsl,use-minimum-ecc"))
&& set_geometry_by_ecc_info(this)) || legacy_set_geometry(this))
return 0; return set_geometry_by_ecc_info(this);
return legacy_set_geometry(this);
return 0;
} }
struct dma_chan *get_dma_chan(struct gpmi_nand_data *this) struct dma_chan *get_dma_chan(struct gpmi_nand_data *this)
...@@ -2033,9 +2035,54 @@ static int gpmi_nand_remove(struct platform_device *pdev) ...@@ -2033,9 +2035,54 @@ static int gpmi_nand_remove(struct platform_device *pdev)
return 0; return 0;
} }
#ifdef CONFIG_PM_SLEEP
static int gpmi_pm_suspend(struct device *dev)
{
struct gpmi_nand_data *this = dev_get_drvdata(dev);
release_dma_channels(this);
return 0;
}
static int gpmi_pm_resume(struct device *dev)
{
struct gpmi_nand_data *this = dev_get_drvdata(dev);
int ret;
ret = acquire_dma_channels(this);
if (ret < 0)
return ret;
/* re-init the GPMI registers */
this->flags &= ~GPMI_TIMING_INIT_OK;
ret = gpmi_init(this);
if (ret) {
dev_err(this->dev, "Error setting GPMI : %d\n", ret);
return ret;
}
/* re-init the BCH registers */
ret = bch_set_geometry(this);
if (ret) {
dev_err(this->dev, "Error setting BCH : %d\n", ret);
return ret;
}
/* re-init others */
gpmi_extra_init(this);
return 0;
}
#endif /* CONFIG_PM_SLEEP */
static const struct dev_pm_ops gpmi_pm_ops = {
SET_SYSTEM_SLEEP_PM_OPS(gpmi_pm_suspend, gpmi_pm_resume)
};
static struct platform_driver gpmi_nand_driver = { static struct platform_driver gpmi_nand_driver = {
.driver = { .driver = {
.name = "gpmi-nand", .name = "gpmi-nand",
.pm = &gpmi_pm_ops,
.of_match_table = gpmi_nand_id_table, .of_match_table = gpmi_nand_id_table,
}, },
.probe = gpmi_nand_probe, .probe = gpmi_nand_probe,
......
...@@ -626,7 +626,7 @@ static void mpc5121_nfc_free(struct device *dev, struct mtd_info *mtd) ...@@ -626,7 +626,7 @@ static void mpc5121_nfc_free(struct device *dev, struct mtd_info *mtd)
static int mpc5121_nfc_probe(struct platform_device *op) static int mpc5121_nfc_probe(struct platform_device *op)
{ {
struct device_node *rootnode, *dn = op->dev.of_node; struct device_node *dn = op->dev.of_node;
struct clk *clk; struct clk *clk;
struct device *dev = &op->dev; struct device *dev = &op->dev;
struct mpc5121_nfc_prv *prv; struct mpc5121_nfc_prv *prv;
...@@ -712,18 +712,15 @@ static int mpc5121_nfc_probe(struct platform_device *op) ...@@ -712,18 +712,15 @@ static int mpc5121_nfc_probe(struct platform_device *op)
chip->ecc.mode = NAND_ECC_SOFT; chip->ecc.mode = NAND_ECC_SOFT;
/* Support external chip-select logic on ADS5121 board */ /* Support external chip-select logic on ADS5121 board */
rootnode = of_find_node_by_path("/"); if (of_machine_is_compatible("fsl,mpc5121ads")) {
if (of_device_is_compatible(rootnode, "fsl,mpc5121ads")) {
retval = ads5121_chipselect_init(mtd); retval = ads5121_chipselect_init(mtd);
if (retval) { if (retval) {
dev_err(dev, "Chipselect init error!\n"); dev_err(dev, "Chipselect init error!\n");
of_node_put(rootnode);
return retval; return retval;
} }
chip->select_chip = ads5121_select_chip; chip->select_chip = ads5121_select_chip;
} }
of_node_put(rootnode);
/* Enable NFC clock */ /* Enable NFC clock */
clk = devm_clk_get(dev, "ipg"); clk = devm_clk_get(dev, "ipg");
......
...@@ -1373,5 +1373,3 @@ int nand_markbad_bbt(struct mtd_info *mtd, loff_t offs) ...@@ -1373,5 +1373,3 @@ int nand_markbad_bbt(struct mtd_info *mtd, loff_t offs)
return ret; return ret;
} }
EXPORT_SYMBOL(nand_scan_bbt);
...@@ -50,8 +50,8 @@ struct nand_flash_dev nand_flash_ids[] = { ...@@ -50,8 +50,8 @@ struct nand_flash_dev nand_flash_ids[] = {
SZ_16K, SZ_8K, SZ_4M, 0, 6, 1280, NAND_ECC_INFO(40, SZ_1K) }, SZ_16K, SZ_8K, SZ_4M, 0, 6, 1280, NAND_ECC_INFO(40, SZ_1K) },
{"H27UCG8T2ATR-BC 64G 3.3V 8-bit", {"H27UCG8T2ATR-BC 64G 3.3V 8-bit",
{ .id = {0xad, 0xde, 0x94, 0xda, 0x74, 0xc4} }, { .id = {0xad, 0xde, 0x94, 0xda, 0x74, 0xc4} },
SZ_8K, SZ_8K, SZ_2M, 0, 6, 640, NAND_ECC_INFO(40, SZ_1K), SZ_8K, SZ_8K, SZ_2M, NAND_NEED_SCRAMBLING, 6, 640,
4 }, NAND_ECC_INFO(40, SZ_1K), 4 },
LEGACY_ID_NAND("NAND 4MiB 5V 8-bit", 0x6B, 4, SZ_8K, SP_OPTIONS), LEGACY_ID_NAND("NAND 4MiB 5V 8-bit", 0x6B, 4, SZ_8K, SP_OPTIONS),
LEGACY_ID_NAND("NAND 4MiB 3,3V 8-bit", 0xE3, 4, SZ_8K, SP_OPTIONS), LEGACY_ID_NAND("NAND 4MiB 3,3V 8-bit", 0xE3, 4, SZ_8K, SP_OPTIONS),
......
...@@ -113,7 +113,7 @@ static int nuc900_check_rb(struct nuc900_nand *nand) ...@@ -113,7 +113,7 @@ static int nuc900_check_rb(struct nuc900_nand *nand)
{ {
unsigned int val; unsigned int val;
spin_lock(&nand->lock); spin_lock(&nand->lock);
val = __raw_readl(REG_SMISR); val = __raw_readl(nand->reg + REG_SMISR);
val &= READYBUSY; val &= READYBUSY;
spin_unlock(&nand->lock); spin_unlock(&nand->lock);
......
This diff is collapsed.
...@@ -179,7 +179,7 @@ static int onenand_isbad_bbt(struct mtd_info *mtd, loff_t offs, int allowbbt) ...@@ -179,7 +179,7 @@ static int onenand_isbad_bbt(struct mtd_info *mtd, loff_t offs, int allowbbt)
* by the onenand_release function. * by the onenand_release function.
* *
*/ */
int onenand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd) static int onenand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd)
{ {
struct onenand_chip *this = mtd->priv; struct onenand_chip *this = mtd->priv;
struct bbm_info *bbm = this->bbm; struct bbm_info *bbm = this->bbm;
...@@ -247,6 +247,3 @@ int onenand_default_bbt(struct mtd_info *mtd) ...@@ -247,6 +247,3 @@ int onenand_default_bbt(struct mtd_info *mtd)
return onenand_scan_bbt(mtd, bbm->badblock_pattern); return onenand_scan_bbt(mtd, bbm->badblock_pattern);
} }
EXPORT_SYMBOL(onenand_scan_bbt);
EXPORT_SYMBOL(onenand_default_bbt);
...@@ -371,8 +371,8 @@ static int mt8173_nor_write_reg(struct spi_nor *nor, u8 opcode, u8 *buf, ...@@ -371,8 +371,8 @@ static int mt8173_nor_write_reg(struct spi_nor *nor, u8 opcode, u8 *buf,
return ret; return ret;
} }
static int __init mtk_nor_init(struct mt8173_nor *mt8173_nor, static int mtk_nor_init(struct mt8173_nor *mt8173_nor,
struct device_node *flash_node) struct device_node *flash_node)
{ {
int ret; int ret;
struct spi_nor *nor; struct spi_nor *nor;
......
...@@ -166,7 +166,6 @@ struct bbm_info { ...@@ -166,7 +166,6 @@ struct bbm_info {
}; };
/* OneNAND BBT interface */ /* OneNAND BBT interface */
extern int onenand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd);
extern int onenand_default_bbt(struct mtd_info *mtd); extern int onenand_default_bbt(struct mtd_info *mtd);
#endif /* __LINUX_MTD_BBM_H */ #endif /* __LINUX_MTD_BBM_H */
...@@ -168,6 +168,12 @@ typedef enum { ...@@ -168,6 +168,12 @@ typedef enum {
/* Device supports subpage reads */ /* Device supports subpage reads */
#define NAND_SUBPAGE_READ 0x00001000 #define NAND_SUBPAGE_READ 0x00001000
/*
* Some MLC NANDs need data scrambling to limit bitflips caused by repeated
* patterns.
*/
#define NAND_NEED_SCRAMBLING 0x00002000
/* Options valid for Samsung large page devices */ /* Options valid for Samsung large page devices */
#define NAND_SAMSUNG_LP_OPTIONS NAND_CACHEPRG #define NAND_SAMSUNG_LP_OPTIONS NAND_CACHEPRG
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment