On 10/10/23 9:19 AM, Dipen Patel wrote: > On 10/10/23 8:17 AM, Andy Shevchenko wrote: >> From: Bartosz Golaszewski <bartosz.golaszewski@xxxxxxxxxx> >> >> 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@xxxxxxxxxx> >> Tested-by: Dipen Patel <dipenp@xxxxxxxxxx> >> Reviewed-by: Linus Walleij <linus.walleij@xxxxxxxxxx> >> [andy: used gpio_device_find_by_fwnode()] >> Signed-off-by: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx> >> --- >> drivers/hte/hte-tegra194.c | 33 +++++++++++++++++++-------------- >> 1 file changed, 19 insertions(+), 14 deletions(-) >> >> diff --git a/drivers/hte/hte-tegra194.c b/drivers/hte/hte-tegra194.c >> index 9fd3c00ff695..339ff5921ec8 100644 >> --- a/drivers/hte/hte-tegra194.c >> +++ b/drivers/hte/hte-tegra194.c >> @@ -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; >> }; >> >> @@ -421,7 +421,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) { >> @@ -643,12 +643,15 @@ static irqreturn_t tegra_hte_isr(int irq, void *dev_id) >> static bool tegra_hte_match_from_linedata(const struct hte_chip *chip, >> const struct hte_ts_desc *hdesc) >> { >> + struct gpio_device *gdev __free(gpio_device_put) = NULL; >> struct tegra_hte_soc *hte_dev = chip->data; >> >> 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); >> + gdev = gpiod_to_device(hdesc->attr.line_data); >> + >> + return hte_dev->gdev == gdev; >> } >> >> static const struct of_device_id tegra_hte_of_match[] = { >> @@ -676,14 +679,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) >> @@ -763,8 +763,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", >> @@ -775,14 +775,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_fnode_handle(gpio_ctrl)); I think there is typo for of_fnode*. Should it be of_fwnode*? >> 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; > > Looks good to me, I will wait for others to comment and will test out (2,3,4 > also) probably end of the day 11th Oct. >