summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chip/stm32/clock-stm32l4.c14
-rw-r--r--chip/stm32/gpio.c37
-rw-r--r--chip/stm32/registers-stm32l5.h22
3 files changed, 60 insertions, 13 deletions
diff --git a/chip/stm32/clock-stm32l4.c b/chip/stm32/clock-stm32l4.c
index 412771163c..6d10fbf79e 100644
--- a/chip/stm32/clock-stm32l4.c
+++ b/chip/stm32/clock-stm32l4.c
@@ -724,7 +724,14 @@ static void pre_work_set_rtc_alarm(void)
while (!(STM32_RTC_ISR & STM32_RTC_ISR_ALRAWF))
;
STM32_RTC_ISR &= ~STM32_RTC_ISR_ALRAF;
+#ifdef STM32_EXTI_RPR
+ /* Separate rising and falling edge pending registers. */
+ STM32_EXTI_RPR = BIT(18);
+ STM32_EXTI_FPR = BIT(18);
+#else
+ /* One combined rising/falling edge pending registers. */
STM32_EXTI_PR = BIT(18);
+#endif
}
/* Register setup after RTC alarm is updated */
@@ -947,7 +954,14 @@ void reset_rtc_alarm(struct rtc_time_reg *rtc)
/* Disable RTC alarm interrupt */
STM32_EXTI_IMR &= ~BIT(18);
+#ifdef STM32_EXTI_RPR
+ /* Separate rising and falling edge pending registers. */
+ STM32_EXTI_RPR = BIT(18);
+ STM32_EXTI_FPR = BIT(18);
+#else
+ /* One combined rising/falling edge pending registers. */
STM32_EXTI_PR = BIT(18);
+#endif
/* Clear the pending RTC alarm IRQ in NVIC */
task_clear_pending_irq(STM32_IRQ_RTC_ALARM);
diff --git a/chip/stm32/gpio.c b/chip/stm32/gpio.c
index 2ad9f99d79..ade662d9d8 100644
--- a/chip/stm32/gpio.c
+++ b/chip/stm32/gpio.c
@@ -109,12 +109,20 @@ int gpio_enable_interrupt(enum gpio_signal signal)
exti_events[bit] = signal;
group = bit / 4;
- shift = (bit % 4) * 4;
+ shift = bit % 4;
bank = (g->port - STM32_GPIOA_BASE) / 0x400;
+#ifdef STM32_EXTI_EXTICR
+ /* STM32L5 has 8-bit fields as part of EXTI registers. */
+ STM32_EXTI_EXTICR(group) =
+ (STM32_EXTI_EXTICR(group) & ~(0xFF << (shift * 8))) |
+ (bank << (shift * 8));
+#else
+ /* Other STM chips have 4-bit fields as part of SYSCFG registers. */
STM32_SYSCFG_EXTICR(group) =
- (STM32_SYSCFG_EXTICR(group) & ~(0xF << shift)) |
- (bank << shift);
+ (STM32_SYSCFG_EXTICR(group) & ~(0xF << (shift * 4))) |
+ (bank << (shift * 4));
+#endif
STM32_EXTI_IMR |= g->mask;
return EC_SUCCESS;
@@ -142,11 +150,19 @@ int gpio_clear_pending_interrupt(enum gpio_signal signal)
{
const struct gpio_info *g = gpio_list + signal;
- if (!g->mask || signal >= GPIO_IH_COUNT)
+ if (!g->mask || signal >= GPIO_IH_COUNT) {
return EC_ERROR_INVAL;
+ }
/* Write 1 to clear interrupt */
+#ifdef STM32_EXTI_RPR
+ /* Separate rising and falling edge pending registers. */
+ STM32_EXTI_RPR = g->mask;
+ STM32_EXTI_FPR = g->mask;
+#else
+ /* One combined rising/falling edge pending registers. */
STM32_EXTI_PR = g->mask;
+#endif
return EC_SUCCESS;
}
@@ -157,12 +173,21 @@ int gpio_clear_pending_interrupt(enum gpio_signal signal)
void __keep gpio_interrupt(void)
{
int bit;
+ uint8_t signal;
+#ifdef STM32_EXTI_RPR
+ /* process only GPIO EXTINTs (EXTINT0..15) not other EXTINTs */
+ uint32_t pending_r = STM32_EXTI_RPR & 0xFFFF;
+ uint32_t pending_f = STM32_EXTI_FPR & 0xFFFF;
+ uint32_t pending = pending_r | pending_f;
+ /* Write 1 to clear interrupt */
+ STM32_EXTI_RPR = pending_r;
+ STM32_EXTI_FPR = pending_f;
+#else
/* process only GPIO EXTINTs (EXTINT0..15) not other EXTINTs */
uint32_t pending = STM32_EXTI_PR & 0xFFFF;
- uint8_t signal;
-
/* Write 1 to clear interrupt */
STM32_EXTI_PR = pending;
+#endif
while (pending) {
bit = get_next_bit(&pending);
diff --git a/chip/stm32/registers-stm32l5.h b/chip/stm32/registers-stm32l5.h
index eec7413233..45f333951b 100644
--- a/chip/stm32/registers-stm32l5.h
+++ b/chip/stm32/registers-stm32l5.h
@@ -1941,7 +1941,6 @@
#define STM32_RCC_CRRCR_HSI48CAL_8 (0x100UL << STM32_RCC_CRRCR_HSI48CAL_POS)
#define STM32_SYSCFG_CFGR1 REG32(STM32_SYSCFG_BASE + 0x04)
-#define STM32_SYSCFG_EXTICR(n) REG32(STM32_SYSCFG_BASE + 8 + 4 * (n))
#define STM32_SYSCFG_I2CFMP(n) BIT(n + 21)
/* Peripheral bits for STM32_RCC_APB/AHB and DBGMCU regs */
@@ -2137,12 +2136,21 @@ typedef volatile struct stm32_spi_regs stm32_spi_regs_t;
#define STM32_OPTB_WRP1BR STM32_FLASH_WRP1BR
/* --- External Interrupts --- */
-#define STM32_EXTI_IMR REG32(STM32_EXTI_BASE + 0x00)
-#define STM32_EXTI_EMR REG32(STM32_EXTI_BASE + 0x04)
-#define STM32_EXTI_RTSR REG32(STM32_EXTI_BASE + 0x08)
-#define STM32_EXTI_FTSR REG32(STM32_EXTI_BASE + 0x0c)
-#define STM32_EXTI_SWIER REG32(STM32_EXTI_BASE + 0x10)
-#define STM32_EXTI_PR REG32(STM32_EXTI_BASE + 0x14)
+#define STM32_EXTI_RTSR REG32(STM32_EXTI_BASE + 0x00)
+#define STM32_EXTI_FTSR REG32(STM32_EXTI_BASE + 0x04)
+#define STM32_EXTI_SWIER REG32(STM32_EXTI_BASE + 0x08)
+#define STM32_EXTI_RPR REG32(STM32_EXTI_BASE + 0x0C)
+#define STM32_EXTI_FPR REG32(STM32_EXTI_BASE + 0x10)
+#define STM32_EXTI_RTSR2 REG32(STM32_EXTI_BASE + 0x20)
+#define STM32_EXTI_FTSR2 REG32(STM32_EXTI_BASE + 0x24)
+#define STM32_EXTI_SWIER2 REG32(STM32_EXTI_BASE + 0x28)
+#define STM32_EXTI_RPR2 REG32(STM32_EXTI_BASE + 0x2C)
+#define STM32_EXTI_FPR2 REG32(STM32_EXTI_BASE + 0x30)
+#define STM32_EXTI_EXTICR(n) REG32(STM32_EXTI_BASE + 0x60 + 4 * (n))
+#define STM32_EXTI_IMR REG32(STM32_EXTI_BASE + 0x80)
+#define STM32_EXTI_EMR REG32(STM32_EXTI_BASE + 0x84)
+#define STM32_EXTI_IMR2 REG32(STM32_EXTI_BASE + 0x80)
+#define STM32_EXTI_EMR2 REG32(STM32_EXTI_BASE + 0x84)
#define EXTI_RTC_ALR_EVENT BIT(18)