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: