]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
pinctrl: samsung: refactor drvdata suspend & resume callbacks
authorPeter Griffin <peter.griffin@linaro.org>
Wed, 2 Apr 2025 15:17:30 +0000 (16:17 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 19 Jun 2025 13:32:23 +0000 (15:32 +0200)
[ Upstream commit 3ade961e97f3b05dcdd9a4fabfe179c9e75571e0 ]

This enables the clk_enable() and clk_disable() logic to be removed
from each callback, but otherwise should have no functional impact.

It is a prepatory patch so that the callbacks can become SoC
specific.

Signed-off-by: Peter Griffin <peter.griffin@linaro.org>
Link: https://lore.kernel.org/r/20250402-pinctrl-fltcon-suspend-v6-1-78ce0d4eb30c@linaro.org
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Stable-dep-of: bdbe0a0f7100 ("pinctrl: samsung: add gs101 specific eint suspend/resume callbacks")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/pinctrl/samsung/pinctrl-exynos.c
drivers/pinctrl/samsung/pinctrl-exynos.h
drivers/pinctrl/samsung/pinctrl-samsung.c
drivers/pinctrl/samsung/pinctrl-samsung.h

index ac6dc22b37c98ed5b7fca3335764f19abb2f71cc..62c8d8d907545119c49a89d79b5dae63282467d5 100644 (file)
@@ -761,19 +761,11 @@ __init int exynos_eint_wkup_init(struct samsung_pinctrl_drv_data *d)
        return 0;
 }
 
-static void exynos_pinctrl_suspend_bank(
-                               struct samsung_pinctrl_drv_data *drvdata,
-                               struct samsung_pin_bank *bank)
+static void exynos_pinctrl_suspend_bank(struct samsung_pin_bank *bank)
 {
        struct exynos_eint_gpio_save *save = bank->soc_priv;
        const void __iomem *regs = bank->eint_base;
 
-       if (clk_enable(bank->drvdata->pclk)) {
-               dev_err(bank->gpio_chip.parent,
-                       "unable to enable clock for saving state\n");
-               return;
-       }
-
        save->eint_con = readl(regs + EXYNOS_GPIO_ECON_OFFSET
                                                + bank->eint_offset);
        save->eint_fltcon0 = readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET
@@ -783,71 +775,46 @@ static void exynos_pinctrl_suspend_bank(
        save->eint_mask = readl(regs + bank->irq_chip->eint_mask
                                                + bank->eint_offset);
 
-       clk_disable(bank->drvdata->pclk);
-
        pr_debug("%s: save     con %#010x\n", bank->name, save->eint_con);
        pr_debug("%s: save fltcon0 %#010x\n", bank->name, save->eint_fltcon0);
        pr_debug("%s: save fltcon1 %#010x\n", bank->name, save->eint_fltcon1);
        pr_debug("%s: save    mask %#010x\n", bank->name, save->eint_mask);
 }
 
-static void exynosauto_pinctrl_suspend_bank(struct samsung_pinctrl_drv_data *drvdata,
-                                           struct samsung_pin_bank *bank)
+static void exynosauto_pinctrl_suspend_bank(struct samsung_pin_bank *bank)
 {
        struct exynos_eint_gpio_save *save = bank->soc_priv;
        const void __iomem *regs = bank->eint_base;
 
-       if (clk_enable(bank->drvdata->pclk)) {
-               dev_err(bank->gpio_chip.parent,
-                       "unable to enable clock for saving state\n");
-               return;
-       }
-
        save->eint_con = readl(regs + bank->pctl_offset + bank->eint_con_offset);
        save->eint_mask = readl(regs + bank->pctl_offset + bank->eint_mask_offset);
 
-       clk_disable(bank->drvdata->pclk);
-
        pr_debug("%s: save     con %#010x\n", bank->name, save->eint_con);
        pr_debug("%s: save    mask %#010x\n", bank->name, save->eint_mask);
 }
 
-void exynos_pinctrl_suspend(struct samsung_pinctrl_drv_data *drvdata)
+void exynos_pinctrl_suspend(struct samsung_pin_bank *bank)
 {
-       struct samsung_pin_bank *bank = drvdata->pin_banks;
        struct exynos_irq_chip *irq_chip = NULL;
-       int i;
 
-       for (i = 0; i < drvdata->nr_banks; ++i, ++bank) {
-               if (bank->eint_type == EINT_TYPE_GPIO) {
-                       if (bank->eint_con_offset)
-                               exynosauto_pinctrl_suspend_bank(drvdata, bank);
-                       else
-                               exynos_pinctrl_suspend_bank(drvdata, bank);
-               }
-               else if (bank->eint_type == EINT_TYPE_WKUP) {
-                       if (!irq_chip) {
-                               irq_chip = bank->irq_chip;
-                               irq_chip->set_eint_wakeup_mask(drvdata,
-                                                              irq_chip);
-                       }
+       if (bank->eint_type == EINT_TYPE_GPIO) {
+               if (bank->eint_con_offset)
+                       exynosauto_pinctrl_suspend_bank(bank);
+               else
+                       exynos_pinctrl_suspend_bank(bank);
+       } else if (bank->eint_type == EINT_TYPE_WKUP) {
+               if (!irq_chip) {
+                       irq_chip = bank->irq_chip;
+                       irq_chip->set_eint_wakeup_mask(bank->drvdata, irq_chip);
                }
        }
 }
 
-static void exynos_pinctrl_resume_bank(
-                               struct samsung_pinctrl_drv_data *drvdata,
-                               struct samsung_pin_bank *bank)
+static void exynos_pinctrl_resume_bank(struct samsung_pin_bank *bank)
 {
        struct exynos_eint_gpio_save *save = bank->soc_priv;
        void __iomem *regs = bank->eint_base;
 
-       if (clk_enable(bank->drvdata->pclk)) {
-               dev_err(bank->gpio_chip.parent,
-                       "unable to enable clock for restoring state\n");
-               return;
-       }
-
        pr_debug("%s:     con %#010x => %#010x\n", bank->name,
                        readl(regs + EXYNOS_GPIO_ECON_OFFSET
                        + bank->eint_offset), save->eint_con);
@@ -869,22 +836,13 @@ static void exynos_pinctrl_resume_bank(
                                                + 2 * bank->eint_offset + 4);
        writel(save->eint_mask, regs + bank->irq_chip->eint_mask
                                                + bank->eint_offset);
-
-       clk_disable(bank->drvdata->pclk);
 }
 
-static void exynosauto_pinctrl_resume_bank(struct samsung_pinctrl_drv_data *drvdata,
-                                          struct samsung_pin_bank *bank)
+static void exynosauto_pinctrl_resume_bank(struct samsung_pin_bank *bank)
 {
        struct exynos_eint_gpio_save *save = bank->soc_priv;
        void __iomem *regs = bank->eint_base;
 
-       if (clk_enable(bank->drvdata->pclk)) {
-               dev_err(bank->gpio_chip.parent,
-                       "unable to enable clock for restoring state\n");
-               return;
-       }
-
        pr_debug("%s:     con %#010x => %#010x\n", bank->name,
                 readl(regs + bank->pctl_offset + bank->eint_con_offset), save->eint_con);
        pr_debug("%s:    mask %#010x => %#010x\n", bank->name,
@@ -893,21 +851,16 @@ static void exynosauto_pinctrl_resume_bank(struct samsung_pinctrl_drv_data *drvd
        writel(save->eint_con, regs + bank->pctl_offset + bank->eint_con_offset);
        writel(save->eint_mask, regs + bank->pctl_offset + bank->eint_mask_offset);
 
-       clk_disable(bank->drvdata->pclk);
 }
 
-void exynos_pinctrl_resume(struct samsung_pinctrl_drv_data *drvdata)
+void exynos_pinctrl_resume(struct samsung_pin_bank *bank)
 {
-       struct samsung_pin_bank *bank = drvdata->pin_banks;
-       int i;
-
-       for (i = 0; i < drvdata->nr_banks; ++i, ++bank)
-               if (bank->eint_type == EINT_TYPE_GPIO) {
-                       if (bank->eint_con_offset)
-                               exynosauto_pinctrl_resume_bank(drvdata, bank);
-                       else
-                               exynos_pinctrl_resume_bank(drvdata, bank);
-               }
+       if (bank->eint_type == EINT_TYPE_GPIO) {
+               if (bank->eint_con_offset)
+                       exynosauto_pinctrl_resume_bank(bank);
+               else
+                       exynos_pinctrl_resume_bank(bank);
+       }
 }
 
 static void exynos_retention_enable(struct samsung_pinctrl_drv_data *drvdata)
index 97a43fa4dfc5679173fb7802a01d3b4beeb9737f..ce39ab52102e7569695c324b9a4baa65ba25ddeb 100644 (file)
@@ -211,8 +211,8 @@ struct exynos_muxed_weint_data {
 
 int exynos_eint_gpio_init(struct samsung_pinctrl_drv_data *d);
 int exynos_eint_wkup_init(struct samsung_pinctrl_drv_data *d);
-void exynos_pinctrl_suspend(struct samsung_pinctrl_drv_data *drvdata);
-void exynos_pinctrl_resume(struct samsung_pinctrl_drv_data *drvdata);
+void exynos_pinctrl_suspend(struct samsung_pin_bank *bank);
+void exynos_pinctrl_resume(struct samsung_pin_bank *bank);
 struct samsung_retention_ctrl *
 exynos_retention_init(struct samsung_pinctrl_drv_data *drvdata,
                      const struct samsung_retention_data *data);
index 63ac89a802d301e43c9e89bdff2c596cae58b77c..210534586c0c0bf9745d7ccec5915eb22acb1879 100644 (file)
@@ -1333,6 +1333,7 @@ err_put_banks:
 static int __maybe_unused samsung_pinctrl_suspend(struct device *dev)
 {
        struct samsung_pinctrl_drv_data *drvdata = dev_get_drvdata(dev);
+       struct samsung_pin_bank *bank;
        int i;
 
        i = clk_enable(drvdata->pclk);
@@ -1343,7 +1344,7 @@ static int __maybe_unused samsung_pinctrl_suspend(struct device *dev)
        }
 
        for (i = 0; i < drvdata->nr_banks; i++) {
-               struct samsung_pin_bank *bank = &drvdata->pin_banks[i];
+               bank = &drvdata->pin_banks[i];
                const void __iomem *reg = bank->pctl_base + bank->pctl_offset;
                const u8 *offs = bank->type->reg_offset;
                const u8 *widths = bank->type->fld_width;
@@ -1371,10 +1372,14 @@ static int __maybe_unused samsung_pinctrl_suspend(struct device *dev)
                }
        }
 
+       for (i = 0; i < drvdata->nr_banks; i++) {
+               bank = &drvdata->pin_banks[i];
+               if (drvdata->suspend)
+                       drvdata->suspend(bank);
+       }
+
        clk_disable(drvdata->pclk);
 
-       if (drvdata->suspend)
-               drvdata->suspend(drvdata);
        if (drvdata->retention_ctrl && drvdata->retention_ctrl->enable)
                drvdata->retention_ctrl->enable(drvdata);
 
@@ -1392,6 +1397,7 @@ static int __maybe_unused samsung_pinctrl_suspend(struct device *dev)
 static int __maybe_unused samsung_pinctrl_resume(struct device *dev)
 {
        struct samsung_pinctrl_drv_data *drvdata = dev_get_drvdata(dev);
+       struct samsung_pin_bank *bank;
        int ret;
        int i;
 
@@ -1406,11 +1412,14 @@ static int __maybe_unused samsung_pinctrl_resume(struct device *dev)
                return ret;
        }
 
-       if (drvdata->resume)
-               drvdata->resume(drvdata);
+       for (i = 0; i < drvdata->nr_banks; i++) {
+               bank = &drvdata->pin_banks[i];
+               if (drvdata->resume)
+                       drvdata->resume(bank);
+       }
 
        for (i = 0; i < drvdata->nr_banks; i++) {
-               struct samsung_pin_bank *bank = &drvdata->pin_banks[i];
+               bank = &drvdata->pin_banks[i];
                void __iomem *reg = bank->pctl_base + bank->pctl_offset;
                const u8 *offs = bank->type->reg_offset;
                const u8 *widths = bank->type->fld_width;
index 14c3b6b965851e0c47d9889679a822cd2dec6351..7ffd2e193e4256dfde7bc4749f9d3d79d7e0d6d7 100644 (file)
@@ -285,8 +285,8 @@ struct samsung_pin_ctrl {
        int             (*eint_gpio_init)(struct samsung_pinctrl_drv_data *);
        int             (*eint_wkup_init)(struct samsung_pinctrl_drv_data *);
        void            (*pud_value_init)(struct samsung_pinctrl_drv_data *drvdata);
-       void            (*suspend)(struct samsung_pinctrl_drv_data *);
-       void            (*resume)(struct samsung_pinctrl_drv_data *);
+       void            (*suspend)(struct samsung_pin_bank *bank);
+       void            (*resume)(struct samsung_pin_bank *bank);
 };
 
 /**
@@ -335,8 +335,8 @@ struct samsung_pinctrl_drv_data {
 
        struct samsung_retention_ctrl   *retention_ctrl;
 
-       void (*suspend)(struct samsung_pinctrl_drv_data *);
-       void (*resume)(struct samsung_pinctrl_drv_data *);
+       void (*suspend)(struct samsung_pin_bank *bank);
+       void (*resume)(struct samsung_pin_bank *bank);
 };
 
 /**