With more SoCs moving towards eUSB2,
a USB 2.0 compliance repeater. This repeater HW-wise usually deals with
level shifting, but depending on the implementation it can do much more.
So add a ganeric USB framework that would allow either a generic PHY or
some USB host controller to control and get a repeater from a devicetree
phandle. This framework will further be used by platform specific
drivers to register the repeater and implement platform specific ops.
Signed-off-by: Abel Vesa <abel.vesa@xxxxxxxxxx>
---
drivers/usb/Kconfig | 2 +
drivers/usb/Makefile | 2 +
drivers/usb/repeater/Kconfig | 9 ++
drivers/usb/repeater/Makefile | 6 +
drivers/usb/repeater/repeater.c | 198 ++++++++++++++++++++++++++++++++
include/linux/usb/repeater.h | 78 +++++++++++++
6 files changed, 295 insertions(+)
create mode 100644 drivers/usb/repeater/Kconfig
create mode 100644 drivers/usb/repeater/Makefile
create mode 100644 drivers/usb/repeater/repeater.c
create mode 100644 include/linux/usb/repeater.h
diff --git a/include/linux/usb/repeater.h b/include/linux/usb/repeater.h
new file mode 100644
index 000000000000..e68e0936f1e5
--- /dev/null
+++ b/include/linux/usb/repeater.h
@@ -0,0 +1,78 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * USB Repeater defines
+ */
+
+#ifndef __LINUX_USB_REPEATER_H
+#define __LINUX_USB_REPEATER_H
+
+struct usb_repeater {
+ struct device *dev;
+ const char *label;
+ unsigned int flags;
+
+ struct list_head head;
+ int (*reset)(struct usb_repeater *rptr, bool assert);
+ int (*init)(struct usb_repeater *rptr);
+ int (*power_on)(struct usb_repeater *rptr);
+ int (*power_off)(struct usb_repeater *rptr);