Skip to content

Commit bbd3fc3

Browse files
AntonioBorneoLinus Walleij
authored andcommitted
pinctrl: stm32: Simplify handling of backup pin status
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>
1 parent 5a0398c commit bbd3fc3

1 file changed

Lines changed: 24 additions & 46 deletions

File tree

drivers/pinctrl/stm32/pinctrl-stm32.c

Lines changed: 24 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -54,18 +54,6 @@
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+
103100
struct 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)
176173
static 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

183179
static 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

192186
static 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

199192
static 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

206198
static 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

Comments
 (0)