From: Patrice Chotard
This is a basic implementation of USB PHY which
define a standard API that link USB PHY client to
USB PHY driver controller.
Signed-off-by: Patrice Chotard
---
v3: _ this patch intoduce new USB PHY uclass
drivers/usb/Kconfig | 4 ++
drivers/usb/phy/Kconfig | 10
drivers/usb/phy/Makefile | 1 +
drivers/usb/phy/usb_phy_uclass.c | 90 +++
include/dm/uclass-id.h | 1 +
include/usb_phy-uclass.h | 42 +++
include/usb_phy.h| 112 +++
7 files changed, 260 insertions(+)
create mode 100644 drivers/usb/phy/Kconfig
create mode 100644 drivers/usb/phy/usb_phy_uclass.c
create mode 100644 include/usb_phy-uclass.h
create mode 100644 include/usb_phy.h
diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig
index da3ec2f..e30c9d6 100644
--- a/drivers/usb/Kconfig
+++ b/drivers/usb/Kconfig
@@ -94,4 +94,8 @@ endif
source "drivers/usb/gadget/Kconfig"
+comment "USB PHY"
+
+source "drivers/usb/phy/Kconfig"
+
endif
diff --git a/drivers/usb/phy/Kconfig b/drivers/usb/phy/Kconfig
new file mode 100644
index 000..0539401
--- /dev/null
+++ b/drivers/usb/phy/Kconfig
@@ -0,0 +1,10 @@
+menu "USB PHY drivers"
+
+config USB_PHY
+ bool "Enable driver model for USB PHY drivers"
+ depends on DM
+ help
+ Enable driver model for USB PHY access. It defines basic
+ init and exit API.
+
+endmenu
diff --git a/drivers/usb/phy/Makefile b/drivers/usb/phy/Makefile
index 4e548c2..5314dcb 100644
--- a/drivers/usb/phy/Makefile
+++ b/drivers/usb/phy/Makefile
@@ -5,6 +5,7 @@
# SPDX-License-Identifier: GPL-2.0+
#
+obj-$(CONFIG_USB_PHY) += usb_phy_uclass.o
obj-$(CONFIG_TWL4030_USB) += twl4030.o
obj-$(CONFIG_OMAP_USB_PHY) += omap_usb_phy.o
obj-$(CONFIG_ROCKCHIP_USB2_PHY) += rockchip_usb2_phy.o
diff --git a/drivers/usb/phy/usb_phy_uclass.c b/drivers/usb/phy/usb_phy_uclass.c
new file mode 100644
index 000..11da635
--- /dev/null
+++ b/drivers/usb/phy/usb_phy_uclass.c
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2017
+ * Patrice Chotard
+ *
+ * SPDX-License-Identifier:GPL-2.0+
+ */
+
+#include
+#include
+#include
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static inline struct usb_phy_ops *usb_phy_dev_ops(struct udevice *dev)
+{
+ return (struct usb_phy_ops *)dev->driver->ops;
+}
+
+int usb_phy_get_by_index(struct udevice *dev, int index,
+struct usb_phy_desc *usb_phy_desc)
+{
+ struct fdtdec_phandle_args args;
+ int ret;
+ struct udevice *dev_usb_phy;
+
+ debug("%s(dev=%p, index=%d, usb_phy_desc=%p)\n", __func__, dev, index,
+ usb_phy_desc);
+
+ ret = fdtdec_parse_phandle_with_args(gd->fdt_blob, dev_of_offset(dev),
+"phys", "#phy-cells", 0,
+index, &args);
+ if (ret) {
+ debug("%s: fdtdec_parse_phandle_with_args failed: %d\n",
+ __func__, ret);
+ return ret;
+ }
+
+ ret = uclass_get_device_by_of_offset(UCLASS_USB_PHY, args.node,
+&dev_usb_phy);
+ if (ret) {
+ debug("%s: uclass_get_device_by_of_offset failed: %d\n",
+ __func__, ret);
+ return ret;
+ }
+
+ usb_phy_desc->dev = dev_usb_phy;
+
+ return 0;
+}
+
+int usb_phy_get_by_name(struct udevice *dev, const char *name,
+ struct usb_phy_desc *usb_phy_desc)
+{
+ int index;
+
+ debug("%s(dev=%p, name=%s, usb_phy_desc=%p)\n", __func__, dev, name,
+ usb_phy_desc);
+
+ index = fdt_stringlist_search(gd->fdt_blob, dev_of_offset(dev),
+ "phy-names", name);
+ if (index < 0) {
+ debug("fdt_stringlist_search() failed: %d\n", index);
+ return index;
+ }
+
+ return usb_phy_get_by_index(dev, index, usb_phy_desc);
+}
+
+int usb_phy_init(struct usb_phy_desc *usb_phy_desc)
+{
+ struct usb_phy_ops *ops = usb_phy_dev_ops(usb_phy_desc->dev);
+
+ debug("%s(usb_phy_desc=%p)\n", __func__, usb_phy_desc);
+
+ return ops->init(usb_phy_desc);
+}
+
+int usb_phy_exit(struct usb_phy_desc *usb_phy_desc)
+{
+ struct usb_phy_ops *ops = usb_phy_dev_ops(usb_phy_desc->dev);
+
+ debug("%s(usb_phy_desc=%p)\n", __func__, usb_phy_desc);
+
+ return ops->exit(usb_phy_desc);
+}
+
+UCLASS_DRIVER(usb_phy) = {
+ .id = UCLASS_USB_PHY,
+ .name = "usb_phy",
+};
diff --git a/include/dm/uclass-id.h b/include/dm/uclass-id.h
index 8c92d0b..feb6689 100644
--- a/include/dm/uclass-id.h
+++ b/include/dm/uclass-id.h
@@ -80,6 +80,7 @@ enum uclass_id {
UCLASS_USB, /* USB bus */
UCLASS_USB_DEV_GENERIC, /* USB generic device */
UCLASS_USB_HUB, /* USB hub */
+ UCLASS_USB_PHY,