5454#define STM32_GPIO_CIDCFGR (x ) (0x50 + (0x8 * (x)))
5555#define STM32_GPIO_SEMCR (x ) (0x54 + (0x8 * (x)))
5656
57- /* custom bitfield to backup pin status */
58- #define STM32_GPIO_BKP_MODE_SHIFT 0
59- #define STM32_GPIO_BKP_MODE_MASK GENMASK(1, 0)
60- #define STM32_GPIO_BKP_ALT_SHIFT 2
61- #define STM32_GPIO_BKP_ALT_MASK GENMASK(5, 2)
62- #define STM32_GPIO_BKP_SPEED_SHIFT 6
63- #define STM32_GPIO_BKP_SPEED_MASK GENMASK(7, 6)
64- #define STM32_GPIO_BKP_PUPD_SHIFT 8
65- #define STM32_GPIO_BKP_PUPD_MASK GENMASK(9, 8)
66- #define STM32_GPIO_BKP_TYPE 10
67- #define STM32_GPIO_BKP_VAL 11
68-
6957#define STM32_GPIO_CIDCFGR_CFEN BIT(0)
7058#define STM32_GPIO_CIDCFGR_SEMEN BIT(1)
7159#define STM32_GPIO_CIDCFGR_SCID_MASK GENMASK(5, 4)
@@ -100,6 +88,15 @@ struct stm32_pinctrl_group {
10088 unsigned pin ;
10189};
10290
91+ struct stm32_pin_backup {
92+ unsigned int alt :4 ;
93+ unsigned int mode :2 ;
94+ unsigned int bias :2 ;
95+ unsigned int speed :2 ;
96+ unsigned int drive :1 ;
97+ unsigned int value :1 ;
98+ };
99+
103100struct stm32_gpio_bank {
104101 void __iomem * base ;
105102 struct reset_control * rstc ;
@@ -110,7 +107,7 @@ struct stm32_gpio_bank {
110107 struct irq_domain * domain ;
111108 u32 bank_nr ;
112109 u32 bank_ioport_nr ;
113- u32 pin_backup [STM32_GPIO_PINS_PER_BANK ];
110+ struct stm32_pin_backup pin_backup [STM32_GPIO_PINS_PER_BANK ];
114111 u8 irq_type [STM32_GPIO_PINS_PER_BANK ];
115112 bool secure_control ;
116113 bool rif_control ;
@@ -176,38 +173,32 @@ static inline u32 stm32_gpio_get_alt(u32 function)
176173static void stm32_gpio_backup_value (struct stm32_gpio_bank * bank ,
177174 u32 offset , u32 value )
178175{
179- bank -> pin_backup [offset ] &= ~BIT (STM32_GPIO_BKP_VAL );
180- bank -> pin_backup [offset ] |= value << STM32_GPIO_BKP_VAL ;
176+ bank -> pin_backup [offset ].value = value ;
181177}
182178
183179static void stm32_gpio_backup_mode (struct stm32_gpio_bank * bank , u32 offset ,
184180 u32 mode , u32 alt )
185181{
186- bank -> pin_backup [offset ] &= ~(STM32_GPIO_BKP_MODE_MASK |
187- STM32_GPIO_BKP_ALT_MASK );
188- bank -> pin_backup [offset ] |= mode << STM32_GPIO_BKP_MODE_SHIFT ;
189- bank -> pin_backup [offset ] |= alt << STM32_GPIO_BKP_ALT_SHIFT ;
182+ bank -> pin_backup [offset ].mode = mode ;
183+ bank -> pin_backup [offset ].alt = alt ;
190184}
191185
192186static void stm32_gpio_backup_driving (struct stm32_gpio_bank * bank , u32 offset ,
193187 u32 drive )
194188{
195- bank -> pin_backup [offset ] &= ~BIT (STM32_GPIO_BKP_TYPE );
196- bank -> pin_backup [offset ] |= drive << STM32_GPIO_BKP_TYPE ;
189+ bank -> pin_backup [offset ].drive = drive ;
197190}
198191
199192static void stm32_gpio_backup_speed (struct stm32_gpio_bank * bank , u32 offset ,
200193 u32 speed )
201194{
202- bank -> pin_backup [offset ] &= ~STM32_GPIO_BKP_SPEED_MASK ;
203- bank -> pin_backup [offset ] |= speed << STM32_GPIO_BKP_SPEED_SHIFT ;
195+ bank -> pin_backup [offset ].speed = speed ;
204196}
205197
206198static void stm32_gpio_backup_bias (struct stm32_gpio_bank * bank , u32 offset ,
207199 u32 bias )
208200{
209- bank -> pin_backup [offset ] &= ~STM32_GPIO_BKP_PUPD_MASK ;
210- bank -> pin_backup [offset ] |= bias << STM32_GPIO_BKP_PUPD_SHIFT ;
201+ bank -> pin_backup [offset ].bias = bias ;
211202}
212203
213204/* RIF functions */
@@ -1798,7 +1789,7 @@ static int __maybe_unused stm32_pinctrl_restore_gpio_regs(
17981789 struct stm32_pinctrl * pctl , u32 pin )
17991790{
18001791 const struct pin_desc * desc = pin_desc_get (pctl -> pctl_dev , pin );
1801- u32 val , alt , mode , offset = stm32_gpio_pin (pin );
1792+ u32 mode , offset = stm32_gpio_pin (pin );
18021793 struct pinctrl_gpio_range * range ;
18031794 struct stm32_gpio_bank * bank ;
18041795 bool pin_is_irq ;
@@ -1818,36 +1809,23 @@ static int __maybe_unused stm32_pinctrl_restore_gpio_regs(
18181809
18191810 bank = gpiochip_get_data (range -> gc );
18201811
1821- alt = bank -> pin_backup [offset ] & STM32_GPIO_BKP_ALT_MASK ;
1822- alt >>= STM32_GPIO_BKP_ALT_SHIFT ;
1823- mode = bank -> pin_backup [offset ] & STM32_GPIO_BKP_MODE_MASK ;
1824- mode >>= STM32_GPIO_BKP_MODE_SHIFT ;
1825-
1826- ret = stm32_pmx_set_mode (bank , offset , mode , alt );
1812+ mode = bank -> pin_backup [offset ].mode ;
1813+ ret = stm32_pmx_set_mode (bank , offset , mode , bank -> pin_backup [offset ].alt );
18271814 if (ret )
18281815 return ret ;
18291816
1830- if (mode == 1 ) {
1831- val = bank -> pin_backup [offset ] & BIT (STM32_GPIO_BKP_VAL );
1832- val = val >> STM32_GPIO_BKP_VAL ;
1833- __stm32_gpio_set (bank , offset , val );
1834- }
1817+ if (mode == 1 )
1818+ __stm32_gpio_set (bank , offset , bank -> pin_backup [offset ].value );
18351819
1836- val = bank -> pin_backup [offset ] & BIT (STM32_GPIO_BKP_TYPE );
1837- val >>= STM32_GPIO_BKP_TYPE ;
1838- ret = stm32_pconf_set_driving (bank , offset , val );
1820+ ret = stm32_pconf_set_driving (bank , offset , bank -> pin_backup [offset ].drive );
18391821 if (ret )
18401822 return ret ;
18411823
1842- val = bank -> pin_backup [offset ] & STM32_GPIO_BKP_SPEED_MASK ;
1843- val >>= STM32_GPIO_BKP_SPEED_SHIFT ;
1844- ret = stm32_pconf_set_speed (bank , offset , val );
1824+ ret = stm32_pconf_set_speed (bank , offset , bank -> pin_backup [offset ].speed );
18451825 if (ret )
18461826 return ret ;
18471827
1848- val = bank -> pin_backup [offset ] & STM32_GPIO_BKP_PUPD_MASK ;
1849- val >>= STM32_GPIO_BKP_PUPD_SHIFT ;
1850- ret = stm32_pconf_set_bias (bank , offset , val );
1828+ ret = stm32_pconf_set_bias (bank , offset , bank -> pin_backup [offset ].bias );
18511829 if (ret )
18521830 return ret ;
18531831
0 commit comments