counter: Internalize sysfs interface code
authorWilliam Breathitt Gray <vilhelm.gray@gmail.com>
Fri, 27 Aug 2021 03:47:47 +0000 (12:47 +0900)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sun, 17 Oct 2021 09:52:58 +0000 (10:52 +0100)
commitaaec1a0f76ec25f46bbb17b81487c4b0e1c318c5
treeb76c9daf90cf5f493fc865aca6dc8ed8a9798ea0
parentea434ff82649111de4fcabd76187270f8abdb63a
counter: Internalize sysfs interface code

This is a reimplementation of the Generic Counter driver interface.
There are no modifications to the Counter subsystem userspace interface,
so existing userspace applications should continue to run seamlessly.

The purpose of this patch is to internalize the sysfs interface code
among the various counter drivers into a shared module. Counter drivers
pass and take data natively (i.e. u8, u64, etc.) and the shared counter
module handles the translation between the sysfs interface and the
device drivers. This guarantees a standard userspace interface for all
counter drivers, and helps generalize the Generic Counter driver ABI in
order to support the Generic Counter chrdev interface (introduced in a
subsequent patch) without significant changes to the existing counter
drivers.

Note, Counter device registration is the same as before: drivers
populate a struct counter_device with components and callbacks, then
pass the structure to the devm_counter_register function. However,
what's different now is how the Counter subsystem code handles this
registration internally.

Whereas before callbacks would interact directly with sysfs data, this
interaction is now abstracted and instead callbacks interact with native
C data types. The counter_comp structure forms the basis for Counter
extensions.

The counter-sysfs.c file contains the code to parse through the
counter_device structure and register the requested components and
extensions. Attributes are created and populated based on type, with
respective translation functions to handle the mapping between sysfs and
the counter driver callbacks.

The translation performed for each attribute is straightforward: the
attribute type and data is parsed from the counter_attribute structure,
the respective counter driver read/write callback is called, and sysfs
I/O is handled before or after the driver read/write function is called.

Cc: Jarkko Nikula <jarkko.nikula@linux.intel.com>
Cc: Patrick Havelange <patrick.havelange@essensium.com>
Cc: Kamel Bouhara <kamel.bouhara@bootlin.com>
Cc: Maxime Coquelin <mcoquelin.stm32@gmail.com>
Cc: Alexandre Torgue <alexandre.torgue@st.com>
Cc: Dan Carpenter <dan.carpenter@oracle.com>
Acked-by: Syed Nayyar Waris <syednwaris@gmail.com>
Reviewed-by: David Lechner <david@lechnology.com>
Tested-by: David Lechner <david@lechnology.com>
Signed-off-by: William Breathitt Gray <vilhelm.gray@gmail.com>
Reviewed-by: Fabrice Gasnier <fabrice.gasnier@foss.st.com> # for stm32
Link: https://lore.kernel.org/r/c68b4a1ffb195c1a2f65e8dd5ad7b7c14e79c6ef.1630031207.git.vilhelm.gray@gmail.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
16 files changed:
MAINTAINERS
drivers/counter/104-quad-8.c
drivers/counter/Makefile
drivers/counter/counter-core.c [new file with mode: 0644]
drivers/counter/counter-sysfs.c [new file with mode: 0644]
drivers/counter/counter-sysfs.h [new file with mode: 0644]
drivers/counter/counter.c [deleted file]
drivers/counter/ftm-quaddec.c
drivers/counter/intel-qep.c
drivers/counter/interrupt-cnt.c
drivers/counter/microchip-tcb-capture.c
drivers/counter/stm32-lptimer-cnt.c
drivers/counter/stm32-timer-cnt.c
drivers/counter/ti-eqep.c
include/linux/counter.h
include/linux/counter_enum.h [deleted file]