Skip to content

Commit 98904cd

Browse files
committed
drivers: pinctrl: wch_20x_30x_afio: fix afio remap
Enable the AFIO clock before remap. Otherwise, remap will not work. Signed-off-by: Jianxiong Gu <jianxiong.gu@outlook.com>
1 parent 05c3775 commit 98904cd

File tree

2 files changed

+16
-4
lines changed

2 files changed

+16
-4
lines changed

drivers/pinctrl/pinctrl_wch_20x_30x_afio.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,17 @@ int pinctrl_configure_pins(const pinctrl_soc_pin_t *pins, uint8_t pin_cnt, uintp
3030
uint8_t pcfr_id = FIELD_GET(CH32V20X_V30X_PINCTRL_PCFR_ID_MASK, pins->config);
3131
uint8_t remap = FIELD_GET(CH32V20X_V30X_PINCTRL_RM_MASK, pins->config);
3232
GPIO_TypeDef *regs = wch_afio_pinctrl_regs[port];
33-
uint32_t pcfr = pcfr_id == 0 ? AFIO->PCFR1 : AFIO->PCFR2;
33+
uint32_t pcfr = 0;
3434
uint8_t cfg = 0;
3535

36+
if (RCC->APB2PCENR & RCC_AFIOEN) {
37+
pcfr = pcfr_id == 0 ? AFIO->PCFR1 : AFIO->PCFR2;
38+
} else {
39+
if (remap != 0) {
40+
RCC->APB2PCENR |= RCC_AFIOEN;
41+
}
42+
}
43+
3644
if (pins->output_high || pins->output_low) {
3745
cfg |= (pins->slew_rate + 1);
3846
if (pins->drive_open_drain) {

drivers/pinctrl/pinctrl_wch_afio.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,15 @@ int pinctrl_configure_pins(const pinctrl_soc_pin_t *pins, uint8_t pin_cnt, uintp
2525
uint8_t bit0 = (pins->config >> CH32V003_PINCTRL_RM_BASE_SHIFT) & 0x1F;
2626
uint8_t remap = (pins->config >> CH32V003_PINCTRL_RM_SHIFT) & 0x3;
2727
GPIO_TypeDef *regs = wch_afio_pinctrl_regs[port];
28-
uint32_t pcfr1 = AFIO->PCFR1;
28+
uint32_t pcfr1 = 0;
2929
uint8_t cfg = 0;
3030

31-
if (remap != 0) {
32-
RCC->APB2PCENR |= RCC_AFIOEN;
31+
if (RCC->APB2PCENR & RCC_AFIOEN) {
32+
pcfr1 = AFIO->PCFR1;
33+
} else {
34+
if (remap != 0) {
35+
RCC->APB2PCENR |= RCC_AFIOEN;
36+
}
3337
}
3438

3539
if (pins->output_high || pins->output_low) {

0 commit comments

Comments
 (0)