if (!value)
                offset += STM32_GPIO_PINS_PER_BANK;
 
-       clk_enable(bank->clk);
-
        writel_relaxed(BIT(offset), bank->base + STM32_GPIO_BSRR);
-
-       clk_disable(bank->clk);
 }
 
 static int stm32_gpio_request(struct gpio_chip *chip, unsigned offset)
        pinctrl_gpio_free(chip->base + offset);
 }
 
-static int stm32_gpio_get_noclk(struct gpio_chip *chip, unsigned int offset)
-{
-       struct stm32_gpio_bank *bank = gpiochip_get_data(chip);
-
-       return !!(readl_relaxed(bank->base + STM32_GPIO_IDR) & BIT(offset));
-}
-
 static int stm32_gpio_get(struct gpio_chip *chip, unsigned offset)
 {
        struct stm32_gpio_bank *bank = gpiochip_get_data(chip);
-       int ret;
 
-       clk_enable(bank->clk);
-
-       ret = stm32_gpio_get_noclk(chip, offset);
-
-       clk_disable(bank->clk);
-
-       return ret;
+       return !!(readl_relaxed(bank->base + STM32_GPIO_IDR) & BIT(offset));
 }
 
 static void stm32_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
                return;
 
        /* If level interrupt type then retrig */
-       level = stm32_gpio_get_noclk(&bank->gpio_chip, d->hwirq);
+       level = stm32_gpio_get(&bank->gpio_chip, d->hwirq);
        if ((level == 0 && bank->irq_type[d->hwirq] == IRQ_TYPE_LEVEL_LOW) ||
            (level == 1 && bank->irq_type[d->hwirq] == IRQ_TYPE_LEVEL_HIGH))
                irq_chip_retrigger_hierarchy(d);
 {
        struct stm32_gpio_bank *bank = irq_data->domain->host_data;
        struct stm32_pinctrl *pctl = dev_get_drvdata(bank->gpio_chip.parent);
-       unsigned long flags;
        int ret;
 
        ret = stm32_gpio_direction_input(&bank->gpio_chip, irq_data->hwirq);
                return ret;
        }
 
-       flags = irqd_get_trigger_type(irq_data);
-       if (flags & IRQ_TYPE_LEVEL_MASK)
-               clk_enable(bank->clk);
-
        return 0;
 }
 
 {
        struct stm32_gpio_bank *bank = irq_data->domain->host_data;
 
-       if (bank->irq_type[irq_data->hwirq] & IRQ_TYPE_LEVEL_MASK)
-               clk_disable(bank->clk);
-
        gpiochip_unlock_as_irq(&bank->gpio_chip, irq_data->hwirq);
 }
 
        unsigned long flags;
        int err = 0;
 
-       clk_enable(bank->clk);
        spin_lock_irqsave(&bank->lock, flags);
 
        if (pctl->hwlock) {
 
 unlock:
        spin_unlock_irqrestore(&bank->lock, flags);
-       clk_disable(bank->clk);
 
        return err;
 }
        int alt_offset = STM32_GPIO_AFRL + (pin / 8) * 4;
        unsigned long flags;
 
-       clk_enable(bank->clk);
        spin_lock_irqsave(&bank->lock, flags);
 
        val = readl_relaxed(bank->base + alt_offset);
        *mode = val >> (pin * 2);
 
        spin_unlock_irqrestore(&bank->lock, flags);
-       clk_disable(bank->clk);
 }
 
 static int stm32_pmx_set_mux(struct pinctrl_dev *pctldev,
        u32 val;
        int err = 0;
 
-       clk_enable(bank->clk);
        spin_lock_irqsave(&bank->lock, flags);
 
        if (pctl->hwlock) {
 
 unlock:
        spin_unlock_irqrestore(&bank->lock, flags);
-       clk_disable(bank->clk);
 
        return err;
 }
        unsigned long flags;
        u32 val;
 
-       clk_enable(bank->clk);
        spin_lock_irqsave(&bank->lock, flags);
 
        val = readl_relaxed(bank->base + STM32_GPIO_TYPER);
        val &= BIT(offset);
 
        spin_unlock_irqrestore(&bank->lock, flags);
-       clk_disable(bank->clk);
 
        return (val >> offset);
 }
        u32 val;
        int err = 0;
 
-       clk_enable(bank->clk);
        spin_lock_irqsave(&bank->lock, flags);
 
        if (pctl->hwlock) {
 
 unlock:
        spin_unlock_irqrestore(&bank->lock, flags);
-       clk_disable(bank->clk);
 
        return err;
 }
        unsigned long flags;
        u32 val;
 
-       clk_enable(bank->clk);
        spin_lock_irqsave(&bank->lock, flags);
 
        val = readl_relaxed(bank->base + STM32_GPIO_SPEEDR);
        val &= GENMASK(offset * 2 + 1, offset * 2);
 
        spin_unlock_irqrestore(&bank->lock, flags);
-       clk_disable(bank->clk);
 
        return (val >> (offset * 2));
 }
        u32 val;
        int err = 0;
 
-       clk_enable(bank->clk);
        spin_lock_irqsave(&bank->lock, flags);
 
        if (pctl->hwlock) {
 
 unlock:
        spin_unlock_irqrestore(&bank->lock, flags);
-       clk_disable(bank->clk);
 
        return err;
 }
        unsigned long flags;
        u32 val;
 
-       clk_enable(bank->clk);
        spin_lock_irqsave(&bank->lock, flags);
 
        val = readl_relaxed(bank->base + STM32_GPIO_PUPDR);
        val &= GENMASK(offset * 2 + 1, offset * 2);
 
        spin_unlock_irqrestore(&bank->lock, flags);
-       clk_disable(bank->clk);
 
        return (val >> (offset * 2));
 }
        unsigned long flags;
        u32 val;
 
-       clk_enable(bank->clk);
        spin_lock_irqsave(&bank->lock, flags);
 
        if (dir)
                         BIT(offset));
 
        spin_unlock_irqrestore(&bank->lock, flags);
-       clk_disable(bank->clk);
 
        return val;
 }
        if (IS_ERR(bank->base))
                return PTR_ERR(bank->base);
 
-       err = clk_prepare(bank->clk);
+       err = clk_prepare_enable(bank->clk);
        if (err) {
-               dev_err(dev, "failed to prepare clk (%d)\n", err);
+               dev_err(dev, "failed to prepare_enable clk (%d)\n", err);
                return err;
        }
 
                                        STM32_GPIO_IRQ_LINE, bank->fwnode,
                                        &stm32_gpio_domain_ops, bank);
 
-       if (!bank->domain)
-               return -ENODEV;
+       if (!bank->domain) {
+               err = -ENODEV;
+               goto err_clk;
+       }
 
        err = gpiochip_add_data(&bank->gpio_chip, bank);
        if (err) {
                dev_err(dev, "Failed to add gpiochip(%d)!\n", bank_nr);
-               return err;
+               goto err_clk;
        }
 
        dev_info(dev, "%s bank added\n", bank->gpio_chip.label);
        return 0;
+
+err_clk:
+       clk_disable_unprepare(bank->clk);
+       return err;
 }
 
 static struct irq_domain *stm32_pctrl_get_irq_domain(struct device_node *np)
                        ret = stm32_gpiolib_register_bank(pctl, child);
                        if (ret) {
                                of_node_put(child);
+
+                               for (i = 0; i < pctl->nbanks; i++)
+                                       clk_disable_unprepare(pctl->banks[i].clk);
+
                                return ret;
                        }
 
        return 0;
 }
 
+int __maybe_unused stm32_pinctrl_suspend(struct device *dev)
+{
+       struct stm32_pinctrl *pctl = dev_get_drvdata(dev);
+       int i;
+
+       for (i = 0; i < pctl->nbanks; i++)
+               clk_disable(pctl->banks[i].clk);
+
+       return 0;
+}
+
 int __maybe_unused stm32_pinctrl_resume(struct device *dev)
 {
        struct stm32_pinctrl *pctl = dev_get_drvdata(dev);
        struct stm32_pinctrl_group *g = pctl->groups;
        int i;
 
+       for (i = 0; i < pctl->nbanks; i++)
+               clk_enable(pctl->banks[i].clk);
+
        for (i = 0; i < pctl->ngroups; i++, g++)
                stm32_pinctrl_restore_gpio_regs(pctl, g->pin);