mtd: m25p80: allow arbitrary OF matching for "jedec,spi-nor"

Linux-MTD Mailing List linux-mtd at lists.infradead.org
Tue Sep 1 14:59:02 PDT 2015


Gitweb:     http://git.infradead.org/?p=mtd-2.6.git;a=commit;h=43163022927b6e7d202a7e6f939c3f392465494d
Commit:     43163022927b6e7d202a7e6f939c3f392465494d
Parent:     d052e508a4069f0711ea68156f4b1565bf14c41c
Author:     Brian Norris <computersforpeace at gmail.com>
AuthorDate: Tue May 19 14:38:22 2015 -0700
Committer:  Brian Norris <computersforpeace at gmail.com>
CommitDate: Tue Jul 21 09:33:42 2015 -0700

    mtd: m25p80: allow arbitrary OF matching for "jedec,spi-nor"
    
    When we added the "jedec,spi-nor" compatible string for use in this
    driver, we added it as a modalias option. The modalias can be derived in
    different ways for platform devices vs. device tree (of_*) matching. But
    for device tree matching (the primary target of this identifier string),
    the modalias is determined from the first entry in the 'compatible'
    property. IOW, the following properties would bind to this driver:
    
    	// Option (a), modalias = "spi-nor"
    	compatible = "jedec,spi-nor";
    
    	// Option (b), modalias = "spi-nor"
    	compatible = "idontknowwhatimdoing,spi-nor";
    
    But the following would not:
    
    	// Option (c), modalias = "shinynewdevice"
    	compatible = "myvendor,shinynewdevice", "jedec,spi-nor";
    
    So, we'd like to match (a) and (c) (even when we don't have an explicit
    entry for "shinynewdevice"), and we'd rather not allow (b).
    
    To do this, we
      (1) always (for devices without specific platform data) pass the
          modalias to the spi-nor library;
      (2) rework the spi-nor library to not reject "bad" names, and
          instead just fall back to autodetection; and
      (3) add the .of_match_table to properly catch all "jedec,spi-nor".
    
    This allows (a) and (c) without warnings, and rejects (b).
    
    Signed-off-by: Brian Norris <computersforpeace at gmail.com>
---
 drivers/mtd/devices/m25p80.c  | 18 +++++++++++-------
 drivers/mtd/spi-nor/spi-nor.c |  8 ++++----
 2 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/drivers/mtd/devices/m25p80.c b/drivers/mtd/devices/m25p80.c
index d313f948b..9cd3631 100644
--- a/drivers/mtd/devices/m25p80.c
+++ b/drivers/mtd/devices/m25p80.c
@@ -223,8 +223,6 @@ static int m25p_probe(struct spi_device *spi)
 	 */
 	if (data && data->type)
 		flash_name = data->type;
-	else if (!strcmp(spi->modalias, "spi-nor"))
-		flash_name = NULL; /* auto-detect */
 	else
 		flash_name = spi->modalias;
 
@@ -289,19 +287,25 @@ static const struct spi_device_id m25p_ids[] = {
 	{"m25p40-nonjedec"},	{"m25p80-nonjedec"},	{"m25p16-nonjedec"},
 	{"m25p32-nonjedec"},	{"m25p64-nonjedec"},	{"m25p128-nonjedec"},
 
-	/*
-	 * Generic support for SPI NOR that can be identified by the JEDEC READ
-	 * ID opcode (0x9F). Use this, if possible.
-	 */
-	{"spi-nor"},
 	{ },
 };
 MODULE_DEVICE_TABLE(spi, m25p_ids);
 
+static const struct of_device_id m25p_of_table[] = {
+	/*
+	 * Generic compatibility for SPI NOR that can be identified by the
+	 * JEDEC READ ID opcode (0x9F). Use this, if possible.
+	 */
+	{ .compatible = "jedec,spi-nor" },
+	{}
+};
+MODULE_DEVICE_TABLE(of, m25p_of_table);
+
 static struct spi_driver m25p80_driver = {
 	.driver = {
 		.name	= "m25p80",
 		.owner	= THIS_MODULE,
+		.of_match_table = m25p_of_table,
 	},
 	.id_table	= m25p_ids,
 	.probe	= m25p_probe,
diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c
index b2e8c3b..47516d3 100644
--- a/drivers/mtd/spi-nor/spi-nor.c
+++ b/drivers/mtd/spi-nor/spi-nor.c
@@ -1015,11 +1015,11 @@ int spi_nor_scan(struct spi_nor *nor, const char *name, enum read_mode mode)
 	if (ret)
 		return ret;
 
-	/* Try to auto-detect if chip name wasn't specified */
-	if (!name)
-		id = spi_nor_read_id(nor);
-	else
+	if (name)
 		id = spi_nor_match_id(name);
+	/* Try to auto-detect if chip name wasn't specified or not found */
+	if (!id)
+		id = spi_nor_read_id(nor);
 	if (IS_ERR_OR_NULL(id))
 		return -ENOENT;
 



More information about the linux-mtd-cvs mailing list