diff --git a/arch/arm/src/stm32/stm32f40xxx_rtcc.c b/arch/arm/src/stm32/stm32f40xxx_rtcc.c
index cbd136d6d5..c0801a4a8f 100644
--- a/arch/arm/src/stm32/stm32f40xxx_rtcc.c
+++ b/arch/arm/src/stm32/stm32f40xxx_rtcc.c
@@ -847,7 +847,7 @@ static inline void rtc_enable_alarm(void)
        * 3. Configure the RTC to generate RTC alarms (Alarm A or Alarm B).
        */
 
-      stm32_exti_alarm(true, false, true, stm32_rtc_alarm_handler);
+      stm32_exti_alarm(true, false, true, stm32_rtc_alarm_handler, NULL);
       g_alarm_enabled = true;
     }
 }
diff --git a/arch/arm/src/stm32l4/stm32l4_exti_alarm.c b/arch/arm/src/stm32l4/stm32l4_exti_alarm.c
index 2cfcbe052e..af0dac1bd9 100644
--- a/arch/arm/src/stm32l4/stm32l4_exti_alarm.c
+++ b/arch/arm/src/stm32l4/stm32l4_exti_alarm.c
@@ -124,7 +124,7 @@ xcpt_t stm32l4_exti_alarm(bool risingedge, bool fallingedge, bool event,
 
   oldhandler       = g_alarm_callback;
   g_alarm_callback = func;
-  g__callback_arg  = arg;
+  g_callback_arg   = arg;
 
   /* Install external interrupt handlers (if not already attached) */
 
diff --git a/arch/arm/src/stm32l4/stm32l4_exti_pwr.c b/arch/arm/src/stm32l4/stm32l4_exti_pwr.c
index 9ac88be2dc..62c1dcfa57 100644
--- a/arch/arm/src/stm32l4/stm32l4_exti_pwr.c
+++ b/arch/arm/src/stm32l4/stm32l4_exti_pwr.c
@@ -68,10 +68,6 @@
 static xcpt_t g_pvd_callback;
 static void  *g_callback_arg;
 
-/****************************************************************************
- * Public Data
- ****************************************************************************/
-
 /****************************************************************************
  * Private Functions
  ****************************************************************************/
diff --git a/arch/arm/src/stm32l4/stm32l4_exti_pwr.h b/arch/arm/src/stm32l4/stm32l4_exti_pwr.h
index 5789e37076..109da43458 100644
--- a/arch/arm/src/stm32l4/stm32l4_exti_pwr.h
+++ b/arch/arm/src/stm32l4/stm32l4_exti_pwr.h
@@ -57,6 +57,7 @@
  *  - rising/falling edge: enables interrupt on rising/falling edge
  *  - event:  generate event when set
  *  - func:   when non-NULL, generate interrupt
+ *  - arg:    Argument passed to the interrupt callback
  *
  * Returns:
  *   The previous value of the interrupt handler function pointer.  This
@@ -66,6 +67,6 @@
  ****************************************************************************/
 
 xcpt_t stm32l4_exti_pvd(bool risingedge, bool fallingedge, bool event,
-                      xcpt_t func);
+                        xcpt_t func, void *arg);
 
 #endif /* STM32L4_EXTI_PWR_H_ */
diff --git a/configs/fire-stm32v2/src/stm32_enc28j60.c b/configs/fire-stm32v2/src/stm32_enc28j60.c
index 7ce3f4de65..9ac4040e4b 100644
--- a/configs/fire-stm32v2/src/stm32_enc28j60.c
+++ b/configs/fire-stm32v2/src/stm32_enc28j60.c
@@ -165,7 +165,8 @@ static void up_enable(FAR const struct enc_lower_s *lower)
 
 static void up_disable(FAR const struct enc_lower_s *lower)
 {
-  (void)stm32_gpiosetevent(GPIO_ENC28J60_INTR, false, true, true, NULL);
+  (void)stm32_gpiosetevent(GPIO_ENC28J60_INTR, false, true, true,
+                           NULL, NULL);
 }
 
 /****************************************************************************
diff --git a/configs/hymini-stm32v/src/stm32_ts.c b/configs/hymini-stm32v/src/stm32_ts.c
index a4abc234db..e8889571d2 100644
--- a/configs/hymini-stm32v/src/stm32_ts.c
+++ b/configs/hymini-stm32v/src/stm32_ts.c
@@ -108,7 +108,7 @@ static void hymini_ts_irq_enable(FAR struct ads7843e_config_s *state,
 {
   iinfo("%d\n", enable);
 
-  stm32_gpiosetevent(GPIO_TS_IRQ, true, true, true, enable? tc_isr:NULL);
+  stm32_gpiosetevent(GPIO_TS_IRQ, true, true, true, enable ? tc_isr : NULL, NULL);
 }
 
 /* Acknowledge/clear any pending GPIO interrupt */
diff --git a/configs/stm32f4discovery/src/stm32_pmbuttons.c b/configs/stm32f4discovery/src/stm32_pmbuttons.c
index 750eaadbbe..12d3e21e51 100644
--- a/configs/stm32f4discovery/src/stm32_pmbuttons.c
+++ b/configs/stm32f4discovery/src/stm32_pmbuttons.c
@@ -96,7 +96,7 @@ static int button_handler(int irq, FAR void *context);
  ****************************************************************************/
 
 #ifdef CONFIG_ARCH_IRQBUTTONS
-static int button_handler(int irq, FAR void *context)
+static int button_handler(int irq, FAR void *context, FAR void *arg)
 {
   /* At this point the MCU should have already awakened.  The state
    * change will be handled in the IDLE loop when the system is re-awakened
@@ -130,7 +130,7 @@ void stm32_pm_buttons(void)
   board_button_initialize();
 
 #ifdef CONFIG_ARCH_IRQBUTTONS
-      xcpt_t oldhandler = board_button_irq(0, button_handler);
+      xcpt_t oldhandler = board_button_irq(0, button_handler, NULL);
 
       if (oldhandler != NULL)
         {
diff --git a/configs/stm32l476-mdk/src/stm32_buttons.c b/configs/stm32l476-mdk/src/stm32_buttons.c
index a44849bf4a..7dfc046941 100644
--- a/configs/stm32l476-mdk/src/stm32_buttons.c
+++ b/configs/stm32l476-mdk/src/stm32_buttons.c
@@ -1,7 +1,7 @@
 /****************************************************************************
  * configs/stm32l476-mdk/src/stm32_buttons.c
  *
- *   Copyright (C) 2016 Gregory Nutt. All rights reserved.
+ *   Copyright (C) 2016-2017 Gregory Nutt. All rights reserved.
  *   Author: dev@ziggurat29.com
  *
  * Redistribution and use in source and binary forms, with or without
@@ -157,7 +157,7 @@ xcpt_t board_button_irq(int id, xcpt_t irqhandler, FAR void *arg)
   if (id >= MIN_IRQBUTTON && id <= MAX_IRQBUTTON)
     {
       oldhandler = stm32l4_gpiosetevent(g_buttons[id], true, true, true,
-                                        irqhandler);
+                                        irqhandler, arg);
     }
 
   return oldhandler;
diff --git a/configs/stm32l476vg-disco/src/stm32_buttons.c b/configs/stm32l476vg-disco/src/stm32_buttons.c
index ca96eecf71..1151003c7d 100644
--- a/configs/stm32l476vg-disco/src/stm32_buttons.c
+++ b/configs/stm32l476vg-disco/src/stm32_buttons.c
@@ -1,7 +1,7 @@
 /****************************************************************************
  * configs/stm32l476vg-disco/src/stm32_buttons.c
  *
- *   Copyright (C) 2016 Gregory Nutt. All rights reserved.
+ *   Copyright (C) 2016-2017 Gregory Nutt. All rights reserved.
  *   Author: dev@ziggurat29.com
  *
  * Redistribution and use in source and binary forms, with or without
@@ -333,7 +333,8 @@ xcpt_t board_button_irq(int id, xcpt_t irqhandler, FAR void *arg)
 
   if (id >= MIN_IRQBUTTON && id <= MAX_IRQBUTTON)
     {
-      oldhandler = stm32l4_gpiosetevent(g_buttons[id], true, true, true, irqhandler);
+      oldhandler = stm32l4_gpiosetevent(g_buttons[id], true, true, true,
+                                        irqhandler, arg);
     }
 
   return oldhandler;
diff --git a/configs/stm32l476vg-disco/src/stm32_usb.c b/configs/stm32l476vg-disco/src/stm32_usb.c
index de9f08c4ee..0b08a9264d 100644
--- a/configs/stm32l476vg-disco/src/stm32_usb.c
+++ b/configs/stm32l476vg-disco/src/stm32_usb.c
@@ -311,7 +311,7 @@ void stm32l4_usbhost_vbusdrive(int iface, bool enable)
 #ifdef CONFIG_USBHOST
 xcpt_t stm32l4_setup_overcurrent(xcpt_t handler)
 {
-  return stm32l4_gpiosetevent(GPIO_OTGFS_OVER, true, true, true, handler);
+  return stm32l4_gpiosetevent(GPIO_OTGFS_OVER, true, true, true, handler, NULL);
 }
 #endif
 
diff --git a/drivers/input/ads7843e.c b/drivers/input/ads7843e.c
index f7019639de..d9c2c3b988 100644
--- a/drivers/input/ads7843e.c
+++ b/drivers/input/ads7843e.c
@@ -109,7 +109,7 @@ static int ads7843e_sample(FAR struct ads7843e_dev_s *priv,
 static int ads7843e_waitsample(FAR struct ads7843e_dev_s *priv,
                                FAR struct ads7843e_sample_s *sample);
 static void ads7843e_worker(FAR void *arg);
-static int ads7843e_interrupt(int irq, FAR void *context);
+static int ads7843e_interrupt(int irq, FAR void *context, FAR void *arg);
 
 /* Character driver methods */
 
@@ -703,7 +703,7 @@ ignored:
  * Name: ads7843e_interrupt
  ****************************************************************************/
 
-static int ads7843e_interrupt(int irq, FAR void *context)
+static int ads7843e_interrupt(int irq, FAR void *context, FAR void *arg)
 {
   FAR struct ads7843e_dev_s    *priv;
   FAR struct ads7843e_config_s *config;
diff --git a/drivers/net/enc28j60.c b/drivers/net/enc28j60.c
index 9289a1bb33..8f2ab3ff02 100644
--- a/drivers/net/enc28j60.c
+++ b/drivers/net/enc28j60.c
@@ -327,7 +327,7 @@ static void enc_rxerif(FAR struct enc_driver_s *priv);
 static void enc_rxdispatch(FAR struct enc_driver_s *priv);
 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 */
 
@@ -1853,7 +1853,7 @@ 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)
 {
   register FAR struct enc_driver_s *priv = &g_enc28j60[0];