This patch allows to select which time source (monotonic/realtime) is used to 
timestamp GPIO events.
The time source used to be monotonic which is the opposite of what other 
drivers do. Now default changed to realtime, plus new API added to go back to 
monotonic.


Signed-off-by: François LEGAL <de...@thom.fr.eu.org>
---
diff --git a/include/rtdm/uapi/gpio.h b/include/rtdm/uapi/gpio.h
index 2839f7d51..f8a93b7f7 100644
--- a/include/rtdm/uapi/gpio.h
+++ b/include/rtdm/uapi/gpio.h
@@ -30,6 +30,8 @@ struct rtdm_gpio_readout {
 #define GPIO_RTIOC_REQS                _IO(RTDM_CLASS_GPIO, 4)
 #define GPIO_RTIOC_RELS                _IO(RTDM_CLASS_GPIO, 5)
 #define GPIO_RTIOC_TS          _IOR(RTDM_CLASS_GPIO, 7, int)
+#define GPIO_RTIOC_TS_REAL  _IOR(RTDM_CLASS_GPIO, 8, int)
+#define GPIO_RTIOC_TS_MONO  _IOR(RTDM_CLASS_GPIO, 9, int)

 #define GPIO_TRIGGER_NONE              0x0 /* unspecified */
 #define GPIO_TRIGGER_EDGE_RISING       0x1
diff --git a/kernel/drivers/gpio/gpio-core.c b/kernel/drivers/gpio/gpio-core.c
index bc283064b..3eaf425c6 100644
--- a/kernel/drivers/gpio/gpio-core.c
+++ b/kernel/drivers/gpio/gpio-core.c
@@ -36,13 +36,15 @@ static LIST_HEAD(rtdm_gpio_chips);

 static DEFINE_MUTEX(chip_lock);

+static nanosecs_abs_t (*timestamp_get_func_ptr)(void) = rtdm_clock_read;
+
 static int gpio_pin_interrupt(rtdm_irq_t *irqh)
 {
        struct rtdm_gpio_pin *pin;

        pin = rtdm_irq_get_arg(irqh, struct rtdm_gpio_pin);

-       pin->timestamp = rtdm_clock_read_monotonic();
+       pin->timestamp = timestamp_get_func_ptr();
        rtdm_event_signal(&pin->event);

        return RTDM_IRQ_HANDLED;
@@ -192,9 +194,18 @@ static int gpio_pin_ioctl_nrt(struct rtdm_fd *fd,
                chan->requested = false;
                break;
        case GPIO_RTIOC_TS:
+       case GPIO_RTIOC_TS_REAL:
+               ret = rtdm_safe_copy_from_user(fd, &val, arg, sizeof(val));
+               if (ret)
+                       return ret;
+               timestamp_get_func_ptr = rtdm_clock_read;
+               chan->want_timestamp = !!val;
+               break;
+       case GPIO_RTIOC_TS_MONO:
                ret = rtdm_safe_copy_from_user(fd, &val, arg, sizeof(val));
                if (ret)
                        return ret;
+               timestamp_get_func_ptr = rtdm_clock_read_monotonic;
                chan->want_timestamp = !!val;
                break;
        default:


Reply via email to