| .. SPDX-License-Identifier: GPL-2.0+ | 
 |  | 
 | ============================================ | 
 | The Linux Hardware Timestamping Engine (HTE) | 
 | ============================================ | 
 |  | 
 | :Author: Dipen Patel | 
 |  | 
 | Introduction | 
 | ------------ | 
 |  | 
 | Certain devices have built in hardware timestamping engines which can | 
 | monitor sets of system signals, lines, buses etc... in realtime for state | 
 | change; upon detecting the change they can automatically store the timestamp at | 
 | the moment of occurrence. Such functionality may help achieve better accuracy | 
 | in obtaining timestamps than using software counterparts i.e. ktime and | 
 | friends. | 
 |  | 
 | This document describes the API that can be used by hardware timestamping | 
 | engine provider and consumer drivers that want to use the hardware timestamping | 
 | engine (HTE) framework. Both consumers and providers must include | 
 | ``#include <linux/hte.h>``. | 
 |  | 
 | The HTE framework APIs for the providers | 
 | ---------------------------------------- | 
 |  | 
 | .. kernel-doc:: drivers/hte/hte.c | 
 |    :functions: devm_hte_register_chip hte_push_ts_ns | 
 |  | 
 | The HTE framework APIs for the consumers | 
 | ---------------------------------------- | 
 |  | 
 | .. kernel-doc:: drivers/hte/hte.c | 
 |    :functions: hte_init_line_attr hte_ts_get hte_ts_put devm_hte_request_ts_ns hte_request_ts_ns hte_enable_ts hte_disable_ts of_hte_req_count hte_get_clk_src_info | 
 |  | 
 | The HTE framework public structures | 
 | ----------------------------------- | 
 | .. kernel-doc:: include/linux/hte.h | 
 |  | 
 | More on the HTE timestamp data | 
 | ------------------------------ | 
 | The ``struct hte_ts_data`` is used to pass timestamp details between the | 
 | consumers and the providers. It expresses timestamp data in nanoseconds in | 
 | u64. An example of the typical timestamp data life cycle, for the GPIO line is | 
 | as follows:: | 
 |  | 
 |  - Monitors GPIO line change. | 
 |  - Detects the state change on GPIO line. | 
 |  - Converts timestamps in nanoseconds. | 
 |  - Stores GPIO raw level in raw_level variable if the provider has that | 
 |  hardware capability. | 
 |  - Pushes this hte_ts_data object to HTE subsystem. | 
 |  - HTE subsystem increments seq counter and invokes consumer provided callback. | 
 |  Based on callback return value, the HTE core invokes secondary callback in | 
 |  the thread context. | 
 |  | 
 | HTE subsystem debugfs attributes | 
 | -------------------------------- | 
 | HTE subsystem creates debugfs attributes at ``/sys/kernel/debug/hte/``. | 
 | It also creates line/signal-related debugfs attributes at | 
 | ``/sys/kernel/debug/hte/<provider>/<label or line id>/``. Note that these | 
 | attributes are read-only. | 
 |  | 
 | `ts_requested` | 
 | 		The total number of entities requested from the given provider, | 
 | 		where entity is specified by the provider and could represent | 
 | 		lines, GPIO, chip signals, buses etc... | 
 |                 The attribute will be available at | 
 | 		``/sys/kernel/debug/hte/<provider>/``. | 
 |  | 
 | `total_ts` | 
 | 		The total number of entities supported by the provider. | 
 |                 The attribute will be available at | 
 | 		``/sys/kernel/debug/hte/<provider>/``. | 
 |  | 
 | `dropped_timestamps` | 
 | 		The dropped timestamps for a given line. | 
 |                 The attribute will be available at | 
 | 		``/sys/kernel/debug/hte/<provider>/<label or line id>/``. |