]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
hte: tegra194: don't access struct gpio_chip
authorBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Fri, 13 Oct 2023 07:23:40 +0000 (09:23 +0200)
committerBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Wed, 18 Oct 2023 07:47:48 +0000 (09:47 +0200)
Using struct gpio_chip is not safe as it will disappear if the
underlying driver is unbound for any reason. Switch to using reference
counted struct gpio_device and its dedicated accessors.

Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Tested-by: Dipen Patel <dipenp@nvidia.com>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
[andy: used gpio_device_find_by_fwnode()]
Reviewed-by: Dipen Patel <dipenp@nvidia.com>
Link: https://lore.kernel.org/r/20231010151709.4104747-3-andriy.shevchenko@linux.intel.com
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
drivers/hte/hte-tegra194.c

index 6fe6897047acad38af79bb52c951dfdf77ac0b84..341a134cb7d0d6b85c4344cd33018516a3803c4e 100644 (file)
@@ -132,7 +132,7 @@ struct tegra_hte_soc {
        const struct tegra_hte_data *prov_data;
        struct tegra_hte_line_data *line_data;
        struct hte_chip *chip;
-       struct gpio_chip *c;
+       struct gpio_device *gdev;
        void __iomem *regs;
 };
 
@@ -418,7 +418,7 @@ static int tegra_hte_line_xlate(struct hte_chip *gc,
         * HTE/GTE namespace.
         */
        if (gs->prov_data->type == HTE_TEGRA_TYPE_GPIO && !args) {
-               line_id = desc->attr.line_id - gs->c->base;
+               line_id = desc->attr.line_id - gpio_device_get_base(gs->gdev);
                map = gs->prov_data->map;
                map_sz = gs->prov_data->map_sz;
        } else if (gs->prov_data->type == HTE_TEGRA_TYPE_GPIO && args) {
@@ -645,7 +645,7 @@ static bool tegra_hte_match_from_linedata(const struct hte_chip *chip,
        if (!hte_dev || (hte_dev->prov_data->type != HTE_TEGRA_TYPE_GPIO))
                return false;
 
-       return hte_dev->c == gpiod_to_chip(hdesc->attr.line_data);
+       return hte_dev->gdev == gpiod_to_gpio_device(hdesc->attr.line_data);
 }
 
 static const struct of_device_id tegra_hte_of_match[] = {
@@ -673,14 +673,11 @@ static void tegra_gte_disable(void *data)
        tegra_hte_writel(gs, HTE_TECTRL, 0);
 }
 
-static int tegra_get_gpiochip_from_name(struct gpio_chip *chip, void *data)
+static void tegra_hte_put_gpio_device(void *data)
 {
-       return !strcmp(chip->label, data);
-}
+       struct gpio_device *gdev = data;
 
-static int tegra_gpiochip_match(struct gpio_chip *chip, void *data)
-{
-       return chip->fwnode == of_node_to_fwnode(data);
+       gpio_device_put(gdev);
 }
 
 static int tegra_hte_probe(struct platform_device *pdev)
@@ -760,8 +757,8 @@ static int tegra_hte_probe(struct platform_device *pdev)
 
                if (of_device_is_compatible(dev->of_node,
                                            "nvidia,tegra194-gte-aon")) {
-                       hte_dev->c = gpiochip_find("tegra194-gpio-aon",
-                                               tegra_get_gpiochip_from_name);
+                       hte_dev->gdev =
+                               gpio_device_find_by_label("tegra194-gpio-aon");
                } else {
                        gpio_ctrl = of_parse_phandle(dev->of_node,
                                                     "nvidia,gpio-controller",
@@ -772,14 +769,19 @@ static int tegra_hte_probe(struct platform_device *pdev)
                                return -ENODEV;
                        }
 
-                       hte_dev->c = gpiochip_find(gpio_ctrl,
-                                                  tegra_gpiochip_match);
+                       hte_dev->gdev =
+                               gpio_device_find_by_fwnode(of_fwnode_handle(gpio_ctrl));
                        of_node_put(gpio_ctrl);
                }
 
-               if (!hte_dev->c)
+               if (!hte_dev->gdev)
                        return dev_err_probe(dev, -EPROBE_DEFER,
                                             "wait for gpio controller\n");
+
+               ret = devm_add_action_or_reset(dev, tegra_hte_put_gpio_device,
+                                              hte_dev->gdev);
+               if (ret)
+                       return ret;
        }
 
        hte_dev->chip = gc;