diff options
author | Hans de Goede <hdegoede@redhat.com> | 2015-03-29 06:50:46 -0400 |
---|---|---|
committer | Felipe Balbi <balbi@ti.com> | 2015-05-27 13:20:36 -0400 |
commit | 24fe86a617c550fb9bdc6c8bd7cf647d3955f8ba (patch) | |
tree | 64618dd2e6e7af38b76e0a710d1408e3c85e4517 | |
parent | 7a64c7283ef83c82cb2125339c5d12092256614e (diff) |
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>
-rw-r--r-- | drivers/phy/phy-sun4i-usb.c | 9 | ||||
-rw-r--r-- | include/linux/phy/phy-sun4i-usb.h | 26 |
2 files changed, 35 insertions, 0 deletions
diff --git a/drivers/phy/phy-sun4i-usb.c b/drivers/phy/phy-sun4i-usb.c index a2b08f3ccb03..e17c539e4f6f 100644 --- a/drivers/phy/phy-sun4i-usb.c +++ b/drivers/phy/phy-sun4i-usb.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <linux/of.h> | 30 | #include <linux/of.h> |
31 | #include <linux/of_address.h> | 31 | #include <linux/of_address.h> |
32 | #include <linux/phy/phy.h> | 32 | #include <linux/phy/phy.h> |
33 | #include <linux/phy/phy-sun4i-usb.h> | ||
33 | #include <linux/platform_device.h> | 34 | #include <linux/platform_device.h> |
34 | #include <linux/regulator/consumer.h> | 35 | #include <linux/regulator/consumer.h> |
35 | #include <linux/reset.h> | 36 | #include <linux/reset.h> |
@@ -58,6 +59,7 @@ | |||
58 | #define PHY_OTG_FUNC_EN 0x28 | 59 | #define PHY_OTG_FUNC_EN 0x28 |
59 | #define PHY_VBUS_DET_EN 0x29 | 60 | #define PHY_VBUS_DET_EN 0x29 |
60 | #define PHY_DISCON_TH_SEL 0x2a | 61 | #define PHY_DISCON_TH_SEL 0x2a |
62 | #define PHY_SQUELCH_DETECT 0x3c | ||
61 | 63 | ||
62 | #define MAX_PHYS 3 | 64 | #define MAX_PHYS 3 |
63 | 65 | ||
@@ -204,6 +206,13 @@ static int sun4i_usb_phy_power_off(struct phy *_phy) | |||
204 | return 0; | 206 | return 0; |
205 | } | 207 | } |
206 | 208 | ||
209 | void sun4i_usb_phy_set_squelch_detect(struct phy *_phy, bool enabled) | ||
210 | { | ||
211 | struct sun4i_usb_phy *phy = phy_get_drvdata(_phy); | ||
212 | |||
213 | sun4i_usb_phy_write(phy, PHY_SQUELCH_DETECT, enabled ? 0 : 2, 2); | ||
214 | } | ||
215 | |||
207 | static struct phy_ops sun4i_usb_phy_ops = { | 216 | static struct phy_ops sun4i_usb_phy_ops = { |
208 | .init = sun4i_usb_phy_init, | 217 | .init = sun4i_usb_phy_init, |
209 | .exit = sun4i_usb_phy_exit, | 218 | .exit = sun4i_usb_phy_exit, |
diff --git a/include/linux/phy/phy-sun4i-usb.h b/include/linux/phy/phy-sun4i-usb.h new file mode 100644 index 000000000000..50aed92ea89c --- /dev/null +++ b/include/linux/phy/phy-sun4i-usb.h | |||
@@ -0,0 +1,26 @@ | |||
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 | ||