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
next prev 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