irq/dispatch: add argument ptr to irq_dispatch()
authorHeesub Shin <heesub.shin@samsung.com>
Thu, 30 Mar 2017 11:02:56 +0000 (20:02 +0900)
committerHeesub Shin <heesub.shin@samsung.com>
Tue, 18 Apr 2017 03:02:04 +0000 (12:02 +0900)
This commit adds a parameter to the interrupt handler for passing
private data to it, so that users can pass additional information to
their callback. This makes drivers that register irq handlers much
simpler than before. It seems to alter quite a lot, but this commit
itself does not inroduce any functional differences at all.

All credits should go to Mark Schulte who wrote the original patch for
NuttX.

Change-Id: Id22891b0f85646e8a2e86a7d4c8463bd8e67cd37
Signed-off-by: Mark Schulte <mark@mjs.pw>
[Shin: back-ported from the latest NuttX version]
Signed-off-by: Heesub Shin <heesub.shin@samsung.com>
25 files changed:
os/arch/arm/src/armv7-m/up_hardfault.c
os/arch/arm/src/armv7-m/up_memfault.c
os/arch/arm/src/armv7-m/up_svcall.c
os/arch/arm/src/armv7-r/arm_gicv2.c
os/arch/arm/src/armv7-r/gic.h
os/arch/arm/src/common/up_internal.h
os/arch/arm/src/s5j/s5j_gpio.c
os/arch/arm/src/s5j/s5j_i2c.c
os/arch/arm/src/s5j/s5j_i2c.h
os/arch/arm/src/s5j/s5j_pwm.c
os/arch/arm/src/s5j/s5j_pwm.h
os/arch/arm/src/s5j/s5j_rtc.c
os/arch/arm/src/s5j/s5j_serial.c
os/arch/arm/src/s5j/s5j_timerisr.c
os/arch/arm/src/sidk_s5jt200/src/s5jt200_buttons.c
os/drivers/net/enc28j60.c
os/drivers/net/phy_notify.c
os/drivers/sercomm/uart.c
os/drivers/serial/uart_16550.c
os/include/tinyara/irq.h
os/kernel/irq/irq.h
os/kernel/irq/irq_attach.c
os/kernel/irq/irq_dispatch.c
os/kernel/irq/irq_initialize.c
os/kernel/irq/irq_unexpectedisr.c

index acb85c1..2a17976 100644 (file)
  *
  ****************************************************************************/
 
-int up_hardfault(int irq, FAR void *context)
+int up_hardfault(int irq, FAR void *context, FAR void *arg)
 {
 #if defined(CONFIG_DEBUG_HARDFAULT) || !defined(CONFIG_ARMV7M_USEBASEPRI)
        uint32_t *regs = (uint32_t *)context;
@@ -148,7 +148,7 @@ int up_hardfault(int irq, FAR void *context)
 
                if (insn == INSN_SVC0) {
                        hfdbg("Forward SVCall\n");
-                       return up_svcall(irq, context);
+                       return up_svcall(irq, context, arg);
                }
        }
 #endif
index ffaf850..b6fc404 100644 (file)
  *
  ****************************************************************************/
 
-int up_memfault(int irq, FAR void *context)
+int up_memfault(int irq, FAR void *context, FAR void *arg)
 {
        /* Dump some memory management fault info */
 
index 9f91e06..ca55111 100644 (file)
@@ -169,7 +169,7 @@ static void dispatch_syscall(void)
  *
  ****************************************************************************/
 
-int up_svcall(int irq, FAR void *context)
+int up_svcall(int irq, FAR void *context, FAR void *arg)
 {
        uint32_t *regs = (uint32_t *)context;
        uint32_t cmd;
index 218bc38..57ec8d7 100644 (file)
@@ -172,8 +172,8 @@ void arm_gic0_initialize(void)
 #ifdef CONFIG_SMP
        /* Attach SGI interrupt handlers */
 
-       DEBUGVERIFY(irq_attach(GIC_IRQ_SGI1, arm_start_handler));
-       DEBUGVERIFY(irq_attach(GIC_IRQ_SGI2, arm_pause_handler));
+       DEBUGVERIFY(irq_attach(GIC_IRQ_SGI1, arm_start_handler, NULL));
+       DEBUGVERIFY(irq_attach(GIC_IRQ_SGI2, arm_pause_handler, NULL));
 #endif
 }
 
index 1465f79..090342d 100644 (file)
@@ -614,7 +614,7 @@ int arm_cpu_sgi(int sgi, unsigned int cpuset);
  ****************************************************************************/
 
 #ifdef CONFIG_SMP
-int arm_start_handler(int irq, FAR void *context);
+int arm_start_handler(int irq, FAR void *context, FAR void *arg);
 #endif
 
 /****************************************************************************
@@ -638,7 +638,7 @@ int arm_start_handler(int irq, FAR void *context);
  ****************************************************************************/
 
 #ifdef CONFIG_SMP
-int arm_pause_handler(int irq, FAR void *context);
+int arm_pause_handler(int irq, FAR void *context, FAR void *arg);
 #endif
 
 #undef EXTERN
index debf480..ac43478 100644 (file)
@@ -373,12 +373,12 @@ uint32_t *up_doirq(int irq, uint32_t *regs);
 
 /* Exception Handlers */
 
-int up_svcall(int irq, FAR void *context);
-int up_hardfault(int irq, FAR void *context);
+int up_svcall(int irq, FAR void *context, FAR void *arg);
+int up_hardfault(int irq, FAR void *context, FAR void *arg);
 
 #if defined(CONFIG_ARCH_CORTEXM3) || defined(CONFIG_ARCH_CORTEXM4)
 
-int up_memfault(int irq, FAR void *context);
+int up_memfault(int irq, FAR void *context, FAR void *arg);
 
 #endif                                                 /* CONFIG_ARCH_CORTEXM3 || CONFIG_ARCH_CORTEXM4 */
 
index bbb3dab..1ccf0be 100644 (file)
@@ -97,7 +97,7 @@ static void *__gpio_eint_filter_get_addr(int gpio);
 static void *__gpio_eint_get_addr(int gpio, unsigned offset);
 static void s5j_gpio_callback_wqueue(FAR void *arg);
 static void s5j_gpio_poll_expiry(int argc, uint32_t arg, ...);
-static int s5j_gpio_irq_handler(int irq, void *context);
+static int s5j_gpio_irq_handler(int irq, void *context, void *arg);
 static void s5j_gpio_enable_irq(struct gpio_dev_s *dev);
 static void s5j_gpio_disable_irq(struct gpio_dev_s *dev);
 static u32 gpio_get_irq_id(int gpio);
@@ -444,7 +444,7 @@ static void s5j_gpio_poll_expiry(int argc, uint32_t arg, ...)
  *  -1, if Error
  *
  ****************************************************************************/
-static int s5j_gpio_irq_handler(int irq, void *context)
+static int s5j_gpio_irq_handler(int irq, void *context, void *arg)
 {
        int i;
        struct gpio_dev_s *dev;
@@ -500,7 +500,7 @@ static void s5j_gpio_enable_irq(struct gpio_dev_s *dev)
        gpio_eint_unmask(gpio);
 
        irq = gpio_to_bank(gpio)->isr_num[s5j_gpio_port(gpio)];
-       (void)irq_attach(irq, (xcpt_t)s5j_gpio_irq_handler);
+       (void)irq_attach(irq, (xcpt_t)s5j_gpio_irq_handler, NULL);
        up_enable_irq(irq);
 }
 
index 28abec3..41c9470 100644 (file)
@@ -850,7 +850,7 @@ static void hsi2c_slave_setup(struct s5j_i2c_priv_s *priv, unsigned int mode, un
        hsi2c_set_trans_mode(priv->config->base, 0, 0);
 #ifdef CONFIG_S5J_I2C_INTERRUPT_MODE
        if ((priv->master == I2C_SLAVE_MODE) || (priv->mode == I2C_INTERRUPT)) {
-               irq_attach(priv->config->irq, priv->config->isr);
+               irq_attach(priv->config->irq, priv->config->isr, NULL);
        }
 #endif
 
@@ -946,7 +946,7 @@ static inline void s5j_i2c_sem_destroy(struct s5j_i2c_priv_s *priv)
 #endif
 }
 
-static int s5j_i2c0_interrupt(int irq, void *context)
+static int s5j_i2c0_interrupt(int irq, void *context, void *arg)
 {
        struct s5j_i2c_priv_s *priv;
 
@@ -957,7 +957,7 @@ static int s5j_i2c0_interrupt(int irq, void *context)
        return hsi2c_master_handler(priv);
 }
 
-static int s5j_i2c1_interrupt(int irq, void *context)
+static int s5j_i2c1_interrupt(int irq, void *context, void *arg)
 {
        struct s5j_i2c_priv_s *priv;
 
@@ -969,7 +969,7 @@ static int s5j_i2c1_interrupt(int irq, void *context)
        return hsi2c_master_handler(priv);
 }
 
-static int s5j_i2c2_interrupt(int irq, void *context)
+static int s5j_i2c2_interrupt(int irq, void *context, void *arg)
 {
        struct s5j_i2c_priv_s *priv;
 
@@ -982,7 +982,7 @@ static int s5j_i2c2_interrupt(int irq, void *context)
        return hsi2c_master_handler(priv);
 }
 
-static int s5j_i2c3_interrupt(int irq, void *context)
+static int s5j_i2c3_interrupt(int irq, void *context, void *arg)
 {
        struct s5j_i2c_priv_s *priv;
 
@@ -1025,7 +1025,7 @@ static int s5j_i2c_initialize(struct s5j_i2c_priv_s *priv, unsigned int frequenc
 
 #ifdef CONFIG_S5J_I2C_INTERRUPT_MODE
        if ((priv->master == I2C_SLAVE_MODE) || (priv->mode == I2C_INTERRUPT)) {
-               irq_attach(config->irq, config->isr);
+               irq_attach(config->irq, config->isr, NULL);
                up_enable_irq(config->irq);
        }
 #endif
index 0ab514d..942dab4 100644 (file)
@@ -167,7 +167,7 @@ struct s5j_i2c_config_s {
        uintptr_t base;                         /* I2C base address */
        unsigned int scl_pin;                   /* GPIO configuration for SCL as SCL */
        unsigned int sda_pin;                   /* GPIO configuration for SDA as SDA */
-       int (*isr)(int, void *);        /* Interrupt handler */
+       int (*isr)(int, void *, void *);        /* Interrupt handler */
        unsigned int irq;                               /* IRQ number */
        uint8_t devno;                          /* I2Cn where n = devno */
 };
@@ -255,10 +255,10 @@ static inline void s5j_i2c_sem_post(struct s5j_i2c_priv_s *priv);
 static inline void s5j_i2c_sem_init(struct s5j_i2c_priv_s *priv);
 static inline void s5j_i2c_sem_destroy(struct s5j_i2c_priv_s *priv);
 static int s5j_i2c_interrupt(struct s5j_i2c_priv_s *priv, unsigned int status);
-static int s5j_i2c0_interrupt(int irq, void *context);
-static int s5j_i2c1_interrupt(int irq, void *context);
-static int s5j_i2c2_interrupt(int irq, void *context);
-static int s5j_i2c3_interrupt(int irq, void *context);
+static int s5j_i2c0_interrupt(int irq, void *context, void *arg);
+static int s5j_i2c1_interrupt(int irq, void *context, void *arg);
+static int s5j_i2c2_interrupt(int irq, void *context, void *arg);
+static int s5j_i2c3_interrupt(int irq, void *context, void *arg);
 static int s5j_i2c_initialize(struct s5j_i2c_priv_s *priv, unsigned int frequency);
 static int s5j_i2c_uninitialize(struct s5j_i2c_priv_s *priv);
 
index 31c0898..7538491 100644 (file)
@@ -80,6 +80,7 @@
 /****************************************************************************
  * Static Function Prototypes
  ****************************************************************************/
+
 /****************************************************************************
  * Private Data
  ****************************************************************************/
@@ -178,7 +179,7 @@ static int s5j_pwm_interrupt(struct s5j_pwmtimer_s *priv)
  *   Zero on success; a negated errno value on failure
  *
  ****************************************************************************/
-static int s5j_pwm_timer_interrupt(int irq, void *context)
+static int s5j_pwm_timer_interrupt(int irq, void *context, void *arg)
 {
        signed int pwm_no;
        signed int irq_no;
@@ -692,7 +693,7 @@ FAR struct pwm_lowerhalf_s *s5j_pwminitialize(int timer)
        /* There is only 6 IRQ ID (PWM0_0 ~ PWM1_1 */
        if (timer < TOTAL_NUMBER_OF_PWMOUT) {
                /* IRQ register */
-               irq_attach(lower->irq, s5j_pwm_timer_interrupt);
+               irq_attach(lower->irq, s5j_pwm_timer_interrupt, NULL);
                up_disable_irq(lower->irq);
 
                /* IRQ trigger = level */
index 61f63ee..e09ec60 100644 (file)
@@ -142,7 +142,7 @@ struct s5j_pwmtimer_s {
 };
 
 static int s5j_pwm_interrupt(struct s5j_pwmtimer_s *priv);
-static int s5j_pwm_timer_interrupt(int irq, void *context);
+static int s5j_pwm_timer_interrupt(int irq, void *context, void *arg);
 static int s5j_pwm_setup(FAR struct pwm_lowerhalf_s *dev);
 static int s5j_pwm_shutdown(FAR struct pwm_lowerhalf_s *dev);
 #ifdef CONFIG_PWM_PULSECOUNT
index 4d52374..8c76b2f 100644 (file)
@@ -530,7 +530,7 @@ static int s5j_rtc_setalarm(FAR struct rtc_lowerhalf_s *lower, FAR const struct
 static int s5j_rtc_aiealarm(FAR struct rtc_lowerhalf_s *lower, bool enable)
 {
        if (enable) {
-               irq_attach(IRQ_TOP_RTC_ALARM, (xcpt_t) __isr_rtc_alarm);
+               irq_attach(IRQ_TOP_RTC_ALARM, (xcpt_t) __isr_rtc_alarm, NULL);
                up_enable_irq(IRQ_TOP_RTC_ALARM);
 
                HW_REG32(S5J_RTC_BASE, RTCALM) |= RTC_GLB_ALM_EN;       /* Enable Alarm Global */
@@ -591,7 +591,7 @@ static int s5j_rtc_set_tick_period(FAR struct rtc_lowerhalf_s *lower, FAR unsign
 static int s5j_rtc_enable_tickirq(FAR struct rtc_lowerhalf_s *lower, bool enable)
 {
        if (enable) {
-               irq_attach(IRQ_TOP_RTC_TIC, (xcpt_t) __isr_rtc_tick);
+               irq_attach(IRQ_TOP_RTC_TIC, (xcpt_t) __isr_rtc_tick, NULL);
                up_enable_irq(IRQ_TOP_RTC_TIC);
 
                HW_REG32(S5J_RTC_BASE, RTCCON) |= RTCCON_TICEN;         /* Enable Tick Timer */
@@ -673,7 +673,7 @@ int s5j_rtc_initialize(void)
 
 #ifdef CONFIG_RTC_ALARM
 
-       irq_attach(IRQ_TOP_RTC_ALARM, (xcpt_t) __isr_rtc_alarm);
+       irq_attach(IRQ_TOP_RTC_ALARM, (xcpt_t) __isr_rtc_alarm, NULL);
        up_enable_irq(IRQ_TOP_RTC_ALARM);
 
        /* Set Alarm after 1 min */
index acd338a..0222acf 100644 (file)
@@ -167,7 +167,7 @@ static int up_setup(struct uart_dev_s *dev);
 static void up_shutdown(struct uart_dev_s *dev);
 static int up_attach(struct uart_dev_s *dev);
 static void up_detach(struct uart_dev_s *dev);
-static int up_interrupt(int irq, void *context);
+static int up_interrupt(int irq, void *context, void *arg);
 static int up_ioctl(struct file *filep, int cmd, unsigned long arg);
 static int up_receive(struct uart_dev_s *dev, uint32_t *status);
 static void up_rxint(struct uart_dev_s *dev, bool enable);
@@ -1116,7 +1116,7 @@ static int up_attach(struct uart_dev_s *dev)
 
        /* Attach and enable the IRQ */
 
-       ret = irq_attach(priv->irq, up_interrupt);
+       ret = irq_attach(priv->irq, up_interrupt, NULL);
        if (ret == OK) {
                /* Enable the interrupt (RX and TX interrupts are still disabled
                 * in the UART
@@ -1157,7 +1157,7 @@ static void up_detach(struct uart_dev_s *dev)
  *
  ****************************************************************************/
 
-static int up_interrupt(int irq, void *context)
+static int up_interrupt(int irq, void *context, void *arg)
 {
        struct uart_dev_s *dev = NULL;
        struct up_dev_s *priv;
index 16ce63b..b2c33d7 100644 (file)
@@ -96,7 +96,7 @@
  *   of the systems.
  *
  ****************************************************************************/
-int up_timerisr(int irq, uint32_t *regs)
+int up_timerisr(int irq, uint32_t *regs, void *arg)
 {
        /* Reset timer */
        s5j_mct_clear_pending(MCT_L0);
@@ -127,7 +127,7 @@ void up_timer_initialize(void)
        s5j_mct_local_start_timer(MCT_L0);
 
        /* Attach the timer interrupt vector */
-       irq_attach(IRQ_MCT_L0, (xcpt_t) up_timerisr);
+       irq_attach(IRQ_MCT_L0, (xcpt_t) up_timerisr, NULL);
 
        /* Enable the timer interrupt */
        up_enable_irq(IRQ_MCT_L0);
index b923f1b..c68a015 100644 (file)
@@ -168,11 +168,11 @@ xcpt_t board_button_irq(int id, xcpt_t irqhandler)
 
        if (irqhandler == NULL) {
                up_disable_irq(IRQ_EINT0);
-               irq_attach(IRQ_EINT0, NULL);
+               irq_attach(IRQ_EINT0, NULL, NULL);
                return oldhandler;
        }
 
-       if (irq_attach(IRQ_EINT0, irqhandler) == OK) {
+       if (irq_attach(IRQ_EINT0, irqhandler, NULL) == OK) {
                up_enable_irq(IRQ_EINT0);
        } else {
                /* TO DO: How can it contolled ? */
index 31bb574..2ed5422 100644 (file)
@@ -314,7 +314,7 @@ static void enc_rxdispatch(FAR struct enc_driver_s *priv);
 #endif
 static void enc_pktif(FAR struct enc_driver_s *priv);
 static void enc_irqworker(FAR void *arg);
-static int enc_interrupt(int irq, FAR void *context);
+static int enc_interrupt(int irq, FAR void *context, FAR void *arg);
 
 /* Watchdog timer expirations */
 static void enc_toworker(FAR void *arg);
@@ -1759,7 +1759,7 @@ static void enc_irqworker(FAR void *arg)
  * Assumptions:
  *
  ****************************************************************************/
-static int enc_interrupt(int irq, FAR void *context)
+static int enc_interrupt(int irq, FAR void *context, FAR void *arg)
 {
        register FAR struct enc_driver_s *priv = &g_enc28j60[0];
 
index 7407a54..6e94961 100644 (file)
@@ -132,13 +132,13 @@ struct phy_notify_s {
  ****************************************************************************/
 
 static int phy_handler(FAR struct phy_notify_s *client);
-static int phy_handler_0(int irq, FAR void *context);
+static int phy_handler_0(int irq, FAR void *context, FAR void *arg);
 #if CONFIG_PHY_NOTIFICATION_NCLIENTS > 1
-static int phy_handler_1(int irq, FAR void *context);
+static int phy_handler_1(int irq, FAR void *context, FAR void *arg);
 #if CONFIG_PHY_NOTIFICATION_NCLIENTS > 2
-static int phy_handler_2(int irq, FAR void *context);
+static int phy_handler_2(int irq, FAR void *context, FAR void *arg);
 #if CONFIG_PHY_NOTIFICATION_NCLIENTS > 3
-static int phy_handler_3(int irq, FAR void *context);
+static int phy_handler_3(int irq, FAR void *context, FAR void *arg);
 #endif
 #endif
 #endif
@@ -305,27 +305,27 @@ static int phy_handler(FAR struct phy_notify_s *client)
  * Name: phy_handler_0, phy_handler_1, ...
  ****************************************************************************/
 
-static int phy_handler_0(int irq, FAR void *context)
+static int phy_handler_0(int irq, FAR void *context, FAR void *arg)
 {
        return phy_handler(&g_notify_clients[0]);
 }
 
 #if CONFIG_PHY_NOTIFICATION_NCLIENTS > 1
-static int phy_handler_1(int irq, FAR void *context)
+static int phy_handler_1(int irq, FAR void *context, FAR void *arg)
 {
        return phy_handler(&g_notify_clients[1]);
 }
 #endif
 
 #if CONFIG_PHY_NOTIFICATION_NCLIENTS > 2
-static int phy_handler_2(int irq, FAR void *context)
+static int phy_handler_2(int irq, FAR void *context, FAR void *arg)
 {
        return phy_handler(&g_notify_clients[2]);
 }
 #endif
 
 #if CONFIG_PHY_NOTIFICATION_NCLIENTS > 3
-static int phy_handler_3(int irq, FAR void *context)
+static int phy_handler_3(int irq, FAR void *context, FAR void *arg)
 {
        return phy_handler(&g_notify_clients[3]);
 }
index 7386b65..8b017e3 100644 (file)
@@ -290,7 +290,7 @@ static void uart_irq_handler_cons(__unused enum irq_nr irqnr)
 }
 #endif
 
-static void uart_irq_handler_sercomm(__unused enum irq_nr irqnr, __unused void *context)
+static void uart_irq_handler_sercomm(__unused enum irq_nr irqnr, __unused void *context, void *arg)
 {
        const uint8_t uart = SERCOMM_UART_NR;
        uint8_t iir, ch;
@@ -364,7 +364,7 @@ void uart_init(uint8_t uart, uint8_t interrupts)
 
        if (uart == SERCOMM_UART_NR) {
                sercomm_init();
-               irq_attach(IRQ_UART_MODEM, (xcpt_t)uart_irq_handler_sercomm);
+               irq_attach(IRQ_UART_MODEM, (xcpt_t)uart_irq_handler_sercomm, NULL);
                up_enable_irq(IRQ_UART_MODEM);
                uart_irq_enable(uart, UART_IRQ_RX_CHAR, 1);
        }
@@ -437,7 +437,7 @@ void uart_poll(uint8_t uart)
        } else
 #endif
        {
-               uart_irq_handler_sercomm(0, NULL);
+               uart_irq_handler_sercomm(0, NULL, NULL);
        }
 }
 
index 77e5300..165b481 100644 (file)
@@ -110,7 +110,7 @@ static void u16550_shutdown(struct uart_dev_s *dev);
 static int u16550_attach(struct uart_dev_s *dev);
 static void u16550_detach(struct uart_dev_s *dev);
 #ifndef CONFIG_SUPPRESS_SERIAL_INTS
-static int u16550_interrupt(int irq, void *context);
+static int u16550_interrupt(int irq, void *context, void *arg);
 #endif
 static int u16550_ioctl(struct file *filep, int cmd, unsigned long arg);
 static int u16550_receive(struct uart_dev_s *dev, uint32_t *status);
@@ -670,7 +670,7 @@ static int u16550_attach(struct uart_dev_s *dev)
 
        /* Attach and enable the IRQ */
 
-       ret = irq_attach(priv->irq, u16550_interrupt);
+       ret = irq_attach(priv->irq, u16550_interrupt, NULL);
 #ifndef CONFIG_ARCH_NOINTC
        if (ret == OK) {
                /* Enable the interrupt (RX and TX interrupts are still disabled
@@ -720,7 +720,7 @@ static void u16550_detach(struct uart_dev_s *dev)
  ****************************************************************************/
 
 #ifndef CONFIG_SUPPRESS_SERIAL_INTS
-static int u16550_interrupt(int irq, void *context)
+static int u16550_interrupt(int irq, void *context, void *arg)
 {
        struct uart_dev_s *dev = NULL;
        struct u16550_s *priv;
index 9678709..6a643d6 100644 (file)
@@ -68,7 +68,7 @@
  */
 
 #ifndef __ASSEMBLY__
-#define irq_detach(isr) irq_attach(isr, NULL)
+#define irq_detach(isr) irq_attach(isr, NULL, NULL)
 #endif
 
 /****************************************************************************
@@ -78,7 +78,7 @@
 /* This struct defines the way the registers are stored */
 
 #ifndef __ASSEMBLY__
-typedef int (*xcpt_t)(int irq, FAR void *context);
+typedef int (*xcpt_t)(int irq, FAR void *context, FAR void *arg);
 #endif
 
 /* Now include architecture-specific types */
@@ -106,11 +106,11 @@ extern "C" {
  *
  * Description:
  *   Configure the IRQ subsystem so that IRQ number 'irq' is dispatched to
- *   'isr'
+ *   'isr' with argument 'arg'
  *
  ****************************************************************************/
 
-int irq_attach(int irq, xcpt_t isr);
+int irq_attach(int irq, xcpt_t isr, FAR void *arg);
 
 #undef EXTERN
 #ifdef __cplusplus
index a303b13..178fd6b 100644 (file)
  * Public Type Declarations
  ****************************************************************************/
 
-extern FAR xcpt_t g_irqvector[NR_IRQS + 1];
+struct irq {
+       xcpt_t handler;
+       FAR void *arg;
+};
+
+extern struct irq g_irqvector[NR_IRQS + 1];
 
 /****************************************************************************
  * Public Variables
@@ -89,7 +94,7 @@ extern "C" {
 #endif
 
 void weak_function irq_initialize(void);
-int irq_unexpected_isr(int irq, FAR void *context);
+int irq_unexpected_isr(int irq, FAR void *context, FAR void *arg);
 
 #undef EXTERN
 #ifdef __cplusplus
index 06f8728..ea6f46f 100644 (file)
@@ -93,7 +93,7 @@
  *
  ****************************************************************************/
 
-int irq_attach(int irq, xcpt_t isr)
+int irq_attach(int irq, xcpt_t isr, FAR void *arg)
 {
 #if NR_IRQS > 0
        int ret = ERROR;
@@ -126,11 +126,13 @@ int irq_attach(int irq, xcpt_t isr)
                         */
 
                        isr = irq_unexpected_isr;
+                       arg = NULL;
                }
 
                /* Save the new ISR in the table. */
 
-               g_irqvector[irq] = isr;
+               g_irqvector[irq].handler = isr;
+               g_irqvector[irq].arg     = arg;
                irqrestore(state);
                ret = OK;
        }
index c6fd164..31b9c85 100644 (file)
 void irq_dispatch(int irq, FAR void *context)
 {
        xcpt_t vector;
+       FAR void *arg;
 
        /* Perform some sanity checks */
 
 #if NR_IRQS > 0
-       if ((unsigned)irq >= NR_IRQS || g_irqvector[irq] == NULL) {
+       if ((unsigned)irq >= NR_IRQS || g_irqvector[irq].handler == NULL) {
                vector = irq_unexpected_isr;
+               arg    = NULL;
        } else {
-               vector = g_irqvector[irq];
+               vector = g_irqvector[irq].handler;
+               arg    = g_irqvector[irq].arg;
        }
 #else
        vector = irq_unexpected_isr;
@@ -113,5 +116,5 @@ void irq_dispatch(int irq, FAR void *context)
 
        /* Then dispatch to the interrupt handler */
 
-       vector(irq, context);
+       vector(irq, context, arg);
 }
index 128c21d..adff07d 100644 (file)
@@ -72,7 +72,7 @@
  * Global Variables
  ****************************************************************************/
 
-FAR xcpt_t g_irqvector[NR_IRQS + 1];
+struct irq g_irqvector[NR_IRQS + 1];
 
 /****************************************************************************
  * Private Variables
@@ -101,6 +101,7 @@ void irq_initialize(void)
        /* Point all interrupt vectors to the unexpected interrupt */
 
        for (i = 0; i < NR_IRQS; i++) {
-               g_irqvector[i] = irq_unexpected_isr;
+               g_irqvector[i].handler = irq_unexpected_isr;
+               g_irqvector[i].arg     = NULL;
        }
 }
index 94a6a5a..26c235a 100644 (file)
@@ -95,7 +95,7 @@
  *
  ****************************************************************************/
 
-int irq_unexpected_isr(int irq, FAR void *context)
+int irq_unexpected_isr(int irq, FAR void *context, FAR void *arg)
 {
        (void)irqsave();
        lldbg("irq: %d\n", irq);