pinctrl: nomadik: Add check for clk_enable()
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: 3a19805920 ("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>
pull/1134/head
parent
efe479ccc4
commit
5c4bfbb21d
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue