Using CLOCK_REALTIME as the source for event timestamps is crucial for some specific applications, particularly those requiring timetamps relative to a PTP clock, so provide an option to switch the event timestamp source from the default CLOCK_MONOTONIC to CLOCK_REALTIME. Note that CLOCK_REALTIME was the default source clock for GPIO until Linux 5.7 when it was changed to CLOCK_MONOTONIC due to issues with the shifting of the realtime clock. Providing this option maintains the CLOCK_MONOTONIC as the default, while also providing a path forward for those dependent on the pre-5.7 behaviour.
Showing the changes to include/uapi/linux (1 of 3 files). Show all
Unified · Split
| @@ -65,6 +65,7 @@ struct gpiochip_info { · 64 unmodified lines | ||
| 65 | 65 | * @GPIO_V2_LINE_FLAG_BIAS_PULL_UP: line has pull-up bias enabled |
| 66 | 66 | * @GPIO_V2_LINE_FLAG_BIAS_PULL_DOWN: line has pull-down bias enabled |
| 67 | 67 | * @GPIO_V2_LINE_FLAG_BIAS_DISABLED: line has bias disabled |
| 68 | + * @GPIO_V2_LINE_FLAG_EVENT_CLOCK_REALTIME: line events contain REALTIME timestamps | |
| 68 | 69 | */ |
| 69 | 70 | enum gpio_v2_line_flag { |
| 70 | 71 | GPIO_V2_LINE_FLAG_USED = _BITULL(0), |
| @@ -78,6 +79,7 @@ enum gpio_v2_line_flag { · 7 unmodified lines | ||
| 78 | 79 | GPIO_V2_LINE_FLAG_BIAS_PULL_UP = _BITULL(8), |
| 79 | 80 | GPIO_V2_LINE_FLAG_BIAS_PULL_DOWN = _BITULL(9), |
| 80 | 81 | GPIO_V2_LINE_FLAG_BIAS_DISABLED = _BITULL(10), |
| 82 | + GPIO_V2_LINE_FLAG_EVENT_CLOCK_REALTIME = _BITULL(11), | |
| 81 | 83 | }; |
| 82 | 84 | |
| 83 | 85 | /** |
| @@ -270,9 +272,6 @@ enum gpio_v2_line_event_id { · 186 unmodified lines | ||
| 270 | 272 | /** |
| 271 | 273 | * struct gpio_v2_line_event - The actual event being pushed to userspace |
| 272 | 274 | * @timestamp_ns: best estimate of time of event occurrence, in nanoseconds. |
| 273 | − * The @timestamp_ns is read from %CLOCK_MONOTONIC and is intended to allow | |
| 274 | − * the accurate measurement of the time between events. It does not provide | |
| 275 | − * the wall-clock time. | |
| 276 | 275 | * @id: event identifier with value from &enum gpio_v2_line_event_id |
| 277 | 276 | * @offset: the offset of the line that triggered the event |
| 278 | 277 | * @seqno: the sequence number for this event in the sequence of events for |
| @@ -280,6 +279,13 @@ enum gpio_v2_line_event_id { · 1 unmodified line | ||
| 280 | 279 | * @line_seqno: the sequence number for this event in the sequence of |
| 281 | 280 | * events on this particular line |
| 282 | 281 | * @padding: reserved for future use |
| 282 | + * | |
| 283 | + * By default the @timestamp_ns is read from %CLOCK_MONOTONIC and is | |
| 284 | + * intended to allow the accurate measurement of the time between events. | |
| 285 | + * It does not provide the wall-clock time. | |
| 286 | + * | |
| 287 | + * If the %GPIO_V2_LINE_FLAG_EVENT_CLOCK_REALTIME flag is set then the | |
| 288 | + * @timestamp_ns is read from %CLOCK_REALTIME. | |
| 283 | 289 | */ |
| 284 | 290 | struct gpio_v2_line_event { |
| 285 | 291 | __aligned_u64 timestamp_ns; |