public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: Jagan Teki <jagan@amarulasolutions.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v10 21/35] phy: sun4i-usb: Add a sunxi specific function for setting squelch-detect
Date: Mon, 28 May 2018 16:48:32 +0530	[thread overview]
Message-ID: <20180528111846.14316-22-jagan@amarulasolutions.com> (raw)
In-Reply-To: <20180528111846.14316-1-jagan@amarulasolutions.com>

The sunxi otg phy has a bug where it wrongly detects a high speed squelch
when reset on the root port gets de-asserted with a lo-speed device.

The workaround for this is to disable squelch detect before de-asserting
reset, and re-enabling it after the reset de-assert is done. Add a sunxi
specific phy function to allow the sunxi-musb glue to do this.

Signed-off-by: Jagan Teki <jagan@amarulasolutions.com>
Acked-by: Jun Nie <jun.nie@linaro.org>
---
 drivers/phy/allwinner/phy-sun4i-usb.c |  6 ++++++
 drivers/usb/musb-new/musb_core.h      |  4 ++++
 drivers/usb/musb-new/musb_uboot.c     | 19 ++++++++-----------
 drivers/usb/musb-new/sunxi.c          | 16 ++++++++++++++++
 include/phy-sun4i-usb.h               |  8 ++++++++
 5 files changed, 42 insertions(+), 11 deletions(-)

diff --git a/drivers/phy/allwinner/phy-sun4i-usb.c b/drivers/phy/allwinner/phy-sun4i-usb.c
index 4194a15007..2b3cf48025 100644
--- a/drivers/phy/allwinner/phy-sun4i-usb.c
+++ b/drivers/phy/allwinner/phy-sun4i-usb.c
@@ -36,6 +36,7 @@
 #define PHY_TX_AMPLITUDE_TUNE		0x20
 #define PHY_TX_SLEWRATE_TUNE		0x22
 #define PHY_DISCON_TH_SEL		0x2a
+#define PHY_SQUELCH_DETECT		0x3c
 
 #define PHYCTL_DATA			BIT(7)
 #define OTGCTL_ROUTE_MUSB		BIT(0)
@@ -383,6 +384,11 @@ int sun4i_usb_phy_id_detect(struct phy *phy)
 	return gpio_get_value(usb_phy->gpio_id_det);
 }
 
+void sun4i_usb_phy_set_squelch_detect(struct phy *phy, bool enabled)
+{
+	sun4i_usb_phy_write(phy, PHY_SQUELCH_DETECT, enabled ? 0 : 2, 2);
+}
+
 static struct phy_ops sun4i_usb_phy_ops = {
 	.of_xlate = sun4i_usb_phy_xlate,
 	.init = sun4i_usb_phy_init,
diff --git a/drivers/usb/musb-new/musb_core.h b/drivers/usb/musb-new/musb_core.h
index fa4cf86c79..821d0e06f6 100644
--- a/drivers/usb/musb-new/musb_core.h
+++ b/drivers/usb/musb-new/musb_core.h
@@ -200,6 +200,8 @@ enum musb_g_ep0_state {
  * @vbus_status: returns vbus status if possible
  * @set_vbus:	forces vbus status
  * @adjust_channel_params: pre check for standard dma channel_program func
+ * @pre_root_reset_end: called before the root usb port reset flag gets cleared
+ * @post_root_reset_end: called after the root usb port reset flag gets cleared
  */
 struct musb_platform_ops {
 	int	(*init)(struct musb *musb);
@@ -221,6 +223,8 @@ struct musb_platform_ops {
 	int	(*adjust_channel_params)(struct dma_channel *channel,
 				u16 packet_sz, u8 *mode,
 				dma_addr_t *dma_addr, u32 *len);
+	void	(*pre_root_reset_end)(struct musb *musb);
+	void	(*post_root_reset_end)(struct musb *musb);
 };
 
 /*
diff --git a/drivers/usb/musb-new/musb_uboot.c b/drivers/usb/musb-new/musb_uboot.c
index 8662c0ff70..48242c0475 100644
--- a/drivers/usb/musb-new/musb_uboot.c
+++ b/drivers/usb/musb-new/musb_uboot.c
@@ -193,19 +193,16 @@ static int _musb_reset_root_port(struct musb_host_data *host,
 	power &= 0xf0;
 	musb_writeb(mbase, MUSB_POWER, MUSB_POWER_RESET | power);
 	mdelay(50);
-#ifdef CONFIG_ARCH_SUNXI
-	/*
-	 * sunxi phy has a bug and it will wrongly detect high speed squelch
-	 * when clearing reset on low-speed devices, temporary disable
-	 * squelch detection to work around this.
-	 */
-	sunxi_usb_phy_enable_squelch_detect(0, 0);
-#endif
+
+	if (host->host->ops->pre_root_reset_end)
+		host->host->ops->pre_root_reset_end(host->host);
+
 	power = musb_readb(mbase, MUSB_POWER);
 	musb_writeb(mbase, MUSB_POWER, ~MUSB_POWER_RESET & power);
-#ifdef CONFIG_ARCH_SUNXI
-	sunxi_usb_phy_enable_squelch_detect(0, 1);
-#endif
+
+	if (host->host->ops->post_root_reset_end)
+		host->host->ops->post_root_reset_end(host->host);
+
 	host->host->isr(0, host->host);
 	host->host_speed = (musb_readb(mbase, MUSB_POWER) & MUSB_POWER_HSMODE) ?
 			USB_SPEED_HIGH :
diff --git a/drivers/usb/musb-new/sunxi.c b/drivers/usb/musb-new/sunxi.c
index a33ebe5caf..5728a3f384 100644
--- a/drivers/usb/musb-new/sunxi.c
+++ b/drivers/usb/musb-new/sunxi.c
@@ -304,10 +304,26 @@ static int sunxi_musb_init(struct musb *musb)
 	return 0;
 }
 
+static void sunxi_musb_pre_root_reset_end(struct musb *musb)
+{
+	struct sunxi_glue *glue = to_sunxi_glue(musb->controller);
+
+	sun4i_usb_phy_set_squelch_detect(glue->phy, false);
+}
+
+static void sunxi_musb_post_root_reset_end(struct musb *musb)
+{
+	struct sunxi_glue *glue = to_sunxi_glue(musb->controller);
+
+	sun4i_usb_phy_set_squelch_detect(glue->phy, true);
+}
+
 static const struct musb_platform_ops sunxi_musb_ops = {
 	.init		= sunxi_musb_init,
 	.enable		= sunxi_musb_enable,
 	.disable	= sunxi_musb_disable,
+	.pre_root_reset_end = sunxi_musb_pre_root_reset_end,
+	.post_root_reset_end = sunxi_musb_post_root_reset_end,
 };
 
 /* Allwinner OTG supports up to 5 endpoints */
diff --git a/include/phy-sun4i-usb.h b/include/phy-sun4i-usb.h
index 040e9d3750..b0a45b2058 100644
--- a/include/phy-sun4i-usb.h
+++ b/include/phy-sun4i-usb.h
@@ -23,4 +23,12 @@ int sun4i_usb_phy_id_detect(struct phy *phy);
  */
 int sun4i_usb_phy_vbus_detect(struct phy *phy);
 
+/**
+ * sun4i_usb_phy_set_squelch_detect() - Enable/disable squelch detect
+ *
+ * @phy: reference to a sun4i usb phy
+ * @enabled: wether to enable or disable squelch detect
+ */
+void sun4i_usb_phy_set_squelch_detect(struct phy *phy, bool enabled);
+
 #endif /*__GENERIC_PHY_SUN4I_USB_H */
-- 
2.14.3

  parent reply	other threads:[~2018-05-28 11:18 UTC|newest]

Thread overview: 57+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-05-28 11:18 [U-Boot] [PATCH v10 00/35] phy: sunxi: Add Allwinner sun4i USB PHY Jagan Teki
2018-05-28 11:18 ` [U-Boot] [PATCH v10 01/35] usb: sunxi: Simplify ccm reg base code Jagan Teki
2018-05-28 11:18 ` [U-Boot] [PATCH v10 02/35] musb: sunxi: Add proper macros instead of numericals Jagan Teki
2018-05-28 11:18 ` [U-Boot] [PATCH v10 03/35] musb: sunxi: Use simple way to fill musb_hdrc pdata Jagan Teki
2018-05-28 11:18 ` [U-Boot] [PATCH v10 04/35] musb: sunxi: Add fifo config Jagan Teki
2018-05-28 11:18 ` [U-Boot] [PATCH v10 05/35] sunxi: clock: Fix clock gating for H3/H5/A64 Jagan Teki
2018-05-28 11:18 ` [U-Boot] [PATCH v10 06/35] musb: sunxi: Add OTG device clkgate and reset for H3/H5 Jagan Teki
2018-05-28 11:18 ` [U-Boot] [PATCH v10 07/35] musb: sunxi: Use BIT instead of numerical shift Jagan Teki
2018-05-28 11:18 ` [U-Boot] [PATCH v10 08/35] sunxi: clock: Fix OHCI clock gating for H3/H5 Jagan Teki
2018-05-28 11:18 ` [U-Boot] [PATCH v10 09/35] musb: sunxi: Add support for H3/H5/A64 Jagan Teki
2018-05-28 11:18 ` [U-Boot] [PATCH v10 10/35] phy: Add Allwinner A64 USB PHY driver Jagan Teki
2018-05-28 11:18 ` [U-Boot] [PATCH v10 11/35] phy: sun4i-usb: Add id_detect and vbus_detect ops Jagan Teki
2018-05-28 11:18 ` [U-Boot] [PATCH v10 12/35] phy: sun4i-usb: Add H3/H5 PHY config Jagan Teki
2018-05-28 11:18 ` [U-Boot] [PATCH v10 13/35] phy: sun4i-usb: Add V3S " Jagan Teki
2018-05-28 11:18 ` [U-Boot] [PATCH v10 14/35] phy: sun4i-usb: Add A83T USB " Jagan Teki
2018-05-28 11:18 ` [U-Boot] [PATCH v10 15/35] phy: sun4i-usb: Add A10/A13/A20 " Jagan Teki
2018-05-28 11:18 ` [U-Boot] [PATCH v10 16/35] phy: sun4i-usb: Add A31 " Jagan Teki
2018-05-28 11:18 ` [U-Boot] [PATCH v10 17/35] phy: sun4i-usb: Add A33 USB " Jagan Teki
2018-05-28 11:18 ` [U-Boot] [PATCH v10 18/35] phy: sun4i-usb: Add A23 " Jagan Teki
2018-05-28 11:18 ` [U-Boot] [PATCH v10 19/35] device-tree-bindings: phy: Sync sun4i-usb-phy bindings Jagan Teki
2018-05-28 11:18 ` [U-Boot] [PATCH v10 20/35] board: sunxi: Use generic-phy for board_usb_cable_connected Jagan Teki
2018-05-28 11:18 ` Jagan Teki [this message]
2018-05-28 11:18 ` [U-Boot] [PATCH v10 22/35] usb: sunxi: Switch to use generic-phy Jagan Teki
2018-06-27 23:09   ` [U-Boot] [linux-sunxi] " Adam Sampson
2018-06-28  0:54     ` Vasily Khoruzhick
2018-06-28  2:08     ` Jagan Teki
2018-05-28 11:18 ` [U-Boot] [PATCH v10 23/35] sunxi: Drop legacy usb_phy.c Jagan Teki
2018-05-28 11:18 ` [U-Boot] [PATCH v10 24/35] sunxi: h3: Sync OTG and HCI nodes from Linux DT Jagan Teki
2018-05-28 11:18 ` [U-Boot] [PATCH v10 25/35] arm64: allwinner: a64: bananapi-m64: Sync usb_otg node from Linux Jagan Teki
2018-05-28 11:18 ` [U-Boot] [PATCH v10 26/35] configs: bananapi-m64: Enable USB OTG peripheral mode Jagan Teki
2018-05-28 11:18 ` [U-Boot] [PATCH v10 27/35] ARM: dts: sun8i: a83t: Sync usbphy node from Linux Jagan Teki
2018-05-28 11:18 ` [U-Boot] [PATCH v10 28/35] arm64: allwinner: a64: bananapi-m64: Sync usb host nodes " Jagan Teki
2018-05-28 11:18 ` [U-Boot] [PATCH v10 29/35] ARM: dts: sun8i-h3: bananapi-m2-plus: Sync usb otg " Jagan Teki
2018-05-28 11:18 ` [U-Boot] [PATCH v10 30/35] configs: bananapi-m2-plus: Enable USB OTG peripheral mode Jagan Teki
2018-05-28 11:18 ` [U-Boot] [PATCH v10 31/35] arm64: allwinner: h5: orangepi-pc2: Order nodes in alphabetic Jagan Teki
2018-05-28 11:18 ` [U-Boot] [PATCH v10 32/35] arm64: allwinner: h5: orangepi-pc2: Sync usb otg nodes from Linux Jagan Teki
2018-05-28 11:18 ` [U-Boot] [PATCH v10 33/35] configs: orangepi-pc2: Enable USB OTG peripheral mode Jagan Teki
2018-05-28 11:18 ` [U-Boot] [PATCH v10 34/35] arm64: allwinner: h5: orangepi-prime: Sync usb otg nodes from Linux Jagan Teki
2018-05-28 11:18 ` [U-Boot] [PATCH v10 35/35] configs: orangepi-prime: Enable USB OTG peripheral mode Jagan Teki
2018-06-01 16:52 ` [U-Boot] [PATCH v10 00/35] phy: sunxi: Add Allwinner sun4i USB PHY Jagan Teki
2018-06-05  4:54   ` Vasily Khoruzhick
2018-06-05  5:11     ` Vasily Khoruzhick
2018-06-05  5:34       ` Jagan Teki
2018-06-05  5:38         ` Vasily Khoruzhick
2018-06-05  5:47           ` Vasily Khoruzhick
2018-06-05  5:51             ` Jagan Teki
2018-06-05  5:58               ` Vasily Khoruzhick
2018-06-05  6:31                 ` Vasily Khoruzhick
2018-06-05  7:02                   ` Vasily Khoruzhick
2018-06-05  7:04                     ` Jagan Teki
2018-06-06  3:39                       ` Vasily Khoruzhick
2018-06-16 18:04                         ` Vasily Khoruzhick
2018-06-18  5:19                           ` Jagan Teki
2018-06-18  5:48                             ` Vasily Khoruzhick
2018-06-18  6:04                               ` Jagan Teki
2018-06-18  6:13                                 ` Vasily Khoruzhick
2018-06-18 16:59                                   ` Tom Rini

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=20180528111846.14316-22-jagan@amarulasolutions.com \
    --to=jagan@amarulasolutions.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox