lkml.org 
[lkml]   [2023]   [Sep]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFT PATCH 14/21] hte: tegra194: don't access struct gpio_chip
    Date
    From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>

    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>
    ---
    drivers/hte/hte-tegra194.c | 36 +++++++++++++++++++++++-------------
    1 file changed, 23 insertions(+), 13 deletions(-)

    diff --git a/drivers/hte/hte-tegra194.c b/drivers/hte/hte-tegra194.c
    index 9fd3c00ff695..d83ef30c9588 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,16 +679,18 @@ 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)
    -{
    - return !strcmp(chip->label, data);
    -}
    -
    static int tegra_gpiochip_match(struct gpio_chip *chip, void *data)
    {
    return chip->fwnode == of_node_to_fwnode(data);
    }

    +static void tegra_hte_put_gpio_device(void *data)
    +{
    + struct gpio_device *gdev = data;
    +
    + gpio_device_put(gdev);
    +}
    +
    static int tegra_hte_probe(struct platform_device *pdev)
    {
    int ret;
    @@ -763,8 +768,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 +780,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(gpio_ctrl,
    + tegra_gpiochip_match);
    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;
    --
    2.39.2
    \
     
     \ /
      Last update: 2023-09-05 21:06    [W:3.587 / U:0.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site