From: Mattijs Korpershoek <mkorpershoek@baylibre.com>
To: Sjoerd Simons <sjoerd@collabora.com>, u-boot@lists.denx.de
Cc: Martyn Welch <martyn.welch@collabora.com>,
Roger Quadros <rogerq@kernel.org>, Nishanth Menon <nm@ti.com>,
Kunihiko Hayashi <hayashi.kunihiko@socionext.com>,
Marek Vasut <marex@denx.de>
Subject: Re: [PATCH v4 1/7] usb: dwc3: Add dwc3 glue driver for am62
Date: Tue, 16 Jan 2024 11:22:41 +0100 [thread overview]
Message-ID: <87ply14lxq.fsf@baylibre.com> (raw)
In-Reply-To: <20240112085317.1866449-2-sjoerd@collabora.com>
Hi Sjoerd,
Thank you for the patch.
On ven., janv. 12, 2024 at 09:52, Sjoerd Simons <sjoerd@collabora.com> wrote:
> Add glue code for TI AM62 to the dwc3 driver; Most code adopted from
> TI vendor u-boot code.
>
> Signed-off-by: Sjoerd Simons <sjoerd@collabora.com>
>
> ---
>
> Changes in v4:
> - Add config dependency on SYSCON
> - Move defines and constants outside out of function scope
>
> Changes in v2:
> - Switch dwc3 glue to a seperate driver rather then in dwc-generic
>
> drivers/usb/dwc3/Kconfig | 14 ++++
> drivers/usb/dwc3/Makefile | 1 +
> drivers/usb/dwc3/dwc3-am62.c | 125 +++++++++++++++++++++++++++++++++++
> 3 files changed, 140 insertions(+)
> create mode 100644 drivers/usb/dwc3/dwc3-am62.c
>
> diff --git a/drivers/usb/dwc3/Kconfig b/drivers/usb/dwc3/Kconfig
> index c0c8c16fd9c..0100723a68b 100644
> --- a/drivers/usb/dwc3/Kconfig
> +++ b/drivers/usb/dwc3/Kconfig
> @@ -37,6 +37,20 @@ config SPL_USB_DWC3_GENERIC
> Select this for Xilinx ZynqMP and similar Platforms.
> This wrapper supports Host and Peripheral operation modes.
>
> +config SPL_USB_DWC3_AM62
> + bool "TI AM62 USB wrapper"
> + depends on SPL_DM_USB && SPL_USB_DWC3_GENERIC && SPL_SYSCON
> + help
> + Select this for TI AM62 Platforms.
> + This wrapper supports Host and Peripheral operation modes.
> +
> +config USB_DWC3_AM62
> + bool "TI AM62 USB wrapper"
> + depends on DM_USB && USB_DWC3_GENERIC && SYSCON
> + help
> + Select this for TI AM62 Platforms.
> + This wrapper supports Host and Peripheral operation modes.
> +
> config USB_DWC3_MESON_G12A
> bool "Amlogic Meson G12A USB wrapper"
> depends on DM_USB && USB_DWC3 && ARCH_MESON
> diff --git a/drivers/usb/dwc3/Makefile b/drivers/usb/dwc3/Makefile
> index 97b4f7191ca..a46b6824ab7 100644
> --- a/drivers/usb/dwc3/Makefile
> +++ b/drivers/usb/dwc3/Makefile
> @@ -6,6 +6,7 @@ dwc3-y := core.o
>
> obj-$(CONFIG_USB_DWC3_GADGET) += gadget.o ep0.o
>
> +obj-$(CONFIG_$(SPL_)USB_DWC3_AM62) += dwc3-am62.o
> obj-$(CONFIG_USB_DWC3_OMAP) += dwc3-omap.o
> obj-$(CONFIG_USB_DWC3_MESON_G12A) += dwc3-meson-g12a.o
> obj-$(CONFIG_USB_DWC3_MESON_GXL) += dwc3-meson-gxl.o
> diff --git a/drivers/usb/dwc3/dwc3-am62.c b/drivers/usb/dwc3/dwc3-am62.c
> new file mode 100644
> index 00000000000..99519602eb2
> --- /dev/null
> +++ b/drivers/usb/dwc3/dwc3-am62.c
> @@ -0,0 +1,125 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * TI AM62 specific glue layer for DWC3
> + */
> +
> +#include <dm.h>
> +#include <dm/device_compat.h>
> +#include <regmap.h>
> +#include <syscon.h>
> +#include <asm/io.h>
> +
> +#include "dwc3-generic.h"
> +
> +#define USBSS_MODE_CONTROL 0x1c
> +#define USBSS_PHY_CONFIG 0x8
> +#define USBSS_PHY_VBUS_SEL_MASK GENMASK(2, 1)
> +#define USBSS_PHY_VBUS_SEL_SHIFT 1
> +#define USBSS_MODE_VALID BIT(0)
> +#define PHY_PLL_REFCLK_MASK GENMASK(3, 0)
> +static const int dwc3_ti_am62_rate_table[] = { /* in KHZ */
> + 9600,
> + 10000,
> + 12000,
> + 19200,
> + 20000,
> + 24000,
> + 25000,
> + 26000,
> + 38400,
> + 40000,
> + 58000,
> + 50000,
> + 52000,
> +};
> +
> +static void dwc3_ti_am62_glue_configure(struct udevice *dev, int index,
> + enum usb_dr_mode mode)
> +{
> + struct clk usb2_refclk;
> + int rate_code, i, ret;
> + unsigned long rate;
> + u32 reg;
> + void *usbss;
> + bool vbus_divider;
> + struct regmap *syscon;
> + struct ofnode_phandle_args args;
> +
> + usbss = dev_remap_addr_index(dev, 0);
> + if (IS_ERR(usbss)) {
> + dev_err(dev, "can't map IOMEM resource\n");
> + return;
> + }
> +
> + ret = clk_get_by_name(dev, "ref", &usb2_refclk);
> + if (ret) {
> + dev_err(dev, "can't get usb2_refclk\n");
> + return;
> + }
> +
> + /* Calculate the rate code */
> + rate = clk_get_rate(&usb2_refclk);
> + rate /= 1000; /* To KHz */
> + for (i = 0; i < ARRAY_SIZE(dwc3_ti_am62_rate_table); i++) {
> + if (dwc3_ti_am62_rate_table[i] == rate)
> + break;
> + }
> +
> + if (i == ARRAY_SIZE(dwc3_ti_am62_rate_table)) {
> + dev_err(dev, "unsupported usb2_refclk rate: %lu KHz\n", rate);
> + return;
> + }
> +
> + rate_code = i;
> +
> + /* Read the syscon property */
> + syscon = syscon_regmap_lookup_by_phandle(dev, "ti,syscon-phy-pll-refclk");
> + if (IS_ERR(syscon)) {
> + dev_err(dev, "unable to get ti,syscon-phy-pll-refclk regmap\n");
> + return;
> + }
> +
> + ret = ofnode_parse_phandle_with_args(dev_ofnode(dev), "ti,syscon-phy-pll-refclk", NULL, 1,
> + 0, &args);
> + if (ret)
> + return;
> +
> + /* Program PHY PLL refclk by reading syscon property */
> + ret = regmap_update_bits(syscon, args.args[0], PHY_PLL_REFCLK_MASK, rate_code);
> + if (ret) {
The doc of ofnode_parse_phandle_with_args() states that:
* Caller is responsible to call of_node_put() on the returned out_args->np
* pointer.
Should we call of_node_put(args->np); before returning here?
Should the cleanup be done in case of success as well?
With that fixed:
Reviewed-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>
> + dev_err(dev, "failed to set phy pll reference clock rate\n");
> + return;
> + }
> +
> + /* VBUS divider select */
> + reg = readl(usbss + USBSS_PHY_CONFIG);
> + vbus_divider = dev_read_bool(dev, "ti,vbus-divider");
> + if (vbus_divider)
> + reg |= 1 << USBSS_PHY_VBUS_SEL_SHIFT;
> +
> + writel(reg, usbss + USBSS_PHY_CONFIG);
> +
> + /* Set mode valid */
> + reg = readl(usbss + USBSS_MODE_CONTROL);
> + reg |= USBSS_MODE_VALID;
> + writel(reg, usbss + USBSS_MODE_CONTROL);
> +}
> +
> +struct dwc3_glue_ops ti_am62_ops = {
> + .glue_configure = dwc3_ti_am62_glue_configure,
> +};
> +
> +static const struct udevice_id dwc3_am62_match[] = {
> + { .compatible = "ti,am62-usb", .data = (ulong)&ti_am62_ops },
> + { /* sentinel */ }
> +};
> +
> +U_BOOT_DRIVER(dwc3_am62_wrapper) = {
> + .name = "dwc3-am62",
> + .id = UCLASS_SIMPLE_BUS,
> + .of_match = dwc3_am62_match,
> + .bind = dwc3_glue_bind,
> + .probe = dwc3_glue_probe,
> + .remove = dwc3_glue_remove,
> + .plat_auto = sizeof(struct dwc3_glue_data),
> +};
> --
> 2.43.0
next prev parent reply other threads:[~2024-01-16 10:22 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-12 8:52 [PATCH v4 0/7] Add DFU and usb boot for TI am62x SK and beagleplay Sjoerd Simons
2024-01-12 8:52 ` [PATCH v4 1/7] usb: dwc3: Add dwc3 glue driver for am62 Sjoerd Simons
2024-01-16 10:22 ` Mattijs Korpershoek [this message]
2024-05-01 13:56 ` Martyn Welch
2024-05-02 7:03 ` Mattijs Korpershoek
2024-04-12 20:34 ` Sverdlin, Alexander
2024-01-12 8:52 ` [PATCH v4 2/7] usb: dwc3: Switch to device mode on gadget start Sjoerd Simons
2024-01-12 10:39 ` Roger Quadros
2024-01-12 11:06 ` Sjoerd Simons
2024-01-12 12:56 ` Roger Quadros
2024-01-12 14:18 ` Sjoerd Simons
2024-01-15 13:40 ` Roger Quadros
2024-01-12 12:55 ` Caleb Connolly
2024-01-16 10:55 ` Mattijs Korpershoek
2024-01-16 10:46 ` Mattijs Korpershoek
2024-04-12 20:33 ` Sverdlin, Alexander
2024-01-12 8:52 ` [PATCH v4 3/7] board: ti: am62x: am62x: include env for DFU Sjoerd Simons
2024-01-16 10:57 ` Mattijs Korpershoek
2024-04-12 20:31 ` Sverdlin, Alexander
2024-01-12 8:52 ` [PATCH v4 4/7] arm: dts: k3-am625-sk: Enable usb port in u-boot Sjoerd Simons
2024-01-16 11:17 ` Mattijs Korpershoek
2024-01-16 11:21 ` Sjoerd Simons
2024-04-12 20:30 ` Sverdlin, Alexander
2024-01-12 8:52 ` [PATCH v4 5/7] configs: am62x_evm_*: Enable USB and DFU support Sjoerd Simons
2024-01-12 9:58 ` Roger Quadros
2024-01-12 10:44 ` Sjoerd Simons
2024-01-12 10:55 ` Roger Quadros
2024-01-12 12:37 ` Nishanth Menon
2024-01-12 13:09 ` Sjoerd Simons
2024-01-12 13:19 ` Nishanth Menon
2024-01-12 15:06 ` Sjoerd Simons
2024-01-12 15:40 ` Nishanth Menon
2024-01-12 15:58 ` Sjoerd Simons
2024-01-12 16:03 ` Tom Rini
2024-02-08 10:33 ` Mattijs Korpershoek
2024-01-12 8:52 ` [PATCH v4 6/7] beagleplay: Add " Sjoerd Simons
2024-01-12 10:41 ` Roger Quadros
2024-01-12 10:47 ` Sjoerd Simons
2024-01-12 12:34 ` Nishanth Menon
2024-01-12 8:52 ` [PATCH v4 7/7] doc: board: Add document for DFU boot on am62x SoCs Sjoerd Simons
2024-01-12 12:36 ` Nishanth Menon
2024-01-12 12:58 ` Sjoerd Simons
2024-01-12 13:18 ` Mattijs Korpershoek
2024-01-16 11:12 ` Mattijs Korpershoek
2024-01-16 10:09 ` [PATCH v4 0/7] Add DFU and usb boot for TI am62x SK and beagleplay Mattijs Korpershoek
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=87ply14lxq.fsf@baylibre.com \
--to=mkorpershoek@baylibre.com \
--cc=hayashi.kunihiko@socionext.com \
--cc=marex@denx.de \
--cc=martyn.welch@collabora.com \
--cc=nm@ti.com \
--cc=rogerq@kernel.org \
--cc=sjoerd@collabora.com \
--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.