提交 0c4ab345 编写于 作者: L Linus Torvalds

Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6

* git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6:
  USB: musb: MAINTAINERS: Fix my mail address
  USB: serial/mos*: prevent reading uninitialized stack memory
  USB: otg: twl4030: fix phy initialization(v1)
  USB: EHCI: Disable langwell/penwell LPM capability
  usb: musb_debugfs: don't use the struct file private_data field with seq_files
...@@ -3942,7 +3942,7 @@ F: drivers/char/isicom.c ...@@ -3942,7 +3942,7 @@ F: drivers/char/isicom.c
F: include/linux/isicom.h F: include/linux/isicom.h
MUSB MULTIPOINT HIGH SPEED DUAL-ROLE CONTROLLER MUSB MULTIPOINT HIGH SPEED DUAL-ROLE CONTROLLER
M: Felipe Balbi <felipe.balbi@nokia.com> M: Felipe Balbi <balbi@ti.com>
L: linux-usb@vger.kernel.org L: linux-usb@vger.kernel.org
T: git git://gitorious.org/usb/usb.git T: git git://gitorious.org/usb/usb.git
S: Maintained S: Maintained
...@@ -4240,7 +4240,7 @@ S: Maintained ...@@ -4240,7 +4240,7 @@ S: Maintained
F: drivers/char/hw_random/omap-rng.c F: drivers/char/hw_random/omap-rng.c
OMAP USB SUPPORT OMAP USB SUPPORT
M: Felipe Balbi <felipe.balbi@nokia.com> M: Felipe Balbi <balbi@ti.com>
M: David Brownell <dbrownell@users.sourceforge.net> M: David Brownell <dbrownell@users.sourceforge.net>
L: linux-usb@vger.kernel.org L: linux-usb@vger.kernel.org
L: linux-omap@vger.kernel.org L: linux-omap@vger.kernel.org
......
...@@ -119,6 +119,11 @@ static int ehci_pci_setup(struct usb_hcd *hcd) ...@@ -119,6 +119,11 @@ static int ehci_pci_setup(struct usb_hcd *hcd)
ehci->broken_periodic = 1; ehci->broken_periodic = 1;
ehci_info(ehci, "using broken periodic workaround\n"); 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; break;
case PCI_VENDOR_ID_TDI: case PCI_VENDOR_ID_TDI:
if (pdev->device == PCI_DEVICE_ID_TDI_EHCI) { if (pdev->device == PCI_DEVICE_ID_TDI_EHCI) {
......
...@@ -195,15 +195,14 @@ static const struct file_operations musb_regdump_fops = { ...@@ -195,15 +195,14 @@ static const struct file_operations musb_regdump_fops = {
static int musb_test_mode_open(struct inode *inode, struct file *file) 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); return single_open(file, musb_test_mode_show, inode->i_private);
} }
static ssize_t musb_test_mode_write(struct file *file, static ssize_t musb_test_mode_write(struct file *file,
const char __user *ubuf, size_t count, loff_t *ppos) 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; u8 test = 0;
char buf[18]; char buf[18];
......
...@@ -347,11 +347,20 @@ static void twl4030_i2c_access(struct twl4030_usb *twl, int on) ...@@ -347,11 +347,20 @@ static void twl4030_i2c_access(struct twl4030_usb *twl, int on)
} }
} }
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) { if (on) {
regulator_enable(twl->usb3v1); regulator_enable(twl->usb3v1);
regulator_enable(twl->usb1v8); regulator_enable(twl->usb1v8);
...@@ -365,15 +374,13 @@ static void twl4030_phy_power(struct twl4030_usb *twl, int on) ...@@ -365,15 +374,13 @@ static void twl4030_phy_power(struct twl4030_usb *twl, int on)
twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0, twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0,
VUSB_DEDICATED2); VUSB_DEDICATED2);
regulator_enable(twl->usb1v5); regulator_enable(twl->usb1v5);
pwr &= ~PHY_PWR_PHYPWD; __twl4030_phy_power(twl, 1);
WARN_ON(twl4030_usb_write_verify(twl, PHY_PWR_CTRL, pwr) < 0);
twl4030_usb_write(twl, PHY_CLK_CTRL, twl4030_usb_write(twl, PHY_CLK_CTRL,
twl4030_usb_read(twl, PHY_CLK_CTRL) | twl4030_usb_read(twl, PHY_CLK_CTRL) |
(PHY_CLK_CTRL_CLOCKGATING_EN | (PHY_CLK_CTRL_CLOCKGATING_EN |
PHY_CLK_CTRL_CLK32K_EN)); PHY_CLK_CTRL_CLK32K_EN));
} else { } else {
pwr |= PHY_PWR_PHYPWD; __twl4030_phy_power(twl, 0);
WARN_ON(twl4030_usb_write_verify(twl, PHY_PWR_CTRL, pwr) < 0);
regulator_disable(twl->usb1v5); regulator_disable(twl->usb1v5);
regulator_disable(twl->usb1v8); regulator_disable(twl->usb1v8);
regulator_disable(twl->usb3v1); regulator_disable(twl->usb3v1);
...@@ -387,19 +394,25 @@ static void twl4030_phy_suspend(struct twl4030_usb *twl, int controller_off) ...@@ -387,19 +394,25 @@ static void twl4030_phy_suspend(struct twl4030_usb *twl, int controller_off)
twl4030_phy_power(twl, 0); twl4030_phy_power(twl, 0);
twl->asleep = 1; 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_phy_power(twl, 1);
twl4030_i2c_access(twl, 1); twl4030_i2c_access(twl, 1);
twl4030_usb_set_mode(twl, twl->usb_mode); twl4030_usb_set_mode(twl, twl->usb_mode);
if (twl->usb_mode == T2_USB_MODE_ULPI) if (twl->usb_mode == T2_USB_MODE_ULPI)
twl4030_i2c_access(twl, 0); 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; twl->asleep = 0;
dev_dbg(twl->dev, "%s\n", __func__);
} }
static int twl4030_usb_ldo_init(struct twl4030_usb *twl) static int twl4030_usb_ldo_init(struct twl4030_usb *twl)
...@@ -408,8 +421,8 @@ static int twl4030_usb_ldo_init(struct twl4030_usb *twl) ...@@ -408,8 +421,8 @@ static int twl4030_usb_ldo_init(struct twl4030_usb *twl)
twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, 0xC0, PROTECT_KEY); twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, 0xC0, PROTECT_KEY);
twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, 0x0C, PROTECT_KEY); twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, 0x0C, PROTECT_KEY);
/* put VUSB3V1 LDO in active state */ /* Keep VUSB3V1 LDO in sleep state until VBUS/ID change detected*/
twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0, VUSB_DEDICATED2); /*twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0, VUSB_DEDICATED2);*/
/* input to VUSB3V1 LDO is from VBAT, not VBUS */ /* input to VUSB3V1 LDO is from VBAT, not VBUS */
twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x14, VUSB_DEDICATED1); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x14, VUSB_DEDICATED1);
...@@ -502,6 +515,26 @@ static irqreturn_t twl4030_usb_irq(int irq, void *_twl) ...@@ -502,6 +515,26 @@ static irqreturn_t twl4030_usb_irq(int irq, void *_twl)
return IRQ_HANDLED; 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) static int twl4030_set_suspend(struct otg_transceiver *x, int suspend)
{ {
struct twl4030_usb *twl = xceiv_to_twl(x); struct twl4030_usb *twl = xceiv_to_twl(x);
...@@ -550,7 +583,6 @@ static int __devinit twl4030_usb_probe(struct platform_device *pdev) ...@@ -550,7 +583,6 @@ static int __devinit twl4030_usb_probe(struct platform_device *pdev)
struct twl4030_usb_data *pdata = pdev->dev.platform_data; struct twl4030_usb_data *pdata = pdev->dev.platform_data;
struct twl4030_usb *twl; struct twl4030_usb *twl;
int status, err; int status, err;
u8 pwr;
if (!pdata) { if (!pdata) {
dev_dbg(&pdev->dev, "platform_data not available\n"); dev_dbg(&pdev->dev, "platform_data not available\n");
...@@ -569,10 +601,7 @@ static int __devinit twl4030_usb_probe(struct platform_device *pdev) ...@@ -569,10 +601,7 @@ static int __devinit twl4030_usb_probe(struct platform_device *pdev)
twl->otg.set_peripheral = twl4030_set_peripheral; twl->otg.set_peripheral = twl4030_set_peripheral;
twl->otg.set_suspend = twl4030_set_suspend; twl->otg.set_suspend = twl4030_set_suspend;
twl->usb_mode = pdata->usb_mode; 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 */ /* init spinlock for workqueue */
spin_lock_init(&twl->lock); spin_lock_init(&twl->lock);
...@@ -610,15 +639,10 @@ static int __devinit twl4030_usb_probe(struct platform_device *pdev) ...@@ -610,15 +639,10 @@ static int __devinit twl4030_usb_probe(struct platform_device *pdev)
return status; return status;
} }
/* The IRQ handler just handles changes from the previous states /* Power down phy or make it work according to
* of the ID and VBUS pins ... in probe() we must initialize that * current link state.
* 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.
*/ */
twl4030_usb_irq(twl->irq, twl); twl4030_usb_phy_init(twl);
dev_info(&pdev->dev, "Initialized TWL4030 USB module\n"); dev_info(&pdev->dev, "Initialized TWL4030 USB module\n");
return 0; return 0;
......
...@@ -2024,6 +2024,9 @@ static int mos7720_ioctl(struct tty_struct *tty, struct file *file, ...@@ -2024,6 +2024,9 @@ static int mos7720_ioctl(struct tty_struct *tty, struct file *file,
case TIOCGICOUNT: case TIOCGICOUNT:
cnow = mos7720_port->icount; cnow = mos7720_port->icount;
memset(&icount, 0, sizeof(struct serial_icounter_struct));
icount.cts = cnow.cts; icount.cts = cnow.cts;
icount.dsr = cnow.dsr; icount.dsr = cnow.dsr;
icount.rng = cnow.rng; icount.rng = cnow.rng;
......
...@@ -2285,6 +2285,9 @@ static int mos7840_ioctl(struct tty_struct *tty, struct file *file, ...@@ -2285,6 +2285,9 @@ static int mos7840_ioctl(struct tty_struct *tty, struct file *file,
case TIOCGICOUNT: case TIOCGICOUNT:
cnow = mos7840_port->icount; cnow = mos7840_port->icount;
smp_rmb(); smp_rmb();
memset(&icount, 0, sizeof(struct serial_icounter_struct));
icount.cts = cnow.cts; icount.cts = cnow.cts;
icount.dsr = cnow.dsr; icount.dsr = cnow.dsr;
icount.rng = cnow.rng; icount.rng = cnow.rng;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册