drivers/interrupt_controller: stm32: add support of stm32mp1

Add support of the stm32mp1 gpio exti.

Signed-off-by: Arnaud Pouliquen <arnaud.pouliquen@st.com>
This commit is contained in:
Arnaud Pouliquen 2019-02-26 18:58:24 +01:00 committed by Kumar Gala
commit 776671c7eb
3 changed files with 313 additions and 10 deletions

View file

@ -74,6 +74,87 @@ config EXTI_STM32_EXTI4_IRQ_PRI
help help
IRQ priority of EXTI4 interrupt IRQ priority of EXTI4 interrupt
if SOC_SERIES_STM32MP1X
config EXTI_STM32_EXTI5_IRQ_PRI
int "EXTI5 IRQ priority"
depends on EXTI_STM32
default 0
help
IRQ priority of EXTI5 interrupt
config EXTI_STM32_EXTI6_IRQ_PRI
int "EXTI6 IRQ priority"
depends on EXTI_STM32
default 0
help
IRQ priority of EXTI6 interrupt
config EXTI_STM32_EXTI7_IRQ_PRI
int "EXTI7 IRQ priority"
depends on EXTI_STM32
default 0
help
IRQ priority of EXTI7 interrupt
config EXTI_STM32_EXTI8_IRQ_PRI
int "EXTI8 IRQ priority"
depends on EXTI_STM32
default 0
help
IRQ priority of EXTI8 interrupt
config EXTI_STM32_EXTI9_IRQ_PRI
int "EXTI9 IRQ priority"
depends on EXTI_STM32
default 0
help
IRQ priority of EXTI9 interrupt
config EXTI_STM32_EXTI10_IRQ_PRI
int "EXTI10 IRQ priority"
depends on EXTI_STM32
default 0
help
IRQ priority of EXTI10 interrupt
config EXTI_STM32_EXTI11_IRQ_PRI
int "EXTI11 IRQ priority"
depends on EXTI_STM32
default 0
help
IRQ priority of EXTI11 interrupt
config EXTI_STM32_EXTI12_IRQ_PRI
int "EXTI12 IRQ priority"
depends on EXTI_STM32
default 0
help
IRQ priority of EXTI12 interrupt
config EXTI_STM32_EXTI13_IRQ_PRI
int "EXTI13 IRQ priority"
depends on EXTI_STM32
default 0
help
IRQ priority of EXTI13 interrupt
config EXTI_STM32_EXTI14_IRQ_PRI
int "EXTI14 IRQ priority"
depends on EXTI_STM32
default 0
help
IRQ priority of EXTI14 interrupt
config EXTI_STM32_EXTI15_IRQ_PRI
int "EXTI15 IRQ priority"
depends on EXTI_STM32
default 0
help
IRQ priority of EXTI15 interrupt
endif # SOC_SERIES_STM32MP1X
if SOC_SERIES_STM32MP1X!=y
config EXTI_STM32_EXTI9_5_IRQ_PRI config EXTI_STM32_EXTI9_5_IRQ_PRI
int "EXTI9:5 IRQ priority" int "EXTI9:5 IRQ priority"
depends on EXTI_STM32 depends on EXTI_STM32
@ -87,6 +168,7 @@ config EXTI_STM32_EXTI15_10_IRQ_PRI
default 0 default 0
help help
IRQ priority of EXTI15:10 interrupt IRQ priority of EXTI15:10 interrupt
endif # SOC_SERIES_STM32MP1X!=y
endif # SOC_SERIES_STM32F0X!=y && SOC_SERIES_STM32L0X!=y endif # SOC_SERIES_STM32F0X!=y && SOC_SERIES_STM32L0X!=y

View file

@ -43,6 +43,31 @@
#define EXTI_LINES 30 #define EXTI_LINES 30
#elif defined(CONFIG_SOC_SERIES_STM32L4X) #elif defined(CONFIG_SOC_SERIES_STM32L4X)
#define EXTI_LINES 40 #define EXTI_LINES 40
#elif defined(CONFIG_SOC_SERIES_STM32MP1X)
#define EXTI_LINES 76
#endif
#if defined(CONFIG_SOC_SERIES_STM32MP1X)
IRQn_Type exti_irq_table[] = {
EXTI0_IRQn, EXTI1_IRQn, EXTI2_IRQn, EXTI3_IRQn,
EXTI4_IRQn, EXTI5_IRQn, EXTI6_IRQn, EXTI7_IRQn,
EXTI8_IRQn, EXTI9_IRQn, EXTI10_IRQn, EXTI11_IRQn,
EXTI12_IRQn, EXTI13_IRQn, EXTI14_IRQn, EXTI15_IRQn,
PVD_AVD_IRQn, RTC_TIMESTAMP_IRQn, TAMP_IRQn, RTC_WKUP_ALARM_IRQn,
0xFF, I2C1_EV_IRQn, I2C2_EV_IRQn, I2C3_EV_IRQn,
I2C3_EV_IRQn, I2C5_EV_IRQn, USART1_IRQn, USART2_IRQn,
USART3_IRQn, USART6_IRQn, UART4_IRQn, UART5_IRQn,
UART7_IRQn, UART8_IRQn, 0xFF, 0xFF,
SPI1_IRQn, SPI2_IRQn, SPI3_IRQn, SPI4_IRQn,
SPI5_IRQn, SPI6_IRQn, MDIOS_IRQn, USBH_OHCI_IRQn,
OTG_IRQn, 0xFF, 0xFF, LPTIM1_IRQn,
LPTIM2_IRQn, 0xFF, LPTIM3_IRQn, 0xFF,
LPTIM4_IRQn, LPTIM5_IRQn, I2C6_EV_IRQn, WAKEUP_PIN_IRQn,
WAKEUP_PIN_IRQn, WAKEUP_PIN_IRQn, WAKEUP_PIN_IRQn, WAKEUP_PIN_IRQn,
WAKEUP_PIN_IRQn, IPCC_RX0_IRQn, IPCC_RX1_IRQn, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF,
0xFF, CEC_IRQn, ETH1_WKUP_IRQn, 0xFF, DTS_IRQn
};
#endif #endif
/* wrapper for user callback */ /* wrapper for user callback */
@ -63,11 +88,17 @@ int stm32_exti_enable(int line)
if (line < 32) { if (line < 32) {
LL_EXTI_EnableIT_0_31(1 << line); LL_EXTI_EnableIT_0_31(1 << line);
} else { } else if (line < 64) {
#if EXTI_LINES > 32 #if EXTI_LINES > 32
LL_EXTI_EnableIT_32_63(1 << (line - 32)); LL_EXTI_EnableIT_32_63(1 << (line - 32));
#else #else
__ASSERT_NO_MSG(line); __ASSERT_NO_MSG(line);
#endif
} else {
#if EXTI_LINES > 64
LL_EXTI_EnableIT_64_95(1 << (line - 32));
#else
__ASSERT_NO_MSG(line);
#endif #endif
} }
@ -141,6 +172,14 @@ int stm32_exti_enable(int line)
#endif /* CONFIG_SOC_SERIES_STM32L4X */ #endif /* CONFIG_SOC_SERIES_STM32L4X */
} }
} }
#elif defined(CONFIG_SOC_SERIES_STM32MP1X)
if (line <= 72) {
irqnum = exti_irq_table[line];
if (irqnum == 0xFF)
return 0;
} else {
return -ENOTSUP;
}
#else #else
#error "Unknown STM32 SoC" #error "Unknown STM32 SoC"
#endif #endif
@ -154,11 +193,17 @@ void stm32_exti_disable(int line)
{ {
if (line < 32) { if (line < 32) {
LL_EXTI_DisableIT_0_31(1 << line); LL_EXTI_DisableIT_0_31(1 << line);
} else { } else if (line < 64) {
#if EXTI_LINES > 32 #if EXTI_LINES > 32
LL_EXTI_DisableIT_32_63(1 << (line - 32)); LL_EXTI_DisableIT_32_63(1 << (line - 32));
#else #else
__ASSERT_NO_MSG(line); __ASSERT_NO_MSG(line);
#endif
} else {
#if EXTI_LINES > 64
LL_EXTI_DisableIT_64_95(1 << (line - 64));
#else
__ASSERT_NO_MSG(line);
#endif #endif
} }
} }
@ -171,10 +216,32 @@ void stm32_exti_disable(int line)
static inline int stm32_exti_is_pending(int line) static inline int stm32_exti_is_pending(int line)
{ {
if (line < 32) { if (line < 32) {
#if defined(CONFIG_SOC_SERIES_STM32MP1X)
return (LL_EXTI_IsActiveRisingFlag_0_31(1 << line) ||
LL_EXTI_IsActiveFallingFlag_0_31(1 << line));
#else
return LL_EXTI_IsActiveFlag_0_31(1 << line); return LL_EXTI_IsActiveFlag_0_31(1 << line);
} else { #endif
} else if (line < 64) {
#if EXTI_LINES > 32 #if EXTI_LINES > 32
#if defined(CONFIG_SOC_SERIES_STM32MP1X)
__ASSERT_NO_MSG(line);
return 0;
#else
return LL_EXTI_IsActiveFlag_32_63(1 << (line - 32)); return LL_EXTI_IsActiveFlag_32_63(1 << (line - 32));
#endif
#else
__ASSERT_NO_MSG(line);
return 0;
#endif
} else {
#if EXTI_LINES > 64
#if defined(CONFIG_SOC_SERIES_STM32MP1X)
return (LL_EXTI_IsActiveRisingFlag_64_95(1 << (line - 64)) ||
LL_EXTI_IsActiveFallingFlag_64_95(1 << (line - 64)));
#else
return LL_EXTI_IsActiveFlag_64_96(1 << (line - 64));
#endif
#else #else
__ASSERT_NO_MSG(line); __ASSERT_NO_MSG(line);
return 0; return 0;
@ -190,10 +257,28 @@ static inline int stm32_exti_is_pending(int line)
static inline void stm32_exti_clear_pending(int line) static inline void stm32_exti_clear_pending(int line)
{ {
if (line < 32) { if (line < 32) {
#if defined(CONFIG_SOC_SERIES_STM32MP1X)
LL_EXTI_ClearRisingFlag_0_31(1 << line);
LL_EXTI_ClearFallingFlag_0_31(1 << line);
#else
LL_EXTI_ClearFlag_0_31(1 << line); LL_EXTI_ClearFlag_0_31(1 << line);
} else { #endif
} else if (line < 64) {
#if EXTI_LINES > 32 #if EXTI_LINES > 32
#if !defined(CONFIG_SOC_SERIES_STM32MP1X)
LL_EXTI_ClearFlag_32_63(1 << (line - 32)); LL_EXTI_ClearFlag_32_63(1 << (line - 32));
#endif
#else
__ASSERT_NO_MSG(line);
#endif
} else {
#if EXTI_LINES > 64
#if defined(CONFIG_SOC_SERIES_STM32MP1X)
LL_EXTI_ClearRisingFlag_64_95(1 << (line - 64));
LL_EXTI_ClearFallingFlag_64_95(1 << (line - 64));
#else
__ASSERT_NO_MSG(line);
#endif
#else #else
__ASSERT_NO_MSG(line); __ASSERT_NO_MSG(line);
#endif #endif
@ -205,11 +290,23 @@ void stm32_exti_trigger(int line, int trigger)
if (trigger & STM32_EXTI_TRIG_RISING) { if (trigger & STM32_EXTI_TRIG_RISING) {
if (line < 32) { if (line < 32) {
LL_EXTI_EnableRisingTrig_0_31(1 << line); LL_EXTI_EnableRisingTrig_0_31(1 << line);
} else { } else if (line < 64) {
#if EXTI_LINES > 32 #if EXTI_LINES > 32
#if defined(CONFIG_SOC_SERIES_STM32MP1X)
__ASSERT_NO_MSG(line);
#else
LL_EXTI_EnableRisingTrig_32_63(1 << (line - 32)); LL_EXTI_EnableRisingTrig_32_63(1 << (line - 32));
#endif
#else #else
__ASSERT_NO_MSG(line); __ASSERT_NO_MSG(line);
#endif
} else {
#if EXTI_LINES > 64
#if !defined(CONFIG_SOC_SERIES_STM32MP1X)
__ASSERT_NO_MSG(line);
#else
LL_EXTI_EnableRisingTrig_64_95(1 << (line - 64));
#endif
#endif #endif
} }
} }
@ -217,11 +314,23 @@ void stm32_exti_trigger(int line, int trigger)
if (trigger & STM32_EXTI_TRIG_FALLING) { if (trigger & STM32_EXTI_TRIG_FALLING) {
if (line < 32) { if (line < 32) {
LL_EXTI_EnableFallingTrig_0_31(1 << line); LL_EXTI_EnableFallingTrig_0_31(1 << line);
} else { } else if (line < 64) {
#if EXTI_LINES > 32 #if EXTI_LINES > 32
#if defined(CONFIG_SOC_SERIES_STM32MP1X)
__ASSERT_NO_MSG(line);
#else
LL_EXTI_EnableFallingTrig_32_63(1 << (line - 32)); LL_EXTI_EnableFallingTrig_32_63(1 << (line - 32));
#endif
#else #else
__ASSERT_NO_MSG(line); __ASSERT_NO_MSG(line);
#endif
} else {
#if EXTI_LINES > 64
#if !defined(CONFIG_SOC_SERIES_STM32MP1X)
__ASSERT_NO_MSG(line);
#else
LL_EXTI_EnableRisingTrig_64_95(1 << (line - 64));
#endif
#endif #endif
} }
} }
@ -301,6 +410,63 @@ static inline void __stm32_exti_isr_4(void *arg)
__stm32_exti_isr(4, 5, arg); __stm32_exti_isr(4, 5, arg);
} }
#if defined(CONFIG_SOC_SERIES_STM32MP1X)
static inline void __stm32_exti_isr_5(void *arg)
{
__stm32_exti_isr(5, 6, arg);
}
static inline void __stm32_exti_isr_6(void *arg)
{
__stm32_exti_isr(6, 7, arg);
}
static inline void __stm32_exti_isr_7(void *arg)
{
__stm32_exti_isr(7, 8, arg);
}
static inline void __stm32_exti_isr_8(void *arg)
{
__stm32_exti_isr(8, 9, arg);
}
static inline void __stm32_exti_isr_9(void *arg)
{
__stm32_exti_isr(9, 10, arg);
}
static inline void __stm32_exti_isr_10(void *arg)
{
__stm32_exti_isr(10, 11, arg);
}
static inline void __stm32_exti_isr_11(void *arg)
{
__stm32_exti_isr(11, 12, arg);
}
static inline void __stm32_exti_isr_12(void *arg)
{
__stm32_exti_isr(12, 13, arg);
}
static inline void __stm32_exti_isr_13(void *arg)
{
__stm32_exti_isr(13, 14, arg);
}
static inline void __stm32_exti_isr_14(void *arg)
{
__stm32_exti_isr(14, 15, arg);
}
static inline void __stm32_exti_isr_15(void *arg)
{
__stm32_exti_isr(15, 16, arg);
}
#endif
static inline void __stm32_exti_isr_9_5(void *arg) static inline void __stm32_exti_isr_9_5(void *arg)
{ {
__stm32_exti_isr(5, 10, arg); __stm32_exti_isr(5, 10, arg);
@ -313,7 +479,8 @@ static inline void __stm32_exti_isr_15_10(void *arg)
#if defined(CONFIG_SOC_SERIES_STM32F4X) || \ #if defined(CONFIG_SOC_SERIES_STM32F4X) || \
defined(CONFIG_SOC_SERIES_STM32F7X) || \ defined(CONFIG_SOC_SERIES_STM32F7X) || \
defined(CONFIG_SOC_SERIES_STM32F2X) defined(CONFIG_SOC_SERIES_STM32F2X) || \
defined(CONFIG_SOC_SERIES_STM32MP1X)
static inline void __stm32_exti_isr_16(void *arg) static inline void __stm32_exti_isr_16(void *arg)
{ {
__stm32_exti_isr(16, 17, arg); __stm32_exti_isr(16, 17, arg);
@ -334,12 +501,13 @@ static inline void __stm32_exti_isr_22(void *arg)
__stm32_exti_isr(22, 23, arg); __stm32_exti_isr(22, 23, arg);
} }
#endif #endif
#ifdef CONFIG_SOC_SERIES_STM32F7X #if defined(CONFIG_SOC_SERIES_STM32F7X) || \
defined(CONFIG_SOC_SERIES_STM32MP1X)
static inline void __stm32_exti_isr_23(void *arg) static inline void __stm32_exti_isr_23(void *arg)
{ {
__stm32_exti_isr(23, 24, arg); __stm32_exti_isr(23, 24, arg);
} }
#endif /* CONFIG_SOC_SERIES_STM32F7X */ #endif
#endif /* CONFIG_SOC_SERIES_STM32F0X */ #endif /* CONFIG_SOC_SERIES_STM32F0X */
static void __stm32_exti_connect_irqs(struct device *dev); static void __stm32_exti_connect_irqs(struct device *dev);
@ -413,7 +581,8 @@ static void __stm32_exti_connect_irqs(struct device *dev)
defined(CONFIG_SOC_SERIES_STM32F3X) || \ defined(CONFIG_SOC_SERIES_STM32F3X) || \
defined(CONFIG_SOC_SERIES_STM32F4X) || \ defined(CONFIG_SOC_SERIES_STM32F4X) || \
defined(CONFIG_SOC_SERIES_STM32F7X) || \ defined(CONFIG_SOC_SERIES_STM32F7X) || \
defined(CONFIG_SOC_SERIES_STM32L4X) defined(CONFIG_SOC_SERIES_STM32L4X) || \
defined(CONFIG_SOC_SERIES_STM32MP1X)
IRQ_CONNECT(EXTI0_IRQn, IRQ_CONNECT(EXTI0_IRQn,
CONFIG_EXTI_STM32_EXTI0_IRQ_PRI, CONFIG_EXTI_STM32_EXTI0_IRQ_PRI,
__stm32_exti_isr_0, DEVICE_GET(exti_stm32), __stm32_exti_isr_0, DEVICE_GET(exti_stm32),
@ -441,6 +610,7 @@ static void __stm32_exti_connect_irqs(struct device *dev)
CONFIG_EXTI_STM32_EXTI4_IRQ_PRI, CONFIG_EXTI_STM32_EXTI4_IRQ_PRI,
__stm32_exti_isr_4, DEVICE_GET(exti_stm32), __stm32_exti_isr_4, DEVICE_GET(exti_stm32),
0); 0);
#ifndef CONFIG_SOC_SERIES_STM32MP1X
IRQ_CONNECT(EXTI9_5_IRQn, IRQ_CONNECT(EXTI9_5_IRQn,
CONFIG_EXTI_STM32_EXTI9_5_IRQ_PRI, CONFIG_EXTI_STM32_EXTI9_5_IRQ_PRI,
__stm32_exti_isr_9_5, DEVICE_GET(exti_stm32), __stm32_exti_isr_9_5, DEVICE_GET(exti_stm32),
@ -449,6 +619,53 @@ static void __stm32_exti_connect_irqs(struct device *dev)
CONFIG_EXTI_STM32_EXTI15_10_IRQ_PRI, CONFIG_EXTI_STM32_EXTI15_10_IRQ_PRI,
__stm32_exti_isr_15_10, DEVICE_GET(exti_stm32), __stm32_exti_isr_15_10, DEVICE_GET(exti_stm32),
0); 0);
#else
IRQ_CONNECT(EXTI5_IRQn,
CONFIG_EXTI_STM32_EXTI5_IRQ_PRI,
__stm32_exti_isr_5, DEVICE_GET(exti_stm32),
0);
IRQ_CONNECT(EXTI6_IRQn,
CONFIG_EXTI_STM32_EXTI6_IRQ_PRI,
__stm32_exti_isr_6, DEVICE_GET(exti_stm32),
0);
IRQ_CONNECT(EXTI7_IRQn,
CONFIG_EXTI_STM32_EXTI7_IRQ_PRI,
__stm32_exti_isr_7, DEVICE_GET(exti_stm32),
0);
IRQ_CONNECT(EXTI8_IRQn,
CONFIG_EXTI_STM32_EXTI8_IRQ_PRI,
__stm32_exti_isr_8, DEVICE_GET(exti_stm32),
0);
IRQ_CONNECT(EXTI9_IRQn,
CONFIG_EXTI_STM32_EXTI9_IRQ_PRI,
__stm32_exti_isr_9, DEVICE_GET(exti_stm32),
0);
IRQ_CONNECT(EXTI10_IRQn,
CONFIG_EXTI_STM32_EXTI10_IRQ_PRI,
__stm32_exti_isr_10, DEVICE_GET(exti_stm32),
0);
IRQ_CONNECT(EXTI11_IRQn,
CONFIG_EXTI_STM32_EXTI11_IRQ_PRI,
__stm32_exti_isr_11, DEVICE_GET(exti_stm32),
0);
IRQ_CONNECT(EXTI12_IRQn,
CONFIG_EXTI_STM32_EXTI12_IRQ_PRI,
__stm32_exti_isr_12, DEVICE_GET(exti_stm32),
0);
IRQ_CONNECT(EXTI13_IRQn,
CONFIG_EXTI_STM32_EXTI13_IRQ_PRI,
__stm32_exti_isr_13, DEVICE_GET(exti_stm32),
0);
IRQ_CONNECT(EXTI14_IRQn,
CONFIG_EXTI_STM32_EXTI14_IRQ_PRI,
__stm32_exti_isr_14, DEVICE_GET(exti_stm32),
0);
IRQ_CONNECT(EXTI15_IRQn,
CONFIG_EXTI_STM32_EXTI15_IRQ_PRI,
__stm32_exti_isr_15, DEVICE_GET(exti_stm32),
0);
#endif /* CONFIG_SOC_SERIES_STM32MP1X */
#if defined(CONFIG_SOC_SERIES_STM32F2X) || \ #if defined(CONFIG_SOC_SERIES_STM32F2X) || \
defined(CONFIG_SOC_SERIES_STM32F4X) || \ defined(CONFIG_SOC_SERIES_STM32F4X) || \
defined(CONFIG_SOC_SERIES_STM32F7X) defined(CONFIG_SOC_SERIES_STM32F7X)

View file

@ -27,6 +27,10 @@
*/ */
#include <kernel_includes.h> #include <kernel_includes.h>
#ifdef CONFIG_EXTI_STM32
#include <stm32mp1xx_ll_exti.h>
#endif
#endif /* !_ASMLANGUAGE */ #endif /* !_ASMLANGUAGE */
#endif /* _STM32MP1SOC_H_ */ #endif /* _STM32MP1SOC_H_ */