kernel: bump 5.4 to 5.4.169
[openwrt/staging/jow.git] / target / linux / bcm27xx / patches-5.10 / 950-0186-pinctrl-bcm2835-Change-init-order-for-gpio-hogs.patch
1 From 069990e0b524a7acdcfef0505913ee20401fec5a Mon Sep 17 00:00:00 2001
2 From: Phil Elwell <phil@raspberrypi.org>
3 Date: Mon, 6 Jan 2020 14:05:42 +0000
4 Subject: [PATCH] pinctrl: bcm2835: Change init order for gpio hogs
5
6 pinctrl-bcm2835 is a combined pinctrl/gpio driver. Currently the gpio
7 side is registered first, but this breaks gpio hogs (which are
8 configured during gpiochip_add_data). Part of the hog initialisation
9 is a call to pinctrl_gpio_request, and since the pinctrl driver hasn't
10 yet been registered this results in an -EPROBE_DEFER from which it can
11 never recover.
12
13 Change the initialisation sequence to register the pinctrl driver
14 first.
15
16 See: https://www.raspberrypi.org/forums/viewtopic.php?f=107&t=260600
17
18 Signed-off-by: Phil Elwell <phil@raspberrypi.org>
19 ---
20 drivers/pinctrl/bcm/pinctrl-bcm2835.c | 29 +++++++++++++++------------
21 1 file changed, 16 insertions(+), 13 deletions(-)
22
23 --- a/drivers/pinctrl/bcm/pinctrl-bcm2835.c
24 +++ b/drivers/pinctrl/bcm/pinctrl-bcm2835.c
25 @@ -1244,6 +1244,18 @@ static int bcm2835_pinctrl_probe(struct
26 raw_spin_lock_init(&pc->irq_lock[i]);
27 }
28
29 + pc->pctl_desc = *pdata->pctl_desc;
30 + pc->pctl_dev = devm_pinctrl_register(dev, &pc->pctl_desc, pc);
31 + if (IS_ERR(pc->pctl_dev)) {
32 + gpiochip_remove(&pc->gpio_chip);
33 + return PTR_ERR(pc->pctl_dev);
34 + }
35 +
36 + pc->gpio_range = *pdata->gpio_range;
37 + pc->gpio_range.base = pc->gpio_chip.base;
38 + pc->gpio_range.gc = &pc->gpio_chip;
39 + pinctrl_add_gpio_range(pc->pctl_dev, &pc->gpio_range);
40 +
41 girq = &pc->gpio_chip.irq;
42 girq->chip = &bcm2835_gpio_irq_chip;
43 girq->parent_handler = bcm2835_gpio_irq_handler;
44 @@ -1251,8 +1263,10 @@ static int bcm2835_pinctrl_probe(struct
45 girq->parents = devm_kcalloc(dev, BCM2835_NUM_IRQS,
46 sizeof(*girq->parents),
47 GFP_KERNEL);
48 - if (!girq->parents)
49 + if (!girq->parents) {
50 + pinctrl_remove_gpio_range(pc->pctl_dev, &pc->gpio_range);
51 return -ENOMEM;
52 + }
53
54 if (is_7211) {
55 pc->wake_irq = devm_kcalloc(dev, BCM2835_NUM_IRQS,
56 @@ -1303,21 +1317,10 @@ static int bcm2835_pinctrl_probe(struct
57 err = devm_gpiochip_add_data(dev, &pc->gpio_chip, pc);
58 if (err) {
59 dev_err(dev, "could not add GPIO chip\n");
60 + pinctrl_remove_gpio_range(pc->pctl_dev, &pc->gpio_range);
61 return err;
62 }
63
64 - pc->pctl_desc = *pdata->pctl_desc;
65 - pc->pctl_dev = devm_pinctrl_register(dev, &pc->pctl_desc, pc);
66 - if (IS_ERR(pc->pctl_dev)) {
67 - gpiochip_remove(&pc->gpio_chip);
68 - return PTR_ERR(pc->pctl_dev);
69 - }
70 -
71 - pc->gpio_range = *pdata->gpio_range;
72 - pc->gpio_range.base = pc->gpio_chip.base;
73 - pc->gpio_range.gc = &pc->gpio_chip;
74 - pinctrl_add_gpio_range(pc->pctl_dev, &pc->gpio_range);
75 -
76 return 0;
77 }
78