public inbox for linux-arm-kernel@lists.infradead.org
 help / color / mirror / Atom feed
From: Alex Bee <knaerzche@gmail.com>
To: Peter Geis <pgwipeout@gmail.com>, Felipe Balbi <balbi@kernel.org>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Heiko Stuebner <heiko@sntech.de>
Cc: frank.wang@rock-chips.com, zyw@rock-chips.com,
	linux-usb@vger.kernel.org,  kever.yang@rock-chips.com,
	linux-rockchip@lists.infradead.org, william.wu@rock-chips.com,
	wulf@rock-chips.com, linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH 1/4] phy: rockchip: add rockchip usb3 innosilicon phy driver
Date: Mon, 19 Jul 2021 16:29:25 +0200	[thread overview]
Message-ID: <6e7a5a02-cd3c-81d3-a473-f87385c41e5a@gmail.com> (raw)
In-Reply-To: <20201116151735.178737-2-pgwipeout@gmail.com>

Hi Peter,

thanks for working on this (I hope to have picked the latest version of 
your series).

It's pretty obvious that the quirky innosilicon phy Rockchip decided for 
in RK3328 needs a additional glue layer. Even if this version isn't 
perfect yet (usb3 devices "sometimes" do net get detected if detached 
and attached again) - it makes thing *a lot* better than it is now (IIRC 
its about the same in vendor tree)

So: are you going to rebase this on current upstream?

Regards,

Alex

Am 16.11.20 um 16:17 schrieb Peter Geis:
> The innosilicon based usb3 phy used in rockchip devices such as the rk3328 is bugged, requiring special handling.
> The following erata have been observed:
>   - usb3 device disconnect events are not detected by the controller
>   - usb2 hubs with no devices attached do not trigger disconnect events when removed
>   - interrupts are not reliable
>
> To work around these issue we implement polling of the usb2 and usb3 status.
> On usb3 disconnection we reset the usb3 phy which triggers the disconnect event.
> On usb2 disconnection we have to force reset the whole controller.
> This requires a handoff to a special dwc3 device driver.
>
> This has been tested on the rk3328-roc-cc board with the following devices:
>   - usb2 only device
>   - usb3 only device
>   - usb2 only hub without devices
>   - usb3 hub without devices
>   - usb2 hub with devices
>   - usb3 hub with devices
>
> Signed-off-by: Peter Geis <pgwipeout@gmail.com>
> ---
>   drivers/phy/rockchip/Kconfig                  |   9 +
>   drivers/phy/rockchip/Makefile                 |   1 +
>   drivers/phy/rockchip/phy-rockchip-inno-usb3.c | 425 ++++++++++++++++++
>   3 files changed, 435 insertions(+)
>   create mode 100644 drivers/phy/rockchip/phy-rockchip-inno-usb3.c
>
> diff --git a/drivers/phy/rockchip/Kconfig b/drivers/phy/rockchip/Kconfig
> index c2f22f90736c..ce16e0877354 100644
> --- a/drivers/phy/rockchip/Kconfig
> +++ b/drivers/phy/rockchip/Kconfig
> @@ -47,6 +47,15 @@ config PHY_ROCKCHIP_INNO_USB2
>   	help
>   	  Support for Rockchip USB2.0 PHY with Innosilicon IP block.
>   
> +config PHY_ROCKCHIP_INNO_USB3
> +	tristate "Rockchip INNO USB3PHY Driver"
> +	depends on (ARCH_ROCKCHIP || COMPILE_TEST) && OF
> +	depends on COMMON_CLK
> +	depends on USB_SUPPORT
> +	select USB_COMMON
> +	help
> +	  Support for Rockchip USB3.0 PHY with Innosilicon IP block.
> +
>   config PHY_ROCKCHIP_INNO_DSIDPHY
>   	tristate "Rockchip Innosilicon MIPI/LVDS/TTL PHY driver"
>   	depends on (ARCH_ROCKCHIP || COMPILE_TEST) && OF
> diff --git a/drivers/phy/rockchip/Makefile b/drivers/phy/rockchip/Makefile
> index c3cfc7f0af5c..738e3574a722 100644
> --- a/drivers/phy/rockchip/Makefile
> +++ b/drivers/phy/rockchip/Makefile
> @@ -5,6 +5,7 @@ obj-$(CONFIG_PHY_ROCKCHIP_EMMC)		+= phy-rockchip-emmc.o
>   obj-$(CONFIG_PHY_ROCKCHIP_INNO_DSIDPHY)	+= phy-rockchip-inno-dsidphy.o
>   obj-$(CONFIG_PHY_ROCKCHIP_INNO_HDMI)	+= phy-rockchip-inno-hdmi.o
>   obj-$(CONFIG_PHY_ROCKCHIP_INNO_USB2)	+= phy-rockchip-inno-usb2.o
> +obj-$(CONFIG_PHY_ROCKCHIP_INNO_USB3)	+= phy-rockchip-inno-usb3.o
>   obj-$(CONFIG_PHY_ROCKCHIP_PCIE)		+= phy-rockchip-pcie.o
>   obj-$(CONFIG_PHY_ROCKCHIP_TYPEC)	+= phy-rockchip-typec.o
>   obj-$(CONFIG_PHY_ROCKCHIP_USB)		+= phy-rockchip-usb.o
> diff --git a/drivers/phy/rockchip/phy-rockchip-inno-usb3.c b/drivers/phy/rockchip/phy-rockchip-inno-usb3.c
> new file mode 100644
> index 000000000000..6e4aa2f0ba46
> --- /dev/null
> +++ b/drivers/phy/rockchip/phy-rockchip-inno-usb3.c
> @@ -0,0 +1,425 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +
> +#include <linux/clk.h>
> +#include <linux/delay.h>
> +#include <linux/err.h>
> +#include <linux/extcon-provider.h>
> +#include <linux/io.h>
> +#include <linux/module.h>
> +#include <linux/mutex.h>
> +#include <linux/notifier.h>
> +#include <linux/of.h>
> +#include <linux/of_address.h>
> +#include <linux/of_device.h>
> +#include <linux/of_platform.h>
> +#include <linux/platform_device.h>
> +#include <linux/pm_runtime.h>
> +#include <linux/regmap.h>
> +#include <linux/reset.h>
> +#include <linux/workqueue.h>
> +#include <linux/mfd/syscon.h>
> +#include <linux/usb/phy.h>
> +
> +#define USB3_STATUS_REG 0x284
> +#define USB2_STATUS_REG 0x30
> +#define USB3_CONN_BIT BIT(0)
> +#define USB2_CONN_BIT BIT(7)
> +#define USB2_STATE_SHIFT 6
> +#define REG_WRITE_MASK GENMASK(31, 16)
> +
> +struct rockchip_usb3phy_port{
> +	struct device		*dev;
> +	struct regmap		*regmap;
> +	struct usb_phy		phy;
> +	struct rockchip_usb3phy	*parent;
> +	unsigned char 		type;
> +};
> +
> +enum usb3phy_mode {
> +	PHY_IDLE = 0,
> +	PHY_USB3,
> +	PHY_USB2,
> +	PHY_COMBO
> +};
> +
> +struct rockchip_usb3phy {
> +	struct device			*dev;
> +	struct regmap			*regmap;
> +	struct clk			*clk_pipe;
> +	struct clk			*clk_otg;
> +	struct reset_control		*u3por_rst;
> +	struct reset_control		*u2por_rst;
> +	struct reset_control		*pipe_rst;
> +	struct reset_control		*utmi_rst;
> +	struct reset_control		*pipe_apb_rst;
> +	struct reset_control		*utmi_apb_rst;
> +	struct rockchip_usb3phy_port	port_pipe;
> +	struct rockchip_usb3phy_port	port_utmi;
> +	struct work_struct		usb_phy_work;
> +	struct notifier_block		nb;
> +	enum usb3phy_mode		mode;
> +	struct mutex			lock;
> +};
> +
> +static int rockchip_usb3phy_reset(struct rockchip_usb3phy *usb3phy, bool reset, enum usb3phy_mode mode)
> +{
> +	if (reset == true) {
> +		if ((mode == PHY_USB2) | (mode == PHY_COMBO)){
> +			clk_disable_unprepare(usb3phy->clk_otg);
> +			reset_control_assert(usb3phy->utmi_rst);
> +			reset_control_assert(usb3phy->u2por_rst);
> +		}
> +		if ((mode == PHY_USB3) | (mode == PHY_COMBO)){
> +			clk_disable_unprepare(usb3phy->clk_pipe);
> +			reset_control_assert(usb3phy->pipe_rst);
> +			reset_control_assert(usb3phy->u3por_rst);
> +		}
> +	}
> +
> +	if (reset == false) {
> +		if ((mode == PHY_USB2) | (mode == PHY_COMBO)){
> +			reset_control_deassert(usb3phy->u2por_rst);
> +			udelay(1000);
> +			clk_prepare_enable(usb3phy->clk_otg);
> +			udelay(500);
> +			reset_control_deassert(usb3phy->utmi_rst);
> +		}
> +		if ((mode == PHY_USB3) | (mode == PHY_COMBO)){
> +			reset_control_deassert(usb3phy->u3por_rst);
> +			udelay(500);
> +			clk_prepare_enable(usb3phy->clk_pipe);
> +			udelay(1000);
> +			reset_control_deassert(usb3phy->pipe_rst);
> +		}
> +	}
> +
> +	return 0;
> +}
> +
> +static void rockchip_usb3phy_work(struct work_struct *work)
> +{
> +	struct rockchip_usb3phy *usb3phy = container_of(work, struct rockchip_usb3phy, usb_phy_work);
> +	struct rockchip_usb3phy_port *port_pipe = &usb3phy->port_pipe;
> +	struct rockchip_usb3phy_port *port_utmi = &usb3phy->port_utmi;
> +	int usb2, usb3, tmp, state;
> +
> +	mutex_lock(&usb3phy->lock);
> +
> +	regmap_read(port_pipe->regmap, USB3_STATUS_REG, &tmp);
> +	usb3 = tmp & USB3_CONN_BIT;
> +	regmap_read(usb3phy->regmap, USB2_STATUS_REG, &tmp);
> +	usb2 = ((tmp & USB2_CONN_BIT) ^ USB2_CONN_BIT ) >> USB2_STATE_SHIFT;
> +	state = (usb3 | usb2);
> +	dev_dbg(usb3phy->dev, "mode %i, state %i\n", usb3phy->mode, state);
> +
> +	if (usb3phy->mode == state)
> +		/* not our device */
> +		goto out;
> +
> +	if (usb2) {
> +		usb3phy->mode = PHY_USB2;
> +		dev_dbg(usb3phy->dev, "usb3phy utmi polling started\n");
> +		regmap_read_poll_timeout(usb3phy->regmap, USB2_STATUS_REG, tmp, (tmp & USB2_CONN_BIT), 2000, 0);
> +		state = ((tmp & USB2_CONN_BIT) ^ USB2_CONN_BIT ) >> USB2_STATE_SHIFT;
> +		dev_dbg(usb3phy->dev, "usb3phy utmi polling completed\n");
> +
> +		atomic_notifier_call_chain(&port_utmi->phy.notifier, 0, NULL);
> +		goto out;
> +	}
> +
> +	if (usb3) {
> +		dev_dbg(usb3phy->dev, "usb3phy pipe polling started\n");
> +		regmap_read_poll_timeout(port_pipe->regmap, USB3_STATUS_REG, tmp, !(tmp & USB3_CONN_BIT), 2000, 0);
> +		dev_dbg(usb3phy->dev, "usb3phy pipe polling completed\n");
> +
> +		rockchip_usb3phy_reset(usb3phy, true, PHY_USB3);
> +		udelay(500);
> +		rockchip_usb3phy_reset(usb3phy, false, PHY_USB3);
> +		udelay(500);
> +
> +		goto out;
> +	}
> +
> +out:
> +	usb3phy->mode = PHY_IDLE;
> +	mutex_unlock(&usb3phy->lock);
> +	return;
> +}
> +
> +static int rockchip_usb3phy_parse_dt(struct rockchip_usb3phy *usb3phy, struct device *dev)
> +{
> +	usb3phy->clk_pipe = devm_clk_get(dev, "usb3phy-pipe");
> +	if (IS_ERR(usb3phy->clk_pipe)) {
> +		dev_err(dev, "could not get usb3phy pipe clock\n");
> +		return PTR_ERR(usb3phy->clk_pipe);
> +	}
> +
> +	usb3phy->clk_otg = devm_clk_get(dev, "usb3phy-otg");
> +	if (IS_ERR(usb3phy->clk_otg)) {
> +		dev_err(dev, "could not get usb3phy otg clock\n");
> +		return PTR_ERR(usb3phy->clk_otg);
> +	}
> +
> +	usb3phy->u2por_rst = devm_reset_control_get(dev, "usb3phy-u2-por");
> +	if (IS_ERR(usb3phy->u2por_rst)) {
> +		dev_err(dev, "no usb3phy-u2-por reset control found\n");
> +		return PTR_ERR(usb3phy->u2por_rst);
> +	}
> +
> +	usb3phy->u3por_rst = devm_reset_control_get(dev, "usb3phy-u3-por");
> +	if (IS_ERR(usb3phy->u3por_rst)) {
> +		dev_err(dev, "no usb3phy-u3-por reset control found\n");
> +		return PTR_ERR(usb3phy->u3por_rst);
> +	}
> +
> +	usb3phy->pipe_rst = devm_reset_control_get(dev, "usb3phy-pipe-mac");
> +	if (IS_ERR(usb3phy->pipe_rst)) {
> +		dev_err(dev, "no usb3phy_pipe_mac reset control found\n");
> +		return PTR_ERR(usb3phy->pipe_rst);
> +	}
> +
> +	usb3phy->utmi_rst = devm_reset_control_get(dev, "usb3phy-utmi-mac");
> +	if (IS_ERR(usb3phy->utmi_rst)) {
> +		dev_err(dev, "no usb3phy-utmi-mac reset control found\n");
> +		return PTR_ERR(usb3phy->utmi_rst);
> +	}
> +
> +	usb3phy->pipe_apb_rst = devm_reset_control_get(dev, "usb3phy-pipe-apb");
> +	if (IS_ERR(usb3phy->pipe_apb_rst)) {
> +		dev_err(dev, "no usb3phy-pipe-apb reset control found\n");
> +		return PTR_ERR(usb3phy->pipe_apb_rst);
> +	}
> +
> +	usb3phy->utmi_apb_rst = devm_reset_control_get(dev, "usb3phy-utmi-apb");
> +	if (IS_ERR(usb3phy->utmi_apb_rst)) {
> +		dev_err(dev, "no usb3phy-utmi-apb reset control found\n");
> +		return PTR_ERR(usb3phy->utmi_apb_rst);
> +	}
> +
> +	return 0;
> +}
> +
> +static int rockchip_usb3phy_notify(struct notifier_block *nb, unsigned long action, void *data)
> +{
> +	struct rockchip_usb3phy *usb3phy = container_of(nb, struct rockchip_usb3phy, nb);
> +	switch (action) {
> +	case USB_DEVICE_ADD:
> +		dev_dbg(usb3phy->dev, "notified of device add\n");
> +		if (!(mutex_is_locked(&usb3phy->lock)))
> +			schedule_work(&usb3phy->usb_phy_work);
> +		return NOTIFY_OK;
> +	}
> +	return NOTIFY_DONE;
> +}
> +
> +static int rockchip_usb3phy_init(struct usb_phy *phy)
> +{
> +	struct rockchip_usb3phy_port *usb3phy_port = container_of(phy, struct rockchip_usb3phy_port, phy);
> +	struct rockchip_usb3phy *usb3phy = usb3phy_port->parent;
> +
> +	dev_warn(usb3phy->dev, "usb3phy_init %s\n", phy->label);
> +	if (phy->type == USB_PHY_TYPE_USB3){
> +		rockchip_usb3phy_reset(usb3phy, false, PHY_USB3);
> +		udelay(100); /* let it stabilize */
> +		usb3phy->nb.notifier_call = rockchip_usb3phy_notify;
> +		usb_register_notify(&usb3phy->nb);
> +	}
> +	if (phy->type == USB_PHY_TYPE_USB2){
> +		rockchip_usb3phy_reset(usb3phy, false, PHY_USB2);
> +		udelay(100); /* let it stabilize */
> +	}
> +
> +	return 0;
> +}
> +
> +static void rockchip_usb3phy_shutdown(struct usb_phy *phy)
> +{
> +	struct rockchip_usb3phy_port *usb3phy_port = container_of(phy, struct rockchip_usb3phy_port, phy);
> +	struct rockchip_usb3phy *usb3phy = usb3phy_port->parent;
> +
> +	dev_dbg(usb3phy->dev, "usb3phy_shutdown\n");
> +	if (phy->type == USB_PHY_TYPE_USB3){
> +		rockchip_usb3phy_reset(usb3phy, false, PHY_USB3);
> +		usb_unregister_notify(&usb3phy->nb);
> +	}
> +	if (phy->type == USB_PHY_TYPE_USB2){
> +		rockchip_usb3phy_reset(usb3phy, false, PHY_USB2);
> +	}
> +}
> +
> +static const struct regmap_config rockchip_usb3phy_port_regmap_config = {
> +	.reg_bits = 32,
> +	.val_bits = 32,
> +	.reg_stride = 4,
> +	.max_register = 0x1000,
> +};
> +
> +static const struct regmap_config rockchip_usb3phy_regmap_config = {
> +	.reg_bits = 32,
> +	.val_bits = 32,
> +	.reg_stride = 4,
> +	.max_register = 0x1000,
> +	.write_flag_mask = REG_WRITE_MASK,
> +};
> +
> +static int rockchip_usb3phy_probe(struct platform_device *pdev)
> +{
> +	struct device *dev = &pdev->dev;
> +	struct device_node *np = dev->of_node;
> +	struct rockchip_usb3phy *usb3phy;
> +	struct rockchip_usb3phy_port *usb3phy_port;
> +	struct regmap_config regmap_config = rockchip_usb3phy_regmap_config;
> +	struct regmap_config regmap_port_config = rockchip_usb3phy_port_regmap_config;
> +	const struct of_device_id *match;
> +	void __iomem *base;
> +	int ret;
> +
> +	match = of_match_device(dev->driver->of_match_table, dev);
> +	if (!match) {
> +		dev_err(dev, "phy node not assigned\n");
> +		return -EINVAL;
> +	}
> +
> +	if (of_node_name_eq(np, "usb3-phy")) {
> +		dev_dbg(dev, "Probe usb3phy main block\n");
> +
> +		usb3phy = devm_kzalloc(dev, sizeof(*usb3phy), GFP_KERNEL);
> +		if (!usb3phy)
> +			return -ENOMEM;
> +
> +		ret = rockchip_usb3phy_parse_dt(usb3phy, dev);
> +		if (ret) {
> +			dev_err(dev, "parse dt failed %i\n", ret);
> +			return ret;
> +		}
> +
> +		base = devm_of_iomap(dev, np, 0, NULL);
> +		if (IS_ERR(base)) {
> +			dev_err(dev, "failed port ioremap\n");
> +			return PTR_ERR(base);
> +		}
> +
> +		regmap_config.name = np->name;
> +
> +		usb3phy->regmap = devm_regmap_init_mmio(dev, base, &regmap_config);
> +		if (IS_ERR(usb3phy->regmap)) {
> +			dev_err(dev, "regmap init failed\n");
> +			return PTR_ERR(usb3phy->regmap);
> +		}
> +
> +		usb3phy->dev = dev;
> +		platform_set_drvdata(pdev, usb3phy);
> +
> +		/* place block in reset */
> +		reset_control_assert(usb3phy->pipe_rst);
> +		reset_control_assert(usb3phy->utmi_rst);
> +		reset_control_assert(usb3phy->u3por_rst);
> +		reset_control_assert(usb3phy->u2por_rst);
> +		reset_control_assert(usb3phy->pipe_apb_rst);
> +		reset_control_assert(usb3phy->utmi_apb_rst);
> +
> +		udelay(20);
> +
> +		/* take apb interface out of reset */
> +		reset_control_deassert(usb3phy->utmi_apb_rst);
> +		reset_control_deassert(usb3phy->pipe_apb_rst);
> +
> +		usb3phy->mode = PHY_IDLE;
> +		INIT_WORK(&usb3phy->usb_phy_work, rockchip_usb3phy_work);
> +		dev_dbg(dev, "Completed usb3phy core probe \n");
> +
> +		return devm_of_platform_populate(&pdev->dev);
> +	}
> +
> +	/* probe the actual ports */
> +	usb3phy = platform_get_drvdata(of_find_device_by_node(np->parent));
> +
> +	if (of_node_name_eq(np, "utmi")) {
> +		usb3phy_port = &usb3phy->port_utmi;
> +		usb3phy_port->phy.label	= "usb2-phy";
> +		usb3phy_port->phy.type	= USB_PHY_TYPE_USB2;
> +	}
> +	else if (of_node_name_eq(np, "pipe")) {
> +		usb3phy_port = &usb3phy->port_pipe;
> +		usb3phy_port->phy.label	= "usb3-phy";
> +		usb3phy_port->phy.type	= USB_PHY_TYPE_USB3;
> +	}
> +	else {
> +		dev_err(dev, "unknown child node port type %s\n", np->name);
> +		return -EINVAL;
> +	}
> +
> +	usb3phy_port->dev = dev;
> +
> +	base = devm_of_iomap(dev, np, 0, NULL);
> +	if (IS_ERR(base)) {
> +		dev_err(dev, "failed port ioremap\n");
> +		return PTR_ERR(base);
> +	}
> +
> +	regmap_port_config.name = np->name;
> +
> +	usb3phy_port->regmap = devm_regmap_init_mmio(dev, base, &regmap_port_config);
> +	if (IS_ERR(usb3phy_port->regmap)) {
> +		dev_err(dev, "regmap init failed\n");
> +		return PTR_ERR(usb3phy_port->regmap);
> +	}
> +
> +	usb3phy_port->phy.dev = dev;
> +	usb3phy_port->phy.init = rockchip_usb3phy_init;
> +	usb3phy_port->phy.shutdown = rockchip_usb3phy_shutdown;
> +	usb3phy_port->parent = usb3phy;
> +
> +	ret = usb_add_phy_dev(&usb3phy_port->phy);
> +	if (ret) {
> +		dev_err(dev, "add usb phy failed %i\n", ret);
> +		return ret;
> +	}
> +
> +	mutex_init(&usb3phy->lock);
> +
> +	dev_info(dev, "Completed usb3phy %s port init\n", usb3phy_port->phy.label);
> +	return 0;
> +}
> +
> +
> +static int rockchip_usb3phy_remove(struct platform_device *pdev)
> +{
> +	struct rockchip_usb3phy *usb3phy = platform_get_drvdata(pdev);
> +	struct rockchip_usb3phy_port *port_pipe = &usb3phy->port_pipe;
> +	struct rockchip_usb3phy_port *port_utmi = &usb3phy->port_utmi;
> +
> +	if (&port_pipe->phy.head)
> +		usb_remove_phy(&port_pipe->phy);
> +	if (&port_utmi->phy.head)
> +		usb_remove_phy(&port_utmi->phy);
> +
> +	reset_control_assert(usb3phy->pipe_apb_rst);
> +	reset_control_assert(usb3phy->utmi_apb_rst);
> +
> +	return 0;
> +}
> +
> +static const struct of_device_id rockchip_usb3phy_dt_ids[] = {
> +	{ .compatible = "rockchip,rk3328-usb3phy", },
> +	{ .compatible = "rockchip,rk3328-usb3phy-utmi", },
> +	{ .compatible = "rockchip,rk3328-usb3phy-pipe", },
> +	{ /* sentinel */ }
> +};
> +
> +MODULE_DEVICE_TABLE(of, rockchip_usb3phy_dt_ids);
> +
> +static struct platform_driver rockchip_usb3phy_driver = {
> +	.probe		= rockchip_usb3phy_probe,
> +	.remove		= rockchip_usb3phy_remove,
> +	.driver		= {
> +		.name	= "rockchip-usb3-phy",
> +		.of_match_table = rockchip_usb3phy_dt_ids,
> +	},
> +};
> +
> +module_platform_driver(rockchip_usb3phy_driver);
> +
> +MODULE_AUTHOR("Peter Geis <pgwipeout@gmail.com>");
> +MODULE_DESCRIPTION("Rockchip USB 3 PHY driver");
> +MODULE_LICENSE("GPL v2");
>
>  From patchwork Mon Nov 16 15:17:34 2020
> Content-Type: text/plain; charset="utf-8"
> MIME-Version: 1.0
> Content-Transfer-Encoding: 7bit
> X-Patchwork-Submitter: Peter Geis <pgwipeout@gmail.com>
> X-Patchwork-Id: 11909625
> Return-Path:
>   <SRS0=LF/6=EW=lists.infradead.org=linux-rockchip-bounces+patchwork-linux-rockchip=patchwork.kernel.org@kernel.org>
> Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org
>   [172.30.200.123])
> 	by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 55BB9697
> 	for <patchwork-linux-rockchip@patchwork.kernel.org>;
>   Mon, 16 Nov 2020 15:35:06 +0000 (UTC)
> Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134])
> 	(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
> 	(No client certificate requested)
> 	by mail.kernel.org (Postfix) with ESMTPS id 0D65A221F9
> 	for <patchwork-linux-rockchip@patchwork.kernel.org>;
>   Mon, 16 Nov 2020 15:35:06 +0000 (UTC)
> Authentication-Results: mail.kernel.org;
> 	dkim=pass (2048-bit key) header.d=lists.infradead.org
>   header.i=@lists.infradead.org header.b="jsfH5g5h";
> 	dkim=fail reason="signature verification failed" (2048-bit key)
>   header.d=infradead.org header.i=@infradead.org header.b="I/yJoMVd";
> 	dkim=fail reason="signature verification failed" (2048-bit key)
>   header.d=gmail.com header.i=@gmail.com header.b="Shq+sOAW"
> DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 0D65A221F9
> Authentication-Results: mail.kernel.org;
>   dmarc=fail (p=none dis=none) header.from=gmail.com
> Authentication-Results: mail.kernel.org;
>   spf=none
>   smtp.mailfrom=linux-rockchip-bounces+patchwork-linux-rockchip=patchwork.kernel.org@lists.infradead.org
> DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed;
> 	d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding:
> 	Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive:
> 	List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:Message-Id:Date:
> 	Subject:To:From:Reply-To:Content-ID:Content-Description:Resent-Date:
> 	Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner;
> 	 bh=LN7oenZpewcGL3cSqtzRVbmzIehtfpcXBk2EI0G63Vs=; b=jsfH5g5hRNdkYJn8xrQ9/LWsI
> 	0V2NUFrRf39IBLF4iB2W0QIVZo1HTOXHHQ9kZWepsMWLawoU6rDYzS2hWfQALS2fpMbW0CEqStGcB
> 	G3H2FD5W1ei4/j4fesAeVussIdB7MLeDRovPLvtcwKymSmwmp5QUkKhJUdQIeMUacyUxuwuFNLQOZ
> 	Gpq7Fs2vfItDG55Smkteh/jpbpxqwiZcLMC4PXXTjjXmsBBzcFuwei2Am3UFmayF+S1YE++166tFI
> 	mNqvkzYS75ERm2qvZBvNMA1wOCwgp8VXjHugJT+kyvO85HNNWUUEmYcDrmZZVOt3WnZtjcAaLnLAl
> 	aQ0aonbbw==;
> Received: from localhost ([::1] helo=merlin.infradead.org)
> 	by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux))
> 	id 1kegWx-0004Yt-45; Mon, 16 Nov 2020 15:34:59 +0000
> Received: from casper.infradead.org ([2001:8b0:10b:1236::1])
>   by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux))
>   id 1kegQd-0001TW-Fm; Mon, 16 Nov 2020 15:28:27 +0000
> DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed;
>   d=infradead.org; s=casper.20170209; h=Content-Transfer-Encoding:MIME-Version:
>   References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To:
>   Content-Type:Content-ID:Content-Description;
>   bh=w34tgFsfoNSL9WZ/5ErfIg33MWZNf9bk46tXnv+A4zs=; b=I/yJoMVde6ej6+DmxTSMArIqtb
>   +WsxPwGfFlDF0UwIAcG73Vo/X0mwdQff6aL6slWJR4B4P91R0/Q3dnlI1jXuDQ+a6XoQ7CaBRZhTl
>   lub2ox6kDJbxKAdiHWLy/QryyyjJ9WLmoshiweiwnkuo7GWFu0LDYQSS28s117rYQFxl271V1TPsL
>   0J8abmbkXkg/wU2NA+mntkqY64Sw+BG+5hpQ4Rb9ipAxCRQkOnxb2oZFpC2gFEaq66ZFqFugftQw4
>   AKd0CzZ4vX7aQJxE5Je4Wqam6TvTqMbLH7O6FRpI6jRClZ/+3MuUtoOb2EiX0EJFH9Vhx5YFm8hlg
>   bT90699A==;
> Received: from mail-qv1-xf41.google.com ([2607:f8b0:4864:20::f41])
>   by casper.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux))
>   id 1kegHu-0006st-Gk; Mon, 16 Nov 2020 15:19:34 +0000
> Received: by mail-qv1-xf41.google.com with SMTP id u23so1477447qvf.1;
>   Mon, 16 Nov 2020 07:19:25 -0800 (PST)
> DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;
>   h=from:to:cc:subject:date:message-id:in-reply-to:references
>   :mime-version:content-transfer-encoding;
>   bh=w34tgFsfoNSL9WZ/5ErfIg33MWZNf9bk46tXnv+A4zs=;
>   b=Shq+sOAW4lgOPgBS5y9b0hdkqGvjhkRYMTvpIVckQyvqL4k6SOfTOZQGLiO6HIixU5
>   GtByhu2Wav9gcY1forc0KxdAdHkMC6xyNiFSH8EHH+MV9gmLLPCFOnfpJIpnA2bpL6c9
>   VbMoGQVzAdGpB0ER8/3/PR3g4LGAU0NeJq9tjqY/7PmFdcjb5EjpnsDg5kc13C8wZsE+
>   DOg7JUxRhYNN45OTnzcCmHoJ8WwSP5/83G4l5qUmV9c8c58S2tCGbrN27THnQyEEs8nt
>   n8ePpL7qyB3nZvJxRCdVy+QXJYX6CGUrQO2/z6gAYnCvUi16a5gLRYj2qhvrjeJxpUR3
>   eyZg==
> X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
>   d=1e100.net; s=20161025;
>   h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to
>   :references:mime-version:content-transfer-encoding;
>   bh=w34tgFsfoNSL9WZ/5ErfIg33MWZNf9bk46tXnv+A4zs=;
>   b=BftVMckt31dk68xTgH5o/1SgXjlN75sM5315E6Bb0M82B6aX7sqkYCQn6z3XOJ+6ET
>   ugwwgkyh2UrfHJSeULJwyWoaCkypl+0Pob5vZjA/n0sd5ofiG4PpgP+iID+eeOkIHBEC
>   rDiKHVVFBNKLNiR3JwDxTJEIaISaYquvcuKF3PHCBPVDBBXjdGmj1fzt3FPOVKI/khjK
>   3HPzI5RRYd51VKvY6YXuMcyq3cPmQ3EVnbQMgiwoSYXJMwA7iQtAaSZJqUsWETim9MVz
>   XJcYTlHw9LwYQ2qlJP+Ty/znMuLX9hO995+xWRmO7H9rgVRAOpxg2j5djRNtLz/+HDKF
>   nBtw==
> X-Gm-Message-State: AOAM533DA882tZ2X8Z1wvuAKDIUdYC52kpsejBvhf37MlDgjtiP3SB9F
>   XAKYdNg3Xb/H1Ejku+EhBKU=
> X-Google-Smtp-Source:
>   ABdhPJzR0XL0NJX31+OywaRPuQxtyQR1QdfhOmqO+/GGz2NIIr+GkJzf1aSvkVIcmho99HCQ8jH97w==
> X-Received: by 2002:ad4:47b0:: with SMTP id a16mr15565115qvz.22.1605539961774;
>   Mon, 16 Nov 2020 07:19:21 -0800 (PST)
> Received: from rockpro64.sparksnet ([2601:153:900:7730::20])
>   by smtp.gmail.com with ESMTPSA id p127sm12216818qkc.37.2020.11.16.07.19.20
>   (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
>   Mon, 16 Nov 2020 07:19:21 -0800 (PST)
> From: Peter Geis <pgwipeout@gmail.com>
> To: Felipe Balbi <balbi@kernel.org>,
>   Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
>   Heiko Stuebner <heiko@sntech.de>
> Subject: [PATCH 2/4] usb: dwc3: add rockchip innosilicon usb3 glue layer
> Date: Mon, 16 Nov 2020 15:17:34 +0000
> Message-Id: <20201116151735.178737-3-pgwipeout@gmail.com>
> X-Mailer: git-send-email 2.25.1
> In-Reply-To: <20201116151735.178737-1-pgwipeout@gmail.com>
> References: <20201116151735.178737-1-pgwipeout@gmail.com>
> MIME-Version: 1.0
> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3
> X-CRM114-CacheID: sfid-20201116_151926_870482_5B810876
> X-CRM114-Status: GOOD (  25.52  )
> X-Spam-Score: -2.1 (--)
> X-Spam-Report: SpamAssassin version 3.4.4 on casper.infradead.org summary:
>   Content analysis details:   (-2.1 points, 5.0 required)
>   pts rule name              description
>   ---- ----------------------
>   --------------------------------------------------
>   -0.0 RCVD_IN_DNSWL_NONE     RBL: Sender listed at https://www.dnswl.org/,
>   no trust [2607:f8b0:4864:20:0:0:0:f41 listed in]
>   [list.dnswl.org]
>   -1.9 BAYES_00               BODY: Bayes spam probability is 0 to 1%
>   [score: 0.0000]
>   -0.0 SPF_PASS               SPF: sender matches SPF record
>   0.0 SPF_HELO_NONE          SPF: HELO does not publish an SPF Record
>   0.0 FREEMAIL_FROM          Sender email is commonly abused enduser mail
>   provider [pgwipeout[at]gmail.com]
>   -0.1 DKIM_VALID_AU          Message has a valid DKIM or DK signature from
>   author's domain
>   -0.1 DKIM_VALID_EF          Message has a valid DKIM or DK signature from
>   envelope-from domain
>   0.1 DKIM_SIGNED            Message has a DKIM or DK signature,
>   not necessarily
>   valid
>   -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature
> X-BeenThere: linux-rockchip@lists.infradead.org
> X-Mailman-Version: 2.1.29
> Precedence: list
> List-Id: Upstream kernel work for Rockchip platforms
>   <linux-rockchip.lists.infradead.org>
> List-Unsubscribe: <http://lists.infradead.org/mailman/options/linux-rockchip>,
>   <mailto:linux-rockchip-request@lists.infradead.org?subject=unsubscribe>
> List-Archive: <http://lists.infradead.org/pipermail/linux-rockchip/>
> List-Post: <mailto:linux-rockchip@lists.infradead.org>
> List-Help: <mailto:linux-rockchip-request@lists.infradead.org?subject=help>
> List-Subscribe: <http://lists.infradead.org/mailman/listinfo/linux-rockchip>,
>   <mailto:linux-rockchip-request@lists.infradead.org?subject=subscribe>
> Cc: frank.wang@rock-chips.com, zyw@rock-chips.com, linux-usb@vger.kernel.org,
>   kever.yang@rock-chips.com, linux-rockchip@lists.infradead.org,
>   Peter Geis <pgwipeout@gmail.com>, william.wu@rock-chips.com,
>   wulf@rock-chips.com, linux-arm-kernel@lists.infradead.org
> Sender: "Linux-rockchip" <linux-rockchip-bounces@lists.infradead.org>
> Errors-To:
>   linux-rockchip-bounces+patchwork-linux-rockchip=patchwork.kernel.org@lists.infradead.org
>
> This adds the handler glue for the rockchip usb3 innosilicon phy driver.
> This driver attaches to the phy driver through the notification system.
> When a usb2 disconnect event occurs this driver tears down the hcd and rebuilds it manually.
> This is to work around the usb2 controller becoming wedged and not detecting any usb2 devices after a usb2 hub is removed.
>
> It is based off work originally done by rockchip.
>
> Signed-off-by: Peter Geis <pgwipeout@gmail.com>
> ---
>   drivers/usb/dwc3/Kconfig              |  10 +
>   drivers/usb/dwc3/Makefile             |   1 +
>   drivers/usb/dwc3/dwc3-rockchip-inno.c | 271 ++++++++++++++++++++++++++
>   3 files changed, 282 insertions(+)
>   create mode 100644 drivers/usb/dwc3/dwc3-rockchip-inno.c
>
> diff --git a/drivers/usb/dwc3/Kconfig b/drivers/usb/dwc3/Kconfig
> index 7a2304565a73..2e33a45f55ff 100644
> --- a/drivers/usb/dwc3/Kconfig
> +++ b/drivers/usb/dwc3/Kconfig
> @@ -139,4 +139,14 @@ config USB_DWC3_QCOM
>   	  for peripheral mode support.
>   	  Say 'Y' or 'M' if you have one such device.
>   
> +config USB_DWC3_ROCKCHIP_INNO
> +	tristate "Rockchip Platforms with INNO PHY"
> +	depends on OF && COMMON_CLK && ARCH_ROCKCHIP
> +	depends on USB=y || USB=USB_DWC3
> +	default USB_DWC3
> +	help
> +	  Support of USB2/3 functionality in Rockchip platforms
> +	  with INNO USB 3.0 PHY IP inside.
> +	  say 'Y' or 'M' if you have one such device.
> +
>   endif
> diff --git a/drivers/usb/dwc3/Makefile b/drivers/usb/dwc3/Makefile
> index ae86da0dc5bd..f5eb7de10128 100644
> --- a/drivers/usb/dwc3/Makefile
> +++ b/drivers/usb/dwc3/Makefile
> @@ -51,3 +51,4 @@ obj-$(CONFIG_USB_DWC3_MESON_G12A)	+= dwc3-meson-g12a.o
>   obj-$(CONFIG_USB_DWC3_OF_SIMPLE)	+= dwc3-of-simple.o
>   obj-$(CONFIG_USB_DWC3_ST)		+= dwc3-st.o
>   obj-$(CONFIG_USB_DWC3_QCOM)		+= dwc3-qcom.o
> +obj-$(CONFIG_USB_DWC3_ROCKCHIP_INNO)	+= dwc3-rockchip-inno.o
> diff --git a/drivers/usb/dwc3/dwc3-rockchip-inno.c b/drivers/usb/dwc3/dwc3-rockchip-inno.c
> new file mode 100644
> index 000000000000..7007ddbcbdae
> --- /dev/null
> +++ b/drivers/usb/dwc3/dwc3-rockchip-inno.c
> @@ -0,0 +1,271 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * dwc3-rockchip-inno.c - DWC3 glue layer for Rockchip devices with Innosilicon based PHY
> + *
> + * Based on dwc3-of-simple.c
> + */
> +
> +#include <linux/module.h>
> +#include <linux/kernel.h>
> +#include <linux/slab.h>
> +#include <linux/platform_device.h>
> +#include <linux/dma-mapping.h>
> +#include <linux/clk.h>
> +#include <linux/notifier.h>
> +#include <linux/of.h>
> +#include <linux/of_platform.h>
> +#include <linux/pm_runtime.h>
> +#include <linux/reset.h>
> +
> +#include <linux/workqueue.h>
> +#include <linux/usb.h>
> +#include <linux/usb/hcd.h>
> +#include <linux/usb/phy.h>
> +
> +#include "core.h"
> +#include "../host/xhci.h"
> +
> +
> +struct dwc3_rk_inno {
> +	struct device		*dev;
> +	struct clk_bulk_data	*clks;
> +	struct dwc3		*dwc;
> +	struct usb_phy		*phy;
> +	struct notifier_block	reset_nb;
> +	struct work_struct	reset_work;
> +	struct mutex		lock;
> +	int			num_clocks;
> +	struct reset_control	*resets;
> +};
> +
> +static int dwc3_rk_inno_host_reset_notifier(struct notifier_block *nb, unsigned long event, void *data)
> +{
> +	struct dwc3_rk_inno	*rk_inno = container_of(nb, struct dwc3_rk_inno, reset_nb);
> +
> +	schedule_work(&rk_inno->reset_work);
> +
> +	return NOTIFY_DONE;
> +}
> +
> +static void dwc3_rk_inno_host_reset_work(struct work_struct *work)
> +{
> +	struct dwc3_rk_inno	*rk_inno = container_of(work, struct dwc3_rk_inno, reset_work);
> +	struct usb_hcd		*hcd = dev_get_drvdata(&rk_inno->dwc->xhci->dev);
> +	struct usb_hcd		*shared_hcd = hcd->shared_hcd;
> +	struct xhci_hcd		*xhci = hcd_to_xhci(hcd);
> +	unsigned int		count = 0;
> +
> +	mutex_lock(&rk_inno->lock);
> +
> +	if (hcd->state != HC_STATE_HALT) {
> +		usb_remove_hcd(shared_hcd);
> +		usb_remove_hcd(hcd);
> +	}
> +
> +	if (rk_inno->phy)
> +		usb_phy_shutdown(rk_inno->phy);
> +
> +	while (hcd->state != HC_STATE_HALT) {
> +		if (++count > 1000) {
> +			dev_err(rk_inno->dev, "wait for HCD remove 1s timeout!\n");
> +			break;
> +		}
> +		usleep_range(1000, 1100);
> +	}
> +
> +	if (hcd->state == HC_STATE_HALT) {
> +		xhci->shared_hcd = shared_hcd;
> +		usb_add_hcd(hcd, hcd->irq, IRQF_SHARED);
> +		usb_add_hcd(shared_hcd, hcd->irq, IRQF_SHARED);
> +	}
> +
> +	if (rk_inno->phy)
> +		usb_phy_init(rk_inno->phy);
> +
> +	mutex_unlock(&rk_inno->lock);
> +	dev_dbg(rk_inno->dev, "host reset complete\n");
> +}
> +
> +static int dwc3_rk_inno_probe(struct platform_device *pdev)
> +{
> +	struct dwc3_rk_inno	*rk_inno;
> +	struct device		*dev = &pdev->dev;
> +	struct device_node	*np = dev->of_node, *child, *node;
> +	struct platform_device	*child_pdev;
> +
> +	int			ret;
> +
> +	rk_inno = devm_kzalloc(dev, sizeof(*rk_inno), GFP_KERNEL);
> +	if (!rk_inno)
> +		return -ENOMEM;
> +
> +	platform_set_drvdata(pdev, rk_inno);
> +	rk_inno->dev = dev;
> +
> +	rk_inno->resets = of_reset_control_array_get(np, false, true,
> +						    true);
> +	if (IS_ERR(rk_inno->resets)) {
> +		ret = PTR_ERR(rk_inno->resets);
> +		dev_err(dev, "failed to get device resets, err=%d\n", ret);
> +		return ret;
> +	}
> +
> +	ret = reset_control_deassert(rk_inno->resets);
> +	if (ret)
> +		goto err_resetc_put;
> +
> +	ret = clk_bulk_get_all(rk_inno->dev, &rk_inno->clks);
> +	if (ret < 0)
> +		goto err_resetc_assert;
> +
> +	rk_inno->num_clocks = ret;
> +	ret = clk_bulk_prepare_enable(rk_inno->num_clocks, rk_inno->clks);
> +	if (ret)
> +		goto err_resetc_assert;
> +
> +	ret = of_platform_populate(np, NULL, NULL, dev);
> +	if (ret)
> +		goto err_clk_put;
> +
> +	child = of_get_child_by_name(np, "dwc3");
> +	if (!child) {
> +		dev_err(dev, "failed to find dwc3 core node\n");
> +		ret = -ENODEV;
> +		goto err_plat_depopulate;
> +	}
> +
> +	child_pdev = of_find_device_by_node(child);
> +	if (!child_pdev) {
> +		dev_err(dev, "failed to get dwc3 core device\n");
> +		ret = -ENODEV;
> +		goto err_plat_depopulate;
> +	}
> +
> +	rk_inno->dwc = platform_get_drvdata(child_pdev);
> +	if (!rk_inno->dwc || !rk_inno->dwc->xhci) {
> +		ret = -EPROBE_DEFER;
> +		goto err_plat_depopulate;
> +	}
> +
> +	node = of_parse_phandle(child, "usb-phy", 0);
> +	INIT_WORK(&rk_inno->reset_work, dwc3_rk_inno_host_reset_work);
> +	rk_inno->reset_nb.notifier_call = dwc3_rk_inno_host_reset_notifier;
> +	rk_inno->phy = devm_usb_get_phy_by_node(dev, node, &rk_inno->reset_nb);
> +	of_node_put(node);
> +	mutex_init(&rk_inno->lock);
> +
> +	pm_runtime_set_active(dev);
> +	pm_runtime_enable(dev);
> +	pm_runtime_get_sync(dev);
> +
> +	return 0;
> +
> +err_plat_depopulate:
> +	of_platform_depopulate(dev);
> +
> +err_clk_put:
> +	clk_bulk_disable_unprepare(rk_inno->num_clocks, rk_inno->clks);
> +	clk_bulk_put_all(rk_inno->num_clocks, rk_inno->clks);
> +
> +err_resetc_assert:
> +	reset_control_assert(rk_inno->resets);
> +
> +err_resetc_put:
> +	reset_control_put(rk_inno->resets);
> +	return ret;
> +}
> +
> +static void __dwc3_rk_inno_teardown(struct dwc3_rk_inno *rk_inno)
> +{
> +	of_platform_depopulate(rk_inno->dev);
> +
> +	clk_bulk_disable_unprepare(rk_inno->num_clocks, rk_inno->clks);
> +	clk_bulk_put_all(rk_inno->num_clocks, rk_inno->clks);
> +	rk_inno->num_clocks = 0;
> +
> +	reset_control_assert(rk_inno->resets);
> +
> +	reset_control_put(rk_inno->resets);
> +
> +	pm_runtime_disable(rk_inno->dev);
> +	pm_runtime_put_noidle(rk_inno->dev);
> +	pm_runtime_set_suspended(rk_inno->dev);
> +}
> +
> +static int dwc3_rk_inno_remove(struct platform_device *pdev)
> +{
> +	struct dwc3_rk_inno	*rk_inno = platform_get_drvdata(pdev);
> +
> +	__dwc3_rk_inno_teardown(rk_inno);
> +
> +	return 0;
> +}
> +
> +static void dwc3_rk_inno_shutdown(struct platform_device *pdev)
> +{
> +	struct dwc3_rk_inno	*rk_inno = platform_get_drvdata(pdev);
> +
> +	__dwc3_rk_inno_teardown(rk_inno);
> +}
> +
> +static int __maybe_unused dwc3_rk_inno_runtime_suspend(struct device *dev)
> +{
> +	struct dwc3_rk_inno	*rk_inno = dev_get_drvdata(dev);
> +
> +	clk_bulk_disable(rk_inno->num_clocks, rk_inno->clks);
> +
> +	return 0;
> +}
> +
> +static int __maybe_unused dwc3_rk_inno_runtime_resume(struct device *dev)
> +{
> +	struct dwc3_rk_inno	*rk_inno = dev_get_drvdata(dev);
> +
> +	return clk_bulk_enable(rk_inno->num_clocks, rk_inno->clks);
> +}
> +
> +static int __maybe_unused dwc3_rk_inno_suspend(struct device *dev)
> +{
> +	struct dwc3_rk_inno *rk_inno = dev_get_drvdata(dev);
> +
> +	reset_control_assert(rk_inno->resets);
> +
> +	return 0;
> +}
> +
> +static int __maybe_unused dwc3_rk_inno_resume(struct device *dev)
> +{
> +	struct dwc3_rk_inno *rk_inno = dev_get_drvdata(dev);
> +
> +	reset_control_deassert(rk_inno->resets);
> +
> +	return 0;
> +}
> +
> +static const struct dev_pm_ops dwc3_rk_inno_dev_pm_ops = {
> +	SET_SYSTEM_SLEEP_PM_OPS(dwc3_rk_inno_suspend, dwc3_rk_inno_resume)
> +	SET_RUNTIME_PM_OPS(dwc3_rk_inno_runtime_suspend,
> +			dwc3_rk_inno_runtime_resume, NULL)
> +};
> +
> +static const struct of_device_id of_dwc3_rk_inno_match[] = {
> +	{ .compatible = "rockchip,rk3328-dwc3" },
> +	{ /* Sentinel */ }
> +};
> +MODULE_DEVICE_TABLE(of, of_dwc3_rk_inno_match);
> +
> +static struct platform_driver dwc3_rk_inno_driver = {
> +	.probe		= dwc3_rk_inno_probe,
> +	.remove		= dwc3_rk_inno_remove,
> +	.shutdown	= dwc3_rk_inno_shutdown,
> +	.driver		= {
> +		.name	= "dwc3-rk-inno",
> +		.of_match_table = of_dwc3_rk_inno_match,
> +		.pm	= &dwc3_rk_inno_dev_pm_ops,
> +	},
> +};
> +
> +module_platform_driver(dwc3_rk_inno_driver);
> +MODULE_LICENSE("GPL v2");
> +MODULE_DESCRIPTION("DesignWare USB3 Rockchip Innosilicon Glue Layer");
> +MODULE_AUTHOR("Peter Geis <pgwipeout@gmail.com>");
>
>  From patchwork Mon Nov 16 15:17:35 2020
> Content-Type: text/plain; charset="utf-8"
> MIME-Version: 1.0
> Content-Transfer-Encoding: 7bit
> X-Patchwork-Submitter: Peter Geis <pgwipeout@gmail.com>
> X-Patchwork-Id: 11909615
> Return-Path:
>   <SRS0=LF/6=EW=lists.infradead.org=linux-rockchip-bounces+patchwork-linux-rockchip=patchwork.kernel.org@kernel.org>
> Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org
>   [172.30.200.123])
> 	by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id EA33415E6
> 	for <patchwork-linux-rockchip@patchwork.kernel.org>;
>   Mon, 16 Nov 2020 15:31:22 +0000 (UTC)
> Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134])
> 	(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
> 	(No client certificate requested)
> 	by mail.kernel.org (Postfix) with ESMTPS id B11162068D
> 	for <patchwork-linux-rockchip@patchwork.kernel.org>;
>   Mon, 16 Nov 2020 15:31:22 +0000 (UTC)
> Authentication-Results: mail.kernel.org;
> 	dkim=pass (2048-bit key) header.d=lists.infradead.org
>   header.i=@lists.infradead.org header.b="x23I+l2Q";
> 	dkim=fail reason="signature verification failed" (2048-bit key)
>   header.d=gmail.com header.i=@gmail.com header.b="TQ6YksiZ"
> DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B11162068D
> Authentication-Results: mail.kernel.org;
>   dmarc=fail (p=none dis=none) header.from=gmail.com
> Authentication-Results: mail.kernel.org;
>   spf=none
>   smtp.mailfrom=linux-rockchip-bounces+patchwork-linux-rockchip=patchwork.kernel.org@lists.infradead.org
> DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed;
> 	d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding:
> 	Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive:
> 	List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:Message-Id:Date:
> 	Subject:To:From:Reply-To:Content-ID:Content-Description:Resent-Date:
> 	Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner;
> 	 bh=aE1uTQlB4dk5p9/bUtsD5nvR7JrGDJXbvP9wv4F1ZKI=; b=x23I+l2QaPeAYNgh1fxzAurB3
> 	QjOFUQhBqj16/RePwVYUcdLuXkvmgvQJmYQAQYb5epwVlv0WvjuacH9QG9GCs/PliUoNU7mDF7RYw
> 	8uONuYUvFMNrGDJOkkvhpJTjSNe2bqT3lsl/0Il7uXyRFirFZDOiUxOiwFarwZBU0i9zzUWYr8w3h
> 	LpMer1kXqSZqIsA10vCZvQcjtGv/rb1BkYfQx4fBFTlVsQL/IzxF3AuVpUTzgBsWnBtYJHDO/yxX1
> 	56efJlMxvuHI1xFla8xqwcoM0bFBECHvKTR/b+G3wJRxKeqTEo/lI1IfZNbBOL+Js4eC0xHJ0iTz6
> 	d76+Tz4zw==;
> Received: from localhost ([::1] helo=merlin.infradead.org)
> 	by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux))
> 	id 1kegTM-0002lq-4l; Mon, 16 Nov 2020 15:31:16 +0000
> Received: from mail-qt1-f196.google.com ([209.85.160.196])
>   by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux))
>   id 1kegHx-0005uU-Du; Mon, 16 Nov 2020 15:19:36 +0000
> Received: by mail-qt1-f196.google.com with SMTP id i12so13089259qtj.0;
>   Mon, 16 Nov 2020 07:19:25 -0800 (PST)
> DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;
>   h=from:to:cc:subject:date:message-id:in-reply-to:references
>   :mime-version:content-transfer-encoding;
>   bh=96RQbd3xbCoXq8nQaSvV25c7fBVmlkmtbILb9lLEVCc=;
>   b=TQ6YksiZV6nNmzn4KO6jK2ge1GzMrVa1svfsXapdp9thN3ZUITDdwUlTzSQ0dpPfYh
>   geJEUW344+HQEFlZGBdjxMnMLhik6/mV6ADVcbT3dcFj5ZmuPJMqf99UPMdFtOQ5SRCu
>   l0mpSd8SbWCQzEWYmoVQHhDJagRUKY6VJx2b/7PyNT0y3Sc1k3nXvUwRGgSI8ATwKsVg
>   EgSP3JXy+7c/c97LZ3iuSAizuQdabqNXYl2n/CbhyjZcD1ynxklduF7zgxG8Cue0Ep//
>   SLy5RtiE1RgsFHn4qvsJ1VXdbYByCqZPe6XeDMOLG93/5CWupms4iy90imhdFk1Moqze
>   BWyg==
> X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
>   d=1e100.net; s=20161025;
>   h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to
>   :references:mime-version:content-transfer-encoding;
>   bh=96RQbd3xbCoXq8nQaSvV25c7fBVmlkmtbILb9lLEVCc=;
>   b=R+N2/Nie35nxV6pv8yn6t+yDKqt40CKPJXAcIy9OgMz0RRtcED3IqO5WKO/nfCS1fS
>   qwp7lGWDJ+J1SwxRaqunw8/qem9Tv6jbi+z22DdMEidJmESa1optaFVnrXMro2XA0iQw
>   xucg/cptTdJgUnyJobh4o1Mrns6JjgtcrrJqcUI1VCP/EsgVueho66W4pvEdrFbjDas9
>   YOvnokQojqgbgMjTbYCo7aEgKKDKaZxnxzBSLdSDyG4Gw3B3Lp7tiQQqVQiJdqsa4n+C
>   yIO0hMHg7KS7y3jQxuYm/0zNSl0DelNLHiVqm29wJgO5ETXVR/WuU5Tbbba53cObObXm
>   sj4Q==
> X-Gm-Message-State: AOAM531bj2SyMyUS74FYoL6yfb2Y9zgiazHGzcvUi7SkFSpF7tiObRBs
>   1QK+z/JakzqgTDh1OcYd+qg=
> X-Google-Smtp-Source:
>   ABdhPJyyrcB8/QuxOXY/HwMuNFrHfoL262pDdTeD92yflaQrFlebYxfBUlull52uCQufmLKxtF3Dbw==
> X-Received: by 2002:ac8:5ccc:: with SMTP id
>   s12mr14307478qta.309.1605539962795;
>   Mon, 16 Nov 2020 07:19:22 -0800 (PST)
> Received: from rockpro64.sparksnet ([2601:153:900:7730::20])
>   by smtp.gmail.com with ESMTPSA id p127sm12216818qkc.37.2020.11.16.07.19.21
>   (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
>   Mon, 16 Nov 2020 07:19:22 -0800 (PST)
> From: Peter Geis <pgwipeout@gmail.com>
> To: Felipe Balbi <balbi@kernel.org>,
>   Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
>   Heiko Stuebner <heiko@sntech.de>
> Subject: [PATCH 3/4] arm64: dts: rockchip: add rk3328 usb3 and usb3phy nodes
> Date: Mon, 16 Nov 2020 15:17:35 +0000
> Message-Id: <20201116151735.178737-4-pgwipeout@gmail.com>
> X-Mailer: git-send-email 2.25.1
> In-Reply-To: <20201116151735.178737-1-pgwipeout@gmail.com>
> References: <20201116151735.178737-1-pgwipeout@gmail.com>
> MIME-Version: 1.0
> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3
> X-CRM114-CacheID: sfid-20201116_101929_565628_4646539B
> X-CRM114-Status: GOOD (  12.32  )
> X-Spam-Score: -0.2 (/)
> X-Spam-Report: SpamAssassin version 3.4.4 on merlin.infradead.org summary:
>   Content analysis details:   (-0.2 points)
>   pts rule name              description
>   ---- ----------------------
>   --------------------------------------------------
>   -0.0 RCVD_IN_DNSWL_NONE     RBL: Sender listed at https://www.dnswl.org/,
>   no trust [209.85.160.196 listed in list.dnswl.org]
>   0.0 RCVD_IN_MSPIKE_H3      RBL: Good reputation (+3)
>   [209.85.160.196 listed in wl.mailspike.net]
>   -0.0 SPF_PASS               SPF: sender matches SPF record
>   0.0 SPF_HELO_NONE          SPF: HELO does not publish an SPF Record
>   0.0 FREEMAIL_FROM          Sender email is commonly abused enduser mail
>   provider [pgwipeout[at]gmail.com]
>   -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature
>   -0.1 DKIM_VALID_EF          Message has a valid DKIM or DK signature from
>   envelope-from domain
>   -0.1 DKIM_VALID_AU          Message has a valid DKIM or DK signature from
>   author's domain
>   0.1 DKIM_SIGNED            Message has a DKIM or DK signature,
>   not necessarily
>   valid 0.0 RCVD_IN_MSPIKE_WL      Mailspike good senders
> X-BeenThere: linux-rockchip@lists.infradead.org
> X-Mailman-Version: 2.1.29
> Precedence: list
> List-Id: Upstream kernel work for Rockchip platforms
>   <linux-rockchip.lists.infradead.org>
> List-Unsubscribe: <http://lists.infradead.org/mailman/options/linux-rockchip>,
>   <mailto:linux-rockchip-request@lists.infradead.org?subject=unsubscribe>
> List-Archive: <http://lists.infradead.org/pipermail/linux-rockchip/>
> List-Post: <mailto:linux-rockchip@lists.infradead.org>
> List-Help: <mailto:linux-rockchip-request@lists.infradead.org?subject=help>
> List-Subscribe: <http://lists.infradead.org/mailman/listinfo/linux-rockchip>,
>   <mailto:linux-rockchip-request@lists.infradead.org?subject=subscribe>
> Cc: frank.wang@rock-chips.com, zyw@rock-chips.com, linux-usb@vger.kernel.org,
>   kever.yang@rock-chips.com, linux-rockchip@lists.infradead.org,
>   Peter Geis <pgwipeout@gmail.com>, william.wu@rock-chips.com,
>   wulf@rock-chips.com, linux-arm-kernel@lists.infradead.org
> Sender: "Linux-rockchip" <linux-rockchip-bounces@lists.infradead.org>
> Errors-To:
>   linux-rockchip-bounces+patchwork-linux-rockchip=patchwork.kernel.org@lists.infradead.org
>
> Add the usb3 controller and usb3 phy nodes to the rk3328.
>
> Signed-off-by: Peter Geis <pgwipeout@gmail.com>
> ---
>   arch/arm64/boot/dts/rockchip/rk3328.dtsi | 65 ++++++++++++++++++++++++
>   1 file changed, 65 insertions(+)
>
> diff --git a/arch/arm64/boot/dts/rockchip/rk3328.dtsi b/arch/arm64/boot/dts/rockchip/rk3328.dtsi
> index bbdb19a3e85d..9fea9203d114 100644
> --- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi
> +++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi
> @@ -853,6 +853,40 @@ u2phy_host: host-port {
>   		};
>   	};
>   
> +	usb3phy: usb3-phy@ff470000 {
> +		compatible = "rockchip,rk3328-usb3phy";
> +		reg = <0x0 0xff460000 0x0 0x10000>;
> +		clocks = <&cru PCLK_USB3PHY_OTG>, <&cru PCLK_USB3PHY_PIPE>;
> +		clock-names = "usb3phy-otg", "usb3phy-pipe";
> +		resets = <&cru SRST_USB3PHY_U2>,
> +			 <&cru SRST_USB3PHY_U3>,
> +			 <&cru SRST_USB3PHY_PIPE>,
> +			 <&cru SRST_USB3OTG_UTMI>,
> +			 <&cru SRST_USB3PHY_OTG_P>,
> +			 <&cru SRST_USB3PHY_PIPE_P>;
> +		reset-names = "usb3phy-u2-por", "usb3phy-u3-por",
> +			      "usb3phy-pipe-mac", "usb3phy-utmi-mac",
> +			      "usb3phy-utmi-apb", "usb3phy-pipe-apb";
> +		#address-cells = <2>;
> +		#size-cells = <2>;
> +		ranges;
> +		status = "disabled";
> +
> +		usb3phy_utmi: utmi@ff470000 {
> +			compatible = "rockchip,rk3328-usb3phy-utmi";
> +			reg = <0x0 0xff470000 0x0 0x8000>;
> +			#phy-cells = <0>;
> +			status = "disabled";
> +		};
> +
> +		usb3phy_pipe: pipe@ff478000 {
> +			compatible = "rockchip,rk3328-usb3phy-pipe";
> +			reg = <0x0 0xff478000 0x0 0x8000>;
> +			#phy-cells = <0>;
> +			status = "disabled";
> +		};
> +	};
> +
>   	sdmmc: mmc@ff500000 {
>   		compatible = "rockchip,rk3328-dw-mshc", "rockchip,rk3288-dw-mshc";
>   		reg = <0x0 0xff500000 0x0 0x4000>;
> @@ -983,6 +1017,37 @@ usb_host0_ohci: usb@ff5d0000 {
>   		status = "disabled";
>   	};
>   
> +       usbdrd3: usb@ff600000 {
> +		compatible = "rockchip,rk3328-dwc3";
> +		clocks = <&cru SCLK_USB3OTG_REF>, <&cru ACLK_USB3OTG>,
> +			 <&cru SCLK_USB3OTG_SUSPEND>;
> +		clock-names = "ref", "bus_early", "suspend";
> +		#address-cells = <2>;
> +		#size-cells = <2>;
> +		ranges;
> +		status = "disabled";
> +
> +		usbdrd_dwc3: dwc3@ff600000 {
> +			compatible = "snps,dwc3";
> +			reg = <0x0 0xff600000 0x0 0x100000>;
> +			interrupts = <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;
> +			clocks = <&cru SCLK_USB3OTG_REF>, <&cru ACLK_USB3OTG>,
> +				 <&cru SCLK_USB3OTG_SUSPEND>;
> +			clock-names = "ref", "bus_early", "suspend";
> +			dr_mode = "host";
> +			usb-phy = <&usb3phy_utmi>, <&usb3phy_pipe>;
> +			phy_type = "utmi_wide";
> +			snps,dis_enblslpm_quirk;
> +			snps,dis-u2-freeclk-exists-quirk;
> +			snps,dis_u2_susphy_quirk;
> +			snps,dis_u3_susphy_quirk;
> +			snps,dis-del-phy-power-chg-quirk;
> +			snps,dis-tx-ipgap-linecheck-quirk;
> +			snps,xhci-trb-ent-quirk;
> +			status = "disabled";
> +		};
> +	};
> +
>   	gic: interrupt-controller@ff811000 {
>   		compatible = "arm,gic-400";
>   		#interrupt-cells = <3>;
>
>  From patchwork Mon Nov 16 15:17:36 2020
> Content-Type: text/plain; charset="utf-8"
> MIME-Version: 1.0
> Content-Transfer-Encoding: 7bit
> X-Patchwork-Submitter: Peter Geis <pgwipeout@gmail.com>
> X-Patchwork-Id: 11909629
> Return-Path:
>   <SRS0=LF/6=EW=lists.infradead.org=linux-rockchip-bounces+patchwork-linux-rockchip=patchwork.kernel.org@kernel.org>
> Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org
>   [172.30.200.123])
> 	by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 26236697
> 	for <patchwork-linux-rockchip@patchwork.kernel.org>;
>   Mon, 16 Nov 2020 15:35:19 +0000 (UTC)
> Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134])
> 	(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
> 	(No client certificate requested)
> 	by mail.kernel.org (Postfix) with ESMTPS id D2F812076E
> 	for <patchwork-linux-rockchip@patchwork.kernel.org>;
>   Mon, 16 Nov 2020 15:35:18 +0000 (UTC)
> Authentication-Results: mail.kernel.org;
> 	dkim=pass (2048-bit key) header.d=lists.infradead.org
>   header.i=@lists.infradead.org header.b="uUuchFSc";
> 	dkim=fail reason="signature verification failed" (2048-bit key)
>   header.d=infradead.org header.i=@infradead.org header.b="RZqLuJOp";
> 	dkim=fail reason="signature verification failed" (2048-bit key)
>   header.d=gmail.com header.i=@gmail.com header.b="UHuHKb1w"
> DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org D2F812076E
> Authentication-Results: mail.kernel.org;
>   dmarc=fail (p=none dis=none) header.from=gmail.com
> Authentication-Results: mail.kernel.org;
>   spf=none
>   smtp.mailfrom=linux-rockchip-bounces+patchwork-linux-rockchip=patchwork.kernel.org@lists.infradead.org
> DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed;
> 	d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding:
> 	Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive:
> 	List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:Message-Id:Date:
> 	Subject:To:From:Reply-To:Content-ID:Content-Description:Resent-Date:
> 	Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner;
> 	 bh=Et9bnnJA6iG/rLDpchCS0bxRlQgBQpayEZxT3kS/J04=; b=uUuchFScHUR3b189VxGoFe7ZJ
> 	f8UsD3AWi3Om64ppw6AXlm4tP08vMxQfTIMrkiKhGBiZRvq0lhUCP+2B5eja79gFOoVCDXlh6tcMW
> 	jMKsd4XE4kDjzdc8zOgaaRAIzqfKZO020x0rI+aSdsKP1RRjZvgOEcW42y9nVk5DvaClraJvvH8DI
> 	IFlobhRZIHWby2I07FDdu6ukufcnoeKBQcQobYcNNVf8GItjsuaM6kF4iqVsqswrCzIfmkLURi6uT
> 	mE/kogci38lrqpqANoN6L8/4hzO62dVDKr8sd1TSuh3KeTNQNgl+PT/jkgOeG2b5Jc3VblJ6y2YsU
> 	gHPmjrGRQ==;
> Received: from localhost ([::1] helo=merlin.infradead.org)
> 	by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux))
> 	id 1kegXA-0004fY-1W; Mon, 16 Nov 2020 15:35:12 +0000
> Received: from casper.infradead.org ([2001:8b0:10b:1236::1])
>   by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux))
>   id 1kegQg-0001TW-6H; Mon, 16 Nov 2020 15:28:30 +0000
> DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed;
>   d=infradead.org; s=casper.20170209; h=Content-Transfer-Encoding:MIME-Version:
>   References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To:
>   Content-Type:Content-ID:Content-Description;
>   bh=eWtERLXExs4DoM6gWGaTUFy6iPC/nCVkimSM+qIDVKM=; b=RZqLuJOpu1Jh2eT0FovM5VjZBD
>   68c5MPR8nuwlrXCz8KN/dAk5oDaR04d9WZmnssPGmelKS+l25SyEs8LETRbImd6eB7BCAzNVsanlG
>   rU/AbCP1gT+VTscXhuNFeQ9Rv0PJd5rFpz902eARSbqROnhPvuTs/CD8UK+IbEWg/Ar7Tt/ekhG5S
>   Ksf1+shXUzmxIn6zLlTNURs4EdEn9elKsGjOGoVwmrVKnCNGC41ERv/gZrHXMtKkxCF1hpPvhbVwZ
>   fGW6PPV8iYBJ9ptpKMej9Prn9Xu3nmPlIr7c/flyPh2nQMkFVsCiNjA4ih/CTXFKIHljhxe3DBeXG
>   dfEe96uQ==;
> Received: from mail-qt1-x844.google.com ([2607:f8b0:4864:20::844])
>   by casper.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux))
>   id 1kegHu-0006sv-4T; Mon, 16 Nov 2020 15:19:30 +0000
> Received: by mail-qt1-x844.google.com with SMTP id f93so13042784qtb.10;
>   Mon, 16 Nov 2020 07:19:26 -0800 (PST)
> DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;
>   h=from:to:cc:subject:date:message-id:in-reply-to:references
>   :mime-version:content-transfer-encoding;
>   bh=eWtERLXExs4DoM6gWGaTUFy6iPC/nCVkimSM+qIDVKM=;
>   b=UHuHKb1wyzJgScpQpTHI+khKWYoA0r+5oV4I4cL+EXw762BNPY6IkiLTLnw7WI6vXX
>   XFRXGWlHjy3L/v6/t8qZGt/ACYNMjAXyVJXA2jP1QltuyhGKVzJe0xsM52OpnSRgzh5e
>   azZNUKR0ppmLCIEr61/CjjMSwazJcDSjYNBkTOmfSgp2yZawPeHX/Ie0w2k8yY1yzUSs
>   Rqnu/m/uLC4WLFZsjftlmMaMdRJfPoAlIKQs+yVyyzuhJXhfR755gLQ5h4VoNQDy/A4Z
>   SGQwkxLqM6Jd5yX5mXQvG+QFggL6XzgC12DqJ2XMhvykSOYVz8KjgQ3lbpi2orB/fACo
>   ztfA==
> X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
>   d=1e100.net; s=20161025;
>   h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to
>   :references:mime-version:content-transfer-encoding;
>   bh=eWtERLXExs4DoM6gWGaTUFy6iPC/nCVkimSM+qIDVKM=;
>   b=lq4dY7b0JW7rBnuD9c2rllEjn5Bel4Hf2NeM10R8P1EsIJSbVqhBMBo/d5uAJIERm5
>   1WndZcLiqaA5K7g9IVYxmH6Xx/iUSZ1V2wRiwzI+6wmfGXDkSWFYuEHcJrKC9I+1mqXr
>   t7/OhaqatQs6jLPEWWOz2TfMV3u0AWbUeOe5YV4AtCXPojQCwIphU0BrqheQvje8QIHS
>   FSkLacK1/k1DevrbJs2MVL9Jj72HJ7l8PoHyxRsqHA+acPr/WcG/gy8XSrEu1VHaLgjy
>   osInPMUsBpfC8PYx4sy5siFK9bkvHp4yNorlmoAE9KEy32eczeRWhNjgBIZwGHvPXGMh
>   LGdg==
> X-Gm-Message-State: AOAM532vtMLkHMB9ChIpzBeitLngNf6qoArsoHgdr8e747hiV4i0d79z
>   8uZRU6fzZYPWowct2alx3AU=
> X-Google-Smtp-Source:
>   ABdhPJwYnI/O7MjyagGSH+7FQMKnfE01e57JG2POD/MrOpJLlI2if5o0NkVRHFEUiDoG5h7TqaOQmg==
> X-Received: by 2002:aed:3263:: with SMTP id
>   y90mr14509217qtd.196.1605539964181;
>   Mon, 16 Nov 2020 07:19:24 -0800 (PST)
> Received: from rockpro64.sparksnet ([2601:153:900:7730::20])
>   by smtp.gmail.com with ESMTPSA id p127sm12216818qkc.37.2020.11.16.07.19.22
>   (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
>   Mon, 16 Nov 2020 07:19:23 -0800 (PST)
> From: Peter Geis <pgwipeout@gmail.com>
> To: Felipe Balbi <balbi@kernel.org>,
>   Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
>   Heiko Stuebner <heiko@sntech.de>
> Subject: [PATCH 4/4] arm64: dts: rockchip: enable usb3 on rk3328-roc-cc board
> Date: Mon, 16 Nov 2020 15:17:36 +0000
> Message-Id: <20201116151735.178737-5-pgwipeout@gmail.com>
> X-Mailer: git-send-email 2.25.1
> In-Reply-To: <20201116151735.178737-1-pgwipeout@gmail.com>
> References: <20201116151735.178737-1-pgwipeout@gmail.com>
> MIME-Version: 1.0
> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3
> X-CRM114-CacheID: sfid-20201116_151926_565663_1ACFAF07
> X-CRM114-Status: UNSURE (   9.44  )
> X-CRM114-Notice: Please train this message.
> X-Spam-Score: -2.1 (--)
> X-Spam-Report: SpamAssassin version 3.4.4 on casper.infradead.org summary:
>   Content analysis details:   (-2.1 points, 5.0 required)
>   pts rule name              description
>   ---- ----------------------
>   --------------------------------------------------
>   -0.0 RCVD_IN_DNSWL_NONE     RBL: Sender listed at https://www.dnswl.org/,
>   no trust [2607:f8b0:4864:20:0:0:0:844 listed in]
>   [list.dnswl.org]
>   -1.9 BAYES_00               BODY: Bayes spam probability is 0 to 1%
>   [score: 0.0000]
>   -0.0 SPF_PASS               SPF: sender matches SPF record
>   0.0 SPF_HELO_NONE          SPF: HELO does not publish an SPF Record
>   0.0 FREEMAIL_FROM          Sender email is commonly abused enduser mail
>   provider [pgwipeout[at]gmail.com]
>   -0.1 DKIM_VALID_AU          Message has a valid DKIM or DK signature from
>   author's domain
>   -0.1 DKIM_VALID_EF          Message has a valid DKIM or DK signature from
>   envelope-from domain
>   0.1 DKIM_SIGNED            Message has a DKIM or DK signature,
>   not necessarily
>   valid
>   -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature
> X-BeenThere: linux-rockchip@lists.infradead.org
> X-Mailman-Version: 2.1.29
> Precedence: list
> List-Id: Upstream kernel work for Rockchip platforms
>   <linux-rockchip.lists.infradead.org>
> List-Unsubscribe: <http://lists.infradead.org/mailman/options/linux-rockchip>,
>   <mailto:linux-rockchip-request@lists.infradead.org?subject=unsubscribe>
> List-Archive: <http://lists.infradead.org/pipermail/linux-rockchip/>
> List-Post: <mailto:linux-rockchip@lists.infradead.org>
> List-Help: <mailto:linux-rockchip-request@lists.infradead.org?subject=help>
> List-Subscribe: <http://lists.infradead.org/mailman/listinfo/linux-rockchip>,
>   <mailto:linux-rockchip-request@lists.infradead.org?subject=subscribe>
> Cc: frank.wang@rock-chips.com, zyw@rock-chips.com, linux-usb@vger.kernel.org,
>   kever.yang@rock-chips.com, linux-rockchip@lists.infradead.org,
>   Peter Geis <pgwipeout@gmail.com>, william.wu@rock-chips.com,
>   wulf@rock-chips.com, linux-arm-kernel@lists.infradead.org
> Sender: "Linux-rockchip" <linux-rockchip-bounces@lists.infradead.org>
> Errors-To:
>   linux-rockchip-bounces+patchwork-linux-rockchip=patchwork.kernel.org@lists.infradead.org
>
> Enable the usb3 controller and usb3 phy nodes on the rk3328-roc-cc board file.
>
> Signed-off-by: Peter Geis <pgwipeout@gmail.com>
> ---
>   .../arm64/boot/dts/rockchip/rk3328-roc-cc.dts | 21 +++++++++++++++++++
>   1 file changed, 21 insertions(+)
>
> diff --git a/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts b/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts
> index b70ffb1c6a63..b060323830af 100644
> --- a/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts
> +++ b/arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts
> @@ -345,6 +345,27 @@ &usb_host0_ohci {
>   	status = "okay";
>   };
>   
> +&usbdrd3 {
> +	status = "okay";
> +};
> +
> +&usbdrd_dwc3 {
> +	dr_mode = "host";
> +	status = "okay";
> +};
> +
> +&usb3phy {
> +	status = "okay";
> +};
> +
> +&usb3phy_utmi {
> +	status = "okay";
> +};
> +
> +&usb3phy_pipe {
> +	status = "okay";
> +};
> +
>   &vop {
>   	status = "okay";
>   };

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  reply	other threads:[~2021-07-19 14:31 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-11-16 15:17 [PATCH 0/4] [RFC] rk3328 usb3 phy driver Peter Geis
2020-11-16 15:17 ` [PATCH 1/4] phy: rockchip: add rockchip usb3 innosilicon " Peter Geis
2021-07-19 14:29   ` Alex Bee [this message]
2021-07-19 23:19     ` Peter Geis
2020-11-16 15:17 ` [PATCH 2/4] usb: dwc3: add rockchip innosilicon usb3 glue layer Peter Geis
2020-11-16 15:17 ` [PATCH 3/4] arm64: dts: rockchip: add rk3328 usb3 and usb3phy nodes Peter Geis
2020-11-16 16:07   ` Johan Jonker
2020-11-16 16:25     ` Peter Geis
2020-11-16 15:17 ` [PATCH 4/4] arm64: dts: rockchip: enable usb3 on rk3328-roc-cc board Peter Geis

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=6e7a5a02-cd3c-81d3-a473-f87385c41e5a@gmail.com \
    --to=knaerzche@gmail.com \
    --cc=balbi@kernel.org \
    --cc=frank.wang@rock-chips.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=heiko@sntech.de \
    --cc=kever.yang@rock-chips.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-rockchip@lists.infradead.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=pgwipeout@gmail.com \
    --cc=william.wu@rock-chips.com \
    --cc=wulf@rock-chips.com \
    --cc=zyw@rock-chips.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox