aboutsummaryrefslogtreecommitdiffstats
path: root/usb.current/usb-otg-twl4030-fix-wrong-assumption-of-starting-state.patch
blob: 34471a1b82dbd858389c67d71b4d5b50be4cde70 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
From linux-usb-owner@vger.kernel.org  Thu Aug 19 10:36:21 2010
From: Felipe Balbi <felipe.balbi@nokia.com>
To: Greg KH <greg@kroah.com>
Cc: Tony Lindgren <tony@atomide.com>,
	David Brownell <david-b@pacbell.net>,
	Felipe Balbi <felipe.balbi@nokia.com>
Subject: USB: otg: twl4030: fix wrong assumption of starting state
Date: Wed, 11 Aug 2010 13:02:32 +0300
Message-Id: <1281520952-27981-1-git-send-email-felipe.balbi@nokia.com>

From: Felipe Balbi <felipe.balbi@nokia.com>

The reset state of twl4030-usb is not sleeping, it starts
up awaken and we need to disable it if we have booted
with a disconnected cable to avoid over consumption on
the default state.

To avoid problems later, we read the current state of the
transceiver from the PHY_PWR_CTRL register. The bootloader
can, anyways, put the device to sleep before us.

Tested on a custom OMAP board.

Signed-off-by: Felipe Balbi <felipe.balbi@nokia.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

---
 drivers/usb/otg/twl4030-usb.c |    6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

--- a/drivers/usb/otg/twl4030-usb.c
+++ b/drivers/usb/otg/twl4030-usb.c
@@ -550,6 +550,7 @@ static int __devinit twl4030_usb_probe(s
 	struct twl4030_usb_data *pdata = pdev->dev.platform_data;
 	struct twl4030_usb	*twl;
 	int			status, err;
+	u8			pwr;
 
 	if (!pdata) {
 		dev_dbg(&pdev->dev, "platform_data not available\n");
@@ -568,7 +569,10 @@ static int __devinit twl4030_usb_probe(s
 	twl->otg.set_peripheral	= twl4030_set_peripheral;
 	twl->otg.set_suspend	= twl4030_set_suspend;
 	twl->usb_mode		= pdata->usb_mode;
-	twl->asleep		= 1;
+
+	pwr = twl4030_usb_read(twl, PHY_PWR_CTRL);
+
+	twl->asleep		= (pwr & PHY_PWR_PHYPWD);
 
 	/* init spinlock for workqueue */
 	spin_lock_init(&twl->lock);