I would like to thank everyone that commented on my last RFC, which made me realize the shortcuts in design I was making. I think I have finally understood the concept of how bus drivers operate and I have implemented a Wiegand bus driver. The driver now manages controllers and devices connected to them. It attaches drivers to Wiegand devices and provides an abstract API in "include/linux/wiegand.h". Most of the Wiegand bus driver code is inspired by the SPI bus driver written by David Brownell. I have also implemented a driver for Wiegand GPIO bit-banging. This driver gets the devicetree defined GPIO lines and sends Wiegand formatted data through them. I have also tested creating sample drivers for devices attached to the bus and working with them. CHANGELOG since RFCv3: - implemented a proper bus driver for controller and device allocation, devicetree probing and driver matching - Wiegand bus is now represented as Wiegand controller node in the devicetree - re-wrote the old version of GPIO bit-banging driver as a Wiegand controller - used standard units for devicetree attributes - removed global variables - tested unbinding of drivers and fixed memory leaks - created a Wiegand protocol sub-system - a folder "drivers/wiegand/" for Wiegand controller drivers I am not sure, whether this bus is complex enough to create a subsystem for, however I do believe that this is the way most buses do it. Martin Zaťovič (3): dt-bindings: add Wiegand controller dt-binding documentation bus: add Wiegand bus driver wiegand: add Wiegand GPIO bit-banged controller driver .../ABI/testing/sysfs-driver-wiegand-gpio | 17 + .../bindings/wiegand/wiegand-controller.yaml | 83 ++ MAINTAINERS | 9 + drivers/Kconfig | 2 + drivers/bus/Kconfig | 5 + drivers/bus/Makefile | 1 + drivers/bus/wiegand.c | 768 ++++++++++++++++++ drivers/wiegand/Kconfig | 8 + drivers/wiegand/Makefile | 1 + drivers/wiegand/wiegand-gpio.c | 471 +++++++++++ include/linux/wiegand.h | 228 ++++++ 11 files changed, 1593 insertions(+) create mode 100644 Documentation/ABI/testing/sysfs-driver-wiegand-gpio create mode 100644 Documentation/devicetree/bindings/wiegand/wiegand-controller.yaml create mode 100644 drivers/bus/wiegand.c create mode 100644 drivers/wiegand/Kconfig create mode 100644 drivers/wiegand/Makefile create mode 100644 drivers/wiegand/wiegand-gpio.c create mode 100644 include/linux/wiegand.h -- 2.38.1