diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-09-20 19:44:40 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-09-20 19:44:40 -0400 |
| commit | 0c4ab3453aae7bba4d76a3eb4b289aa53a9f9a60 (patch) | |
| tree | 5324be527053594218107f3890c919ed8fae1f3d | |
| parent | 36ff4a5517779355f4bd62030cdb8498c3954f29 (diff) | |
| parent | f299470a15ab3057afbf598cec59246a90ade449 (diff) | |
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
| -rw-r--r-- | MAINTAINERS | 4 | ||||
| -rw-r--r-- | drivers/usb/host/ehci-pci.c | 5 | ||||
| -rw-r--r-- | drivers/usb/musb/musb_debugfs.c | 5 | ||||
| -rw-r--r-- | drivers/usb/otg/twl4030-usb.c | 78 | ||||
| -rw-r--r-- | drivers/usb/serial/mos7720.c | 3 | ||||
| -rw-r--r-- | drivers/usb/serial/mos7840.c | 3 |
6 files changed, 66 insertions, 32 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index 411b0d04f69..50b8148448f 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -3942,7 +3942,7 @@ F: drivers/char/isicom.c | |||
| 3942 | F: include/linux/isicom.h | 3942 | F: include/linux/isicom.h |
| 3943 | 3943 | ||
| 3944 | MUSB MULTIPOINT HIGH SPEED DUAL-ROLE CONTROLLER | 3944 | MUSB MULTIPOINT HIGH SPEED DUAL-ROLE CONTROLLER |
| 3945 | M: Felipe Balbi <felipe.balbi@nokia.com> | 3945 | M: Felipe Balbi <balbi@ti.com> |
| 3946 | L: linux-usb@vger.kernel.org | 3946 | L: linux-usb@vger.kernel.org |
| 3947 | T: git git://gitorious.org/usb/usb.git | 3947 | T: git git://gitorious.org/usb/usb.git |
| 3948 | S: Maintained | 3948 | S: Maintained |
| @@ -4240,7 +4240,7 @@ S: Maintained | |||
| 4240 | F: drivers/char/hw_random/omap-rng.c | 4240 | F: drivers/char/hw_random/omap-rng.c |
| 4241 | 4241 | ||
| 4242 | OMAP USB SUPPORT | 4242 | OMAP USB SUPPORT |
| 4243 | M: Felipe Balbi <felipe.balbi@nokia.com> | 4243 | M: Felipe Balbi <balbi@ti.com> |
| 4244 | M: David Brownell <dbrownell@users.sourceforge.net> | 4244 | M: David Brownell <dbrownell@users.sourceforge.net> |
| 4245 | L: linux-usb@vger.kernel.org | 4245 | L: linux-usb@vger.kernel.org |
| 4246 | L: linux-omap@vger.kernel.org | 4246 | L: linux-omap@vger.kernel.org |
diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c index 58b72d741d9..a1e8d273103 100644 --- 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 *hcd) | |||
| 119 | ehci->broken_periodic = 1; | 119 | ehci->broken_periodic = 1; |
| 120 | ehci_info(ehci, "using broken periodic workaround\n"); | 120 | ehci_info(ehci, "using broken periodic workaround\n"); |
| 121 | } | 121 | } |
| 122 | if (pdev->device == 0x0806 || pdev->device == 0x0811 | ||
| 123 | || pdev->device == 0x0829) { | ||
| 124 | ehci_info(ehci, "disable lpm for langwell/penwell\n"); | ||
| 125 | ehci->has_lpm = 0; | ||
| 126 | } | ||
| 122 | break; | 127 | break; |
| 123 | case PCI_VENDOR_ID_TDI: | 128 | case PCI_VENDOR_ID_TDI: |
| 124 | if (pdev->device == PCI_DEVICE_ID_TDI_EHCI) { | 129 | if (pdev->device == PCI_DEVICE_ID_TDI_EHCI) { |
diff --git a/drivers/usb/musb/musb_debugfs.c b/drivers/usb/musb/musb_debugfs.c index c79a5e30d43..9e8639d4e86 100644 --- a/drivers/usb/musb/musb_debugfs.c +++ b/drivers/usb/musb/musb_debugfs.c | |||
| @@ -195,15 +195,14 @@ static const struct file_operations musb_regdump_fops = { | |||
| 195 | 195 | ||
| 196 | static int musb_test_mode_open(struct inode *inode, struct file *file) | 196 | static int musb_test_mode_open(struct inode *inode, struct file *file) |
| 197 | { | 197 | { |
| 198 | file->private_data = inode->i_private; | ||
| 199 | |||
| 200 | return single_open(file, musb_test_mode_show, inode->i_private); | 198 | return single_open(file, musb_test_mode_show, inode->i_private); |
| 201 | } | 199 | } |
| 202 | 200 | ||
| 203 | static ssize_t musb_test_mode_write(struct file *file, | 201 | static ssize_t musb_test_mode_write(struct file *file, |
| 204 | const char __user *ubuf, size_t count, loff_t *ppos) | 202 | const char __user *ubuf, size_t count, loff_t *ppos) |
| 205 | { | 203 | { |
| 206 | struct musb *musb = file->private_data; | 204 | struct seq_file *s = file->private_data; |
| 205 | struct musb *musb = s->private; | ||
| 207 | u8 test = 0; | 206 | u8 test = 0; |
| 208 | char buf[18]; | 207 | char buf[18]; |
| 209 | 208 | ||
diff --git a/drivers/usb/otg/twl4030-usb.c b/drivers/usb/otg/twl4030-usb.c index 05aaac1c386..0bc97698af1 100644 --- a/drivers/usb/otg/twl4030-usb.c +++ b/drivers/usb/otg/twl4030-usb.c | |||
| @@ -347,11 +347,20 @@ static void twl4030_i2c_access(struct twl4030_usb *twl, int on) | |||
| 347 | } | 347 | } |
| 348 | } | 348 | } |
| 349 | 349 | ||
| 350 | static void twl4030_phy_power(struct twl4030_usb *twl, int on) | 350 | static void __twl4030_phy_power(struct twl4030_usb *twl, int on) |
| 351 | { | 351 | { |
| 352 | u8 pwr; | 352 | u8 pwr = twl4030_usb_read(twl, PHY_PWR_CTRL); |
| 353 | |||
| 354 | if (on) | ||
| 355 | pwr &= ~PHY_PWR_PHYPWD; | ||
| 356 | else | ||
| 357 | pwr |= PHY_PWR_PHYPWD; | ||
| 353 | 358 | ||
| 354 | pwr = twl4030_usb_read(twl, PHY_PWR_CTRL); | 359 | WARN_ON(twl4030_usb_write_verify(twl, PHY_PWR_CTRL, pwr) < 0); |
| 360 | } | ||
| 361 | |||
| 362 | static void twl4030_phy_power(struct twl4030_usb *twl, int on) | ||
| 363 | { | ||
| 355 | if (on) { | 364 | if (on) { |
| 356 | regulator_enable(twl->usb3v1); | 365 | regulator_enable(twl->usb3v1); |
| 357 | regulator_enable(twl->usb1v8); | 366 | regulator_enable(twl->usb1v8); |
| @@ -365,15 +374,13 @@ static void twl4030_phy_power(struct twl4030_usb *twl, int on) | |||
| 365 | twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0, | 374 | twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0, |
| 366 | VUSB_DEDICATED2); | 375 | VUSB_DEDICATED2); |
| 367 | regulator_enable(twl->usb1v5); | 376 | regulator_enable(twl->usb1v5); |
| 368 | pwr &= ~PHY_PWR_PHYPWD; | 377 | __twl4030_phy_power(twl, 1); |
| 369 | WARN_ON(twl4030_usb_write_verify(twl, PHY_PWR_CTRL, pwr) < 0); | ||
| 370 | twl4030_usb_write(twl, PHY_CLK_CTRL, | 378 | twl4030_usb_write(twl, PHY_CLK_CTRL, |
| 371 | twl4030_usb_read(twl, PHY_CLK_CTRL) | | 379 | twl4030_usb_read(twl, PHY_CLK_CTRL) | |
| 372 | (PHY_CLK_CTRL_CLOCKGATING_EN | | 380 | (PHY_CLK_CTRL_CLOCKGATING_EN | |
| 373 | PHY_CLK_CTRL_CLK32K_EN)); | 381 | PHY_CLK_CTRL_CLK32K_EN)); |
| 374 | } else { | 382 | } else { |
| 375 | pwr |= PHY_PWR_PHYPWD; | 383 | __twl4030_phy_power(twl, 0); |
| 376 | WARN_ON(twl4030_usb_write_verify(twl, PHY_PWR_CTRL, pwr) < 0); | ||
| 377 | regulator_disable(twl->usb1v5); | 384 | regulator_disable(twl->usb1v5); |
| 378 | regulator_disable(twl->usb1v8); | 385 | regulator_disable(twl->usb1v8); |
| 379 | regulator_disable(twl->usb3v1); | 386 | regulator_disable(twl->usb3v1); |
| @@ -387,19 +394,25 @@ static void twl4030_phy_suspend(struct twl4030_usb *twl, int controller_off) | |||
| 387 | 394 | ||
| 388 | twl4030_phy_power(twl, 0); | 395 | twl4030_phy_power(twl, 0); |
| 389 | twl->asleep = 1; | 396 | twl->asleep = 1; |
| 397 | dev_dbg(twl->dev, "%s\n", __func__); | ||
| 390 | } | 398 | } |
| 391 | 399 | ||
| 392 | static void twl4030_phy_resume(struct twl4030_usb *twl) | 400 | static void __twl4030_phy_resume(struct twl4030_usb *twl) |
| 393 | { | 401 | { |
| 394 | if (!twl->asleep) | ||
| 395 | return; | ||
| 396 | |||
| 397 | twl4030_phy_power(twl, 1); | 402 | twl4030_phy_power(twl, 1); |
| 398 | twl4030_i2c_access(twl, 1); | 403 | twl4030_i2c_access(twl, 1); |
| 399 | twl4030_usb_set_mode(twl, twl->usb_mode); | 404 | twl4030_usb_set_mode(twl, twl->usb_mode); |
| 400 | if (twl->usb_mode == T2_USB_MODE_ULPI) | 405 | if (twl->usb_mode == T2_USB_MODE_ULPI) |
| 401 | twl4030_i2c_access(twl, 0); | 406 | twl4030_i2c_access(twl, 0); |
| 407 | } | ||
| 408 | |||
| 409 | static void twl4030_phy_resume(struct twl4030_usb *twl) | ||
| 410 | { | ||
| 411 | if (!twl->asleep) | ||
| 412 | return; | ||
| 413 | __twl4030_phy_resume(twl); | ||
| 402 | twl->asleep = 0; | 414 | twl->asleep = 0; |
| 415 | dev_dbg(twl->dev, "%s\n", __func__); | ||
| 403 | } | 416 | } |
| 404 | 417 | ||
| 405 | static int twl4030_usb_ldo_init(struct twl4030_usb *twl) | 418 | 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 | twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, 0xC0, PROTECT_KEY); | 421 | twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, 0xC0, PROTECT_KEY); |
| 409 | twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, 0x0C, PROTECT_KEY); | 422 | twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, 0x0C, PROTECT_KEY); |
| 410 | 423 | ||
| 411 | /* put VUSB3V1 LDO in active state */ | 424 | /* Keep VUSB3V1 LDO in sleep state until VBUS/ID change detected*/ |
| 412 | twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0, VUSB_DEDICATED2); | 425 | /*twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0, VUSB_DEDICATED2);*/ |
| 413 | 426 | ||
| 414 | /* input to VUSB3V1 LDO is from VBAT, not VBUS */ | 427 | /* input to VUSB3V1 LDO is from VBAT, not VBUS */ |
| 415 | twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x14, VUSB_DEDICATED1); | 428 | 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 | return IRQ_HANDLED; | 515 | return IRQ_HANDLED; |
| 503 | } | 516 | } |
| 504 | 517 | ||
| 518 | static void twl4030_usb_phy_init(struct twl4030_usb *twl) | ||
| 519 | { | ||
| 520 | int status; | ||
| 521 | |||
| 522 | status = twl4030_usb_linkstat(twl); | ||
| 523 | if (status >= 0) { | ||
| 524 | if (status == USB_EVENT_NONE) { | ||
| 525 | __twl4030_phy_power(twl, 0); | ||
| 526 | twl->asleep = 1; | ||
| 527 | } else { | ||
| 528 | __twl4030_phy_resume(twl); | ||
| 529 | twl->asleep = 0; | ||
| 530 | } | ||
| 531 | |||
| 532 | blocking_notifier_call_chain(&twl->otg.notifier, status, | ||
| 533 | twl->otg.gadget); | ||
| 534 | } | ||
| 535 | sysfs_notify(&twl->dev->kobj, NULL, "vbus"); | ||
| 536 | } | ||
| 537 | |||
| 505 | static int twl4030_set_suspend(struct otg_transceiver *x, int suspend) | 538 | static int twl4030_set_suspend(struct otg_transceiver *x, int suspend) |
| 506 | { | 539 | { |
| 507 | struct twl4030_usb *twl = xceiv_to_twl(x); | 540 | struct twl4030_usb *twl = xceiv_to_twl(x); |
| @@ -550,7 +583,6 @@ static int __devinit twl4030_usb_probe(struct platform_device *pdev) | |||
| 550 | struct twl4030_usb_data *pdata = pdev->dev.platform_data; | 583 | struct twl4030_usb_data *pdata = pdev->dev.platform_data; |
| 551 | struct twl4030_usb *twl; | 584 | struct twl4030_usb *twl; |
| 552 | int status, err; | 585 | int status, err; |
| 553 | u8 pwr; | ||
| 554 | 586 | ||
| 555 | if (!pdata) { | 587 | if (!pdata) { |
| 556 | dev_dbg(&pdev->dev, "platform_data not available\n"); | 588 | dev_dbg(&pdev->dev, "platform_data not available\n"); |
| @@ -569,10 +601,7 @@ static int __devinit twl4030_usb_probe(struct platform_device *pdev) | |||
| 569 | twl->otg.set_peripheral = twl4030_set_peripheral; | 601 | twl->otg.set_peripheral = twl4030_set_peripheral; |
| 570 | twl->otg.set_suspend = twl4030_set_suspend; | 602 | twl->otg.set_suspend = twl4030_set_suspend; |
| 571 | twl->usb_mode = pdata->usb_mode; | 603 | twl->usb_mode = pdata->usb_mode; |
| 572 | 604 | twl->asleep = 1; | |
| 573 | pwr = twl4030_usb_read(twl, PHY_PWR_CTRL); | ||
| 574 | |||
| 575 | twl->asleep = (pwr & PHY_PWR_PHYPWD); | ||
| 576 | 605 | ||
| 577 | /* init spinlock for workqueue */ | 606 | /* init spinlock for workqueue */ |
| 578 | spin_lock_init(&twl->lock); | 607 | spin_lock_init(&twl->lock); |
| @@ -610,15 +639,10 @@ static int __devinit twl4030_usb_probe(struct platform_device *pdev) | |||
| 610 | return status; | 639 | return status; |
| 611 | } | 640 | } |
| 612 | 641 | ||
| 613 | /* The IRQ handler just handles changes from the previous states | 642 | /* Power down phy or make it work according to |
| 614 | * of the ID and VBUS pins ... in probe() we must initialize that | 643 | * current link state. |
| 615 | * previous state. The easy way: fake an IRQ. | ||
| 616 | * | ||
| 617 | * REVISIT: a real IRQ might have happened already, if PREEMPT is | ||
| 618 | * enabled. Else the IRQ may not yet be configured or enabled, | ||
| 619 | * because of scheduling delays. | ||
| 620 | */ | 644 | */ |
| 621 | twl4030_usb_irq(twl->irq, twl); | 645 | twl4030_usb_phy_init(twl); |
| 622 | 646 | ||
| 623 | dev_info(&pdev->dev, "Initialized TWL4030 USB module\n"); | 647 | dev_info(&pdev->dev, "Initialized TWL4030 USB module\n"); |
| 624 | return 0; | 648 | return 0; |
diff --git a/drivers/usb/serial/mos7720.c b/drivers/usb/serial/mos7720.c index 30922a7e334..aa665817a27 100644 --- a/drivers/usb/serial/mos7720.c +++ b/drivers/usb/serial/mos7720.c | |||
| @@ -2024,6 +2024,9 @@ static int mos7720_ioctl(struct tty_struct *tty, struct file *file, | |||
| 2024 | 2024 | ||
| 2025 | case TIOCGICOUNT: | 2025 | case TIOCGICOUNT: |
| 2026 | cnow = mos7720_port->icount; | 2026 | cnow = mos7720_port->icount; |
| 2027 | |||
| 2028 | memset(&icount, 0, sizeof(struct serial_icounter_struct)); | ||
| 2029 | |||
| 2027 | icount.cts = cnow.cts; | 2030 | icount.cts = cnow.cts; |
| 2028 | icount.dsr = cnow.dsr; | 2031 | icount.dsr = cnow.dsr; |
| 2029 | icount.rng = cnow.rng; | 2032 | icount.rng = cnow.rng; |
diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c index 1c9b6e9b238..1a42bc21379 100644 --- a/drivers/usb/serial/mos7840.c +++ b/drivers/usb/serial/mos7840.c | |||
| @@ -2285,6 +2285,9 @@ static int mos7840_ioctl(struct tty_struct *tty, struct file *file, | |||
| 2285 | case TIOCGICOUNT: | 2285 | case TIOCGICOUNT: |
| 2286 | cnow = mos7840_port->icount; | 2286 | cnow = mos7840_port->icount; |
| 2287 | smp_rmb(); | 2287 | smp_rmb(); |
| 2288 | |||
| 2289 | memset(&icount, 0, sizeof(struct serial_icounter_struct)); | ||
| 2290 | |||
| 2288 | icount.cts = cnow.cts; | 2291 | icount.cts = cnow.cts; |
| 2289 | icount.dsr = cnow.dsr; | 2292 | icount.dsr = cnow.dsr; |
| 2290 | icount.rng = cnow.rng; | 2293 | icount.rng = cnow.rng; |
