lkml.org 
[lkml]   [2024]   [Feb]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 19/23] gpio: nomadik: grab optional reset control and deassert it at probe
    Fetch a reference to the optional shared reset control and deassert it
    if it exists.

    Optional because not all platforms that use this driver have a reset
    attached to the reset block. Shared because some platforms that use the
    reset (at least Mobileye EyeQ5) share the reset across banks.

    Do not keep a reference to the reset control as it is not needed
    afterwards; the driver does not handle suspend, does not use runtime PM
    and does not register a remove callback.

    The operation is done in nmk_gpio_populate_chip(). This function is
    called by either gpio-nomadik or pinctrl-nomadik, whoever comes first.
    This is here for historic reasons and could probably be removed now; it
    seems gpio-ranges enforces the ordering to be pinctrl-first. It is not
    the topic of the present patch however.

    Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com>
    ---
    drivers/gpio/gpio-nomadik.c | 15 +++++++++++++++
    1 file changed, 15 insertions(+)

    diff --git a/drivers/gpio/gpio-nomadik.c b/drivers/gpio/gpio-nomadik.c
    index 21bb6d6363fc..b623c093b54d 100644
    --- a/drivers/gpio/gpio-nomadik.c
    +++ b/drivers/gpio/gpio-nomadik.c
    @@ -513,12 +513,14 @@ struct nmk_gpio_chip *nmk_gpio_populate_chip(struct device_node *np,
    {
    struct nmk_gpio_chip *nmk_chip;
    struct platform_device *gpio_pdev;
    + struct reset_control *reset;
    struct gpio_chip *chip;
    struct resource *res;
    struct clk *clk;
    void __iomem *base;
    uintptr_t flags;
    u32 id, ngpio;
    + int ret;

    gpio_pdev = of_find_device_by_node(np);
    if (!gpio_pdev) {
    @@ -576,6 +578,19 @@ struct nmk_gpio_chip *nmk_gpio_populate_chip(struct device_node *np,
    clk_prepare(clk);
    nmk_chip->clk = clk;

    + reset = devm_reset_control_get_optional_shared(&gpio_pdev->dev, NULL);
    + if (IS_ERR(reset)) {
    + dev_err(&pdev->dev, "failed getting reset control: %ld\n",
    + PTR_ERR(reset));
    + return ERR_CAST(reset);
    + }
    +
    + ret = reset_control_deassert(reset);
    + if (ret) {
    + dev_err(&pdev->dev, "failed reset deassert: %d\n", ret);
    + return ERR_PTR(ret);
    + }
    +
    #ifdef CONFIG_PINCTRL_NOMADIK
    BUG_ON(nmk_chip->bank >= ARRAY_SIZE(nmk_gpio_chips));
    nmk_gpio_chips[id] = nmk_chip;
    --
    2.43.1


    \
     
     \ /
      Last update: 2024-05-27 15:02    [W:4.039 / U:0.196 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site