From 17a62dd268aadb28e80c1cb032047f9f4972bedb Mon Sep 17 00:00:00 2001 From: Ricardo Salveti Date: Sat, 13 Aug 2016 02:06:32 -0300 Subject: [PATCH] exti: stm32: fix driver data handling Since dd5e90ec the device_get_binding call returns NULL unless the driver_api is set by the driver. Since the exti driver only uses an internal struct to store the callbacks, remove the need for the device binding call from other drivers (e.g. gpio). Change-Id: If0b733c27754108118d87ef02640311f0535ab57 Signed-off-by: Ricardo Salveti Signed-off-by: Amit Kucheria --- drivers/gpio/gpio_stm32.c | 8 ++-- drivers/interrupt_controller/exti_stm32.c | 56 +++++++++++------------ drivers/interrupt_controller/exti_stm32.h | 11 ++--- 3 files changed, 35 insertions(+), 40 deletions(-) diff --git a/drivers/gpio/gpio_stm32.c b/drivers/gpio/gpio_stm32.c index 6c3992d59e6..138a9e34fed 100644 --- a/drivers/gpio/gpio_stm32.c +++ b/drivers/gpio/gpio_stm32.c @@ -74,9 +74,7 @@ static int gpio_stm32_config(struct device *dev, int access_op, } if (flags & GPIO_INT) { - struct device *exti = device_get_binding(STM32_EXTI_NAME); - - stm32_exti_set_callback(exti, pin, gpio_stm32_isr, dev); + stm32_exti_set_callback(pin, gpio_stm32_isr, dev); stm32_gpio_enable_int(cfg->port, pin); @@ -92,10 +90,10 @@ static int gpio_stm32_config(struct device *dev, int access_op, edge = STM32_EXTI_TRIG_FALLING; } - stm32_exti_trigger(exti, pin, edge); + stm32_exti_trigger(pin, edge); } - stm32_exti_enable(exti, pin); + stm32_exti_enable(pin); } return 0; diff --git a/drivers/interrupt_controller/exti_stm32.c b/drivers/interrupt_controller/exti_stm32.c index 4528b070bb5..e51f67c9a29 100644 --- a/drivers/interrupt_controller/exti_stm32.c +++ b/drivers/interrupt_controller/exti_stm32.c @@ -66,13 +66,11 @@ struct stm32_exti_data { #define AS_EXTI(__base_addr) \ ((struct stm32_exti *)(__base_addr)) -void stm32_exti_enable(struct device *dev, int line) +void stm32_exti_enable(int line) { volatile struct stm32_exti *exti = AS_EXTI(EXTI_BASE); int irqnum; - ARG_UNUSED(dev); - exti->imr |= 1 << line; #ifdef CONFIG_SOC_SERIES_STM32F1X @@ -89,12 +87,10 @@ void stm32_exti_enable(struct device *dev, int line) irq_enable(irqnum); } -void stm32_exti_disable(struct device *dev, int line) +void stm32_exti_disable(int line) { volatile struct stm32_exti *exti = AS_EXTI(EXTI_BASE); - ARG_UNUSED(dev); - exti->imr &= ~(1 << line); } @@ -122,12 +118,10 @@ static inline void stm32_exti_clear_pending(int line) exti->pr |= 1 << line; } -void stm32_exti_trigger(struct device *dev, int line, int trigger) +void stm32_exti_trigger(int line, int trigger) { volatile struct stm32_exti *exti = AS_EXTI(EXTI_BASE); - ARG_UNUSED(dev); - if (trigger & STM32_EXTI_TRIG_RISING) { exti->rtsr |= 1 << line; } @@ -137,26 +131,6 @@ void stm32_exti_trigger(struct device *dev, int line, int trigger) } } -void stm32_exti_set_callback(struct device *dev, int line, - stm32_exti_callback_t cb, void *arg) -{ - struct stm32_exti_data *data = dev->driver_data; - - __ASSERT(data->cb[line].cb == NULL, - "EXTI %d callback already registered", line); - - data->cb[line].cb = cb; - data->cb[line].data = arg; -} - -void stm32_exti_unset_callback(struct device *dev, int line) -{ - struct stm32_exti_data *data = dev->driver_data; - - data->cb[line].cb = NULL; - data->cb[line].data = NULL; -} - /** * @brief EXTI ISR handler * @@ -241,6 +215,30 @@ DEVICE_INIT(exti_stm32, STM32_EXTI_NAME, stm32_exti_init, &exti_data, NULL, PRIMARY, CONFIG_KERNEL_INIT_PRIORITY_DEVICE); +/** + * @brief set & unset for the interrupt callbacks + */ +void stm32_exti_set_callback(int line, stm32_exti_callback_t cb, void *arg) +{ + struct device *dev = DEVICE_GET(exti_stm32); + struct stm32_exti_data *data = dev->driver_data; + + __ASSERT(data->cb[line].cb == NULL, + "EXTI %d callback already registered", line); + + data->cb[line].cb = cb; + data->cb[line].data = arg; +} + +void stm32_exti_unset_callback(int line) +{ + struct device *dev = DEVICE_GET(exti_stm32); + struct stm32_exti_data *data = dev->driver_data; + + data->cb[line].cb = NULL; + data->cb[line].data = NULL; +} + /** * @brief connect all interrupts */ diff --git a/drivers/interrupt_controller/exti_stm32.h b/drivers/interrupt_controller/exti_stm32.h index a04dea8281a..ad753d6c4e6 100644 --- a/drivers/interrupt_controller/exti_stm32.h +++ b/drivers/interrupt_controller/exti_stm32.h @@ -38,14 +38,14 @@ * * @param line EXTI# line */ -void stm32_exti_enable(struct device *dev, int line); +void stm32_exti_enable(int line); /** * @brief disable EXTI interrupt for specific line * * @param line EXTI# line */ -void stm32_exti_disable(struct device *dev, int line); +void stm32_exti_disable(int line); /** * @brief EXTI trigger flags @@ -63,7 +63,7 @@ enum stm32_exti_trigger { * @param line EXTI# line * @param trg OR'ed stm32_exti_trigger flags */ -void stm32_exti_trigger(struct device *dev, int line, int trg); +void stm32_exti_trigger(int line, int trg); /* callback for exti interrupt */ typedef void (*stm32_exti_callback_t) (int line, void *user); @@ -75,14 +75,13 @@ typedef void (*stm32_exti_callback_t) (int line, void *user); * @param cb user callback * @param arg user arg */ -void stm32_exti_set_callback(struct device *dev, int line, - stm32_exti_callback_t cb, void *data); +void stm32_exti_set_callback(int line, stm32_exti_callback_t cb, void *data); /** * @brief unset EXTI interrupt callback * * @param line EXI# line */ -void stm32_exti_unset_callback(struct device *dev, int line); +void stm32_exti_unset_callback(int line); #endif /* _STM32_EXTI_H_ */