From: hdegoede@redhat.com (Hans de Goede)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v5 6/7] phy-sun4i-usb: Add support for boards with broken Vusb-detection
Date: Sat, 13 Jun 2015 14:37:50 +0200 [thread overview]
Message-ID: <1434199071-22127-7-git-send-email-hdegoede@redhat.com> (raw)
In-Reply-To: <1434199071-22127-1-git-send-email-hdegoede@redhat.com>
On some boards we cannot detect the presence of an external Vusb, because
e.g. the 5V of the otg connector is directly connected to the 5V of the board,
and thus is always high.
This commit adds support for using such boards by only looking at the
id-detection pin.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
drivers/phy/phy-sun4i-usb.c | 44 ++++++++++++++++++++++++++++++++++++--------
1 file changed, 36 insertions(+), 8 deletions(-)
diff --git a/drivers/phy/phy-sun4i-usb.c b/drivers/phy/phy-sun4i-usb.c
index 5060257..0681641 100644
--- a/drivers/phy/phy-sun4i-usb.c
+++ b/drivers/phy/phy-sun4i-usb.c
@@ -22,6 +22,7 @@
*/
#include <linux/clk.h>
+#include <linux/delay.h>
#include <linux/err.h>
#include <linux/extcon.h>
#include <linux/io.h>
@@ -309,7 +310,7 @@ static int sun4i_usb_phy_power_on(struct phy *_phy)
phy->regulator_on = true;
/* We must report Vbus high within OTG_TIME_A_WAIT_VRISE msec. */
- if (phy->index == 0 && data->phy0_poll)
+ if (phy->index == 0 && data->vbus_det_gpio && data->phy0_poll)
mod_delayed_work(system_wq, &data->detect, DEBOUNCE_TIME);
return 0;
@@ -330,7 +331,7 @@ static int sun4i_usb_phy_power_off(struct phy *_phy)
* phy0 vbus typically slowly discharges, sometimes this causes the
* Vbus gpio to not trigger an edge irq on Vbus off, so force a rescan.
*/
- if (phy->index == 0 && !data->phy0_poll)
+ if (phy->index == 0 && data->vbus_det_gpio && !data->phy0_poll)
mod_delayed_work(system_wq, &data->detect, POLL_TIME);
return 0;
@@ -359,7 +360,10 @@ static void sun4i_usb_phy0_id_vbus_det_scan(struct work_struct *work)
int id_det, vbus_det, id_notify = 0, vbus_notify = 0;
id_det = gpiod_get_value_cansleep(data->id_det_gpio);
- vbus_det = gpiod_get_value_cansleep(data->vbus_det_gpio);
+ if (data->vbus_det_gpio)
+ vbus_det = gpiod_get_value_cansleep(data->vbus_det_gpio);
+ else
+ vbus_det = 1; /* Report vbus as high */
mutex_lock(&phy0->mutex);
@@ -369,6 +373,16 @@ static void sun4i_usb_phy0_id_vbus_det_scan(struct work_struct *work)
}
if (id_det != data->id_det) {
+ /*
+ * When a host cable (id == 0) gets plugged in on systems
+ * without vbus detection report vbus low for long enough for
+ * the musb-ip to end the current device session.
+ */
+ if (!data->vbus_det_gpio && id_det == 0) {
+ sun4i_usb_phy0_set_vbus_detect(phy0, 0);
+ msleep(200);
+ sun4i_usb_phy0_set_vbus_detect(phy0, 1);
+ }
sun4i_usb_phy0_set_id_detect(phy0, id_det);
data->id_det = id_det;
id_notify = 1;
@@ -382,9 +396,22 @@ static void sun4i_usb_phy0_id_vbus_det_scan(struct work_struct *work)
mutex_unlock(&phy0->mutex);
- if (id_notify)
+ if (id_notify) {
extcon_set_cable_state_(data->extcon, EXTCON_USB_HOST,
!id_det);
+ /*
+ * When a host cable gets unplugged (id == 1) on systems
+ * without vbus detection report vbus low for long enough to
+ * the musb-ip to end the current host session.
+ */
+ if (!data->vbus_det_gpio && id_det == 1) {
+ mutex_lock(&phy0->mutex);
+ sun4i_usb_phy0_set_vbus_detect(phy0, 0);
+ msleep(1000);
+ sun4i_usb_phy0_set_vbus_detect(phy0, 1);
+ mutex_unlock(&phy0->mutex);
+ }
+ }
if (vbus_notify)
extcon_set_cable_state_(data->extcon, EXTCON_USB, vbus_det);
@@ -495,9 +522,9 @@ static int sun4i_usb_phy_probe(struct platform_device *pdev)
data->vbus_det_gpio = NULL;
}
- /* We either want both gpio pins or neither (when in host mode) */
- if (!data->id_det_gpio != !data->vbus_det_gpio) {
- dev_err(dev, "failed to get id or vbus detect pin\n");
+ /* vbus_det without id_det makes no sense, and is not supported */
+ if (data->vbus_det_gpio && !data->id_det_gpio) {
+ dev_err(dev, "usb0_id_det missing or invalid\n");
return -ENODEV;
}
@@ -565,7 +592,8 @@ static int sun4i_usb_phy_probe(struct platform_device *pdev)
data->id_det_irq = gpiod_to_irq(data->id_det_gpio);
data->vbus_det_irq = gpiod_to_irq(data->vbus_det_gpio);
- if (data->id_det_irq < 0 || data->vbus_det_irq < 0)
+ if ((data->id_det_gpio && data->id_det_irq < 0) ||
+ (data->vbus_det_gpio && data->vbus_det_irq < 0))
data->phy0_poll = true;
if (data->id_det_irq >= 0) {
--
2.4.3
next prev parent reply other threads:[~2015-06-13 12:37 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-13 12:37 [PATCH v5 0/7] phy-sun4i-usb: Add OTG and newer SoC support Hans de Goede
2015-06-13 12:37 ` [PATCH v5 1/7] phy-sun4i-usb: Add id and vbus detection support for the otg phy (phy0) Hans de Goede
2015-06-13 12:37 ` [PATCH v5 2/7] phy-sun4i-usb: Add extcon " Hans de Goede
2015-06-15 0:39 ` Chanwoo Choi
2015-07-31 14:23 ` [linux-sunxi] " Jonathan Liu
2015-07-31 14:24 ` Hans de Goede
2015-06-13 12:37 ` [PATCH v5 3/7] phy-sun4i-usb: Swap check for disconnect threshold Hans de Goede
2015-06-13 12:37 ` [PATCH v5 4/7] phy-sun4i-usb: Add support for the usb-phys on the sun8i-a23 SoC Hans de Goede
2015-06-13 12:37 ` [PATCH v5 5/7] phy-sun4i-usb: Add support for the usb-phys on the sun8i-a33 SoC Hans de Goede
2015-06-13 12:37 ` Hans de Goede [this message]
2015-06-13 12:37 ` [PATCH v5 7/7] phy-sun4i-usb: Add support for monitoring vbus via a power-supply Hans de Goede
2015-06-15 5:27 ` [PATCH v5 0/7] phy-sun4i-usb: Add OTG and newer SoC support Kishon Vijay Abraham I
2015-07-15 11:07 ` Kishon Vijay Abraham I
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=1434199071-22127-7-git-send-email-hdegoede@redhat.com \
--to=hdegoede@redhat.com \
--cc=linux-arm-kernel@lists.infradead.org \
/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;
as well as URLs for NNTP newsgroup(s).