mtd: nand: denali: introduce capability flag

Linux-MTD Mailing List linux-mtd at lists.infradead.org
Wed May 10 19:59:09 PDT 2017


Gitweb:     http://git.infradead.org/?p=mtd-2.6.git;a=commit;h=be72a4aa8ec1c13a55708bd0285106a5020ff72f
Commit:     be72a4aa8ec1c13a55708bd0285106a5020ff72f
Parent:     1aded58a27f253f399dcd5746417e684c92ccd7d
Author:     Masahiro Yamada <yamada.masahiro at socionext.com>
AuthorDate: Thu Mar 23 05:07:07 2017 +0900
Committer:  Boris Brezillon <boris.brezillon at free-electrons.com>
CommitDate: Fri Mar 24 09:51:38 2017 +0100

    mtd: nand: denali: introduce capability flag
    
    The Denali NAND controller IP has various customizable features.
    SoC vendors can choose desired functions when a delivery RTL is
    created.  It means there are several variants for this IP.  For
    example, the Intel version is equipped with 32bit DMA, whereas the
    IP for UniPhier SoC family with 64bit DMA.
    
    This driver was originally written for some Intel platforms with
    Intel specific things hard-coded.  What is worse, the revision
    register of this IP does not work to distinguish such features.
    We need to do something to make the driver available for other SoCs.
    
    Let's introduce a caps member to the denali_nand_info structure to
    switch on/off various features.  Also, add struct denali_dt_data to
    store the capability associated with compatible string.
    
    Boris suggested this approach in discussion [1] instead of a new DT
    property for every feature.
    
    [1] https://lkml.org/lkml/2016/3/29/142
    
    Signed-off-by: Masahiro Yamada <yamada.masahiro at socionext.com>
    Signed-off-by: Boris Brezillon <boris.brezillon at free-electrons.com>
---
 drivers/mtd/nand/denali.h    |  1 +
 drivers/mtd/nand/denali_dt.c | 18 +++++++++---------
 2 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/drivers/mtd/nand/denali.h b/drivers/mtd/nand/denali.h
index 8df2285..eed001d 100644
--- a/drivers/mtd/nand/denali.h
+++ b/drivers/mtd/nand/denali.h
@@ -338,6 +338,7 @@ struct denali_nand_info {
 	uint32_t devnum;	/* represent how many nands connected */
 	uint32_t bbtskipbytes;
 	uint32_t max_banks;
+	unsigned int caps;
 };
 
 extern int denali_init(struct denali_nand_info *denali);
diff --git a/drivers/mtd/nand/denali_dt.c b/drivers/mtd/nand/denali_dt.c
index 5607fcd..293ddb8 100644
--- a/drivers/mtd/nand/denali_dt.c
+++ b/drivers/mtd/nand/denali_dt.c
@@ -29,6 +29,10 @@ struct denali_dt {
 	struct clk		*clk;
 };
 
+struct denali_dt_data {
+	unsigned int caps;
+};
+
 static const struct of_device_id denali_nand_dt_ids[] = {
 		{ .compatible = "denali,denali-nand-dt" },
 		{ /* sentinel */ }
@@ -42,23 +46,19 @@ static int denali_dt_probe(struct platform_device *ofdev)
 {
 	struct resource *denali_reg, *nand_data;
 	struct denali_dt *dt;
+	const struct denali_dt_data *data;
 	struct denali_nand_info *denali;
 	int ret;
-	const struct of_device_id *of_id;
-
-	of_id = of_match_device(denali_nand_dt_ids, &ofdev->dev);
-	if (of_id) {
-		ofdev->id_entry = of_id->data;
-	} else {
-		pr_err("Failed to find the right device id.\n");
-		return -ENOMEM;
-	}
 
 	dt = devm_kzalloc(&ofdev->dev, sizeof(*dt), GFP_KERNEL);
 	if (!dt)
 		return -ENOMEM;
 	denali = &dt->denali;
 
+	data = of_device_get_match_data(&ofdev->dev);
+	if (data)
+		denali->caps = data->caps;
+
 	denali->platform = DT;
 	denali->dev = &ofdev->dev;
 	denali->irq = platform_get_irq(ofdev, 0);



More information about the linux-mtd-cvs mailing list