From 7ccc73773fb58efe710ccb1f9e855e73cf8b0b9d Mon Sep 17 00:00:00 2001 From: Neil Armstrong Date: Thu, 10 Sep 2020 10:48:14 +0200 Subject: ARM: mach-meson: use new DWC3 glue for GXL & GXM Use the new Amlogic GXL/GXM USB Glue instead of the set of USB3 PHY and Simple DWC3 wrapper. Signed-off-by: Neil Armstrong --- arch/arm/mach-meson/board-gx.c | 127 +++++++++++++++++++++++------------------ 1 file changed, 72 insertions(+), 55 deletions(-) (limited to 'arch') diff --git a/arch/arm/mach-meson/board-gx.c b/arch/arm/mach-meson/board-gx.c index c4cc11f1de..7a0e703596 100644 --- a/arch/arm/mach-meson/board-gx.c +++ b/arch/arm/mach-meson/board-gx.c @@ -156,79 +156,70 @@ void meson_eth_init(phy_interface_t mode, unsigned int flags) clrbits_le32(GX_MEM_PD_REG_0, GX_MEM_PD_REG_0_ETH_MASK); } -#if CONFIG_IS_ENABLED(USB_XHCI_DWC3_OF_SIMPLE) && \ +#if CONFIG_IS_ENABLED(USB_DWC3_MESON_GXL) && \ CONFIG_IS_ENABLED(USB_GADGET_DWC2_OTG) static struct dwc2_plat_otg_data meson_gx_dwc2_data; -static struct phy usb_phys[2]; int board_usb_init(int index, enum usb_init_type init) { - struct ofnode_phandle_args args; - struct udevice *clk_dev; - ofnode dwc2_node; + struct fdtdec_phandle_args args; + const void *blob = gd->fdt_blob; + int node, dwc2_node; + struct udevice *dev, *clk_dev; struct clk clk; - int ret, i; - u32 val; - - /* find the dwc2 node */ - dwc2_node = ofnode_by_compatible(ofnode_null(), "snps,dwc2"); - if (!ofnode_valid(dwc2_node)) { - debug("Not found dwc2 node\n"); - return -ENODEV; + int ret; + + /* find the usb glue node */ + node = fdt_node_offset_by_compatible(blob, -1, + "amlogic,meson-gxl-usb-ctrl"); + if (node < 0) { + node = fdt_node_offset_by_compatible(blob, -1, + "amlogic,meson-gxm-usb-ctrl"); + if (node < 0) { + debug("Not found usb-control node\n"); + return -ENODEV; + } } - if (!ofnode_is_available(dwc2_node)) { - debug("dwc2 is disabled in the device tree\n"); + if (!fdtdec_get_is_enabled(blob, node)) { + debug("usb is disabled in the device tree\n"); return -ENODEV; } - /* get the PHYs */ - for (i = 0; i < 2; i++) { - ret = generic_phy_get_by_index_nodev(dwc2_node, i, - &usb_phys[i]); - if (ret && ret != -ENOENT) { - pr_err("Failed to get USB PHY%d for %s\n", - i, ofnode_get_name(dwc2_node)); - return ret; - } + ret = uclass_get_device_by_of_offset(UCLASS_SIMPLE_BUS, node, &dev); + if (ret) { + debug("Not found usb-control device\n"); + return ret; } - for (i = 0; i < 2; i++) { - ret = generic_phy_init(&usb_phys[i]); - if (ret) { - pr_err("Can't init USB PHY%d for %s\n", - i, ofnode_get_name(dwc2_node)); - return ret; - } + /* find the dwc2 node */ + dwc2_node = fdt_node_offset_by_compatible(blob, node, + "amlogic,meson-g12a-usb"); + if (dwc2_node < 0) { + debug("Not found dwc2 node\n"); + return -ENODEV; } - for (i = 0; i < 2; i++) { - ret = generic_phy_power_on(&usb_phys[i]); - if (ret) { - pr_err("Can't power USB PHY%d for %s\n", - i, ofnode_get_name(dwc2_node)); - return ret; - } + if (!fdtdec_get_is_enabled(blob, dwc2_node)) { + debug("dwc2 is disabled in the device tree\n"); + return -ENODEV; } - phy_meson_gxl_usb3_set_mode(&usb_phys[0], USB_DR_MODE_PERIPHERAL); - phy_meson_gxl_usb2_set_mode(&usb_phys[1], USB_DR_MODE_PERIPHERAL); - - meson_gx_dwc2_data.regs_otg = ofnode_get_addr(dwc2_node); + meson_gx_dwc2_data.regs_otg = fdtdec_get_addr(blob, dwc2_node, "reg"); if (meson_gx_dwc2_data.regs_otg == FDT_ADDR_T_NONE) { debug("usbotg: can't get base address\n"); return -ENODATA; } /* Enable clock */ - ret = ofnode_parse_phandle_with_args(dwc2_node, "clocks", + ret = fdtdec_parse_phandle_with_args(blob, dwc2_node, "clocks", "#clock-cells", 0, 0, &args); if (ret) { debug("usbotg has no clocks defined in the device tree\n"); return ret; } - ret = uclass_get_device_by_ofnode(UCLASS_CLK, args.node, &clk_dev); + ret = uclass_get_device_by_of_offset(UCLASS_CLK, args.node, &clk_dev); if (ret) return ret; @@ -246,25 +237,51 @@ int board_usb_init(int index, enum usb_init_type init) return ret; } - ofnode_read_u32(dwc2_node, "g-rx-fifo-size", &val); - meson_gx_dwc2_data.rx_fifo_sz = val; - ofnode_read_u32(dwc2_node, "g-np-tx-fifo-size", &val); - meson_gx_dwc2_data.np_tx_fifo_sz = val; - ofnode_read_u32(dwc2_node, "g-tx-fifo-size", &val); - meson_gx_dwc2_data.tx_fifo_sz = val; + meson_gx_dwc2_data.rx_fifo_sz = fdtdec_get_int(blob, dwc2_node, + "g-rx-fifo-size", 0); + meson_gx_dwc2_data.np_tx_fifo_sz = fdtdec_get_int(blob, dwc2_node, + "g-np-tx-fifo-size", 0); + meson_gx_dwc2_data.tx_fifo_sz = fdtdec_get_int(blob, dwc2_node, + "g-tx-fifo-size", 0); + + /* Switch to peripheral mode */ + ret = dwc3_meson_gxl_force_mode(dev, USB_DR_MODE_PERIPHERAL); + if (ret) + return ret; return dwc2_udc_probe(&meson_gx_dwc2_data); } int board_usb_cleanup(int index, enum usb_init_type init) { - int i; + const void *blob = gd->fdt_blob; + struct udevice *dev; + int node; + int ret; + + /* find the usb glue node */ + node = fdt_node_offset_by_compatible(blob, -1, + "amlogic,meson-gxl-usb-ctrl"); + if (node < 0) { + node = fdt_node_offset_by_compatible(blob, -1, + "amlogic,meson-gxm-usb-ctrl"); + if (node < 0) { + debug("Not found usb-control node\n"); + return -ENODEV; + } + } - phy_meson_gxl_usb3_set_mode(&usb_phys[0], USB_DR_MODE_HOST); - phy_meson_gxl_usb2_set_mode(&usb_phys[1], USB_DR_MODE_HOST); + if (!fdtdec_get_is_enabled(blob, node)) + return -ENODEV; - for (i = 0; i < 2; i++) - usb_phys[i].dev = NULL; + ret = uclass_get_device_by_of_offset(UCLASS_SIMPLE_BUS, node, &dev); + if (ret) + return ret; + + /* Switch to OTG mode */ + ret = dwc3_meson_gxl_force_mode(dev, USB_DR_MODE_HOST); + if (ret) + return ret; return 0; } -- cgit v1.2.1