kernel: bump 5.4 to 5.4.48
[oweals/openwrt.git] / target / linux / bcm27xx / patches-5.4 / 950-0367-pinctrl-bcm2835-Change-init-order-for-gpio-hogs.patch
1 From 27cb8bf0442f677380a1df93b93b7589b7ce5243 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 | 40 ++++++++++++---------------
21  1 file changed, 17 insertions(+), 23 deletions(-)
22
23 --- a/drivers/pinctrl/bcm/pinctrl-bcm2835.c
24 +++ b/drivers/pinctrl/bcm/pinctrl-bcm2835.c
25 @@ -1135,9 +1135,25 @@ static int bcm2835_pinctrl_probe(struct
26                 raw_spin_lock_init(&pc->irq_lock[i]);
27         }
28  
29 +       match = of_match_node(bcm2835_pinctrl_match, pdev->dev.of_node);
30 +       if (match) {
31 +               bcm2835_pinctrl_desc.confops =
32 +                       (const struct pinconf_ops *)match->data;
33 +       }
34 +
35 +       pc->pctl_dev = devm_pinctrl_register(dev, &bcm2835_pinctrl_desc, pc);
36 +       if (IS_ERR(pc->pctl_dev))
37 +               return PTR_ERR(pc->pctl_dev);
38 +
39 +       pc->gpio_range = bcm2835_pinctrl_gpio_range;
40 +       pc->gpio_range.base = pc->gpio_chip.base;
41 +       pc->gpio_range.gc = &pc->gpio_chip;
42 +       pinctrl_add_gpio_range(pc->pctl_dev, &pc->gpio_range);
43 +
44         err = devm_gpiochip_add_data(dev, &pc->gpio_chip, pc);
45         if (err) {
46                 dev_err(dev, "could not add GPIO chip\n");
47 +               pinctrl_remove_gpio_range(pc->pctl_dev, &pc->gpio_range);
48                 return err;
49         }
50  
51 @@ -1145,6 +1161,7 @@ static int bcm2835_pinctrl_probe(struct
52                                    0, handle_level_irq, IRQ_TYPE_NONE);
53         if (err) {
54                 dev_info(dev, "could not add irqchip\n");
55 +               pinctrl_remove_gpio_range(pc->pctl_dev, &pc->gpio_range);
56                 return err;
57         }
58  
59 @@ -1167,29 +1184,6 @@ static int bcm2835_pinctrl_probe(struct
60                                              bcm2835_gpio_irq_handler);
61         }
62  
63 -       match = of_match_node(bcm2835_pinctrl_match, pdev->dev.of_node);
64 -       if (match) {
65 -               bcm2835_pinctrl_desc.confops =
66 -                       (const struct pinconf_ops *)match->data;
67 -       }
68 -
69 -       match = of_match_node(bcm2835_pinctrl_match, pdev->dev.of_node);
70 -       if (match) {
71 -               bcm2835_pinctrl_desc.confops =
72 -                       (const struct pinconf_ops *)match->data;
73 -       }
74 -
75 -       pc->pctl_dev = devm_pinctrl_register(dev, &bcm2835_pinctrl_desc, pc);
76 -       if (IS_ERR(pc->pctl_dev)) {
77 -               gpiochip_remove(&pc->gpio_chip);
78 -               return PTR_ERR(pc->pctl_dev);
79 -       }
80 -
81 -       pc->gpio_range = bcm2835_pinctrl_gpio_range;
82 -       pc->gpio_range.base = pc->gpio_chip.base;
83 -       pc->gpio_range.gc = &pc->gpio_chip;
84 -       pinctrl_add_gpio_range(pc->pctl_dev, &pc->gpio_range);
85 -
86         return 0;
87  }
88