powerpc/83xx: Split usb.c
authorChristophe Leroy <christophe.leroy@csgroup.eu>
Wed, 16 Aug 2023 15:22:17 +0000 (17:22 +0200)
committerMichael Ellerman <mpe@ellerman.id.au>
Fri, 18 Aug 2023 07:03:14 +0000 (17:03 +1000)
usb.c contains three independent parts with no common part.

Split it.

Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
[mpe: Drop usb.o from Makefile to fix build]
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://msgid.link/75712b54bf9cb85ab10e47cd2772cd2a098ca895.1692199324.git.christophe.leroy@csgroup.eu
arch/powerpc/platforms/83xx/Makefile
arch/powerpc/platforms/83xx/usb.c [deleted file]
arch/powerpc/platforms/83xx/usb_831x.c [new file with mode: 0644]
arch/powerpc/platforms/83xx/usb_834x.c [new file with mode: 0644]
arch/powerpc/platforms/83xx/usb_837x.c [new file with mode: 0644]

index 6b4013e01b3b688a21e5b9487ee4948665d8c17e..6fc3dba943dade4f63da090b520b0c35bb46a091 100644 (file)
@@ -2,7 +2,7 @@
 #
 # Makefile for the PowerPC 83xx linux kernel.
 #
-obj-y                          := misc.o usb.o
+obj-y                          := misc.o
 obj-$(CONFIG_SUSPEND)          += suspend.o suspend-asm.o
 obj-$(CONFIG_MCU_MPC8349EMITX) += mcu_mpc8349emitx.o
 obj-$(CONFIG_MPC830x_RDB)      += mpc830x_rdb.o
@@ -13,3 +13,6 @@ obj-$(CONFIG_MPC836x_RDK)     += mpc836x_rdk.o
 obj-$(CONFIG_MPC837x_RDB)      += mpc837x_rdb.o
 obj-$(CONFIG_ASP834x)          += asp834x.o
 obj-$(CONFIG_KMETER1)          += km83xx.o
+obj-$(CONFIG_PPC_MPC831x)      += usb_831x.o
+obj-$(CONFIG_PPC_MPC834x)      += usb_834x.o
+obj-$(CONFIG_PPC_MPC837x)      += usb_837x.o
diff --git a/arch/powerpc/platforms/83xx/usb.c b/arch/powerpc/platforms/83xx/usb.c
deleted file mode 100644 (file)
index d5ad6cf..0000000
+++ /dev/null
@@ -1,246 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-or-later
-/*
- * Freescale 83xx USB SOC setup code
- *
- * Copyright (C) 2007 Freescale Semiconductor, Inc.
- * Author: Li Yang
- */
-
-#include <linux/stddef.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/of.h>
-#include <linux/of_address.h>
-#include <linux/io.h>
-
-#include <sysdev/fsl_soc.h>
-
-#include "mpc83xx.h"
-
-#ifdef CONFIG_PPC_MPC834x
-int __init mpc834x_usb_cfg(void)
-{
-       unsigned long sccr, sicrl, sicrh;
-       void __iomem *immap;
-       struct device_node *np = NULL;
-       int port0_is_dr = 0, port1_is_dr = 0;
-       const void *prop, *dr_mode;
-
-       immap = ioremap(get_immrbase(), 0x1000);
-       if (!immap)
-               return -ENOMEM;
-
-       /* Read registers */
-       /* Note: DR and MPH must use the same clock setting in SCCR */
-       sccr = in_be32(immap + MPC83XX_SCCR_OFFS) & ~MPC83XX_SCCR_USB_MASK;
-       sicrl = in_be32(immap + MPC83XX_SICRL_OFFS) & ~MPC834X_SICRL_USB_MASK;
-       sicrh = in_be32(immap + MPC83XX_SICRH_OFFS) & ~MPC834X_SICRH_USB_UTMI;
-
-       np = of_find_compatible_node(NULL, NULL, "fsl-usb2-dr");
-       if (np) {
-               sccr |= MPC83XX_SCCR_USB_DRCM_11;  /* 1:3 */
-
-               prop = of_get_property(np, "phy_type", NULL);
-               port1_is_dr = 1;
-               if (prop &&
-                   (!strcmp(prop, "utmi") || !strcmp(prop, "utmi_wide"))) {
-                       sicrl |= MPC834X_SICRL_USB0 | MPC834X_SICRL_USB1;
-                       sicrh |= MPC834X_SICRH_USB_UTMI;
-                       port0_is_dr = 1;
-               } else if (prop && !strcmp(prop, "serial")) {
-                       dr_mode = of_get_property(np, "dr_mode", NULL);
-                       if (dr_mode && !strcmp(dr_mode, "otg")) {
-                               sicrl |= MPC834X_SICRL_USB0 | MPC834X_SICRL_USB1;
-                               port0_is_dr = 1;
-                       } else {
-                               sicrl |= MPC834X_SICRL_USB1;
-                       }
-               } else if (prop && !strcmp(prop, "ulpi")) {
-                       sicrl |= MPC834X_SICRL_USB1;
-               } else {
-                       pr_warn("834x USB PHY type not supported\n");
-               }
-               of_node_put(np);
-       }
-       np = of_find_compatible_node(NULL, NULL, "fsl-usb2-mph");
-       if (np) {
-               sccr |= MPC83XX_SCCR_USB_MPHCM_11; /* 1:3 */
-
-               prop = of_get_property(np, "port0", NULL);
-               if (prop) {
-                       if (port0_is_dr)
-                               pr_warn("834x USB port0 can't be used by both DR and MPH!\n");
-                       sicrl &= ~MPC834X_SICRL_USB0;
-               }
-               prop = of_get_property(np, "port1", NULL);
-               if (prop) {
-                       if (port1_is_dr)
-                               pr_warn("834x USB port1 can't be used by both DR and MPH!\n");
-                       sicrl &= ~MPC834X_SICRL_USB1;
-               }
-               of_node_put(np);
-       }
-
-       /* Write back */
-       out_be32(immap + MPC83XX_SCCR_OFFS, sccr);
-       out_be32(immap + MPC83XX_SICRL_OFFS, sicrl);
-       out_be32(immap + MPC83XX_SICRH_OFFS, sicrh);
-
-       iounmap(immap);
-       return 0;
-}
-#endif /* CONFIG_PPC_MPC834x */
-
-#ifdef CONFIG_PPC_MPC831x
-int __init mpc831x_usb_cfg(void)
-{
-       u32 temp;
-       void __iomem *immap, *usb_regs;
-       struct device_node *np = NULL;
-       struct device_node *immr_node = NULL;
-       const void *prop;
-       struct resource res;
-       int ret = 0;
-#ifdef CONFIG_USB_OTG
-       const void *dr_mode;
-#endif
-
-       np = of_find_compatible_node(NULL, NULL, "fsl-usb2-dr");
-       if (!np)
-               return -ENODEV;
-       prop = of_get_property(np, "phy_type", NULL);
-
-       /* Map IMMR space for pin and clock settings */
-       immap = ioremap(get_immrbase(), 0x1000);
-       if (!immap) {
-               of_node_put(np);
-               return -ENOMEM;
-       }
-
-       /* Configure clock */
-       immr_node = of_get_parent(np);
-       if (immr_node && (of_device_is_compatible(immr_node, "fsl,mpc8315-immr") ||
-                         of_device_is_compatible(immr_node, "fsl,mpc8308-immr")))
-               clrsetbits_be32(immap + MPC83XX_SCCR_OFFS,
-                               MPC8315_SCCR_USB_MASK,
-                               MPC8315_SCCR_USB_DRCM_01);
-       else
-               clrsetbits_be32(immap + MPC83XX_SCCR_OFFS,
-                               MPC83XX_SCCR_USB_MASK,
-                               MPC83XX_SCCR_USB_DRCM_11);
-
-       /* Configure pin mux for ULPI.  There is no pin mux for UTMI */
-       if (prop && !strcmp(prop, "ulpi")) {
-               if (of_device_is_compatible(immr_node, "fsl,mpc8308-immr")) {
-                       clrsetbits_be32(immap + MPC83XX_SICRH_OFFS,
-                                       MPC8308_SICRH_USB_MASK,
-                                       MPC8308_SICRH_USB_ULPI);
-               } else if (of_device_is_compatible(immr_node, "fsl,mpc8315-immr")) {
-                       clrsetbits_be32(immap + MPC83XX_SICRL_OFFS,
-                                       MPC8315_SICRL_USB_MASK,
-                                       MPC8315_SICRL_USB_ULPI);
-                       clrsetbits_be32(immap + MPC83XX_SICRH_OFFS,
-                                       MPC8315_SICRH_USB_MASK,
-                                       MPC8315_SICRH_USB_ULPI);
-               } else {
-                       clrsetbits_be32(immap + MPC83XX_SICRL_OFFS,
-                                       MPC831X_SICRL_USB_MASK,
-                                       MPC831X_SICRL_USB_ULPI);
-                       clrsetbits_be32(immap + MPC83XX_SICRH_OFFS,
-                                       MPC831X_SICRH_USB_MASK,
-                                       MPC831X_SICRH_USB_ULPI);
-               }
-       }
-
-       iounmap(immap);
-
-       of_node_put(immr_node);
-
-       /* Map USB SOC space */
-       ret = of_address_to_resource(np, 0, &res);
-       if (ret) {
-               of_node_put(np);
-               return ret;
-       }
-       usb_regs = ioremap(res.start, resource_size(&res));
-
-       /* Using on-chip PHY */
-       if (prop && (!strcmp(prop, "utmi_wide") || !strcmp(prop, "utmi"))) {
-               u32 refsel;
-
-               if (of_device_is_compatible(immr_node, "fsl,mpc8308-immr"))
-                       goto out;
-
-               if (of_device_is_compatible(immr_node, "fsl,mpc8315-immr"))
-                       refsel = CONTROL_REFSEL_24MHZ;
-               else
-                       refsel = CONTROL_REFSEL_48MHZ;
-               /* Set UTMI_PHY_EN and REFSEL */
-               out_be32(usb_regs + FSL_USB2_CONTROL_OFFS,
-                        CONTROL_UTMI_PHY_EN | refsel);
-       /* Using external UPLI PHY */
-       } else if (prop && !strcmp(prop, "ulpi")) {
-               /* Set PHY_CLK_SEL to ULPI */
-               temp = CONTROL_PHY_CLK_SEL_ULPI;
-#ifdef CONFIG_USB_OTG
-               /* Set OTG_PORT */
-               if (!of_device_is_compatible(immr_node, "fsl,mpc8308-immr")) {
-                       dr_mode = of_get_property(np, "dr_mode", NULL);
-                       if (dr_mode && !strcmp(dr_mode, "otg"))
-                               temp |= CONTROL_OTG_PORT;
-               }
-#endif /* CONFIG_USB_OTG */
-               out_be32(usb_regs + FSL_USB2_CONTROL_OFFS, temp);
-       } else {
-               pr_warn("831x USB PHY type not supported\n");
-               ret = -EINVAL;
-       }
-
-out:
-       iounmap(usb_regs);
-       of_node_put(np);
-       return ret;
-}
-#endif /* CONFIG_PPC_MPC831x */
-
-#ifdef CONFIG_PPC_MPC837x
-int __init mpc837x_usb_cfg(void)
-{
-       void __iomem *immap;
-       struct device_node *np = NULL;
-       const void *prop;
-       int ret = 0;
-
-       np = of_find_compatible_node(NULL, NULL, "fsl-usb2-dr");
-       if (!np || !of_device_is_available(np)) {
-               of_node_put(np);
-               return -ENODEV;
-       }
-       prop = of_get_property(np, "phy_type", NULL);
-
-       if (!prop || (strcmp(prop, "ulpi") && strcmp(prop, "serial"))) {
-               pr_warn("837x USB PHY type not supported\n");
-               of_node_put(np);
-               return -EINVAL;
-       }
-
-       /* Map IMMR space for pin and clock settings */
-       immap = ioremap(get_immrbase(), 0x1000);
-       if (!immap) {
-               of_node_put(np);
-               return -ENOMEM;
-       }
-
-       /* Configure clock */
-       clrsetbits_be32(immap + MPC83XX_SCCR_OFFS, MPC837X_SCCR_USB_DRCM_11,
-                       MPC837X_SCCR_USB_DRCM_11);
-
-       /* Configure pin mux for ULPI/serial */
-       clrsetbits_be32(immap + MPC83XX_SICRL_OFFS, MPC837X_SICRL_USB_MASK,
-                       MPC837X_SICRL_USB_ULPI);
-
-       iounmap(immap);
-       of_node_put(np);
-       return ret;
-}
-#endif /* CONFIG_PPC_MPC837x */
diff --git a/arch/powerpc/platforms/83xx/usb_831x.c b/arch/powerpc/platforms/83xx/usb_831x.c
new file mode 100644 (file)
index 0000000..28c24e9
--- /dev/null
@@ -0,0 +1,128 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Freescale 83xx USB SOC setup code
+ *
+ * Copyright (C) 2007 Freescale Semiconductor, Inc.
+ * Author: Li Yang
+ */
+
+#include <linux/stddef.h>
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/io.h>
+
+#include <sysdev/fsl_soc.h>
+
+#include "mpc83xx.h"
+
+int __init mpc831x_usb_cfg(void)
+{
+       u32 temp;
+       void __iomem *immap, *usb_regs;
+       struct device_node *np = NULL;
+       struct device_node *immr_node = NULL;
+       const void *prop;
+       struct resource res;
+       int ret = 0;
+#ifdef CONFIG_USB_OTG
+       const void *dr_mode;
+#endif
+
+       np = of_find_compatible_node(NULL, NULL, "fsl-usb2-dr");
+       if (!np)
+               return -ENODEV;
+       prop = of_get_property(np, "phy_type", NULL);
+
+       /* Map IMMR space for pin and clock settings */
+       immap = ioremap(get_immrbase(), 0x1000);
+       if (!immap) {
+               of_node_put(np);
+               return -ENOMEM;
+       }
+
+       /* Configure clock */
+       immr_node = of_get_parent(np);
+       if (immr_node && (of_device_is_compatible(immr_node, "fsl,mpc8315-immr") ||
+                         of_device_is_compatible(immr_node, "fsl,mpc8308-immr")))
+               clrsetbits_be32(immap + MPC83XX_SCCR_OFFS,
+                               MPC8315_SCCR_USB_MASK,
+                               MPC8315_SCCR_USB_DRCM_01);
+       else
+               clrsetbits_be32(immap + MPC83XX_SCCR_OFFS,
+                               MPC83XX_SCCR_USB_MASK,
+                               MPC83XX_SCCR_USB_DRCM_11);
+
+       /* Configure pin mux for ULPI.  There is no pin mux for UTMI */
+       if (prop && !strcmp(prop, "ulpi")) {
+               if (of_device_is_compatible(immr_node, "fsl,mpc8308-immr")) {
+                       clrsetbits_be32(immap + MPC83XX_SICRH_OFFS,
+                                       MPC8308_SICRH_USB_MASK,
+                                       MPC8308_SICRH_USB_ULPI);
+               } else if (of_device_is_compatible(immr_node, "fsl,mpc8315-immr")) {
+                       clrsetbits_be32(immap + MPC83XX_SICRL_OFFS,
+                                       MPC8315_SICRL_USB_MASK,
+                                       MPC8315_SICRL_USB_ULPI);
+                       clrsetbits_be32(immap + MPC83XX_SICRH_OFFS,
+                                       MPC8315_SICRH_USB_MASK,
+                                       MPC8315_SICRH_USB_ULPI);
+               } else {
+                       clrsetbits_be32(immap + MPC83XX_SICRL_OFFS,
+                                       MPC831X_SICRL_USB_MASK,
+                                       MPC831X_SICRL_USB_ULPI);
+                       clrsetbits_be32(immap + MPC83XX_SICRH_OFFS,
+                                       MPC831X_SICRH_USB_MASK,
+                                       MPC831X_SICRH_USB_ULPI);
+               }
+       }
+
+       iounmap(immap);
+
+       of_node_put(immr_node);
+
+       /* Map USB SOC space */
+       ret = of_address_to_resource(np, 0, &res);
+       if (ret) {
+               of_node_put(np);
+               return ret;
+       }
+       usb_regs = ioremap(res.start, resource_size(&res));
+
+       /* Using on-chip PHY */
+       if (prop && (!strcmp(prop, "utmi_wide") || !strcmp(prop, "utmi"))) {
+               u32 refsel;
+
+               if (of_device_is_compatible(immr_node, "fsl,mpc8308-immr"))
+                       goto out;
+
+               if (of_device_is_compatible(immr_node, "fsl,mpc8315-immr"))
+                       refsel = CONTROL_REFSEL_24MHZ;
+               else
+                       refsel = CONTROL_REFSEL_48MHZ;
+               /* Set UTMI_PHY_EN and REFSEL */
+               out_be32(usb_regs + FSL_USB2_CONTROL_OFFS,
+                        CONTROL_UTMI_PHY_EN | refsel);
+       /* Using external UPLI PHY */
+       } else if (prop && !strcmp(prop, "ulpi")) {
+               /* Set PHY_CLK_SEL to ULPI */
+               temp = CONTROL_PHY_CLK_SEL_ULPI;
+#ifdef CONFIG_USB_OTG
+               /* Set OTG_PORT */
+               if (!of_device_is_compatible(immr_node, "fsl,mpc8308-immr")) {
+                       dr_mode = of_get_property(np, "dr_mode", NULL);
+                       if (dr_mode && !strcmp(dr_mode, "otg"))
+                               temp |= CONTROL_OTG_PORT;
+               }
+#endif /* CONFIG_USB_OTG */
+               out_be32(usb_regs + FSL_USB2_CONTROL_OFFS, temp);
+       } else {
+               pr_warn("831x USB PHY type not supported\n");
+               ret = -EINVAL;
+       }
+
+out:
+       iounmap(usb_regs);
+       of_node_put(np);
+       return ret;
+}
diff --git a/arch/powerpc/platforms/83xx/usb_834x.c b/arch/powerpc/platforms/83xx/usb_834x.c
new file mode 100644 (file)
index 0000000..3a8d6c6
--- /dev/null
@@ -0,0 +1,90 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Freescale 83xx USB SOC setup code
+ *
+ * Copyright (C) 2007 Freescale Semiconductor, Inc.
+ * Author: Li Yang
+ */
+
+#include <linux/stddef.h>
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/io.h>
+
+#include <sysdev/fsl_soc.h>
+
+#include "mpc83xx.h"
+
+int __init mpc834x_usb_cfg(void)
+{
+       unsigned long sccr, sicrl, sicrh;
+       void __iomem *immap;
+       struct device_node *np = NULL;
+       int port0_is_dr = 0, port1_is_dr = 0;
+       const void *prop, *dr_mode;
+
+       immap = ioremap(get_immrbase(), 0x1000);
+       if (!immap)
+               return -ENOMEM;
+
+       /* Read registers */
+       /* Note: DR and MPH must use the same clock setting in SCCR */
+       sccr = in_be32(immap + MPC83XX_SCCR_OFFS) & ~MPC83XX_SCCR_USB_MASK;
+       sicrl = in_be32(immap + MPC83XX_SICRL_OFFS) & ~MPC834X_SICRL_USB_MASK;
+       sicrh = in_be32(immap + MPC83XX_SICRH_OFFS) & ~MPC834X_SICRH_USB_UTMI;
+
+       np = of_find_compatible_node(NULL, NULL, "fsl-usb2-dr");
+       if (np) {
+               sccr |= MPC83XX_SCCR_USB_DRCM_11;  /* 1:3 */
+
+               prop = of_get_property(np, "phy_type", NULL);
+               port1_is_dr = 1;
+               if (prop &&
+                   (!strcmp(prop, "utmi") || !strcmp(prop, "utmi_wide"))) {
+                       sicrl |= MPC834X_SICRL_USB0 | MPC834X_SICRL_USB1;
+                       sicrh |= MPC834X_SICRH_USB_UTMI;
+                       port0_is_dr = 1;
+               } else if (prop && !strcmp(prop, "serial")) {
+                       dr_mode = of_get_property(np, "dr_mode", NULL);
+                       if (dr_mode && !strcmp(dr_mode, "otg")) {
+                               sicrl |= MPC834X_SICRL_USB0 | MPC834X_SICRL_USB1;
+                               port0_is_dr = 1;
+                       } else {
+                               sicrl |= MPC834X_SICRL_USB1;
+                       }
+               } else if (prop && !strcmp(prop, "ulpi")) {
+                       sicrl |= MPC834X_SICRL_USB1;
+               } else {
+                       pr_warn("834x USB PHY type not supported\n");
+               }
+               of_node_put(np);
+       }
+       np = of_find_compatible_node(NULL, NULL, "fsl-usb2-mph");
+       if (np) {
+               sccr |= MPC83XX_SCCR_USB_MPHCM_11; /* 1:3 */
+
+               prop = of_get_property(np, "port0", NULL);
+               if (prop) {
+                       if (port0_is_dr)
+                               pr_warn("834x USB port0 can't be used by both DR and MPH!\n");
+                       sicrl &= ~MPC834X_SICRL_USB0;
+               }
+               prop = of_get_property(np, "port1", NULL);
+               if (prop) {
+                       if (port1_is_dr)
+                               pr_warn("834x USB port1 can't be used by both DR and MPH!\n");
+                       sicrl &= ~MPC834X_SICRL_USB1;
+               }
+               of_node_put(np);
+       }
+
+       /* Write back */
+       out_be32(immap + MPC83XX_SCCR_OFFS, sccr);
+       out_be32(immap + MPC83XX_SICRL_OFFS, sicrl);
+       out_be32(immap + MPC83XX_SICRH_OFFS, sicrh);
+
+       iounmap(immap);
+       return 0;
+}
diff --git a/arch/powerpc/platforms/83xx/usb_837x.c b/arch/powerpc/platforms/83xx/usb_837x.c
new file mode 100644 (file)
index 0000000..726935b
--- /dev/null
@@ -0,0 +1,58 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Freescale 83xx USB SOC setup code
+ *
+ * Copyright (C) 2007 Freescale Semiconductor, Inc.
+ * Author: Li Yang
+ */
+
+#include <linux/stddef.h>
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/io.h>
+
+#include <sysdev/fsl_soc.h>
+
+#include "mpc83xx.h"
+
+int __init mpc837x_usb_cfg(void)
+{
+       void __iomem *immap;
+       struct device_node *np = NULL;
+       const void *prop;
+       int ret = 0;
+
+       np = of_find_compatible_node(NULL, NULL, "fsl-usb2-dr");
+       if (!np || !of_device_is_available(np)) {
+               of_node_put(np);
+               return -ENODEV;
+       }
+       prop = of_get_property(np, "phy_type", NULL);
+
+       if (!prop || (strcmp(prop, "ulpi") && strcmp(prop, "serial"))) {
+               pr_warn("837x USB PHY type not supported\n");
+               of_node_put(np);
+               return -EINVAL;
+       }
+
+       /* Map IMMR space for pin and clock settings */
+       immap = ioremap(get_immrbase(), 0x1000);
+       if (!immap) {
+               of_node_put(np);
+               return -ENOMEM;
+       }
+
+       /* Configure clock */
+       clrsetbits_be32(immap + MPC83XX_SCCR_OFFS, MPC837X_SCCR_USB_DRCM_11,
+                       MPC837X_SCCR_USB_DRCM_11);
+
+       /* Configure pin mux for ULPI/serial */
+       clrsetbits_be32(immap + MPC83XX_SICRL_OFFS, MPC837X_SICRL_USB_MASK,
+                       MPC837X_SICRL_USB_ULPI);
+
+       iounmap(immap);
+       of_node_put(np);
+       return ret;
+}