[PATCH v2 0/8] phy: samsung: add Exynos2200 SNPS eUSB2 driver

Ivaylo Ivanov
2025-02-23T12:22:33Z

Hey folks,

In the vendor kernel, everything is handled in a single phy driver,
with helpers for functions outside it. Clocks and regulators are
specified and enabled in one node, which makes it difficult to
separate what clocks and regulators go where without access to
schematics or TRMs. The following gates are defined for USB:

CLK_BLK_HSI0_UID_USB32DRD_IPCLKPORT_I_USBSUBCTL_APB_PCLK
CLK_BLK_HSI0_UID_USB32DRD_IPCLKPORT_I_USBDPPHY_CTRL_PCLK
CLK_BLK_HSI0_UID_USB32DRD_IPCLKPORT_I_USBDPPHY_TCA_APB_CLK

CLK_BLK_HSI0_UID_USB32DRD_IPCLKPORT_I_USBLINK_ACLK
CLK_BLK_HSI0_UID_USB32DRD_IPCLKPORT_I_USB32DRD_REF_CLK_40

CLK_BLK_HSI0_UID_USB32DRD_IPCLKPORT_I_EUSB_CTRL_PCLK
CLK_BLK_HSI0_UID_USB32DRD_IPCLKPORT_I_EUSB_APB_CLK
CLK_BLK_HSI0_UID_AS_APB_EUSBPHY_HSI0_IPCLKPORT_PCLKM
CLK_BLK_HSI0_UID_RSTNSYNC_CLK_HSI0_EUSB_IPCLKPORT_CLK

The vendor kernel specifies 4 regulators, 2 of which are for eUSB
and the other 2 for the repeater. The rest of the PHYs and the dwc3
controller are on a single power domain (hsi0), so they're most likely
sharing power rails.

From what I've managed to understand, this SoC has 3 PHYs for USB:
- a synopsys eusb2 phy
- a synposys combophy for usbdp and superspeed
- a usbcon phy, which acts as a "controller" for the other 2 phys

As Qualcomm is also using the eUSB2 IP, the approach taken here is to
rename the driver so that it can be used by other SoC vendors as well
while keeping compatibles SoC-vendor prefixed (different vendors have
different implementations of the IP with different register maps),
add support for exynos2200 in it and introduce a new USBCON phy driver,
modelled to take phandles to eUSB2 (and in the future, USBDP).

A new USBDP driver will be added later on, so that pipe3 and super-speed
can be configured.

The USBCON binding includes a header from the clocks [1] patchset.

Bindings have been tested:
$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j4 dt_binding_check DT_SCHEMA_FILES="Documentation/devicetree/bindings/phy/samsung,exynos2200-usbcon-phy.yaml"
SCHEMA Documentation/devicetree/bindings/processed-schema.json
/home/ivaylo/linux-devices/s22/linux/for-upstream/linux-next/Documentation/devicetree/bindings/iio/light/brcm,apds9160.yaml: ps-cancellation-current-picoamp: missing type definition
CHKDT ./Documentation/devicetree/bindings
LINT ./Documentation/devicetree/bindings
DTEX Documentation/devicetree/bindings/phy/samsung,exynos2200-usbcon-phy.example.dts
DTC [C] Documentation/devicetree/bindings/phy/samsung,exynos2200-usbcon-phy.example.dtb

ivaylo@ivaylo-T580:~/linux-devices/s22/linux/for-upstream/linux-next$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j4 dt_binding_check DT_SCHEMA_FILES="Documentation/devicetree/bindings/phy/snps,eusb2-phy.yaml"
CHKDT ./Documentation/devicetree/bindings
LINT ./Documentation/devicetree/bindings
DTC [C] Documentation/devicetree/bindings/phy/snps,eusb2-phy.example.dtb

Best regards,
Ivaylo

Changes in v2:
USBCON changes:
- drop unused header includes
- sanitize the binding
- proper init and exit power management
- shorten some variables
- unrelax reads and writes
- update commit description
- remodel to take other phys
- drop specified regulators as these are for the repeater
- make the kconfig description better
- general cleanup
EUSB2 changes:
- merge the previous separate driver into the qualcomm one
- drop the previous model of taking usbcon phandle

[1] https://lore.kernel.org/all/20250223115601.723886-1-ivo.ivanov.ivanov1@gmail.com/

Ivaylo Ivanov (8):
dt-bindings: phy: rename qcom,snps-eusb2-phy binding to snps,eusb2-phy
dt-bindings: phy: snps-eusb2: add exynos2200 support
dt-bindings: phy: add samsung,exynos2200-usbcon-phy schema file
phy: move phy-qcom-snps-eusb2 out of its vendor sub-directory
phy: phy-snps-eusb2: make repeater optional
phy: phy-snps-eusb2: make reset control optional
phy: phy-snps-eusb2: add support for exynos2200
phy: samsung: add Exynos2200 usb phy controller

.../phy/samsung,exynos2200-usbcon-phy.yaml | 76 ++
...nps-eusb2-phy.yaml => snps,eusb2-phy.yaml} | 70 +-
drivers/phy/Kconfig | 8 +
drivers/phy/Makefile | 1 +
drivers/phy/phy-snps-eusb2.c | 677 ++++++++++++++++++
drivers/phy/qualcomm/Kconfig | 9 -
drivers/phy/qualcomm/Makefile | 1 -
drivers/phy/qualcomm/phy-qcom-snps-eusb2.c | 442 ------------
drivers/phy/samsung/Kconfig | 12 +
drivers/phy/samsung/Makefile | 1 +
drivers/phy/samsung/phy-exynos2200-usbcon.c | 250 +++++++
11 files changed, 1085 insertions(+), 462 deletions(-)
create mode 100644 Documentation/devicetree/bindings/phy/samsung,exynos2200-usbcon-phy.yaml
rename Documentation/devicetree/bindings/phy/{qcom,snps-eusb2-phy.yaml => snps,eusb2-phy.yaml} (57%)
create mode 100644 drivers/phy/phy-snps-eusb2.c
delete mode 100644 drivers/phy/qualcomm/phy-qcom-snps-eusb2.c
create mode 100644 drivers/phy/samsung/phy-exynos2200-usbcon.c

--
2.43.0