OSDN Git Service

pinctrl: mcp23s08: spi: Fix duplicate pinctrl debugfs entries
authorJan Kundrát <jan.kundrat@cesnet.cz>
Fri, 26 Jan 2018 15:06:37 +0000 (16:06 +0100)
committerLinus Walleij <linus.walleij@linaro.org>
Mon, 12 Feb 2018 09:47:24 +0000 (10:47 +0100)
This is a bit more involved because the pinctrl core so far always
assumed that one device (with a unique dev_name) only contains a single
pinctrl thing. This is not true for the mcp23s08 driver for chips
connected over SPI. They have a "logical address" which means that
several chips can share one physical CS signal.

A downside of this patch are some possibly ugly names for the debugfs
entries, such as "spi1.1-mcp23xxx-pinctrl.2", etc.

Signed-off-by: Jan Kundrát <jan.kundrat@cesnet.cz>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/core.c
drivers/pinctrl/pinctrl-mcp23s08.c

index 2c0dbfc..d2b0329 100644 (file)
@@ -1866,9 +1866,23 @@ static struct dentry *debugfs_root;
 static void pinctrl_init_device_debugfs(struct pinctrl_dev *pctldev)
 {
        struct dentry *device_root;
+       const char *debugfs_name;
+
+       if (pctldev->desc->name &&
+                       strcmp(dev_name(pctldev->dev), pctldev->desc->name)) {
+               debugfs_name = devm_kasprintf(pctldev->dev, GFP_KERNEL,
+                               "%s-%s", dev_name(pctldev->dev),
+                               pctldev->desc->name);
+               if (!debugfs_name) {
+                       pr_warn("failed to determine debugfs dir name for %s\n",
+                               dev_name(pctldev->dev));
+                       return;
+               }
+       } else {
+               debugfs_name = dev_name(pctldev->dev);
+       }
 
-       device_root = debugfs_create_dir(dev_name(pctldev->dev),
-                                        debugfs_root);
+       device_root = debugfs_create_dir(debugfs_name, debugfs_root);
        pctldev->device_root = device_root;
 
        if (IS_ERR(device_root) || !device_root) {
index ab2d939..f3f9f19 100644 (file)
@@ -918,7 +918,14 @@ static int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev,
        if (ret < 0)
                goto fail;
 
-       mcp->pinctrl_desc.name = "mcp23xxx-pinctrl";
+       if (one_regmap_config) {
+               mcp->pinctrl_desc.name = devm_kasprintf(dev, GFP_KERNEL,
+                               "mcp23xxx-pinctrl.%d", raw_chip_address);
+               if (!mcp->pinctrl_desc.name)
+                       return -ENOMEM;
+       } else {
+               mcp->pinctrl_desc.name = "mcp23xxx-pinctrl";
+       }
        mcp->pinctrl_desc.pctlops = &mcp_pinctrl_ops;
        mcp->pinctrl_desc.confops = &mcp_pinconf_ops;
        mcp->pinctrl_desc.npins = mcp->chip.ngpio;