From: Thierry Reding <thierry.reding@gmail.com>
To: Nagarjuna Kristam <nkristam@nvidia.com>
Cc: balbi@kernel.org, gregkh@linuxfoundation.org,
jonathanh@nvidia.com, linux-tegra@vger.kernel.org,
linux-usb@vger.kernel.org
Subject: [V2,1/8] phy: tegra: xusb: t210: add XUSB dual mode support
Date: Thu, 25 Apr 2019 16:13:12 +0200 [thread overview]
Message-ID: <20190425141312.GC24213@ulmo> (raw)
On Mon, Mar 11, 2019 at 04:41:49PM +0530, Nagarjuna Kristam wrote:
> The device tree bindings document the "mode" property of "ports"
> subnodes, but the driver was not parsing the property. In preparation
> for adding role switching, parse the property at probe time and
> confgiure the port capabilities accordingly
>
> Based on work by JC Kuo <jckuo@nvidia.com>.
>
> Signed-off-by: Nagarjuna Kristam <nkristam@nvidia.com>
> ---
> drivers/phy/tegra/xusb-tegra210.c | 22 +++++++++++++++++++---
> drivers/phy/tegra/xusb.c | 24 +++++++++++++++++++++++-
> drivers/phy/tegra/xusb.h | 4 +++-
> 3 files changed, 45 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/phy/tegra/xusb-tegra210.c b/drivers/phy/tegra/xusb-tegra210.c
> index 05bee32..4beebcc 100644
> --- a/drivers/phy/tegra/xusb-tegra210.c
> +++ b/drivers/phy/tegra/xusb-tegra210.c
> @@ -1,5 +1,5 @@
> /*
> - * Copyright (c) 2014, NVIDIA CORPORATION. All rights reserved.
> + * Copyright (c) 2014-2019, NVIDIA CORPORATION. All rights reserved.
> * Copyright (C) 2015 Google, Inc.
> *
> * This program is free software; you can redistribute it and/or modify it
> @@ -47,7 +47,10 @@
> #define XUSB_PADCTL_USB2_PAD_MUX_USB2_BIAS_PAD_XUSB 0x1
>
> #define XUSB_PADCTL_USB2_PORT_CAP 0x008
> +#define XUSB_PADCTL_USB2_PORT_CAP_PORTX_CAP_DISABLED(x) (0x0 << ((x) * 4))
> #define XUSB_PADCTL_USB2_PORT_CAP_PORTX_CAP_HOST(x) (0x1 << ((x) * 4))
> +#define XUSB_PADCTL_USB2_PORT_CAP_PORTX_CAP_DEVICE(x) (0x2 << ((x) * 4))
> +#define XUSB_PADCTL_USB2_PORT_CAP_PORTX_CAP_OTG(x) (0x3 << ((x) * 4))
> #define XUSB_PADCTL_USB2_PORT_CAP_PORTX_CAP_MASK(x) (0x3 << ((x) * 4))
>
> #define XUSB_PADCTL_SS_PORT_MAP 0x014
> @@ -72,6 +75,7 @@
> #define XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPADX_CTL1(x) (0x084 + (x) * 0x40)
> #define XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD_CTL1_VREG_LEV_SHIFT 7
> #define XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD_CTL1_VREG_LEV_MASK 0x3
> +#define XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD_CTL1_VREG_LEV_VAL 0x1
> #define XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD_CTL1_VREG_FIX18 (1 << 6)
>
> #define XUSB_PADCTL_USB2_OTG_PADX_CTL0(x) (0x088 + (x) * 0x40)
> @@ -965,7 +969,14 @@ static int tegra210_usb2_phy_power_on(struct phy *phy)
>
> value = padctl_readl(padctl, XUSB_PADCTL_USB2_PORT_CAP);
> value &= ~XUSB_PADCTL_USB2_PORT_CAP_PORTX_CAP_MASK(index);
> - value |= XUSB_PADCTL_USB2_PORT_CAP_PORTX_CAP_HOST(index);
> + if (port->mode == USB_DR_MODE_UNKNOWN)
> + value |= XUSB_PADCTL_USB2_PORT_CAP_PORTX_CAP_DISABLED(index);
> + else if (port->mode == USB_DR_MODE_PERIPHERAL)
> + value |= XUSB_PADCTL_USB2_PORT_CAP_PORTX_CAP_DEVICE(index);
> + else if (port->mode == USB_DR_MODE_HOST)
> + value |= XUSB_PADCTL_USB2_PORT_CAP_PORTX_CAP_HOST(index);
> + else if (port->mode == USB_DR_MODE_OTG)
> + value |= XUSB_PADCTL_USB2_PORT_CAP_PORTX_CAP_OTG(index);
> padctl_writel(padctl, value, XUSB_PADCTL_USB2_PORT_CAP);
>
> value = padctl_readl(padctl, XUSB_PADCTL_USB2_OTG_PADX_CTL0(index));
> @@ -997,7 +1008,12 @@ static int tegra210_usb2_phy_power_on(struct phy *phy)
> XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPADX_CTL1(index));
> value &= ~(XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD_CTL1_VREG_LEV_MASK <<
> XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD_CTL1_VREG_LEV_SHIFT);
> - value |= XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD_CTL1_VREG_FIX18;
> + if (port->mode == USB_DR_MODE_HOST)
> + value |= XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD_CTL1_VREG_FIX18;
> + else
> + value |=
> + XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD_CTL1_VREG_LEV_VAL <<
> + XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD_CTL1_VREG_LEV_SHIFT;
> padctl_writel(padctl, value,
> XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPADX_CTL1(index));
>
> diff --git a/drivers/phy/tegra/xusb.c b/drivers/phy/tegra/xusb.c
> index 5b3b886..c6178a0 100644
> --- a/drivers/phy/tegra/xusb.c
> +++ b/drivers/phy/tegra/xusb.c
> @@ -1,5 +1,5 @@
> /*
> - * Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved.
> + * Copyright (c) 2014-2019, NVIDIA CORPORATION. All rights reserved.
> *
> * This program is free software; you can redistribute it and/or modify it
> * under the terms and conditions of the GNU General Public License,
> @@ -542,13 +542,35 @@ static void tegra_xusb_port_unregister(struct tegra_xusb_port *port)
> device_unregister(&port->dev);
> }
>
> +static const char *const modes[] = {
> + [USB_DR_MODE_UNKNOWN] = "",
> + [USB_DR_MODE_HOST] = "host",
> + [USB_DR_MODE_PERIPHERAL] = "peripheral",
> + [USB_DR_MODE_OTG] = "otg",
> +};
> +
> static int tegra_xusb_usb2_port_parse_dt(struct tegra_xusb_usb2_port *usb2)
> {
> struct tegra_xusb_port *port = &usb2->base;
> struct device_node *np = port->dev.of_node;
> + const char *mode;
>
> usb2->internal = of_property_read_bool(np, "nvidia,internal");
>
> + if (!of_property_read_string(np, "mode", &mode)) {
> + int err = match_string(modes, ARRAY_SIZE(modes), mode);
> +
> + if (err < 0) {
> + dev_err(&port->dev, "invalid value %s for \"mode\"\n",
> + mode);
> + usb2->mode = USB_DR_MODE_UNKNOWN;
> + } else {
> + usb2->mode = err;
> + }
> + } else {
> + usb2->mode = USB_DR_MODE_HOST;
> + }
> +
> usb2->supply = devm_regulator_get(&port->dev, "vbus");
> return PTR_ERR_OR_ZERO(usb2->supply);
> }
This hunk has now been merged as part of commit 5311a7b89502 ("phy:
tegra: xusb: Parse dual-role mode property"), which is now in linux-next
as of next-20190418. So you may want to rebase.
Thierry
> diff --git a/drivers/phy/tegra/xusb.h b/drivers/phy/tegra/xusb.h
> index b49dbc3..17cc8dc 100644
> --- a/drivers/phy/tegra/xusb.h
> +++ b/drivers/phy/tegra/xusb.h
> @@ -1,5 +1,5 @@
> /*
> - * Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved.
> + * Copyright (c) 2014-2019, NVIDIA CORPORATION. All rights reserved.
> * Copyright (c) 2015, Google Inc.
> *
> * This program is free software; you can redistribute it and/or modify it
> @@ -18,6 +18,7 @@
> #include <linux/io.h>
> #include <linux/mutex.h>
> #include <linux/workqueue.h>
> +#include <linux/usb/otg.h>
>
> /* legacy entry points for backwards-compatibility */
> int tegra_xusb_padctl_legacy_probe(struct platform_device *pdev);
> @@ -272,6 +273,7 @@ struct tegra_xusb_usb2_port {
>
> struct regulator *supply;
> bool internal;
> + enum usb_dr_mode mode;
> };
>
> static inline struct tegra_xusb_usb2_port *
> --
> 2.7.4
>
WARNING: multiple messages have this Message-ID (diff)
From: Thierry Reding <thierry.reding@gmail.com>
To: Nagarjuna Kristam <nkristam@nvidia.com>
Cc: balbi@kernel.org, gregkh@linuxfoundation.org,
jonathanh@nvidia.com, linux-tegra@vger.kernel.org,
linux-usb@vger.kernel.org
Subject: Re: [PATCH V2 1/8] phy: tegra: xusb: t210: add XUSB dual mode support
Date: Thu, 25 Apr 2019 16:13:12 +0200 [thread overview]
Message-ID: <20190425141312.GC24213@ulmo> (raw)
Message-ID: <20190425141312.jJBMbTSo4UIKEvqapDaBe-CQEjllRU6lBvMq62rFf_Y@z> (raw)
In-Reply-To: <1552302716-18554-2-git-send-email-nkristam@nvidia.com>
[-- Attachment #1: Type: text/plain, Size: 6568 bytes --]
On Mon, Mar 11, 2019 at 04:41:49PM +0530, Nagarjuna Kristam wrote:
> The device tree bindings document the "mode" property of "ports"
> subnodes, but the driver was not parsing the property. In preparation
> for adding role switching, parse the property at probe time and
> confgiure the port capabilities accordingly
>
> Based on work by JC Kuo <jckuo@nvidia.com>.
>
> Signed-off-by: Nagarjuna Kristam <nkristam@nvidia.com>
> ---
> drivers/phy/tegra/xusb-tegra210.c | 22 +++++++++++++++++++---
> drivers/phy/tegra/xusb.c | 24 +++++++++++++++++++++++-
> drivers/phy/tegra/xusb.h | 4 +++-
> 3 files changed, 45 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/phy/tegra/xusb-tegra210.c b/drivers/phy/tegra/xusb-tegra210.c
> index 05bee32..4beebcc 100644
> --- a/drivers/phy/tegra/xusb-tegra210.c
> +++ b/drivers/phy/tegra/xusb-tegra210.c
> @@ -1,5 +1,5 @@
> /*
> - * Copyright (c) 2014, NVIDIA CORPORATION. All rights reserved.
> + * Copyright (c) 2014-2019, NVIDIA CORPORATION. All rights reserved.
> * Copyright (C) 2015 Google, Inc.
> *
> * This program is free software; you can redistribute it and/or modify it
> @@ -47,7 +47,10 @@
> #define XUSB_PADCTL_USB2_PAD_MUX_USB2_BIAS_PAD_XUSB 0x1
>
> #define XUSB_PADCTL_USB2_PORT_CAP 0x008
> +#define XUSB_PADCTL_USB2_PORT_CAP_PORTX_CAP_DISABLED(x) (0x0 << ((x) * 4))
> #define XUSB_PADCTL_USB2_PORT_CAP_PORTX_CAP_HOST(x) (0x1 << ((x) * 4))
> +#define XUSB_PADCTL_USB2_PORT_CAP_PORTX_CAP_DEVICE(x) (0x2 << ((x) * 4))
> +#define XUSB_PADCTL_USB2_PORT_CAP_PORTX_CAP_OTG(x) (0x3 << ((x) * 4))
> #define XUSB_PADCTL_USB2_PORT_CAP_PORTX_CAP_MASK(x) (0x3 << ((x) * 4))
>
> #define XUSB_PADCTL_SS_PORT_MAP 0x014
> @@ -72,6 +75,7 @@
> #define XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPADX_CTL1(x) (0x084 + (x) * 0x40)
> #define XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD_CTL1_VREG_LEV_SHIFT 7
> #define XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD_CTL1_VREG_LEV_MASK 0x3
> +#define XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD_CTL1_VREG_LEV_VAL 0x1
> #define XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD_CTL1_VREG_FIX18 (1 << 6)
>
> #define XUSB_PADCTL_USB2_OTG_PADX_CTL0(x) (0x088 + (x) * 0x40)
> @@ -965,7 +969,14 @@ static int tegra210_usb2_phy_power_on(struct phy *phy)
>
> value = padctl_readl(padctl, XUSB_PADCTL_USB2_PORT_CAP);
> value &= ~XUSB_PADCTL_USB2_PORT_CAP_PORTX_CAP_MASK(index);
> - value |= XUSB_PADCTL_USB2_PORT_CAP_PORTX_CAP_HOST(index);
> + if (port->mode == USB_DR_MODE_UNKNOWN)
> + value |= XUSB_PADCTL_USB2_PORT_CAP_PORTX_CAP_DISABLED(index);
> + else if (port->mode == USB_DR_MODE_PERIPHERAL)
> + value |= XUSB_PADCTL_USB2_PORT_CAP_PORTX_CAP_DEVICE(index);
> + else if (port->mode == USB_DR_MODE_HOST)
> + value |= XUSB_PADCTL_USB2_PORT_CAP_PORTX_CAP_HOST(index);
> + else if (port->mode == USB_DR_MODE_OTG)
> + value |= XUSB_PADCTL_USB2_PORT_CAP_PORTX_CAP_OTG(index);
> padctl_writel(padctl, value, XUSB_PADCTL_USB2_PORT_CAP);
>
> value = padctl_readl(padctl, XUSB_PADCTL_USB2_OTG_PADX_CTL0(index));
> @@ -997,7 +1008,12 @@ static int tegra210_usb2_phy_power_on(struct phy *phy)
> XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPADX_CTL1(index));
> value &= ~(XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD_CTL1_VREG_LEV_MASK <<
> XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD_CTL1_VREG_LEV_SHIFT);
> - value |= XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD_CTL1_VREG_FIX18;
> + if (port->mode == USB_DR_MODE_HOST)
> + value |= XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD_CTL1_VREG_FIX18;
> + else
> + value |=
> + XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD_CTL1_VREG_LEV_VAL <<
> + XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD_CTL1_VREG_LEV_SHIFT;
> padctl_writel(padctl, value,
> XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPADX_CTL1(index));
>
> diff --git a/drivers/phy/tegra/xusb.c b/drivers/phy/tegra/xusb.c
> index 5b3b886..c6178a0 100644
> --- a/drivers/phy/tegra/xusb.c
> +++ b/drivers/phy/tegra/xusb.c
> @@ -1,5 +1,5 @@
> /*
> - * Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved.
> + * Copyright (c) 2014-2019, NVIDIA CORPORATION. All rights reserved.
> *
> * This program is free software; you can redistribute it and/or modify it
> * under the terms and conditions of the GNU General Public License,
> @@ -542,13 +542,35 @@ static void tegra_xusb_port_unregister(struct tegra_xusb_port *port)
> device_unregister(&port->dev);
> }
>
> +static const char *const modes[] = {
> + [USB_DR_MODE_UNKNOWN] = "",
> + [USB_DR_MODE_HOST] = "host",
> + [USB_DR_MODE_PERIPHERAL] = "peripheral",
> + [USB_DR_MODE_OTG] = "otg",
> +};
> +
> static int tegra_xusb_usb2_port_parse_dt(struct tegra_xusb_usb2_port *usb2)
> {
> struct tegra_xusb_port *port = &usb2->base;
> struct device_node *np = port->dev.of_node;
> + const char *mode;
>
> usb2->internal = of_property_read_bool(np, "nvidia,internal");
>
> + if (!of_property_read_string(np, "mode", &mode)) {
> + int err = match_string(modes, ARRAY_SIZE(modes), mode);
> +
> + if (err < 0) {
> + dev_err(&port->dev, "invalid value %s for \"mode\"\n",
> + mode);
> + usb2->mode = USB_DR_MODE_UNKNOWN;
> + } else {
> + usb2->mode = err;
> + }
> + } else {
> + usb2->mode = USB_DR_MODE_HOST;
> + }
> +
> usb2->supply = devm_regulator_get(&port->dev, "vbus");
> return PTR_ERR_OR_ZERO(usb2->supply);
> }
This hunk has now been merged as part of commit 5311a7b89502 ("phy:
tegra: xusb: Parse dual-role mode property"), which is now in linux-next
as of next-20190418. So you may want to rebase.
Thierry
> diff --git a/drivers/phy/tegra/xusb.h b/drivers/phy/tegra/xusb.h
> index b49dbc3..17cc8dc 100644
> --- a/drivers/phy/tegra/xusb.h
> +++ b/drivers/phy/tegra/xusb.h
> @@ -1,5 +1,5 @@
> /*
> - * Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved.
> + * Copyright (c) 2014-2019, NVIDIA CORPORATION. All rights reserved.
> * Copyright (c) 2015, Google Inc.
> *
> * This program is free software; you can redistribute it and/or modify it
> @@ -18,6 +18,7 @@
> #include <linux/io.h>
> #include <linux/mutex.h>
> #include <linux/workqueue.h>
> +#include <linux/usb/otg.h>
>
> /* legacy entry points for backwards-compatibility */
> int tegra_xusb_padctl_legacy_probe(struct platform_device *pdev);
> @@ -272,6 +273,7 @@ struct tegra_xusb_usb2_port {
>
> struct regulator *supply;
> bool internal;
> + enum usb_dr_mode mode;
> };
>
> static inline struct tegra_xusb_usb2_port *
> --
> 2.7.4
>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
next reply other threads:[~2019-04-25 14:13 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-04-25 14:13 Thierry Reding [this message]
2019-04-25 14:13 ` [PATCH V2 1/8] phy: tegra: xusb: t210: add XUSB dual mode support Thierry Reding
-- strict thread matches above, loose matches on Subject: below --
2019-05-03 14:22 [V2,7/8] usb: gadget: Add UDC driver for tegra XUSB device mode controller Thierry Reding
2019-05-03 14:22 ` [PATCH V2 7/8] " Thierry Reding
2019-04-25 13:57 [V2,4/8] dt-bindings: usb: Add NVIDIA Tegra XUSB device mode controller binding Thierry Reding
2019-04-25 13:57 ` [PATCH V2 4/8] " Thierry Reding
[not found] <1552302716-18554-1-git-send-email-nkristam@nvidia.com>
2019-03-11 11:11 ` [V2,2/8] phy: tegra: xusb: t210: add usb3 port fake support Nagarjuna Kristam
2019-04-25 14:55 ` Thierry Reding
2019-04-25 14:55 ` [PATCH V2 2/8] " Thierry Reding
2019-05-08 9:35 ` Nagarjuna Kristam
2019-03-11 11:11 ` [V2,3/8] phy: tegra: xusb: t210: add vbus override support Nagarjuna Kristam
2019-04-25 15:04 ` Thierry Reding
2019-04-25 15:04 ` [PATCH V2 3/8] " Thierry Reding
2019-05-08 10:21 ` Nagarjuna Kristam
2019-03-11 11:11 ` [V2,4/8] dt-bindings: usb: Add NVIDIA Tegra XUSB device mode controller binding Nagarjuna Kristam
2019-04-25 15:14 ` Thierry Reding
2019-04-25 15:14 ` [PATCH V2 4/8] " Thierry Reding
2019-05-03 14:30 ` [V2,4/8] " Thierry Reding
2019-05-03 14:30 ` [PATCH V2 4/8] " Thierry Reding
2019-05-08 10:51 ` Nagarjuna Kristam
2019-03-11 11:11 ` [V2,7/8] usb: gadget: Add UDC driver for tegra XUSB device mode controller Nagarjuna Kristam
2019-04-25 13:00 ` Felipe Balbi
2019-04-25 13:00 ` [PATCH V2 7/8] " Felipe Balbi
2019-04-25 13:55 ` [V2,7/8] " Thierry Reding
2019-04-25 13:55 ` [PATCH V2 7/8] " Thierry Reding
2019-05-07 10:09 ` Nagarjuna Kristam
2019-03-11 11:11 [V2,1/8] phy: tegra: xusb: t210: add XUSB dual mode support Nagarjuna Kristam
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=20190425141312.GC24213@ulmo \
--to=thierry.reding@gmail.com \
--cc=balbi@kernel.org \
--cc=gregkh@linuxfoundation.org \
--cc=jonathanh@nvidia.com \
--cc=linux-tegra@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=nkristam@nvidia.com \
/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.