linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	alan@lxorguk.ukuu.org.uk, Mike Thompson <mpthompson@gmail.com>,
	Fabio Estevam <fabio.estevam@freescale.com>,
	Felipe Balbi <balbi@ti.com>
Subject: [ 03/56] usb: otg: mxs-phy: Fix mx23 operation
Date: Thu,  4 Oct 2012 14:15:24 -0700	[thread overview]
Message-ID: <20121004211152.495075619@linuxfoundation.org> (raw)
In-Reply-To: <20121004211152.101901246@linuxfoundation.org>

3.6-stable review patch.  If anyone has any objections, please let me know.

------------------

From: Mike Thompson <mpthompson@gmail.com>

commit 363366cf61c544ea476f3d220f43a95cb03014f5 upstream.

Currently mx23 fails to enumerate a USB device:

[ 1.300000] hub 1-0:1.0: unable to enumerate USB device on port 1
[ 1.520000] hub 1-0:1.0: unable to enumerate USB device on port 1
[ 1.740000] hub 1-0:1.0: unable to enumerate USB device on port 1
[ 1.960000] hub 1-0:1.0: unable to enumerate USB device on port 1
[ 2.180000] hub 1-0:1.0: unable to enumerate USB device on port 1

Use a kernel workqueue to asynchronously delay the setting of
ENHOSTDISCONDETECT bit until after higher level hub connect/reset processing
is complete.  Prematurely setting the bit prevents the connection
processing from completing and not setting it prevents disconnect from being
detected. No delay is needed for clearing of ENHOSTDISCONDETECT.

Successfully tested on mx23-olinuxino (micro, mini and maxi variants) and mx28evk.

Signed-off-by: Mike Thompson <mpthompson@gmail.com>
Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

---
 drivers/usb/otg/mxs-phy.c |   38 +++++++++++++++++++++++++++++++++++---
 1 file changed, 35 insertions(+), 3 deletions(-)

--- a/drivers/usb/otg/mxs-phy.c
+++ b/drivers/usb/otg/mxs-phy.c
@@ -20,6 +20,7 @@
 #include <linux/delay.h>
 #include <linux/err.h>
 #include <linux/io.h>
+#include <linux/workqueue.h>
 
 #define DRIVER_NAME "mxs_phy"
 
@@ -34,9 +35,16 @@
 #define BM_USBPHY_CTRL_ENUTMILEVEL2		BIT(14)
 #define BM_USBPHY_CTRL_ENHOSTDISCONDETECT	BIT(1)
 
+/*
+ * Amount of delay in miliseconds to safely enable ENHOSTDISCONDETECT bit
+ * so that connection and reset processing can be completed for the root hub.
+ */
+#define MXY_PHY_ENHOSTDISCONDETECT_DELAY	250
+
 struct mxs_phy {
 	struct usb_phy phy;
 	struct clk *clk;
+	struct delayed_work enhostdiscondetect_work;
 };
 
 #define to_mxs_phy(p) container_of((p), struct mxs_phy, phy)
@@ -62,6 +70,7 @@ static int mxs_phy_init(struct usb_phy *
 
 	clk_prepare_enable(mxs_phy->clk);
 	mxs_phy_hw_init(mxs_phy);
+	INIT_DELAYED_WORK(&mxs_phy->enhostdiscondetect_work, NULL);
 
 	return 0;
 }
@@ -76,13 +85,34 @@ static void mxs_phy_shutdown(struct usb_
 	clk_disable_unprepare(mxs_phy->clk);
 }
 
+static void mxs_phy_enhostdiscondetect_delay(struct work_struct *ws)
+{
+	struct mxs_phy *mxs_phy = container_of(ws, struct mxs_phy,
+						enhostdiscondetect_work.work);
+
+	/* Enable HOSTDISCONDETECT after delay. */
+	dev_dbg(mxs_phy->phy.dev, "Setting ENHOSTDISCONDETECT\n");
+	writel_relaxed(BM_USBPHY_CTRL_ENHOSTDISCONDETECT,
+				mxs_phy->phy.io_priv + HW_USBPHY_CTRL_SET);
+}
+
 static int mxs_phy_on_connect(struct usb_phy *phy, int port)
 {
+	struct mxs_phy *mxs_phy = to_mxs_phy(phy);
+
 	dev_dbg(phy->dev, "Connect on port %d\n", port);
 
-	mxs_phy_hw_init(to_mxs_phy(phy));
-	writel_relaxed(BM_USBPHY_CTRL_ENHOSTDISCONDETECT,
-			phy->io_priv + HW_USBPHY_CTRL_SET);
+	mxs_phy_hw_init(mxs_phy);
+
+	/*
+	 * Delay enabling ENHOSTDISCONDETECT so that connection and
+	 * reset processing can be completed for the root hub.
+	 */
+	dev_dbg(phy->dev, "Delaying setting ENHOSTDISCONDETECT\n");
+	PREPARE_DELAYED_WORK(&mxs_phy->enhostdiscondetect_work,
+			mxs_phy_enhostdiscondetect_delay);
+	schedule_delayed_work(&mxs_phy->enhostdiscondetect_work,
+			msecs_to_jiffies(MXY_PHY_ENHOSTDISCONDETECT_DELAY));
 
 	return 0;
 }
@@ -91,6 +121,8 @@ static int mxs_phy_on_disconnect(struct
 {
 	dev_dbg(phy->dev, "Disconnect on port %d\n", port);
 
+	/* No need to delay before clearing ENHOSTDISCONDETECT. */
+	dev_dbg(phy->dev, "Clearing ENHOSTDISCONDETECT\n");
 	writel_relaxed(BM_USBPHY_CTRL_ENHOSTDISCONDETECT,
 			phy->io_priv + HW_USBPHY_CTRL_CLR);
 



  parent reply	other threads:[~2012-10-04 21:16 UTC|newest]

Thread overview: 57+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-10-04 21:15 [ 00/56] 3.6.1-stable review Greg Kroah-Hartman
2012-10-04 21:15 ` [ 01/56] usb: gadget: make g_printer enumerate again Greg Kroah-Hartman
2012-10-04 21:15 ` [ 02/56] usb: gadget: initialize the strings in tcm_usb_gadget properly Greg Kroah-Hartman
2012-10-04 21:15 ` Greg Kroah-Hartman [this message]
2012-10-04 21:15 ` [ 04/56] USB: option: blacklist QMI interface on ZTE MF683 Greg Kroah-Hartman
2012-10-04 21:15 ` [ 05/56] USB: ftdi_sio: add TIAO USB Multi-Protocol Adapter (TUMPA) support Greg Kroah-Hartman
2012-10-04 21:15 ` [ 06/56] USB: EHCI: convert warning messages to debug-level Greg Kroah-Hartman
2012-10-04 21:15 ` [ 07/56] USB: qcaux: add Pantech vendor class match Greg Kroah-Hartman
2012-10-04 21:15 ` [ 08/56] usb: host: xhci: Fix Null pointer dereferencing with 71c731a for non-x86 systems Greg Kroah-Hartman
2012-10-04 21:15 ` [ 09/56] USB: serial: fix up bug with missing {} Greg Kroah-Hartman
2012-10-04 21:15 ` [ 10/56] staging: speakup_soft: Fix reading of init string Greg Kroah-Hartman
2012-10-04 21:15 ` [ 11/56] tty: keyboard.c: Remove locking from vt_get_leds Greg Kroah-Hartman
2012-10-04 21:15 ` [ 12/56] staging: r8712u: Do not queue cloned skb Greg Kroah-Hartman
2012-10-04 21:15 ` [ 13/56] staging: comedi: s626: dont dereference insn->data Greg Kroah-Hartman
2012-10-04 21:15 ` [ 14/56] staging: comedi: jr3_pci: fix iomem dereference Greg Kroah-Hartman
2012-10-04 21:15 ` [ 15/56] staging: comedi: dont dereference user memory for INSN_INTTRIG Greg Kroah-Hartman
2012-10-04 21:15 ` [ 16/56] staging: comedi: fix memory leak for saved channel list Greg Kroah-Hartman
2012-10-04 21:15 ` [ 17/56] Remove BUG_ON from n_tty_read() Greg Kroah-Hartman
2012-10-04 21:15 ` [ 18/56] TTY: ttyprintk, dont touch behind tty->write_buf Greg Kroah-Hartman
2012-10-04 21:15 ` [ 19/56] serial: omap: fix software flow control Greg Kroah-Hartman
2012-10-04 21:15 ` [ 20/56] serial: pl011: handle corruption at high clock speeds Greg Kroah-Hartman
2012-10-04 21:15 ` [ 21/56] serial: set correct baud_base for EXSYS EX-41092 Dual 16950 Greg Kroah-Hartman
2012-10-04 21:15 ` [ 22/56] tools/hv: Fix file handle leak Greg Kroah-Hartman
2012-10-04 21:15 ` [ 23/56] tools/hv: Fix exit() error code Greg Kroah-Hartman
2012-10-04 21:15 ` [ 24/56] tools/hv: Check for read/write errors Greg Kroah-Hartman
2012-10-04 21:15 ` [ 25/56] b43legacy: Fix crash on unload when firmware not available Greg Kroah-Hartman
2012-10-04 21:15 ` [ 26/56] firmware: Add missing attributes to EFI variable attribute print out from sysfs Greg Kroah-Hartman
2012-10-04 21:15 ` [ 27/56] xhci: Intel Panther Point BEI quirk Greg Kroah-Hartman
2012-10-04 21:15 ` [ 28/56] xHCI: add cmd_ring_state Greg Kroah-Hartman
2012-10-04 21:15 ` [ 29/56] xHCI: add aborting command ring function Greg Kroah-Hartman
2012-10-04 21:15 ` [ 30/56] xHCI: cancel command after command timeout Greg Kroah-Hartman
2012-10-04 21:15 ` [ 31/56] xHCI: handle command after aborting the command ring Greg Kroah-Hartman
2012-10-04 21:15 ` [ 32/56] Increase XHCI suspend timeout to 16ms Greg Kroah-Hartman
2012-10-04 21:15 ` [ 33/56] HID: keep dev_rdesc unmodified and use it for comparisons Greg Kroah-Hartman
2012-10-04 21:15 ` [ 34/56] ath9k: Disable ASPM only for AR9285 Greg Kroah-Hartman
2012-10-04 21:15 ` [ 35/56] xen/pciback: Restore the PCI config space after an FLR Greg Kroah-Hartman
2012-10-04 21:15 ` [ 36/56] coredump: prevent double-free on an error path in core dumper Greg Kroah-Hartman
2012-10-04 21:15 ` [ 37/56] n_gsm.c: Implement 3GPP27.010 DLC start-up procedure in MUX Greg Kroah-Hartman
2012-10-04 21:15 ` [ 38/56] n_gsm: uplink SKBs accumulate on list Greg Kroah-Hartman
2012-10-04 21:16 ` [ 39/56] n_gsm: added interlocking for gsm_data_lock for certain code paths Greg Kroah-Hartman
2012-10-04 21:16 ` [ 40/56] n_gsm: memory leak in uplink error path Greg Kroah-Hartman
2012-10-04 21:16 ` [ 41/56] UBI: fix autoresize handling in R/O mode Greg Kroah-Hartman
2012-10-04 21:16 ` [ 42/56] UBI: erase free PEB with bitflip in EC header Greg Kroah-Hartman
2012-10-04 21:16 ` [ 43/56] Yama: handle 32-bit userspace prctl Greg Kroah-Hartman
2012-10-04 21:16 ` [ 44/56] SCSI: ibmvscsi: Fix host config length field overflow Greg Kroah-Hartman
2012-10-04 21:16 ` [ 45/56] SCSI: hpsa: Use LUN reset instead of target reset Greg Kroah-Hartman
2012-10-04 21:16 ` [ 46/56] can: mscan-mpc5xxx: fix return value check in mpc512x_can_get_clock() Greg Kroah-Hartman
2012-10-04 21:16 ` [ 47/56] Input: synaptics - adjust threshold for treating position values as negative Greg Kroah-Hartman
2012-10-04 21:16 ` [ 48/56] remoteproc: select VIRTIO to avoid build breakage Greg Kroah-Hartman
2012-10-04 21:16 ` [ 49/56] remoteproc: fix a potential NULL-dereference on cleanup Greg Kroah-Hartman
2012-10-04 21:16 ` [ 50/56] IPoIB: Fix use-after-free of multicast object Greg Kroah-Hartman
2012-10-04 21:16 ` [ 51/56] IB/srp: Fix use-after-free in srp_reset_req() Greg Kroah-Hartman
2012-10-04 21:16 ` [ 52/56] IB/srp: Avoid having aborted requests hang Greg Kroah-Hartman
2012-10-04 21:16 ` [ 53/56] IB/qib: Fix local access validation for user MRs Greg Kroah-Hartman
2012-10-04 21:16 ` [ 54/56] isci: fix isci_pci_probe() generates warning on efi failure path Greg Kroah-Hartman
2012-10-04 21:16 ` [ 55/56] SCSI: scsi_remove_target: fix softlockup regression on hot remove Greg Kroah-Hartman
2012-10-04 21:16 ` [ 56/56] SCSI: scsi_dh_alua: Enable STPG for unavailable ports Greg Kroah-Hartman

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=20121004211152.495075619@linuxfoundation.org \
    --to=gregkh@linuxfoundation.org \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=balbi@ti.com \
    --cc=fabio.estevam@freescale.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mpthompson@gmail.com \
    --cc=stable@vger.kernel.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).