| From 3c0c1a685fe6de599c9e256548a73736468a2213 Mon Sep 17 00:00:00 2001 |
| From: Paul Kocialkowski <paul.kocialkowski@bootlin.com> |
| Date: Thu, 14 Mar 2019 14:05:18 +0100 |
| Subject: phy: sun4i-usb: Make sure to disable PHY0 passby for peripheral mode |
| |
| [ Upstream commit e6f32efb1b128344a2c7df9875bc1a1abaa1d395 ] |
| |
| On platforms where the MUSB and HCI controllers share PHY0, PHY passby |
| is required when using the HCI controller with the PHY, but it must be |
| disabled when the MUSB controller is used instead. |
| |
| Without this, PHY0 passby is always enabled, which results in broken |
| peripheral mode on such platforms (e.g. H3/H5). |
| |
| Fixes: ba4bdc9e1dc0 ("PHY: sunxi: Add driver for sunxi usb phy") |
| |
| Signed-off-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com> |
| Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/phy/allwinner/phy-sun4i-usb.c | 4 ++++ |
| 1 file changed, 4 insertions(+) |
| |
| diff --git a/drivers/phy/allwinner/phy-sun4i-usb.c b/drivers/phy/allwinner/phy-sun4i-usb.c |
| index 4bbd9ede38c83..cc5af961778d6 100644 |
| --- a/drivers/phy/allwinner/phy-sun4i-usb.c |
| +++ b/drivers/phy/allwinner/phy-sun4i-usb.c |
| @@ -554,6 +554,7 @@ static void sun4i_usb_phy0_id_vbus_det_scan(struct work_struct *work) |
| struct sun4i_usb_phy_data *data = |
| container_of(work, struct sun4i_usb_phy_data, detect.work); |
| struct phy *phy0 = data->phys[0].phy; |
| + struct sun4i_usb_phy *phy = phy_get_drvdata(phy0); |
| bool force_session_end, id_notify = false, vbus_notify = false; |
| int id_det, vbus_det; |
| |
| @@ -610,6 +611,9 @@ static void sun4i_usb_phy0_id_vbus_det_scan(struct work_struct *work) |
| mutex_unlock(&phy0->mutex); |
| } |
| |
| + /* Enable PHY0 passby for host mode only. */ |
| + sun4i_usb_phy_passby(phy, !id_det); |
| + |
| /* Re-route PHY0 if necessary */ |
| if (data->cfg->phy0_dual_route) |
| sun4i_usb_phy0_reroute(data, id_det); |
| -- |
| 2.20.1 |
| |