drivers/ioexpander: The IRQ subsystem now supports passing a void * parameter to IRQ handlers. Use that method to support multiple pc9555 devices, by passing a pointer to the device to the board defined irq handler. Now the CONFIG_ for multiple PCA devices just allocates device structures dynamically instead of statically when not enabled.

The same interrupt handler is entered with the device structure parameter in all situations,
multiple or single PCA. One should still be careful if multiple PCA devices share the same IRQ.
This commit is contained in:
Sebastien Lorquet 2017-10-19 08:10:40 -06:00 committed by Gregory Nutt
parent ee1330ed5e
commit 1182702b80
3 changed files with 5 additions and 18 deletions

View File

@ -26,7 +26,6 @@ if IOEXPANDER_PCA9555
config PCA9555_MULTIPLE
bool "Multiple PCA9555 Devices"
default n
depends on EXPERIMENTAL
---help---
Can be defined to support multiple PCA9555 devices on board.

View File

@ -868,18 +868,9 @@ static void pca9555_irqworker(void *arg)
*
****************************************************************************/
static int pca9555_interrupt(int irq, FAR void *context)
static int pca9555_interrupt(int irq, FAR void *context, FAR void *arg)
{
#ifdef CONFIG_PCA9555_MULTIPLE
/* To support multiple devices,
* retrieve the pca structure using the irq number.
*/
# warning Missing logic
#else
register FAR struct pca9555_dev_s *pca = &g_pca9555;
#endif
register FAR struct pca9555_dev_s *pca = (FAR struct pca9555_dev_s*)arg;
/* In complex environments, we cannot do I2C transfers from the interrupt
* handler because semaphores are probably used to lock the I2C bus. In
@ -956,7 +947,7 @@ FAR struct ioexpander_dev_s *pca9555_initialize(FAR struct i2c_master_s *i2cdev,
pcadev->config = config;
#ifdef CONFIG_PCA9555_INT_ENABLE
pcadev->config->attach(pcadev->config, pca9555_interrupt);
pcadev->config->attach(pcadev->config, pca9555_interrupt, pcadev);
pcadev->config->enable(pcadev->config, TRUE);
#endif

View File

@ -74,10 +74,6 @@ struct pca9555_config_s
* be provided for each so that their interrupts can be distinguished.
*/
#ifdef CONFIG_PCA9555_MULTIPLE
int irq; /* IRQ number received by interrupt handler. */
#endif
/* IRQ/GPIO access callbacks. These operations all hidden behind
* callbacks to isolate the PCA9555 driver from differences in GPIO
* interrupt handling by varying boards and MCUs.
@ -86,7 +82,8 @@ struct pca9555_config_s
* enable - Enable or disable the GPIO interrupt
*/
CODE int (*attach)(FAR struct pca9555_config_s *state, xcpt_t isr);
CODE int (*attach)(FAR struct pca9555_config_s *state, xcpt_t isr,
FAR void *arg);
CODE void (*enable)(FAR struct pca9555_config_s *state, bool enable);
#endif
};