Re: [PATCH RESEND v6 5/5] USB: PHY: JZ4770: Use the generic PHY framework.

From: Zhou Yanjie
Date: Tue Jul 28 2020 - 11:17:27 EST


Hi Paul,

å 2020/7/25 äå8:58, Paul Cercueil åé:
Hi Zhou,

I'm a bit lost in all these JZ4770 PHY patchsets...

Anyway, the move from drivers/usb/phy to drivers/phy should be done before adding anything else to the driver, so right after the devicetree change. Here, your patch modifies things that were just introduced in the previous patches; that adds a lot of noise for nothing and is harder to review.

If you really want to rename the function names and comments from jz4770_phy* to ingenic_usb_phy*, you can do it afterwards, within your current "unify code style" patch. Then add the patch to reformat the macros, and then finally finish the patchset by adding support for the new SoCs, because right now the macros introduced in the "add SoCs" patch are modified in the "reformat macros" patch.

So I think you got the content right, just some reordering to do.


Sorry for the delay caused by the mailbox failure. Now the first four patches have been merged into next. I think I need to make a new patch to move the driver to drivers/phy/

Thanks and best regards!



Le sam. 25 juil. 2020 Ã 15:33, åçæ (Zhou Yanjie) <zhouyanjie@xxxxxxxxxxxxxx> a Ãcrit :
Used the generic PHY framework API to create the PHY,
and move the driver to driver/phy/ingenic.

Tested-by: åæ (Zhou Zheng) <sernia.zhou@xxxxxxxxxxx>
Suggested-by: Felipe Balbi <balbi@xxxxxxxxxx>
Co-developed-by: æéæ (Qi Pengzhen) <aric.pzqi@xxxxxxxxxxx>
Signed-off-by: æéæ (Qi Pengzhen) <aric.pzqi@xxxxxxxxxxx>
Signed-off-by: åçæ (Zhou Yanjie) <zhouyanjie@xxxxxxxxxxxxxx>
---

Notes:
ÂÂÂ v6:
ÂÂÂ New patch.

Âdrivers/phy/KconfigÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ |ÂÂ 1 +
Âdrivers/phy/MakefileÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ |ÂÂ 1 +
Âdrivers/phy/ingenic/KconfigÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ |Â 12 ++
Âdrivers/phy/ingenic/MakefileÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ |ÂÂ 2 +
Â.../phy-jz4770.c => phy/ingenic/phy-ingenic-usb.c} | 208 ++++++++++++---------
Âdrivers/usb/phy/KconfigÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ |ÂÂ 8 -
Âdrivers/usb/phy/MakefileÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ |ÂÂ 1 -
Â7 files changed, 134 insertions(+), 99 deletions(-)
Âcreate mode 100644 drivers/phy/ingenic/Kconfig
Âcreate mode 100644 drivers/phy/ingenic/Makefile
Ârename drivers/{usb/phy/phy-jz4770.c => phy/ingenic/phy-ingenic-usb.c} (67%)

diff --git a/drivers/phy/Kconfig b/drivers/phy/Kconfig
index b3ed94b98d9b..96d7bb85f595 100644
--- a/drivers/phy/Kconfig
+++ b/drivers/phy/Kconfig
@@ -55,6 +55,7 @@ source "drivers/phy/broadcom/Kconfig"
Âsource "drivers/phy/cadence/Kconfig"
Âsource "drivers/phy/freescale/Kconfig"
Âsource "drivers/phy/hisilicon/Kconfig"
+source "drivers/phy/ingenic/Kconfig"
Âsource "drivers/phy/lantiq/Kconfig"
Âsource "drivers/phy/marvell/Kconfig"
Âsource "drivers/phy/mediatek/Kconfig"
diff --git a/drivers/phy/Makefile b/drivers/phy/Makefile
index 310c149a9df5..0f88724b4387 100644
--- a/drivers/phy/Makefile
+++ b/drivers/phy/Makefile
@@ -18,6 +18,7 @@ obj-yÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ += broadcom/ÂÂÂ \
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ cadence/ÂÂÂ \
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ freescale/ÂÂÂ \
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ hisilicon/ÂÂÂ \
+ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ ingenic/ÂÂÂ \
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ intel/ÂÂÂ \
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ lantiq/ÂÂÂ \
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ marvell/ÂÂÂ \
diff --git a/drivers/phy/ingenic/Kconfig b/drivers/phy/ingenic/Kconfig
new file mode 100644
index 000000000000..b9581eae89dd
--- /dev/null
+++ b/drivers/phy/ingenic/Kconfig
@@ -0,0 +1,12 @@
+# SPDX-License-Identifier: GPL-2.0
+#
+# Phy drivers for Ingenic platforms
+#
+config PHY_INGENIC_USB
+ÂÂÂ tristate "Ingenic SoCs USB PHY Driver"
+ÂÂÂ depends on (MACH_INGENIC && MIPS) || COMPILE_TEST
+ÂÂÂ depends on USB_SUPPORT
+ÂÂÂ select GENERIC_PHY
+ÂÂÂ help
+ÂÂÂÂÂ This driver provides USB PHY support for the USB controller found
+ÂÂÂÂÂ on the JZ-series and X-series SoCs from Ingenic.
diff --git a/drivers/phy/ingenic/Makefile b/drivers/phy/ingenic/Makefile
new file mode 100644
index 000000000000..65d5ea00fc9d
--- /dev/null
+++ b/drivers/phy/ingenic/Makefile
@@ -0,0 +1,2 @@
+# SPDX-License-Identifier: GPL-2.0
+obj-yÂÂÂÂÂÂÂ += phy-ingenic-usb.o
diff --git a/drivers/usb/phy/phy-jz4770.c b/drivers/phy/ingenic/phy-ingenic-usb.c
similarity index 67%
rename from drivers/usb/phy/phy-jz4770.c
rename to drivers/phy/ingenic/phy-ingenic-usb.c
index 23d38cbc150e..c43d53b235d3 100644
--- a/drivers/usb/phy/phy-jz4770.c
+++ b/drivers/phy/ingenic/phy-ingenic-usb.c
@@ -7,12 +7,12 @@
 */

Â#include <linux/clk.h>
+#include <linux/delay.h>
Â#include <linux/io.h>
Â#include <linux/module.h>
Â#include <linux/platform_device.h>
Â#include <linux/regulator/consumer.h>
-#include <linux/usb/otg.h>
-#include <linux/usb/phy.h>
+#include <linux/phy/phy.h>

Â/* OTGPHY register offsets */
Â#define REG_USBPCR_OFFSETÂÂÂÂÂÂÂÂÂÂÂ 0x00
@@ -97,66 +97,48 @@ enum ingenic_usb_phy_version {
Âstruct ingenic_soc_info {
ÂÂÂÂ enum ingenic_usb_phy_version version;

-ÂÂÂ void (*usb_phy_init)(struct usb_phy *phy);
+ÂÂÂ void (*usb_phy_init)(struct phy *phy);
Â};

-struct jz4770_phy {
+struct ingenic_usb_phy {
ÂÂÂÂ const struct ingenic_soc_info *soc_info;

-ÂÂÂ struct usb_phy phy;
-ÂÂÂ struct usb_otg otg;
+ÂÂÂ struct phy *phy;
ÂÂÂÂ struct device *dev;
ÂÂÂÂ void __iomem *base;
ÂÂÂÂ struct clk *clk;
ÂÂÂÂ struct regulator *vcc_supply;
Â};

-static inline struct jz4770_phy *otg_to_jz4770_phy(struct usb_otg *otg)
+static int ingenic_usb_phy_init(struct phy *phy)
Â{
-ÂÂÂ return container_of(otg, struct jz4770_phy, otg);
-}
-
-static inline struct jz4770_phy *phy_to_jz4770_phy(struct usb_phy *phy)
-{
-ÂÂÂ return container_of(phy, struct jz4770_phy, phy);
-}
-
-static int ingenic_usb_phy_set_peripheral(struct usb_otg *otg,
-ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ struct usb_gadget *gadget)
-{
-ÂÂÂ struct jz4770_phy *priv = otg_to_jz4770_phy(otg);
-ÂÂÂ u32 reg;
+ÂÂÂ struct ingenic_usb_phy *priv = phy_get_drvdata(phy);
+ÂÂÂ int err;

-ÂÂÂ if (priv->soc_info->version >= ID_X1000) {
-ÂÂÂÂÂÂÂ reg = readl(priv->base + REG_USBPCR1_OFFSET);
-ÂÂÂÂÂÂÂ reg |= USBPCR1_BVLD_REG;
-ÂÂÂÂÂÂÂ writel(reg, priv->base + REG_USBPCR1_OFFSET);
+ÂÂÂ err = clk_prepare_enable(priv->clk);
+ÂÂÂ if (err) {
+ÂÂÂÂÂÂÂ dev_err(priv->dev, "Unable to start clock: %d\n", err);
+ÂÂÂÂÂÂÂ return err;
ÂÂÂÂ }

-ÂÂÂ reg = readl(priv->base + REG_USBPCR_OFFSET);
-ÂÂÂ reg &= ~USBPCR_USB_MODE;
-ÂÂÂ reg |= USBPCR_VBUSVLDEXT | USBPCR_VBUSVLDEXTSEL | USBPCR_OTG_DISABLE;
-ÂÂÂ writel(reg, priv->base + REG_USBPCR_OFFSET);
+ÂÂÂ priv->soc_info->usb_phy_init(phy);

ÂÂÂÂ return 0;
Â}

-static int ingenic_usb_phy_set_host(struct usb_otg *otg, struct usb_bus *host)
+static int ingenic_usb_phy_exit(struct phy *phy)
Â{
-ÂÂÂ struct jz4770_phy *priv = otg_to_jz4770_phy(otg);
-ÂÂÂ u32 reg;
+ÂÂÂ struct ingenic_usb_phy *priv = phy_get_drvdata(phy);

-ÂÂÂ reg = readl(priv->base + REG_USBPCR_OFFSET);
-ÂÂÂ reg &= ~(USBPCR_VBUSVLDEXT | USBPCR_VBUSVLDEXTSEL | USBPCR_OTG_DISABLE);
-ÂÂÂ reg |= USBPCR_USB_MODE;
-ÂÂÂ writel(reg, priv->base + REG_USBPCR_OFFSET);
+ÂÂÂ clk_disable_unprepare(priv->clk);
+ÂÂÂ regulator_disable(priv->vcc_supply);

ÂÂÂÂ return 0;
Â}

-static int ingenic_usb_phy_init(struct usb_phy *phy)
+static int ingenic_usb_phy_power_on(struct phy *phy)
Â{
-ÂÂÂ struct jz4770_phy *priv = phy_to_jz4770_phy(phy);
+ÂÂÂ struct ingenic_usb_phy *priv = phy_get_drvdata(phy);
ÂÂÂÂ int err;

ÂÂÂÂ err = regulator_enable(priv->vcc_supply);
@@ -165,33 +147,71 @@ static int ingenic_usb_phy_init(struct usb_phy *phy)
ÂÂÂÂÂÂÂÂ return err;
ÂÂÂÂ }

-ÂÂÂ err = clk_prepare_enable(priv->clk);
-ÂÂÂ if (err) {
-ÂÂÂÂÂÂÂ dev_err(priv->dev, "Unable to start clock: %d\n", err);
-ÂÂÂÂÂÂÂ return err;
-ÂÂÂ }
-
-ÂÂÂ priv->soc_info->usb_phy_init(phy);
-
ÂÂÂÂ return 0;
Â}

-static void ingenic_usb_phy_shutdown(struct usb_phy *phy)
+static int ingenic_usb_phy_power_off(struct phy *phy)
Â{
-ÂÂÂ struct jz4770_phy *priv = phy_to_jz4770_phy(phy);
+ÂÂÂ struct ingenic_usb_phy *priv = phy_get_drvdata(phy);

-ÂÂÂ clk_disable_unprepare(priv->clk);
ÂÂÂÂ regulator_disable(priv->vcc_supply);
+
+ÂÂÂ return 0;
Â}

-static void ingenic_usb_phy_remove(void *phy)
+static int ingenic_usb_phy_set_mode(struct phy *phy,
+ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ enum phy_mode mode, int submode)
Â{
-ÂÂÂ usb_remove_phy(phy);
+ÂÂÂ struct ingenic_usb_phy *priv = phy_get_drvdata(phy);
+ÂÂÂ u32 reg;
+
+ÂÂÂ switch (mode) {
+ÂÂÂ case PHY_MODE_USB_HOST:
+ÂÂÂÂÂÂÂ reg = readl(priv->base + REG_USBPCR_OFFSET);
+ÂÂÂÂÂÂÂ reg &= ~(USBPCR_VBUSVLDEXT | USBPCR_VBUSVLDEXTSEL | USBPCR_OTG_DISABLE);
+ÂÂÂÂÂÂÂ reg |= USBPCR_USB_MODE;
+ÂÂÂÂÂÂÂ writel(reg, priv->base + REG_USBPCR_OFFSET);
+
+ÂÂÂÂÂÂÂ break;
+ÂÂÂ case PHY_MODE_USB_DEVICE:
+ÂÂÂÂÂÂÂ if (priv->soc_info->version >= ID_X1000) {
+ÂÂÂÂÂÂÂÂÂÂÂ reg = readl(priv->base + REG_USBPCR1_OFFSET);
+ÂÂÂÂÂÂÂÂÂÂÂ reg |= USBPCR1_BVLD_REG;
+ÂÂÂÂÂÂÂÂÂÂÂ writel(reg, priv->base + REG_USBPCR1_OFFSET);
+ÂÂÂÂÂÂÂ }
+
+ÂÂÂÂÂÂÂ reg = readl(priv->base + REG_USBPCR_OFFSET);
+ÂÂÂÂÂÂÂ reg &= ~USBPCR_USB_MODE;
+ÂÂÂÂÂÂÂ reg |= USBPCR_VBUSVLDEXT | USBPCR_VBUSVLDEXTSEL | USBPCR_OTG_DISABLE;
+ÂÂÂÂÂÂÂ writel(reg, priv->base + REG_USBPCR_OFFSET);
+
+ÂÂÂÂÂÂÂ break;
+ÂÂÂ case PHY_MODE_USB_OTG:
+ÂÂÂÂÂÂÂ reg = readl(priv->base + REG_USBPCR_OFFSET);
+ÂÂÂÂÂÂÂ reg &= ~USBPCR_OTG_DISABLE;
+ÂÂÂÂÂÂÂ reg |= USBPCR_VBUSVLDEXT | USBPCR_VBUSVLDEXTSEL | USBPCR_USB_MODE;
+ÂÂÂÂÂÂÂ writel(reg, priv->base + REG_USBPCR_OFFSET);
+
+ÂÂÂÂÂÂÂ break;
+ÂÂÂ default:
+ÂÂÂÂÂÂÂ return -EINVAL;
+ÂÂÂ }
+
+ÂÂÂ return 0;
Â}

-static void jz4770_usb_phy_init(struct usb_phy *phy)
+static const struct phy_ops ingenic_usb_phy_ops = {
+ÂÂÂ .initÂÂÂÂÂÂÂ = ingenic_usb_phy_init,
+ÂÂÂ .exitÂÂÂÂÂÂÂ = ingenic_usb_phy_exit,
+ÂÂÂ .power_onÂÂÂ = ingenic_usb_phy_power_on,
+ÂÂÂ .power_offÂÂÂ = ingenic_usb_phy_power_off,
+ÂÂÂ .set_modeÂÂÂ = ingenic_usb_phy_set_mode,
+ÂÂÂ .ownerÂÂÂÂÂÂÂ = THIS_MODULE,
+};
+
+static void jz4770_usb_phy_init(struct phy *phy)
Â{
-ÂÂÂ struct jz4770_phy *priv = phy_to_jz4770_phy(phy);
+ÂÂÂ struct ingenic_usb_phy *priv = phy_get_drvdata(phy);
ÂÂÂÂ u32 reg;

ÂÂÂÂ reg = USBPCR_AVLD_REG | USBPCR_COMMONONN | USBPCR_IDPULLUP_ALWAYS |
@@ -206,9 +226,9 @@ static void jz4770_usb_phy_init(struct usb_phy *phy)
ÂÂÂÂ usleep_range(300, 1000);
Â}

-static void jz4780_usb_phy_init(struct usb_phy *phy)
+static void jz4780_usb_phy_init(struct phy *phy)
Â{
-ÂÂÂ struct jz4770_phy *priv = phy_to_jz4770_phy(phy);
+ÂÂÂ struct ingenic_usb_phy *priv = phy_get_drvdata(phy);
ÂÂÂÂ u32 reg;

ÂÂÂÂ reg = readl(priv->base + REG_USBPCR1_OFFSET) | USBPCR1_USB_SEL |
@@ -224,9 +244,9 @@ static void jz4780_usb_phy_init(struct usb_phy *phy)
ÂÂÂÂ usleep_range(300, 1000);
Â}

-static void x1000_usb_phy_init(struct usb_phy *phy)
+static void x1000_usb_phy_init(struct phy *phy)
Â{
-ÂÂÂ struct jz4770_phy *priv = phy_to_jz4770_phy(phy);
+ÂÂÂ struct ingenic_usb_phy *priv = phy_get_drvdata(phy);
ÂÂÂÂ u32 reg;

ÂÂÂÂ reg = readl(priv->base + REG_USBPCR1_OFFSET) | USBPCR1_WORD_IF_16BIT;
@@ -243,9 +263,9 @@ static void x1000_usb_phy_init(struct usb_phy *phy)
ÂÂÂÂ usleep_range(300, 1000);
Â}

-static void x1830_usb_phy_init(struct usb_phy *phy)
+static void x1830_usb_phy_init(struct phy *phy)
Â{
-ÂÂÂ struct jz4770_phy *priv = phy_to_jz4770_phy(phy);
+ÂÂÂ struct ingenic_usb_phy *priv = phy_get_drvdata(phy);
ÂÂÂÂ u32 reg;

ÂÂÂÂ /* rdt */
@@ -298,75 +318,83 @@ static const struct of_device_id ingenic_usb_phy_of_matches[] = {
Â};
ÂMODULE_DEVICE_TABLE(of, ingenic_usb_phy_of_matches);

-static int jz4770_phy_probe(struct platform_device *pdev)
+static int ingenic_usb_phy_probe(struct platform_device *pdev)
Â{
-ÂÂÂ struct device *dev = &pdev->dev;
-ÂÂÂ struct jz4770_phy *priv;
+ÂÂÂ struct ingenic_usb_phy *priv;
+ÂÂÂ struct phy_provider *provider;
ÂÂÂÂ int err;

-ÂÂÂ priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
+ÂÂÂ priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
ÂÂÂÂ if (!priv)
ÂÂÂÂÂÂÂÂ return -ENOMEM;

+ÂÂÂ priv->dev = &pdev->dev;
+
ÂÂÂÂ priv->soc_info = device_get_match_data(&pdev->dev);
ÂÂÂÂ if (!priv->soc_info) {
ÂÂÂÂÂÂÂÂ dev_err(&pdev->dev, "Error: No device match found\n");
ÂÂÂÂÂÂÂÂ return -ENODEV;
ÂÂÂÂ }

-ÂÂÂ platform_set_drvdata(pdev, priv);
-ÂÂÂ priv->dev = dev;
-ÂÂÂ priv->phy.dev = dev;
-ÂÂÂ priv->phy.otg = &priv->otg;
-ÂÂÂ priv->phy.label = "ingenic-usb-phy";
-ÂÂÂ priv->phy.init = ingenic_usb_phy_init;
-ÂÂÂ priv->phy.shutdown = ingenic_usb_phy_shutdown;
-
-ÂÂÂ priv->otg.state = OTG_STATE_UNDEFINED;
-ÂÂÂ priv->otg.usb_phy = &priv->phy;
-ÂÂÂ priv->otg.set_host = ingenic_usb_phy_set_host;
-ÂÂÂ priv->otg.set_peripheral = ingenic_usb_phy_set_peripheral;
-
ÂÂÂÂ priv->base = devm_platform_ioremap_resource(pdev, 0);
ÂÂÂÂ if (IS_ERR(priv->base)) {
-ÂÂÂÂÂÂÂ dev_err(dev, "Failed to map registers\n");
+ÂÂÂÂÂÂÂ dev_err(priv->dev, "Failed to map registers\n");
ÂÂÂÂÂÂÂÂ return PTR_ERR(priv->base);
ÂÂÂÂ }

-ÂÂÂ priv->clk = devm_clk_get(dev, NULL);
+ÂÂÂ priv->clk = devm_clk_get(priv->dev, NULL);
ÂÂÂÂ if (IS_ERR(priv->clk)) {
ÂÂÂÂÂÂÂÂ err = PTR_ERR(priv->clk);
ÂÂÂÂÂÂÂÂ if (err != -EPROBE_DEFER)
-ÂÂÂÂÂÂÂÂÂÂÂ dev_err(dev, "Failed to get clock\n");
+ÂÂÂÂÂÂÂÂÂÂÂ dev_err(priv->dev, "Failed to get clock\n");
ÂÂÂÂÂÂÂÂ return err;
ÂÂÂÂ }

-ÂÂÂ priv->vcc_supply = devm_regulator_get(dev, "vcc");
+ÂÂÂ priv->vcc_supply = devm_regulator_get(priv->dev, "vcc");
ÂÂÂÂ if (IS_ERR(priv->vcc_supply)) {
ÂÂÂÂÂÂÂÂ err = PTR_ERR(priv->vcc_supply);
ÂÂÂÂÂÂÂÂ if (err != -EPROBE_DEFER)
-ÂÂÂÂÂÂÂÂÂÂÂ dev_err(dev, "Failed to get regulator\n");
+ÂÂÂÂÂÂÂÂÂÂÂ dev_err(priv->dev, "Failed to get regulator\n");
ÂÂÂÂÂÂÂÂ return err;
ÂÂÂÂ }

-ÂÂÂ err = usb_add_phy(&priv->phy, USB_PHY_TYPE_USB2);
-ÂÂÂ if (err) {
-ÂÂÂÂÂÂÂ if (err != -EPROBE_DEFER)
-ÂÂÂÂÂÂÂÂÂÂÂ dev_err(dev, "Unable to register PHY\n");
-ÂÂÂÂÂÂÂ return err;
+ÂÂÂ priv->phy = devm_phy_create(priv->dev, NULL, &ingenic_usb_phy_ops);
+ÂÂÂ if (IS_ERR(priv)) {
+ÂÂÂÂÂÂÂ dev_err(priv->dev, "Failed to create PHY: %ld\n", PTR_ERR(priv));
+ÂÂÂÂÂÂÂ return PTR_ERR(priv);
ÂÂÂÂ }

-ÂÂÂ return devm_add_action_or_reset(dev, ingenic_usb_phy_remove, &priv->phy);
+ÂÂÂ provider = devm_of_phy_provider_register(priv->dev, of_phy_simple_xlate);
+ÂÂÂ if (IS_ERR(provider)) {
+ÂÂÂÂÂÂÂ dev_err(priv->dev, "Failed to register PHY provider: %ld\n", PTR_ERR(provider));
+ÂÂÂÂÂÂÂ return PTR_ERR(provider);
+ÂÂÂ }
+
+ÂÂÂ platform_set_drvdata(pdev, priv);
+ÂÂÂ phy_set_drvdata(priv->phy, priv);
+
+ÂÂÂ return 0;
+}
+
+static int ingenic_usb_phy_remove(struct platform_device *pdev)
+{
+ÂÂÂ struct ingenic_usb_phy *priv = platform_get_drvdata(pdev);
+
+ÂÂÂ clk_disable_unprepare(priv->clk);
+ÂÂÂ regulator_disable(priv->vcc_supply);
+
+ÂÂÂ return 0;
Â}

-static struct platform_driver ingenic_phy_driver = {
-ÂÂÂ .probeÂÂÂÂÂÂÂ = jz4770_phy_probe,
+static struct platform_driver ingenic_usb_phy_driver = {
+ÂÂÂ .probeÂÂÂÂÂÂÂ = ingenic_usb_phy_probe,
+ÂÂÂ .removeÂÂÂÂÂÂÂ = ingenic_usb_phy_remove,
ÂÂÂÂ .driverÂÂÂÂÂÂÂ = {
-ÂÂÂÂÂÂÂ .nameÂÂÂ = "jz4770-phy",
+ÂÂÂÂÂÂÂ .nameÂÂÂ = "ingenic-usb-phy",
ÂÂÂÂÂÂÂÂ .of_match_table = of_match_ptr(ingenic_usb_phy_of_matches),
ÂÂÂÂ },
Â};
-module_platform_driver(ingenic_phy_driver);
+module_platform_driver(ingenic_usb_phy_driver);

ÂMODULE_AUTHOR("åçæ (Zhou Yanjie) <zhouyanjie@xxxxxxxxxxxxxx>");
ÂMODULE_AUTHOR("æéæ (Qi Pengzhen) <aric.pzqi@xxxxxxxxxxx>");

Finally, because of the renaming, the module name changed. To keep compatibility with userspace, I think you need to add a MODULE_ALIAS(jz4770_phy) here (but I'm not sure and maybe someone else should confirm that).

Cheers,
-Paul

diff --git a/drivers/usb/phy/Kconfig b/drivers/usb/phy/Kconfig
index ef4787cd3d37..ff24fca0a2d9 100644
--- a/drivers/usb/phy/Kconfig
+++ b/drivers/usb/phy/Kconfig
@@ -184,12 +184,4 @@ config USB_ULPI_VIEWPORT
ÂÂÂÂÂÂ Provides read/write operations to the ULPI phy register set for
ÂÂÂÂÂÂ controllers with a viewport register (e.g. Chipidea/ARC controllers).

-config JZ4770_PHY
-ÂÂÂ tristate "Ingenic SoCs Transceiver Driver"
-ÂÂÂ depends on MIPS || COMPILE_TEST
-ÂÂÂ select USB_PHY
-ÂÂÂ help
-ÂÂÂÂÂ This driver provides PHY support for the USB controller found
-ÂÂÂÂÂ on the JZ-series and X-series SoCs from Ingenic.
-
Âendmenu
diff --git a/drivers/usb/phy/Makefile b/drivers/usb/phy/Makefile
index b352bdbe8712..df1d99010079 100644
--- a/drivers/usb/phy/Makefile
+++ b/drivers/usb/phy/Makefile
@@ -24,4 +24,3 @@ obj-$(CONFIG_USB_MXS_PHY)ÂÂÂÂÂÂÂ += phy-mxs-usb.o
Âobj-$(CONFIG_USB_ULPI)ÂÂÂÂÂÂÂÂÂÂÂ += phy-ulpi.o
Âobj-$(CONFIG_USB_ULPI_VIEWPORT)ÂÂÂÂÂÂÂ += phy-ulpi-viewport.o
Âobj-$(CONFIG_KEYSTONE_USB_PHY)ÂÂÂÂÂÂÂ += phy-keystone.o
-obj-$(CONFIG_JZ4770_PHY)ÂÂÂÂÂÂÂ += phy-jz4770.o
--
2.11.0