aboutsummaryrefslogtreecommitdiffstats
path: root/usb.current
diff options
Diffstat (limited to 'usb.current')
-rw-r--r--usb.current/usb-ehci-disable-langwell-penwell-lpm-capability.patch36
-rw-r--r--usb.current/usb-musb_debugfs-don-t-use-the-struct-file-private_data-field-with-seq_files.patch41
-rw-r--r--usb.current/usb-otg-twl4030-fix-phy-initialization-v1.patch287
3 files changed, 364 insertions, 0 deletions
diff --git a/usb.current/usb-ehci-disable-langwell-penwell-lpm-capability.patch b/usb.current/usb-ehci-disable-langwell-penwell-lpm-capability.patch
new file mode 100644
index 00000000000000..de57de40b10f93
--- /dev/null
+++ b/usb.current/usb-ehci-disable-langwell-penwell-lpm-capability.patch
@@ -0,0 +1,36 @@
+From alan@linux.intel.com Tue Sep 7 00:49:05 2010
+From: Alek Du <alek.du@intel.com>
+Date: Mon, 06 Sep 2010 14:50:57 +0100
+Subject: USB: EHCI: Disable langwell/penwell LPM capability
+To: linux-usb@vger.kernel.org
+Message-ID: <20100906135040.4591.72919.stgit@localhost.localdomain>
+
+
+From: Alek Du <alek.du@intel.com>
+
+We have to do so due to HW limitation.
+
+Signed-off-by: Alek Du <alek.du@intel.com>
+Signed-off-by: Alan Cox <alan@linux.intel.com>
+Cc: stable <stable@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+
+---
+ drivers/usb/host/ehci-pci.c | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+--- a/drivers/usb/host/ehci-pci.c
++++ b/drivers/usb/host/ehci-pci.c
+@@ -119,6 +119,11 @@ static int ehci_pci_setup(struct usb_hcd
+ ehci->broken_periodic = 1;
+ ehci_info(ehci, "using broken periodic workaround\n");
+ }
++ if (pdev->device == 0x0806 || pdev->device == 0x0811
++ || pdev->device == 0x0829) {
++ ehci_info(ehci, "disable lpm for langwell/penwell\n");
++ ehci->has_lpm = 0;
++ }
+ break;
+ case PCI_VENDOR_ID_TDI:
+ if (pdev->device == PCI_DEVICE_ID_TDI_EHCI) {
diff --git a/usb.current/usb-musb_debugfs-don-t-use-the-struct-file-private_data-field-with-seq_files.patch b/usb.current/usb-musb_debugfs-don-t-use-the-struct-file-private_data-field-with-seq_files.patch
new file mode 100644
index 00000000000000..6864da9be83596
--- /dev/null
+++ b/usb.current/usb-musb_debugfs-don-t-use-the-struct-file-private_data-field-with-seq_files.patch
@@ -0,0 +1,41 @@
+From mathias.nyman@nokia.com Tue Sep 7 00:45:41 2010
+From: Mathias Nyman <mathias.nyman@nokia.com>
+Date: Mon, 6 Sep 2010 13:52:01 +0300
+Subject: usb: musb_debugfs: don't use the struct file private_data field with seq_files
+To: linux-usb@vger.kernel.org
+Cc: Mathias Nyman <mathias.nyman@nokia.com>
+Message-ID: <1283770321-16903-1-git-send-email-mathias.nyman@nokia.com>
+
+
+seq_files use the private_data field of a file struct for storing a seq_file structure,
+data should be stored in seq_file's own private field (e.g. file->private_data->private)
+Otherwise seq_release() will free the private data when the file is closed.
+
+Signed-off-by: Mathias Nyman <mathias.nyman@nokia.com>
+Cc: stable <stable@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/musb/musb_debugfs.c | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+--- a/drivers/usb/musb/musb_debugfs.c
++++ b/drivers/usb/musb/musb_debugfs.c
+@@ -195,15 +195,14 @@ static const struct file_operations musb
+
+ static int musb_test_mode_open(struct inode *inode, struct file *file)
+ {
+- file->private_data = inode->i_private;
+-
+ return single_open(file, musb_test_mode_show, inode->i_private);
+ }
+
+ static ssize_t musb_test_mode_write(struct file *file,
+ const char __user *ubuf, size_t count, loff_t *ppos)
+ {
+- struct musb *musb = file->private_data;
++ struct seq_file *s = file->private_data;
++ struct musb *musb = s->private;
+ u8 test = 0;
+ char buf[18];
+
diff --git a/usb.current/usb-otg-twl4030-fix-phy-initialization-v1.patch b/usb.current/usb-otg-twl4030-fix-phy-initialization-v1.patch
new file mode 100644
index 00000000000000..2dc026f5ebdbe2
--- /dev/null
+++ b/usb.current/usb-otg-twl4030-fix-phy-initialization-v1.patch
@@ -0,0 +1,287 @@
+From tom.leiming@gmail.com Tue Sep 7 00:49:51 2010
+From: tom.leiming@gmail.com
+Date: Mon, 6 Sep 2010 23:27:09 +0800
+Subject: USB: otg: twl4030: fix phy initialization(v1)
+To: greg@kroah.com
+Cc: linux-usb@vger.kernel.org, linux-omap@vger.kernel.org, linux-kernel@vger.kernel.org, Ming Lei <tom.leiming@gmail.com>, David Brownell <dbrownell@users.sourceforge.net>, Felipe Balbi <me@felipebalbi.com>, Anand Gadiyar <gadiyar@ti.com>, Mike Frysinger <vapier@gentoo.org>, Sergei Shtylyov <sshtylyov@ru.mvista.com>
+Message-ID: <1283786829-3564-1-git-send-email-tom.leiming@gmail.com>
+
+
+From: Ming Lei <tom.leiming@gmail.com>
+
+Commit 461c317705eca5cac09a360f488715927fd0a927(into 2.6.36-v3)
+is put forward to power down phy if no usb cable is connected,
+but does introduce the two issues below:
+
+1), phy is not into work state if usb cable is connected
+with PC during poweron, so musb device mode is not usable
+in such case, follows the reasons:
+ -twl4030_phy_resume is not called, so
+ regulators are not enabled
+ i2c access are not enabled
+ usb mode not configurated
+
+2), The kernel warings[1] of regulators 'unbalanced disables'
+is caused if poweron without usb cable connected
+with PC or b-device.
+
+This patch fixes the two issues above:
+ -power down phy only if no usb cable is connected with PC
+and b-device
+ -do phy initialization(via __twl4030_phy_resume) if usb cable
+is connected with PC(vbus event) or another b-device(ID event) in
+twl4030_usb_probe.
+
+This patch also doesn't put VUSB3V1 LDO into active mode in
+twl4030_usb_ldo_init until VBUS/ID change detected, so we can
+save more power consumption than before.
+
+This patch is verified OK on Beagle board either connected with
+usb cable or not when poweron.
+
+[1]. warnings of 'unbalanced disables' of regulators.
+[root@OMAP3EVM /]# dmesg
+------------[ cut here ]------------
+WARNING: at drivers/regulator/core.c:1357 _regulator_disable+0x38/0x128()
+unbalanced disables for VUSB1V8
+Modules linked in:
+Backtrace:
+[<c0030c48>] (dump_backtrace+0x0/0x110) from [<c034f5a8>] (dump_stack+0x18/0x1c)
+ r7:c78179d8 r6:c01ed6b8 r5:c0410822 r4:0000054d
+[<c034f590>] (dump_stack+0x0/0x1c) from [<c0057da8>] (warn_slowpath_common+0x54/0x6c)
+[<c0057d54>] (warn_slowpath_common+0x0/0x6c) from [<c0057e64>] (warn_slowpath_fmt+0x38/0x40)
+ r9:00000000 r8:00000000 r7:c78e6608 r6:00000000 r5:fffffffb
+ r4:c78e6c00
+[<c0057e2c>] (warn_slowpath_fmt+0x0/0x40) from [<c01ed6b8>] (_regulator_disable+0x38/0x128)
+ r3:c0410e53 r2:c0410ad5
+[<c01ed680>] (_regulator_disable+0x0/0x128) from [<c01ed87c>] (regulator_disable+0x24/0x38)
+ r7:c78e6608 r6:00000000 r5:c78e6c40 r4:c78e6c00
+[<c01ed858>] (regulator_disable+0x0/0x38) from [<c02382dc>] (twl4030_phy_power+0x15c/0x17c)
+ r5:c78595c0 r4:00000000
+[<c0238180>] (twl4030_phy_power+0x0/0x17c) from [<c023831c>] (twl4030_phy_suspend+0x20/0x2c)
+ r6:00000000 r5:c78595c0 r4:c78595c0
+[<c02382fc>] (twl4030_phy_suspend+0x0/0x2c) from [<c0238638>] (twl4030_usb_irq+0x11c/0x16c)
+ r5:c78595c0 r4:00000040
+[<c023851c>] (twl4030_usb_irq+0x0/0x16c) from [<c034ec18>] (twl4030_usb_probe+0x2c4/0x32c)
+ r6:00000000 r5:00000000 r4:c78595c0
+[<c034e954>] (twl4030_usb_probe+0x0/0x32c) from [<c02152a0>] (platform_drv_probe+0x20/0x24)
+ r7:00000000 r6:c047d49c r5:c78e6608 r4:c047d49c
+[<c0215280>] (platform_drv_probe+0x0/0x24) from [<c0214244>] (driver_probe_device+0xd0/0x190)
+[<c0214174>] (driver_probe_device+0x0/0x190) from [<c02143d4>] (__device_attach+0x44/0x48)
+ r7:00000000 r6:c78e6608 r5:c78e6608 r4:c047d49c
+[<c0214390>] (__device_attach+0x0/0x48) from [<c0213694>] (bus_for_each_drv+0x50/0x90)
+ r5:c0214390 r4:00000000
+[<c0213644>] (bus_for_each_drv+0x0/0x90) from [<c0214474>] (device_attach+0x70/0x94)
+ r6:c78e663c r5:c78e6608 r4:c78e6608
+[<c0214404>] (device_attach+0x0/0x94) from [<c02134fc>] (bus_probe_device+0x2c/0x48)
+ r7:00000000 r6:00000002 r5:c78e6608 r4:c78e6600
+[<c02134d0>] (bus_probe_device+0x0/0x48) from [<c0211e48>] (device_add+0x340/0x4b4)
+[<c0211b08>] (device_add+0x0/0x4b4) from [<c021597c>] (platform_device_add+0x110/0x16c)
+[<c021586c>] (platform_device_add+0x0/0x16c) from [<c0220cb0>] (add_numbered_child+0xd8/0x118)
+ r7:00000000 r6:c045f15c r5:c78e6600 r4:00000000
+[<c0220bd8>] (add_numbered_child+0x0/0x118) from [<c001c618>] (twl_probe+0x3a4/0x72c)
+[<c001c274>] (twl_probe+0x0/0x72c) from [<c02601ac>] (i2c_device_probe+0x7c/0xa4)
+[<c0260130>] (i2c_device_probe+0x0/0xa4) from [<c0214244>] (driver_probe_device+0xd0/0x190)
+ r5:c7856e20 r4:c047c860
+[<c0214174>] (driver_probe_device+0x0/0x190) from [<c02143d4>] (__device_attach+0x44/0x48)
+ r7:c7856e04 r6:c7856e20 r5:c7856e20 r4:c047c860
+[<c0214390>] (__device_attach+0x0/0x48) from [<c0213694>] (bus_for_each_drv+0x50/0x90)
+ r5:c0214390 r4:00000000
+[<c0213644>] (bus_for_each_drv+0x0/0x90) from [<c0214474>] (device_attach+0x70/0x94)
+ r6:c7856e54 r5:c7856e20 r4:c7856e20
+[<c0214404>] (device_attach+0x0/0x94) from [<c02134fc>] (bus_probe_device+0x2c/0x48)
+ r7:c7856e04 r6:c78fd048 r5:c7856e20 r4:c7856e20
+[<c02134d0>] (bus_probe_device+0x0/0x48) from [<c0211e48>] (device_add+0x340/0x4b4)
+[<c0211b08>] (device_add+0x0/0x4b4) from [<c0211fd8>] (device_register+0x1c/0x20)
+[<c0211fbc>] (device_register+0x0/0x20) from [<c0260aa8>] (i2c_new_device+0xec/0x150)
+ r5:c7856e00 r4:c7856e20
+[<c02609bc>] (i2c_new_device+0x0/0x150) from [<c0260dc0>] (i2c_register_adapter+0xa0/0x1c4)
+ r7:00000000 r6:c78fd078 r5:c78fd048 r4:c781d5c0
+[<c0260d20>] (i2c_register_adapter+0x0/0x1c4) from [<c0260f80>] (i2c_add_numbered_adapter+0x9c/0xb4)
+ r7:00000a28 r6:c04600a8 r5:c78fd048 r4:00000000
+[<c0260ee4>] (i2c_add_numbered_adapter+0x0/0xb4) from [<c034efa4>] (omap_i2c_probe+0x324/0x3e8)
+ r5:00000000 r4:c78fd000
+[<c034ec80>] (omap_i2c_probe+0x0/0x3e8) from [<c02152a0>] (platform_drv_probe+0x20/0x24)
+[<c0215280>] (platform_drv_probe+0x0/0x24) from [<c0214244>] (driver_probe_device+0xd0/0x190)
+[<c0214174>] (driver_probe_device+0x0/0x190) from [<c021436c>] (__driver_attach+0x68/0x8c)
+ r7:c78b2140 r6:c047e214 r5:c04600e4 r4:c04600b0
+[<c0214304>] (__driver_attach+0x0/0x8c) from [<c021399c>] (bus_for_each_dev+0x50/0x84)
+ r7:c78b2140 r6:c047e214 r5:c0214304 r4:00000000
+[<c021394c>] (bus_for_each_dev+0x0/0x84) from [<c0214068>] (driver_attach+0x20/0x28)
+ r6:c047e214 r5:c047e214 r4:c00270d0
+[<c0214048>] (driver_attach+0x0/0x28) from [<c0213274>] (bus_add_driver+0xa8/0x228)
+[<c02131cc>] (bus_add_driver+0x0/0x228) from [<c02146a4>] (driver_register+0xb0/0x13c)
+[<c02145f4>] (driver_register+0x0/0x13c) from [<c0215744>] (platform_driver_register+0x4c/0x60)
+ r9:00000000 r8:c001f688 r7:00000013 r6:c005b6fc r5:c00083dc
+r4:c00270d0
+[<c02156f8>] (platform_driver_register+0x0/0x60) from [<c001f69c>] (omap_i2c_init_driver+0x14/0x1c)
+[<c001f688>] (omap_i2c_init_driver+0x0/0x1c) from [<c002c460>] (do_one_initcall+0xd0/0x1a4)
+[<c002c390>] (do_one_initcall+0x0/0x1a4) from [<c0008478>] (kernel_init+0x9c/0x154)
+[<c00083dc>] (kernel_init+0x0/0x154) from [<c005b6fc>] (do_exit+0x0/0x688)
+ r5:c00083dc r4:00000000
+---[ end trace 1b75b31a2719ed1d ]---
+
+Signed-off-by: Ming Lei <tom.leiming@gmail.com>
+Cc: David Brownell <dbrownell@users.sourceforge.net>
+Cc: Felipe Balbi <me@felipebalbi.com>
+Cc: Anand Gadiyar <gadiyar@ti.com>
+Cc: Mike Frysinger <vapier@gentoo.org>
+Cc: Sergei Shtylyov <sshtylyov@ru.mvista.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/otg/twl4030-usb.c | 78 +++++++++++++++++++++++++++---------------
+ 1 file changed, 51 insertions(+), 27 deletions(-)
+
+--- a/drivers/usb/otg/twl4030-usb.c
++++ b/drivers/usb/otg/twl4030-usb.c
+@@ -347,11 +347,20 @@ static void twl4030_i2c_access(struct tw
+ }
+ }
+
+-static void twl4030_phy_power(struct twl4030_usb *twl, int on)
++static void __twl4030_phy_power(struct twl4030_usb *twl, int on)
+ {
+- u8 pwr;
++ u8 pwr = twl4030_usb_read(twl, PHY_PWR_CTRL);
++
++ if (on)
++ pwr &= ~PHY_PWR_PHYPWD;
++ else
++ pwr |= PHY_PWR_PHYPWD;
+
+- pwr = twl4030_usb_read(twl, PHY_PWR_CTRL);
++ WARN_ON(twl4030_usb_write_verify(twl, PHY_PWR_CTRL, pwr) < 0);
++}
++
++static void twl4030_phy_power(struct twl4030_usb *twl, int on)
++{
+ if (on) {
+ regulator_enable(twl->usb3v1);
+ regulator_enable(twl->usb1v8);
+@@ -365,15 +374,13 @@ static void twl4030_phy_power(struct twl
+ twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0,
+ VUSB_DEDICATED2);
+ regulator_enable(twl->usb1v5);
+- pwr &= ~PHY_PWR_PHYPWD;
+- WARN_ON(twl4030_usb_write_verify(twl, PHY_PWR_CTRL, pwr) < 0);
++ __twl4030_phy_power(twl, 1);
+ twl4030_usb_write(twl, PHY_CLK_CTRL,
+ twl4030_usb_read(twl, PHY_CLK_CTRL) |
+ (PHY_CLK_CTRL_CLOCKGATING_EN |
+ PHY_CLK_CTRL_CLK32K_EN));
+- } else {
+- pwr |= PHY_PWR_PHYPWD;
+- WARN_ON(twl4030_usb_write_verify(twl, PHY_PWR_CTRL, pwr) < 0);
++ } else {
++ __twl4030_phy_power(twl, 0);
+ regulator_disable(twl->usb1v5);
+ regulator_disable(twl->usb1v8);
+ regulator_disable(twl->usb3v1);
+@@ -387,19 +394,25 @@ static void twl4030_phy_suspend(struct t
+
+ twl4030_phy_power(twl, 0);
+ twl->asleep = 1;
++ dev_dbg(twl->dev, "%s\n", __func__);
+ }
+
+-static void twl4030_phy_resume(struct twl4030_usb *twl)
++static void __twl4030_phy_resume(struct twl4030_usb *twl)
+ {
+- if (!twl->asleep)
+- return;
+-
+ twl4030_phy_power(twl, 1);
+ twl4030_i2c_access(twl, 1);
+ twl4030_usb_set_mode(twl, twl->usb_mode);
+ if (twl->usb_mode == T2_USB_MODE_ULPI)
+ twl4030_i2c_access(twl, 0);
++}
++
++static void twl4030_phy_resume(struct twl4030_usb *twl)
++{
++ if (!twl->asleep)
++ return;
++ __twl4030_phy_resume(twl);
+ twl->asleep = 0;
++ dev_dbg(twl->dev, "%s\n", __func__);
+ }
+
+ static int twl4030_usb_ldo_init(struct twl4030_usb *twl)
+@@ -408,8 +421,8 @@ static int twl4030_usb_ldo_init(struct t
+ twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, 0xC0, PROTECT_KEY);
+ twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, 0x0C, PROTECT_KEY);
+
+- /* put VUSB3V1 LDO in active state */
+- twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0, VUSB_DEDICATED2);
++ /* Keep VUSB3V1 LDO in sleep state until VBUS/ID change detected*/
++ /*twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0, VUSB_DEDICATED2);*/
+
+ /* input to VUSB3V1 LDO is from VBAT, not VBUS */
+ twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x14, VUSB_DEDICATED1);
+@@ -502,6 +515,26 @@ static irqreturn_t twl4030_usb_irq(int i
+ return IRQ_HANDLED;
+ }
+
++static void twl4030_usb_phy_init(struct twl4030_usb *twl)
++{
++ int status;
++
++ status = twl4030_usb_linkstat(twl);
++ if (status >= 0) {
++ if (status == USB_EVENT_NONE) {
++ __twl4030_phy_power(twl, 0);
++ twl->asleep = 1;
++ } else {
++ __twl4030_phy_resume(twl);
++ twl->asleep = 0;
++ }
++
++ blocking_notifier_call_chain(&twl->otg.notifier, status,
++ twl->otg.gadget);
++ }
++ sysfs_notify(&twl->dev->kobj, NULL, "vbus");
++}
++
+ static int twl4030_set_suspend(struct otg_transceiver *x, int suspend)
+ {
+ struct twl4030_usb *twl = xceiv_to_twl(x);
+@@ -550,7 +583,6 @@ 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");
+@@ -569,10 +601,7 @@ 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;
+-
+- pwr = twl4030_usb_read(twl, PHY_PWR_CTRL);
+-
+- twl->asleep = (pwr & PHY_PWR_PHYPWD);
++ twl->asleep = 1;
+
+ /* init spinlock for workqueue */
+ spin_lock_init(&twl->lock);
+@@ -610,15 +639,10 @@ static int __devinit twl4030_usb_probe(s
+ return status;
+ }
+
+- /* The IRQ handler just handles changes from the previous states
+- * of the ID and VBUS pins ... in probe() we must initialize that
+- * previous state. The easy way: fake an IRQ.
+- *
+- * REVISIT: a real IRQ might have happened already, if PREEMPT is
+- * enabled. Else the IRQ may not yet be configured or enabled,
+- * because of scheduling delays.
++ /* Power down phy or make it work according to
++ * current link state.
+ */
+- twl4030_usb_irq(twl->irq, twl);
++ twl4030_usb_phy_init(twl);
+
+ dev_info(&pdev->dev, "Initialized TWL4030 USB module\n");
+ return 0;