From: Lukasz Majewski <lukma@denx.de>
To: Neil Armstrong <narmstrong@baylibre.com>
Cc: marex@denx.de, u-boot@lists.denx.de, u-boot-amlogic@groups.io
Subject: Re: [U-Boot] [PATCH v2 3/3] mach-meson: g12a: add DWC2 peripheral mode support
Date: Fri, 19 Apr 2019 08:17:22 +0200 [thread overview]
Message-ID: <20190419081722.6941a8a7@jawa> (raw)
In-Reply-To: <20190401124657.29736-4-narmstrong@baylibre.com>
[-- Attachment #1: Type: text/plain, Size: 5854 bytes --]
Hi Neil,
> Adds support for Amlogic G12A USB Device mode.
>
> The DWC2 Controller behind the Glue can be connected to an OTG
> capable PHY. The Glue setups the PHY mode.
>
> This patch implements Device mode support by adding a
> board_usb_init/cleanup setting up the DWC2 controller and switch the
> OTG capable port to Device before starting the DWC2 controller in
> Device mode.
>
> Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
I wanted to apply this series, but it turned out that it depends on:
[U-Boot] [PATCH v2 0/6] ARM: meson: Add support for G12A based U200
board
Let's wait till the above one is pulled to master.
> ---
> arch/arm/include/asm/arch-meson/usb.h | 12 +++
> arch/arm/mach-meson/board-g12a.c | 126
> ++++++++++++++++++++++++++ 2 files changed, 138 insertions(+)
> create mode 100644 arch/arm/include/asm/arch-meson/usb.h
>
> diff --git a/arch/arm/include/asm/arch-meson/usb.h
> b/arch/arm/include/asm/arch-meson/usb.h new file mode 100644
> index 0000000000..b794b5ce77
> --- /dev/null
> +++ b/arch/arm/include/asm/arch-meson/usb.h
> @@ -0,0 +1,12 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +/*
> + * Copyright (C) 2019 BayLibre, SAS
> + * Author: Neil Armstrong <narmstrong@baylibre.com>
> + */
> +
> +#ifndef __MESON_USB_H__
> +#define __MESON_USB_H__
> +
> +int dwc3_meson_g12a_force_mode(struct udevice *dev, enum usb_dr_mode
> mode); +
> +#endif /* __MESON_USB_H__ */
> diff --git a/arch/arm/mach-meson/board-g12a.c
> b/arch/arm/mach-meson/board-g12a.c index fc3764b960..1652970fbd 100644
> --- a/arch/arm/mach-meson/board-g12a.c
> +++ b/arch/arm/mach-meson/board-g12a.c
> @@ -12,7 +12,12 @@
> #include <asm/io.h>
> #include <asm/armv8/mmu.h>
> #include <linux/sizes.h>
> +#include <usb.h>
> +#include <linux/usb/otg.h>
> +#include <asm/arch/usb.h>
> +#include <usb/dwc2_udc.h>
> #include <phy.h>
> +#include <clk.h>
>
> DECLARE_GLOBAL_DATA_PTR;
>
> @@ -148,3 +153,124 @@ void meson_eth_init(phy_interface_t mode,
> unsigned int flags) /* Enable power gate */
> clrbits_le32(G12A_MEM_PD_REG_0, G12A_MEM_PD_REG_0_ETH_MASK);
> }
> +
> +#if CONFIG_IS_ENABLED(USB_DWC3_MESON_G12A) && \
> + CONFIG_IS_ENABLED(USB_GADGET_DWC2_OTG)
> +static struct dwc2_plat_otg_data meson_g12a_dwc2_data;
> +
> +int board_usb_init(int index, enum usb_init_type init)
> +{
> + 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;
> +
> + /* find the usb glue node */
> + node = fdt_node_offset_by_compatible(blob, -1,
> +
> "amlogic,meson-g12a-usb-ctrl");
> + if (node < 0) {
> + debug("Not found usb-control node\n");
> + return -ENODEV;
> + }
> +
> + if (!fdtdec_get_is_enabled(blob, node)) {
> + debug("usb is disabled in the device tree\n");
> + return -ENODEV;
> + }
> +
> + ret = uclass_get_device_by_of_offset(UCLASS_SIMPLE_BUS,
> node, &dev);
> + if (ret) {
> + debug("Not found usb-control device\n");
> + 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;
> + }
> +
> + if (!fdtdec_get_is_enabled(blob, dwc2_node)) {
> + debug("dwc2 is disabled in the device tree\n");
> + return -ENODEV;
> + }
> +
> + meson_g12a_dwc2_data.regs_otg = fdtdec_get_addr(blob,
> dwc2_node, "reg");
> + if (meson_g12a_dwc2_data.regs_otg == FDT_ADDR_T_NONE) {
> + debug("usbotg: can't get base address\n");
> + return -ENODATA;
> + }
> +
> + /* Enable clock */
> + 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_of_offset(UCLASS_CLK, args.node,
> &clk_dev);
> + if (ret)
> + return ret;
> +
> + if (args.args_count != 1) {
> + debug("Can't find clock ID in the device tree\n");
> + return -ENODATA;
> + }
> +
> + clk.dev = clk_dev;
> + clk.id = args.args[0];
> +
> + ret = clk_enable(&clk);
> + if (ret) {
> + debug("Failed to enable usbotg clock\n");
> + return ret;
> + }
> +
> + meson_g12a_dwc2_data.rx_fifo_sz = fdtdec_get_int(blob,
> dwc2_node,
> +
> "g-rx-fifo-size", 0);
> + meson_g12a_dwc2_data.np_tx_fifo_sz = fdtdec_get_int(blob,
> dwc2_node,
> + "g-np-tx-fifo-size",
> 0);
> + meson_g12a_dwc2_data.tx_fifo_sz = fdtdec_get_int(blob,
> dwc2_node,
> +
> "g-tx-fifo-size", 0); +
> + /* Switch to peripheral mode */
> + ret = dwc3_meson_g12a_force_mode(dev,
> USB_DR_MODE_PERIPHERAL);
> + if (ret)
> + return ret;
> +
> + return dwc2_udc_probe(&meson_g12a_dwc2_data);
> +}
> +
> +int board_usb_cleanup(int index, enum usb_init_type init)
> +{
> + 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-g12a-usb-ctrl");
> + if (node < 0)
> + return -ENODEV;
> +
> + if (!fdtdec_get_is_enabled(blob, node))
> + return -ENODEV;
> +
> + ret = uclass_get_device_by_of_offset(UCLASS_SIMPLE_BUS,
> node, &dev);
> + if (ret)
> + return ret;
> +
> + /* Switch to OTG mode */
> + ret = dwc3_meson_g12a_force_mode(dev, USB_DR_MODE_HOST);
> + if (ret)
> + return ret;
> +
> + return 0;
> +}
> +#endif
Best regards,
Lukasz Majewski
--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma@denx.de
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
WARNING: multiple messages have this Message-ID (diff)
From: Lukasz Majewski <lukma@denx.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v2 3/3] mach-meson: g12a: add DWC2 peripheral mode support
Date: Fri, 19 Apr 2019 08:17:22 +0200 [thread overview]
Message-ID: <20190419081722.6941a8a7@jawa> (raw)
In-Reply-To: <20190401124657.29736-4-narmstrong@baylibre.com>
Hi Neil,
> Adds support for Amlogic G12A USB Device mode.
>
> The DWC2 Controller behind the Glue can be connected to an OTG
> capable PHY. The Glue setups the PHY mode.
>
> This patch implements Device mode support by adding a
> board_usb_init/cleanup setting up the DWC2 controller and switch the
> OTG capable port to Device before starting the DWC2 controller in
> Device mode.
>
> Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
I wanted to apply this series, but it turned out that it depends on:
[U-Boot] [PATCH v2 0/6] ARM: meson: Add support for G12A based U200
board
Let's wait till the above one is pulled to master.
> ---
> arch/arm/include/asm/arch-meson/usb.h | 12 +++
> arch/arm/mach-meson/board-g12a.c | 126
> ++++++++++++++++++++++++++ 2 files changed, 138 insertions(+)
> create mode 100644 arch/arm/include/asm/arch-meson/usb.h
>
> diff --git a/arch/arm/include/asm/arch-meson/usb.h
> b/arch/arm/include/asm/arch-meson/usb.h new file mode 100644
> index 0000000000..b794b5ce77
> --- /dev/null
> +++ b/arch/arm/include/asm/arch-meson/usb.h
> @@ -0,0 +1,12 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +/*
> + * Copyright (C) 2019 BayLibre, SAS
> + * Author: Neil Armstrong <narmstrong@baylibre.com>
> + */
> +
> +#ifndef __MESON_USB_H__
> +#define __MESON_USB_H__
> +
> +int dwc3_meson_g12a_force_mode(struct udevice *dev, enum usb_dr_mode
> mode); +
> +#endif /* __MESON_USB_H__ */
> diff --git a/arch/arm/mach-meson/board-g12a.c
> b/arch/arm/mach-meson/board-g12a.c index fc3764b960..1652970fbd 100644
> --- a/arch/arm/mach-meson/board-g12a.c
> +++ b/arch/arm/mach-meson/board-g12a.c
> @@ -12,7 +12,12 @@
> #include <asm/io.h>
> #include <asm/armv8/mmu.h>
> #include <linux/sizes.h>
> +#include <usb.h>
> +#include <linux/usb/otg.h>
> +#include <asm/arch/usb.h>
> +#include <usb/dwc2_udc.h>
> #include <phy.h>
> +#include <clk.h>
>
> DECLARE_GLOBAL_DATA_PTR;
>
> @@ -148,3 +153,124 @@ void meson_eth_init(phy_interface_t mode,
> unsigned int flags) /* Enable power gate */
> clrbits_le32(G12A_MEM_PD_REG_0, G12A_MEM_PD_REG_0_ETH_MASK);
> }
> +
> +#if CONFIG_IS_ENABLED(USB_DWC3_MESON_G12A) && \
> + CONFIG_IS_ENABLED(USB_GADGET_DWC2_OTG)
> +static struct dwc2_plat_otg_data meson_g12a_dwc2_data;
> +
> +int board_usb_init(int index, enum usb_init_type init)
> +{
> + 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;
> +
> + /* find the usb glue node */
> + node = fdt_node_offset_by_compatible(blob, -1,
> +
> "amlogic,meson-g12a-usb-ctrl");
> + if (node < 0) {
> + debug("Not found usb-control node\n");
> + return -ENODEV;
> + }
> +
> + if (!fdtdec_get_is_enabled(blob, node)) {
> + debug("usb is disabled in the device tree\n");
> + return -ENODEV;
> + }
> +
> + ret = uclass_get_device_by_of_offset(UCLASS_SIMPLE_BUS,
> node, &dev);
> + if (ret) {
> + debug("Not found usb-control device\n");
> + 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;
> + }
> +
> + if (!fdtdec_get_is_enabled(blob, dwc2_node)) {
> + debug("dwc2 is disabled in the device tree\n");
> + return -ENODEV;
> + }
> +
> + meson_g12a_dwc2_data.regs_otg = fdtdec_get_addr(blob,
> dwc2_node, "reg");
> + if (meson_g12a_dwc2_data.regs_otg == FDT_ADDR_T_NONE) {
> + debug("usbotg: can't get base address\n");
> + return -ENODATA;
> + }
> +
> + /* Enable clock */
> + 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_of_offset(UCLASS_CLK, args.node,
> &clk_dev);
> + if (ret)
> + return ret;
> +
> + if (args.args_count != 1) {
> + debug("Can't find clock ID in the device tree\n");
> + return -ENODATA;
> + }
> +
> + clk.dev = clk_dev;
> + clk.id = args.args[0];
> +
> + ret = clk_enable(&clk);
> + if (ret) {
> + debug("Failed to enable usbotg clock\n");
> + return ret;
> + }
> +
> + meson_g12a_dwc2_data.rx_fifo_sz = fdtdec_get_int(blob,
> dwc2_node,
> +
> "g-rx-fifo-size", 0);
> + meson_g12a_dwc2_data.np_tx_fifo_sz = fdtdec_get_int(blob,
> dwc2_node,
> + "g-np-tx-fifo-size",
> 0);
> + meson_g12a_dwc2_data.tx_fifo_sz = fdtdec_get_int(blob,
> dwc2_node,
> +
> "g-tx-fifo-size", 0); +
> + /* Switch to peripheral mode */
> + ret = dwc3_meson_g12a_force_mode(dev,
> USB_DR_MODE_PERIPHERAL);
> + if (ret)
> + return ret;
> +
> + return dwc2_udc_probe(&meson_g12a_dwc2_data);
> +}
> +
> +int board_usb_cleanup(int index, enum usb_init_type init)
> +{
> + 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-g12a-usb-ctrl");
> + if (node < 0)
> + return -ENODEV;
> +
> + if (!fdtdec_get_is_enabled(blob, node))
> + return -ENODEV;
> +
> + ret = uclass_get_device_by_of_offset(UCLASS_SIMPLE_BUS,
> node, &dev);
> + if (ret)
> + return ret;
> +
> + /* Switch to OTG mode */
> + ret = dwc3_meson_g12a_force_mode(dev, USB_DR_MODE_HOST);
> + if (ret)
> + return ret;
> +
> + return 0;
> +}
> +#endif
Best regards,
Lukasz Majewski
--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma at denx.de
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 488 bytes
Desc: OpenPGP digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20190419/95a6834b/attachment.sig>
next prev parent reply other threads:[~2019-04-19 6:17 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-04-01 12:46 [PATCH v2 0/3] ARM: meson: Add G12A USB Support Neil Armstrong
2019-04-01 12:46 ` [U-Boot] " Neil Armstrong
2019-04-01 12:46 ` [PATCH v2 1/3] usb: dwc3: Add Meson G12A USB Glue Neil Armstrong
2019-04-01 12:46 ` [U-Boot] " Neil Armstrong
2019-04-02 1:02 ` Marek Vasut
2019-04-02 1:02 ` [U-Boot] " Marek Vasut
2019-04-01 12:46 ` [PATCH v2 2/3] phy: meson: add Amlogic G12A USB2 and USB3+PCIE PHY drivers Neil Armstrong
2019-04-01 12:46 ` [U-Boot] " Neil Armstrong
2019-04-01 12:46 ` [PATCH v2 3/3] mach-meson: g12a: add DWC2 peripheral mode support Neil Armstrong
2019-04-01 12:46 ` [U-Boot] " Neil Armstrong
2019-04-19 6:17 ` Lukasz Majewski [this message]
2019-04-19 6:17 ` Lukasz Majewski
2019-04-23 9:31 ` Neil Armstrong
2019-04-23 9:31 ` Neil Armstrong
2019-04-26 9:18 ` Neil Armstrong
2019-04-26 9:18 ` Neil Armstrong
2019-05-06 18:35 ` Neil Armstrong
2019-05-06 18:35 ` Neil Armstrong
2019-05-06 21:16 ` Lukasz Majewski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190419081722.6941a8a7@jawa \
--to=lukma@denx.de \
--cc=marex@denx.de \
--cc=narmstrong@baylibre.com \
--cc=u-boot-amlogic@groups.io \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.