Skip to content

Commit 62140a1

Browse files
andy-shevlinusw
authored andcommitted
Revert "pinctrl: avoid unsafe code pattern in find_pinctrl()"
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 c153a4e. Signed-off-by: Andy Shevchenko <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Linus Walleij <[email protected]>
1 parent c8befdc commit 62140a1

File tree

1 file changed

+7
-9
lines changed

1 file changed

+7
-9
lines changed

drivers/pinctrl/core.c

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1022,20 +1022,17 @@ static int add_setting(struct pinctrl *p, struct pinctrl_dev *pctldev,
10221022

10231023
static struct pinctrl *find_pinctrl(struct device *dev)
10241024
{
1025-
struct pinctrl *entry, *p = NULL;
1025+
struct pinctrl *p;
10261026

10271027
mutex_lock(&pinctrl_list_mutex);
1028-
1029-
list_for_each_entry(entry, &pinctrl_list, node) {
1030-
if (entry->dev == dev) {
1031-
p = entry;
1032-
kref_get(&p->users);
1033-
break;
1028+
list_for_each_entry(p, &pinctrl_list, node)
1029+
if (p->dev == dev) {
1030+
mutex_unlock(&pinctrl_list_mutex);
1031+
return p;
10341032
}
1035-
}
10361033

10371034
mutex_unlock(&pinctrl_list_mutex);
1038-
return p;
1035+
return NULL;
10391036
}
10401037

10411038
static void pinctrl_free(struct pinctrl *p, bool inlist);
@@ -1143,6 +1140,7 @@ struct pinctrl *pinctrl_get(struct device *dev)
11431140
p = find_pinctrl(dev);
11441141
if (p) {
11451142
dev_dbg(dev, "obtain a copy of previously claimed pinctrl\n");
1143+
kref_get(&p->users);
11461144
return p;
11471145
}
11481146

0 commit comments

Comments
 (0)