]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
pinctrl: stm32: Simplify handling of backup pin status
authorAntonio Borneo <antonio.borneo@foss.st.com>
Thu, 23 Oct 2025 13:26:54 +0000 (15:26 +0200)
committerLinus Walleij <linus.walleij@linaro.org>
Tue, 28 Oct 2025 09:43:01 +0000 (10:43 +0100)
Use C bit-field to keep the backup of the pin status, instead of
explicitly handling the bit-field through shift and mask of a u32
container.

Signed-off-by: Antonio Borneo <antonio.borneo@foss.st.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/stm32/pinctrl-stm32.c

index 6c5f9e015e8e1b49f3050f4c986c39fa3ba3f140..66f9783fce8629ddc7fec5fa5a13299bf5f5a786 100644 (file)
 #define STM32_GPIO_CIDCFGR(x)  (0x50 + (0x8 * (x)))
 #define STM32_GPIO_SEMCR(x)    (0x54 + (0x8 * (x)))
 
-/* custom bitfield to backup pin status */
-#define STM32_GPIO_BKP_MODE_SHIFT      0
-#define STM32_GPIO_BKP_MODE_MASK       GENMASK(1, 0)
-#define STM32_GPIO_BKP_ALT_SHIFT       2
-#define STM32_GPIO_BKP_ALT_MASK                GENMASK(5, 2)
-#define STM32_GPIO_BKP_SPEED_SHIFT     6
-#define STM32_GPIO_BKP_SPEED_MASK      GENMASK(7, 6)
-#define STM32_GPIO_BKP_PUPD_SHIFT      8
-#define STM32_GPIO_BKP_PUPD_MASK       GENMASK(9, 8)
-#define STM32_GPIO_BKP_TYPE            10
-#define STM32_GPIO_BKP_VAL             11
-
 #define STM32_GPIO_CIDCFGR_CFEN                BIT(0)
 #define STM32_GPIO_CIDCFGR_SEMEN       BIT(1)
 #define STM32_GPIO_CIDCFGR_SCID_MASK   GENMASK(5, 4)
@@ -100,6 +88,15 @@ struct stm32_pinctrl_group {
        unsigned pin;
 };
 
+struct stm32_pin_backup {
+       unsigned int alt:4;
+       unsigned int mode:2;
+       unsigned int bias:2;
+       unsigned int speed:2;
+       unsigned int drive:1;
+       unsigned int value:1;
+};
+
 struct stm32_gpio_bank {
        void __iomem *base;
        struct reset_control *rstc;
@@ -110,7 +107,7 @@ struct stm32_gpio_bank {
        struct irq_domain *domain;
        u32 bank_nr;
        u32 bank_ioport_nr;
-       u32 pin_backup[STM32_GPIO_PINS_PER_BANK];
+       struct stm32_pin_backup pin_backup[STM32_GPIO_PINS_PER_BANK];
        u8 irq_type[STM32_GPIO_PINS_PER_BANK];
        bool secure_control;
        bool rif_control;
@@ -176,38 +173,32 @@ static inline u32 stm32_gpio_get_alt(u32 function)
 static void stm32_gpio_backup_value(struct stm32_gpio_bank *bank,
                                    u32 offset, u32 value)
 {
-       bank->pin_backup[offset] &= ~BIT(STM32_GPIO_BKP_VAL);
-       bank->pin_backup[offset] |= value << STM32_GPIO_BKP_VAL;
+       bank->pin_backup[offset].value = value;
 }
 
 static void stm32_gpio_backup_mode(struct stm32_gpio_bank *bank, u32 offset,
                                   u32 mode, u32 alt)
 {
-       bank->pin_backup[offset] &= ~(STM32_GPIO_BKP_MODE_MASK |
-                                     STM32_GPIO_BKP_ALT_MASK);
-       bank->pin_backup[offset] |= mode << STM32_GPIO_BKP_MODE_SHIFT;
-       bank->pin_backup[offset] |= alt << STM32_GPIO_BKP_ALT_SHIFT;
+       bank->pin_backup[offset].mode = mode;
+       bank->pin_backup[offset].alt = alt;
 }
 
 static void stm32_gpio_backup_driving(struct stm32_gpio_bank *bank, u32 offset,
                                      u32 drive)
 {
-       bank->pin_backup[offset] &= ~BIT(STM32_GPIO_BKP_TYPE);
-       bank->pin_backup[offset] |= drive << STM32_GPIO_BKP_TYPE;
+       bank->pin_backup[offset].drive = drive;
 }
 
 static void stm32_gpio_backup_speed(struct stm32_gpio_bank *bank, u32 offset,
                                    u32 speed)
 {
-       bank->pin_backup[offset] &= ~STM32_GPIO_BKP_SPEED_MASK;
-       bank->pin_backup[offset] |= speed << STM32_GPIO_BKP_SPEED_SHIFT;
+       bank->pin_backup[offset].speed = speed;
 }
 
 static void stm32_gpio_backup_bias(struct stm32_gpio_bank *bank, u32 offset,
                                   u32 bias)
 {
-       bank->pin_backup[offset] &= ~STM32_GPIO_BKP_PUPD_MASK;
-       bank->pin_backup[offset] |= bias << STM32_GPIO_BKP_PUPD_SHIFT;
+       bank->pin_backup[offset].bias = bias;
 }
 
 /* RIF functions */
@@ -1798,7 +1789,7 @@ static int __maybe_unused stm32_pinctrl_restore_gpio_regs(
                                        struct stm32_pinctrl *pctl, u32 pin)
 {
        const struct pin_desc *desc = pin_desc_get(pctl->pctl_dev, pin);
-       u32 val, alt, mode, offset = stm32_gpio_pin(pin);
+       u32 mode, offset = stm32_gpio_pin(pin);
        struct pinctrl_gpio_range *range;
        struct stm32_gpio_bank *bank;
        bool pin_is_irq;
@@ -1818,36 +1809,23 @@ static int __maybe_unused stm32_pinctrl_restore_gpio_regs(
 
        bank = gpiochip_get_data(range->gc);
 
-       alt = bank->pin_backup[offset] & STM32_GPIO_BKP_ALT_MASK;
-       alt >>= STM32_GPIO_BKP_ALT_SHIFT;
-       mode = bank->pin_backup[offset] & STM32_GPIO_BKP_MODE_MASK;
-       mode >>= STM32_GPIO_BKP_MODE_SHIFT;
-
-       ret = stm32_pmx_set_mode(bank, offset, mode, alt);
+       mode = bank->pin_backup[offset].mode;
+       ret = stm32_pmx_set_mode(bank, offset, mode, bank->pin_backup[offset].alt);
        if (ret)
                return ret;
 
-       if (mode == 1) {
-               val = bank->pin_backup[offset] & BIT(STM32_GPIO_BKP_VAL);
-               val = val >> STM32_GPIO_BKP_VAL;
-               __stm32_gpio_set(bank, offset, val);
-       }
+       if (mode == 1)
+               __stm32_gpio_set(bank, offset, bank->pin_backup[offset].value);
 
-       val = bank->pin_backup[offset] & BIT(STM32_GPIO_BKP_TYPE);
-       val >>= STM32_GPIO_BKP_TYPE;
-       ret = stm32_pconf_set_driving(bank, offset, val);
+       ret = stm32_pconf_set_driving(bank, offset, bank->pin_backup[offset].drive);
        if (ret)
                return ret;
 
-       val = bank->pin_backup[offset] & STM32_GPIO_BKP_SPEED_MASK;
-       val >>= STM32_GPIO_BKP_SPEED_SHIFT;
-       ret = stm32_pconf_set_speed(bank, offset, val);
+       ret = stm32_pconf_set_speed(bank, offset, bank->pin_backup[offset].speed);
        if (ret)
                return ret;
 
-       val = bank->pin_backup[offset] & STM32_GPIO_BKP_PUPD_MASK;
-       val >>= STM32_GPIO_BKP_PUPD_SHIFT;
-       ret = stm32_pconf_set_bias(bank, offset, val);
+       ret = stm32_pconf_set_bias(bank, offset, bank->pin_backup[offset].bias);
        if (ret)
                return ret;