pinctrl: mcp23s08: spi: Fix regmap debugfs entries
authorJan Kundrát <jan.kundrat@cesnet.cz>
Thu, 25 Jan 2018 17:29:15 +0000 (18:29 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 30 May 2018 05:52:41 +0000 (07:52 +0200)
[ Upstream commit 9b3e4207661e67f04c72af15e29f74cd944f5964 ]

The SPI version of this chip allows several devices to be present on the
same SPI bus via a local address. If this is in action and if the kernel
has debugfs, however, the code attempts to create duplicate entries for
the regmap's debugfs:

  mcp23s08 spi1.1: Failed to create debugfs directory

This patch simply assigns a local name matching the device logical
address to the `struct regmap_config`.

No changes are needed for MCP23S18 because that device does not support
any logical addressing. Similarly, I2C devices do not need any action,
either, because they are already different in their I2C address.

A similar problem is present for the pinctrl debugfs instance, but that
one is not addressed by this patch.

Signed-off-by: Jan Kundrát <jan.kundrat@cesnet.cz>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/pinctrl/pinctrl-mcp23s08.c

index 447763a..db9cca4 100644 (file)
@@ -779,6 +779,7 @@ static int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev,
 {
        int status, ret;
        bool mirror = false;
+       struct regmap_config *one_regmap_config = NULL;
 
        mutex_init(&mcp->lock);
 
@@ -799,22 +800,36 @@ static int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev,
        switch (type) {
 #ifdef CONFIG_SPI_MASTER
        case MCP_TYPE_S08:
-               mcp->regmap = devm_regmap_init(dev, &mcp23sxx_spi_regmap, mcp,
-                                              &mcp23x08_regmap);
-               mcp->reg_shift = 0;
-               mcp->chip.ngpio = 8;
-               mcp->chip.label = "mcp23s08";
-               break;
-
        case MCP_TYPE_S17:
+               switch (type) {
+               case MCP_TYPE_S08:
+                       one_regmap_config =
+                               devm_kmemdup(dev, &mcp23x08_regmap,
+                                       sizeof(struct regmap_config), GFP_KERNEL);
+                       mcp->reg_shift = 0;
+                       mcp->chip.ngpio = 8;
+                       mcp->chip.label = "mcp23s08";
+                       break;
+               case MCP_TYPE_S17:
+                       one_regmap_config =
+                               devm_kmemdup(dev, &mcp23x17_regmap,
+                                       sizeof(struct regmap_config), GFP_KERNEL);
+                       mcp->reg_shift = 1;
+                       mcp->chip.ngpio = 16;
+                       mcp->chip.label = "mcp23s17";
+                       break;
+               }
+               if (!one_regmap_config)
+                       return -ENOMEM;
+
+               one_regmap_config->name = devm_kasprintf(dev, GFP_KERNEL, "%d", (addr & ~0x40) >> 1);
                mcp->regmap = devm_regmap_init(dev, &mcp23sxx_spi_regmap, mcp,
-                                              &mcp23x17_regmap);
-               mcp->reg_shift = 1;
-               mcp->chip.ngpio = 16;
-               mcp->chip.label = "mcp23s17";
+                                              one_regmap_config);
                break;
 
        case MCP_TYPE_S18:
+               if (!one_regmap_config)
+                       return -ENOMEM;
                mcp->regmap = devm_regmap_init(dev, &mcp23sxx_spi_regmap, mcp,
                                               &mcp23x17_regmap);
                mcp->reg_shift = 1;