summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Hesselbarth <sebastian.hesselbarth@gmail.com>2015-11-20 20:36:06 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2015-11-23 08:17:24 +0100
commit4647cb15e9a59a4ec91ee7c13df2b9ecf8a11f99 (patch)
treeb243c59d0833c041171147a7092cee8963e545ad
parentfa8ece6674e1e84da3e1743b38a156d1973076ae (diff)
downloadbarebox-4647cb15e9a59a4ec91ee7c13df2b9ecf8a11f99.tar.gz
barebox-4647cb15e9a59a4ec91ee7c13df2b9ecf8a11f99.tar.xz
mtd: nand_mrvl_nfc: Add hwflags to distinguish different HW versions
Marvell PXA3xx NAND flash controller IP has been reused in later SoCs with additional HW features. Add HW BCH ECC as the first known HW difference. Signed-off-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> Tested-by: Robert Jarzmik <robert.jarzmik@free.fr> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r--drivers/mtd/nand/nand_mrvl_nfc.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/drivers/mtd/nand/nand_mrvl_nfc.c b/drivers/mtd/nand/nand_mrvl_nfc.c
index c88a91af7a..25b723276e 100644
--- a/drivers/mtd/nand/nand_mrvl_nfc.c
+++ b/drivers/mtd/nand/nand_mrvl_nfc.c
@@ -129,6 +129,10 @@
#define nand_readsl(host, off, buf, nbbytes) \
readsl((host)->mmio_base + (off), buf, nbbytes)
+struct mrvl_nand_variant {
+ unsigned int hwflags;
+};
+
struct mrvl_nand_host {
struct mtd_info mtd;
struct nand_chip chip;
@@ -142,6 +146,8 @@ struct mrvl_nand_host {
size_t read_id_bytes;
void __iomem *mmio_base;
+ unsigned int hwflags;
+#define HWFLAGS_ECC_BCH BIT(0)
unsigned int buf_start;
unsigned int buf_count;
@@ -235,9 +241,14 @@ static struct nand_ecclayout ecc_layout_2KB_hwecc = {
#define mtd_info_to_host(mtd) ((struct mrvl_nand_host *) \
(((struct nand_chip *)((mtd)->priv))->priv))
+static const struct mrvl_nand_variant pxa3xx_variant = {
+ .hwflags = 0,
+};
+
static struct of_device_id mrvl_nand_dt_ids[] = {
{
.compatible = "marvell,pxa3xx-nand",
+ .data = &pxa3xx_variant,
},
{}
};
@@ -1009,10 +1020,17 @@ static struct mrvl_nand_host *alloc_nand_resource(struct device_d *dev)
static int mrvl_nand_probe_dt(struct mrvl_nand_host *host)
{
struct device_node *np = host->dev->device_node;
+ const struct of_device_id *match;
+ const struct mrvl_nand_variant *variant;
if (!IS_ENABLED(CONFIG_OFTREE) || host->dev->platform_data)
return 0;
+ match = of_match_node(mrvl_nand_dt_ids, np);
+ if (!match)
+ return -EINVAL;
+ variant = match->data;
+
if (of_get_property(np, "marvell,nand-keep-config", NULL))
host->keep_config = 1;
of_property_read_u32(np, "num-cs", &host->num_cs);
@@ -1027,6 +1045,8 @@ static int mrvl_nand_probe_dt(struct mrvl_nand_host *host)
if (host->ecc_step < 0)
host->ecc_step = 0;
+ host->hwflags = variant->hwflags;
+
return 0;
}