Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

phy: sun4i-usb: Add a sunxi specific function for setting squelch-detect

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.

Acked-by: Kishon Vijay Abraham I <kishon@ti.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>

authored by

Hans de Goede and committed by
Felipe Balbi
24fe86a6 7a64c728

+35
+9
drivers/phy/phy-sun4i-usb.c
··· 30 30 #include <linux/of.h> 31 31 #include <linux/of_address.h> 32 32 #include <linux/phy/phy.h> 33 + #include <linux/phy/phy-sun4i-usb.h> 33 34 #include <linux/platform_device.h> 34 35 #include <linux/regulator/consumer.h> 35 36 #include <linux/reset.h> ··· 59 58 #define PHY_OTG_FUNC_EN 0x28 60 59 #define PHY_VBUS_DET_EN 0x29 61 60 #define PHY_DISCON_TH_SEL 0x2a 61 + #define PHY_SQUELCH_DETECT 0x3c 62 62 63 63 #define MAX_PHYS 3 64 64 ··· 204 202 regulator_disable(phy->vbus); 205 203 206 204 return 0; 205 + } 206 + 207 + void sun4i_usb_phy_set_squelch_detect(struct phy *_phy, bool enabled) 208 + { 209 + struct sun4i_usb_phy *phy = phy_get_drvdata(_phy); 210 + 211 + sun4i_usb_phy_write(phy, PHY_SQUELCH_DETECT, enabled ? 0 : 2, 2); 207 212 } 208 213 209 214 static struct phy_ops sun4i_usb_phy_ops = {
+26
include/linux/phy/phy-sun4i-usb.h
··· 1 + /* 2 + * Copyright (c) 2015 Hans de Goede <hdegoede@redhat.com> 3 + * 4 + * This program is free software; you can redistribute it and/or modify 5 + * it under the terms of the GNU General Public License version 2 and 6 + * only version 2 as published by the Free Software Foundation. 7 + * 8 + * This program is distributed in the hope that it will be useful, 9 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 + * GNU General Public License for more details. 12 + */ 13 + 14 + #ifndef PHY_SUN4I_USB_H_ 15 + #define PHY_SUN4I_USB_H_ 16 + 17 + #include "phy.h" 18 + 19 + /** 20 + * sun4i_usb_phy_set_squelch_detect() - Enable/disable squelch detect 21 + * @phy: reference to a sun4i usb phy 22 + * @enabled: wether to enable or disable squelch detect 23 + */ 24 + void sun4i_usb_phy_set_squelch_detect(struct phy *phy, bool enabled); 25 + 26 + #endif