]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
pinctrl: nomadik: Add check for clk_enable()
authorMingwei Zheng <zmw12306@gmail.com>
Fri, 6 Dec 2024 22:16:18 +0000 (17:16 -0500)
committerLinus Walleij <linus.walleij@linaro.org>
Tue, 17 Dec 2024 14:06:05 +0000 (15:06 +0100)
Add check for the return value of clk_enable() to catch the potential
error.
Disable success clks in the error handling.
Change return type of nmk_gpio_glitch_slpm_init casade.

Fixes: 3a19805920f1 ("pinctrl: nomadik: move all Nomadik drivers to subdir")
Signed-off-by: Mingwei Zheng <zmw12306@gmail.com>
Signed-off-by: Jiasheng Jiang <jiashengjiangcool@gmail.com>
Link: https://lore.kernel.org/20241206221618.3453159-1-zmw12306@gmail.com
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/nomadik/pinctrl-nomadik.c

index f4f10c60c1d23b9092606c1e9c43d6b5e092985e..dcc662be080004c87141938a7f2d27b20d46f28a 100644 (file)
@@ -438,9 +438,9 @@ static void nmk_prcm_altcx_set_mode(struct nmk_pinctrl *npct,
  *  - Any spurious wake up event during switch sequence to be ignored and
  *    cleared
  */
-static void nmk_gpio_glitch_slpm_init(unsigned int *slpm)
+static int nmk_gpio_glitch_slpm_init(unsigned int *slpm)
 {
-       int i;
+       int i, j, ret;
 
        for (i = 0; i < NMK_MAX_BANKS; i++) {
                struct nmk_gpio_chip *chip = nmk_gpio_chips[i];
@@ -449,11 +449,21 @@ static void nmk_gpio_glitch_slpm_init(unsigned int *slpm)
                if (!chip)
                        break;
 
-               clk_enable(chip->clk);
+               ret = clk_enable(chip->clk);
+               if (ret) {
+                       for (j = 0; j < i; j++) {
+                               chip = nmk_gpio_chips[j];
+                               clk_disable(chip->clk);
+                       }
+
+                       return ret;
+               }
 
                slpm[i] = readl(chip->addr + NMK_GPIO_SLPC);
                writel(temp, chip->addr + NMK_GPIO_SLPC);
        }
+
+       return 0;
 }
 
 static void nmk_gpio_glitch_slpm_restore(unsigned int *slpm)
@@ -923,7 +933,9 @@ static int nmk_pmx_set(struct pinctrl_dev *pctldev, unsigned int function,
 
                        slpm[nmk_chip->bank] &= ~BIT(bit);
                }
-               nmk_gpio_glitch_slpm_init(slpm);
+               ret = nmk_gpio_glitch_slpm_init(slpm);
+               if (ret)
+                       goto out_pre_slpm_init;
        }
 
        for (i = 0; i < g->grp.npins; i++) {
@@ -940,7 +952,10 @@ static int nmk_pmx_set(struct pinctrl_dev *pctldev, unsigned int function,
                dev_dbg(npct->dev, "setting pin %d to altsetting %d\n",
                        g->grp.pins[i], g->altsetting);
 
-               clk_enable(nmk_chip->clk);
+               ret = clk_enable(nmk_chip->clk);
+               if (ret)
+                       goto out_glitch;
+
                /*
                 * If the pin is switching to altfunc, and there was an
                 * interrupt installed on it which has been lazy disabled,
@@ -988,6 +1003,7 @@ static int nmk_gpio_request_enable(struct pinctrl_dev *pctldev,
        struct nmk_gpio_chip *nmk_chip;
        struct gpio_chip *chip;
        unsigned int bit;
+       int ret;
 
        if (!range) {
                dev_err(npct->dev, "invalid range\n");
@@ -1004,7 +1020,9 @@ static int nmk_gpio_request_enable(struct pinctrl_dev *pctldev,
 
        find_nmk_gpio_from_pin(pin, &bit);
 
-       clk_enable(nmk_chip->clk);
+       ret = clk_enable(nmk_chip->clk);
+       if (ret)
+               return ret;
        /* There is no glitch when converting any pin to GPIO */
        __nmk_gpio_set_mode(nmk_chip, bit, NMK_GPIO_ALT_GPIO);
        clk_disable(nmk_chip->clk);
@@ -1058,6 +1076,7 @@ static int nmk_pin_config_set(struct pinctrl_dev *pctldev, unsigned int pin,
        unsigned long cfg;
        int pull, slpm, output, val, i;
        bool lowemi, gpiomode, sleep;
+       int ret;
 
        nmk_chip = find_nmk_gpio_from_pin(pin, &bit);
        if (!nmk_chip) {
@@ -1116,7 +1135,9 @@ static int nmk_pin_config_set(struct pinctrl_dev *pctldev, unsigned int pin,
                        output ? (val ? "high" : "low") : "",
                        lowemi ? "on" : "off");
 
-               clk_enable(nmk_chip->clk);
+               ret = clk_enable(nmk_chip->clk);
+               if (ret)
+                       return ret;
                if (gpiomode)
                        /* No glitch when going to GPIO mode */
                        __nmk_gpio_set_mode(nmk_chip, bit, NMK_GPIO_ALT_GPIO);