Revert "pinctrl: avoid unsafe code pattern in find_pinctrl()"
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Tue, 17 Oct 2023 14:18:06 +0000 (17:18 +0300)
committerLinus Walleij <linus.walleij@linaro.org>
Thu, 19 Oct 2023 08:12:48 +0000 (10:12 +0200)
The commit breaks MMC enumeration on the Intel Merrifield
plaform.

Before:
[   36.439057] mmc0: SDHCI controller on PCI [0000:00:01.0] using ADMA
[   36.450924] mmc2: SDHCI controller on PCI [0000:00:01.3] using ADMA
[   36.459355] mmc1: SDHCI controller on PCI [0000:00:01.2] using ADMA
[   36.706399] mmc0: new DDR MMC card at address 0001
[   37.058972] mmc2: new ultra high speed DDR50 SDIO card at address 0001
[   37.278977] mmcblk0: mmc0:0001 H4G1d 3.64 GiB
[   37.297300]  mmcblk0: p1 p2 p3 p4 p5 p6 p7 p8 p9 p10

After:
[   36.436704] mmc2: SDHCI controller on PCI [0000:00:01.3] using ADMA
[   36.436720] mmc1: SDHCI controller on PCI [0000:00:01.0] using ADMA
[   36.463685] mmc0: SDHCI controller on PCI [0000:00:01.2] using ADMA
[   36.720627] mmc1: new DDR MMC card at address 0001
[   37.068181] mmc2: new ultra high speed DDR50 SDIO card at address 0001
[   37.279998] mmcblk1: mmc1:0001 H4G1d 3.64 GiB
[   37.302670]  mmcblk1: p1 p2 p3 p4 p5 p6 p7 p8 p9 p10

This reverts commit c153a4edff6ab01370fcac8e46f9c89cca1060c2.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Link: https://lore.kernel.org/r/20231017141806.535191-1-andriy.shevchenko@linux.intel.com
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/core.c

index e2f7519..e9dc963 100644 (file)
@@ -1022,20 +1022,17 @@ static int add_setting(struct pinctrl *p, struct pinctrl_dev *pctldev,
 
 static struct pinctrl *find_pinctrl(struct device *dev)
 {
-       struct pinctrl *entry, *p = NULL;
+       struct pinctrl *p;
 
        mutex_lock(&pinctrl_list_mutex);
-
-       list_for_each_entry(entry, &pinctrl_list, node) {
-               if (entry->dev == dev) {
-                       p = entry;
-                       kref_get(&p->users);
-                       break;
+       list_for_each_entry(p, &pinctrl_list, node)
+               if (p->dev == dev) {
+                       mutex_unlock(&pinctrl_list_mutex);
+                       return p;
                }
-       }
 
        mutex_unlock(&pinctrl_list_mutex);
-       return p;
+       return NULL;
 }
 
 static void pinctrl_free(struct pinctrl *p, bool inlist);
@@ -1143,6 +1140,7 @@ struct pinctrl *pinctrl_get(struct device *dev)
        p = find_pinctrl(dev);
        if (p) {
                dev_dbg(dev, "obtain a copy of previously claimed pinctrl\n");
+               kref_get(&p->users);
                return p;
        }