aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/host
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-05-07 12:03:39 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-05-07 12:03:39 -0400
commit61906313bd41cde2f9aaa14e461e6108d3e71aaa (patch)
treec84805a9c67e3baf9e5acf13a3f55f7058a9131f /drivers/usb/host
parent3aa2ae74ba630ec9b98736d64aea8e4cb490861d (diff)
parentd48b97b403d23f6df0b990cee652bdf9a52337a3 (diff)
Merge 3.4-rc6 into usb-next
This resolves the conflict with: drivers/usb/host/ehci-tegra.c Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/usb/host')
-rw-r--r--drivers/usb/host/ehci-pci.c8
-rw-r--r--drivers/usb/host/ehci-tegra.c376
2 files changed, 203 insertions, 181 deletions
diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c
index 123481793a47..bc94d7bf072d 100644
--- a/drivers/usb/host/ehci-pci.c
+++ b/drivers/usb/host/ehci-pci.c
@@ -144,6 +144,14 @@ static int ehci_pci_setup(struct usb_hcd *hcd)
144 hcd->has_tt = 1; 144 hcd->has_tt = 1;
145 tdi_reset(ehci); 145 tdi_reset(ehci);
146 } 146 }
147 if (pdev->subsystem_vendor == PCI_VENDOR_ID_ASUSTEK) {
148 /* EHCI #1 or #2 on 6 Series/C200 Series chipset */
149 if (pdev->device == 0x1c26 || pdev->device == 0x1c2d) {
150 ehci_info(ehci, "broken D3 during system sleep on ASUS\n");
151 hcd->broken_pci_sleep = 1;
152 device_set_wakeup_capable(&pdev->dev, false);
153 }
154 }
147 break; 155 break;
148 case PCI_VENDOR_ID_TDI: 156 case PCI_VENDOR_ID_TDI:
149 if (pdev->device == PCI_DEVICE_ID_TDI_EHCI) { 157 if (pdev->device == PCI_DEVICE_ID_TDI_EHCI) {
diff --git a/drivers/usb/host/ehci-tegra.c b/drivers/usb/host/ehci-tegra.c
index 4c1eb61bc2fc..e57aba52b31c 100644
--- a/drivers/usb/host/ehci-tegra.c
+++ b/drivers/usb/host/ehci-tegra.c
@@ -24,6 +24,7 @@
24#include <linux/gpio.h> 24#include <linux/gpio.h>
25#include <linux/of.h> 25#include <linux/of.h>
26#include <linux/of_gpio.h> 26#include <linux/of_gpio.h>
27#include <linux/pm_runtime.h>
27 28
28#include <mach/usb_phy.h> 29#include <mach/usb_phy.h>
29#include <mach/iomap.h> 30#include <mach/iomap.h>
@@ -37,9 +38,7 @@ struct tegra_ehci_hcd {
37 struct clk *emc_clk; 38 struct clk *emc_clk;
38 struct usb_phy *transceiver; 39 struct usb_phy *transceiver;
39 int host_resumed; 40 int host_resumed;
40 int bus_suspended;
41 int port_resuming; 41 int port_resuming;
42 int power_down_on_bus_suspend;
43 enum tegra_usb_phy_port_speed port_speed; 42 enum tegra_usb_phy_port_speed port_speed;
44}; 43};
45 44
@@ -262,120 +261,6 @@ static void tegra_ehci_restart(struct usb_hcd *hcd)
262 up_write(&ehci_cf_port_reset_rwsem); 261 up_write(&ehci_cf_port_reset_rwsem);
263} 262}
264 263
265static int tegra_usb_suspend(struct usb_hcd *hcd)
266{
267 struct tegra_ehci_hcd *tegra = dev_get_drvdata(hcd->self.controller);
268 struct ehci_regs __iomem *hw = tegra->ehci->regs;
269 unsigned long flags;
270
271 spin_lock_irqsave(&tegra->ehci->lock, flags);
272
273 tegra->port_speed = (readl(&hw->port_status[0]) >> 26) & 0x3;
274 ehci_halt(tegra->ehci);
275 clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
276
277 spin_unlock_irqrestore(&tegra->ehci->lock, flags);
278
279 tegra_ehci_power_down(hcd);
280 return 0;
281}
282
283static int tegra_usb_resume(struct usb_hcd *hcd)
284{
285 struct tegra_ehci_hcd *tegra = dev_get_drvdata(hcd->self.controller);
286 struct ehci_hcd *ehci = hcd_to_ehci(hcd);
287 struct ehci_regs __iomem *hw = ehci->regs;
288 unsigned long val;
289
290 set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
291 tegra_ehci_power_up(hcd);
292
293 if (tegra->port_speed > TEGRA_USB_PHY_PORT_SPEED_HIGH) {
294 /* Wait for the phy to detect new devices
295 * before we restart the controller */
296 msleep(10);
297 goto restart;
298 }
299
300 /* Force the phy to keep data lines in suspend state */
301 tegra_ehci_phy_restore_start(tegra->phy, tegra->port_speed);
302
303 /* Enable host mode */
304 tdi_reset(ehci);
305
306 /* Enable Port Power */
307 val = readl(&hw->port_status[0]);
308 val |= PORT_POWER;
309 writel(val, &hw->port_status[0]);
310 udelay(10);
311
312 /* Check if the phy resume from LP0. When the phy resume from LP0
313 * USB register will be reset. */
314 if (!readl(&hw->async_next)) {
315 /* Program the field PTC based on the saved speed mode */
316 val = readl(&hw->port_status[0]);
317 val &= ~PORT_TEST(~0);
318 if (tegra->port_speed == TEGRA_USB_PHY_PORT_SPEED_HIGH)
319 val |= PORT_TEST_FORCE;
320 else if (tegra->port_speed == TEGRA_USB_PHY_PORT_SPEED_FULL)
321 val |= PORT_TEST(6);
322 else if (tegra->port_speed == TEGRA_USB_PHY_PORT_SPEED_LOW)
323 val |= PORT_TEST(7);
324 writel(val, &hw->port_status[0]);
325 udelay(10);
326
327 /* Disable test mode by setting PTC field to NORMAL_OP */
328 val = readl(&hw->port_status[0]);
329 val &= ~PORT_TEST(~0);
330 writel(val, &hw->port_status[0]);
331 udelay(10);
332 }
333
334 /* Poll until CCS is enabled */
335 if (handshake(ehci, &hw->port_status[0], PORT_CONNECT,
336 PORT_CONNECT, 2000)) {
337 pr_err("%s: timeout waiting for PORT_CONNECT\n", __func__);
338 goto restart;
339 }
340
341 /* Poll until PE is enabled */
342 if (handshake(ehci, &hw->port_status[0], PORT_PE,
343 PORT_PE, 2000)) {
344 pr_err("%s: timeout waiting for USB_PORTSC1_PE\n", __func__);
345 goto restart;
346 }
347
348 /* Clear the PCI status, to avoid an interrupt taken upon resume */
349 val = readl(&hw->status);
350 val |= STS_PCD;
351 writel(val, &hw->status);
352
353 /* Put controller in suspend mode by writing 1 to SUSP bit of PORTSC */
354 val = readl(&hw->port_status[0]);
355 if ((val & PORT_POWER) && (val & PORT_PE)) {
356 val |= PORT_SUSPEND;
357 writel(val, &hw->port_status[0]);
358
359 /* Wait until port suspend completes */
360 if (handshake(ehci, &hw->port_status[0], PORT_SUSPEND,
361 PORT_SUSPEND, 1000)) {
362 pr_err("%s: timeout waiting for PORT_SUSPEND\n",
363 __func__);
364 goto restart;
365 }
366 }
367
368 tegra_ehci_phy_restore_end(tegra->phy);
369 return 0;
370
371restart:
372 if (tegra->port_speed <= TEGRA_USB_PHY_PORT_SPEED_HIGH)
373 tegra_ehci_phy_restore_end(tegra->phy);
374
375 tegra_ehci_restart(hcd);
376 return 0;
377}
378
379static void tegra_ehci_shutdown(struct usb_hcd *hcd) 264static void tegra_ehci_shutdown(struct usb_hcd *hcd)
380{ 265{
381 struct tegra_ehci_hcd *tegra = dev_get_drvdata(hcd->self.controller); 266 struct tegra_ehci_hcd *tegra = dev_get_drvdata(hcd->self.controller);
@@ -423,36 +308,6 @@ static int tegra_ehci_setup(struct usb_hcd *hcd)
423 return retval; 308 return retval;
424} 309}
425 310
426#ifdef CONFIG_PM
427static int tegra_ehci_bus_suspend(struct usb_hcd *hcd)
428{
429 struct tegra_ehci_hcd *tegra = dev_get_drvdata(hcd->self.controller);
430 int error_status = 0;
431
432 error_status = ehci_bus_suspend(hcd);
433 if (!error_status && tegra->power_down_on_bus_suspend) {
434 tegra_usb_suspend(hcd);
435 tegra->bus_suspended = 1;
436 }
437
438 return error_status;
439}
440
441static int tegra_ehci_bus_resume(struct usb_hcd *hcd)
442{
443 struct tegra_ehci_hcd *tegra = dev_get_drvdata(hcd->self.controller);
444
445 if (tegra->bus_suspended && tegra->power_down_on_bus_suspend) {
446 tegra_usb_resume(hcd);
447 tegra->bus_suspended = 0;
448 }
449
450 tegra_usb_phy_preresume(tegra->phy);
451 tegra->port_resuming = 1;
452 return ehci_bus_resume(hcd);
453}
454#endif
455
456struct dma_aligned_buffer { 311struct dma_aligned_buffer {
457 void *kmalloc_ptr; 312 void *kmalloc_ptr;
458 void *old_xfer_buffer; 313 void *old_xfer_buffer;
@@ -559,8 +414,8 @@ static const struct hc_driver tegra_ehci_hc_driver = {
559 .unmap_urb_for_dma = tegra_ehci_unmap_urb_for_dma, 414 .unmap_urb_for_dma = tegra_ehci_unmap_urb_for_dma,
560 .hub_control = tegra_ehci_hub_control, 415 .hub_control = tegra_ehci_hub_control,
561#ifdef CONFIG_PM 416#ifdef CONFIG_PM
562 .bus_suspend = tegra_ehci_bus_suspend, 417 .bus_suspend = ehci_bus_suspend,
563 .bus_resume = tegra_ehci_bus_resume, 418 .bus_resume = ehci_bus_resume,
564#endif 419#endif
565}; 420};
566 421
@@ -586,11 +441,187 @@ static int setup_vbus_gpio(struct platform_device *pdev)
586 dev_err(&pdev->dev, "can't enable vbus\n"); 441 dev_err(&pdev->dev, "can't enable vbus\n");
587 return err; 442 return err;
588 } 443 }
589 gpio_set_value(gpio, 1);
590 444
591 return err; 445 return err;
592} 446}
593 447
448#ifdef CONFIG_PM
449
450static int controller_suspend(struct device *dev)
451{
452 struct tegra_ehci_hcd *tegra =
453 platform_get_drvdata(to_platform_device(dev));
454 struct ehci_hcd *ehci = tegra->ehci;
455 struct usb_hcd *hcd = ehci_to_hcd(ehci);
456 struct ehci_regs __iomem *hw = ehci->regs;
457 unsigned long flags;
458
459 if (time_before(jiffies, ehci->next_statechange))
460 msleep(10);
461
462 spin_lock_irqsave(&ehci->lock, flags);
463
464 tegra->port_speed = (readl(&hw->port_status[0]) >> 26) & 0x3;
465 ehci_halt(ehci);
466 clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
467
468 spin_unlock_irqrestore(&ehci->lock, flags);
469
470 tegra_ehci_power_down(hcd);
471 return 0;
472}
473
474static int controller_resume(struct device *dev)
475{
476 struct tegra_ehci_hcd *tegra =
477 platform_get_drvdata(to_platform_device(dev));
478 struct ehci_hcd *ehci = tegra->ehci;
479 struct usb_hcd *hcd = ehci_to_hcd(ehci);
480 struct ehci_regs __iomem *hw = ehci->regs;
481 unsigned long val;
482
483 set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
484 tegra_ehci_power_up(hcd);
485
486 if (tegra->port_speed > TEGRA_USB_PHY_PORT_SPEED_HIGH) {
487 /* Wait for the phy to detect new devices
488 * before we restart the controller */
489 msleep(10);
490 goto restart;
491 }
492
493 /* Force the phy to keep data lines in suspend state */
494 tegra_ehci_phy_restore_start(tegra->phy, tegra->port_speed);
495
496 /* Enable host mode */
497 tdi_reset(ehci);
498
499 /* Enable Port Power */
500 val = readl(&hw->port_status[0]);
501 val |= PORT_POWER;
502 writel(val, &hw->port_status[0]);
503 udelay(10);
504
505 /* Check if the phy resume from LP0. When the phy resume from LP0
506 * USB register will be reset. */
507 if (!readl(&hw->async_next)) {
508 /* Program the field PTC based on the saved speed mode */
509 val = readl(&hw->port_status[0]);
510 val &= ~PORT_TEST(~0);
511 if (tegra->port_speed == TEGRA_USB_PHY_PORT_SPEED_HIGH)
512 val |= PORT_TEST_FORCE;
513 else if (tegra->port_speed == TEGRA_USB_PHY_PORT_SPEED_FULL)
514 val |= PORT_TEST(6);
515 else if (tegra->port_speed == TEGRA_USB_PHY_PORT_SPEED_LOW)
516 val |= PORT_TEST(7);
517 writel(val, &hw->port_status[0]);
518 udelay(10);
519
520 /* Disable test mode by setting PTC field to NORMAL_OP */
521 val = readl(&hw->port_status[0]);
522 val &= ~PORT_TEST(~0);
523 writel(val, &hw->port_status[0]);
524 udelay(10);
525 }
526
527 /* Poll until CCS is enabled */
528 if (handshake(ehci, &hw->port_status[0], PORT_CONNECT,
529 PORT_CONNECT, 2000)) {
530 pr_err("%s: timeout waiting for PORT_CONNECT\n", __func__);
531 goto restart;
532 }
533
534 /* Poll until PE is enabled */
535 if (handshake(ehci, &hw->port_status[0], PORT_PE,
536 PORT_PE, 2000)) {
537 pr_err("%s: timeout waiting for USB_PORTSC1_PE\n", __func__);
538 goto restart;
539 }
540
541 /* Clear the PCI status, to avoid an interrupt taken upon resume */
542 val = readl(&hw->status);
543 val |= STS_PCD;
544 writel(val, &hw->status);
545
546 /* Put controller in suspend mode by writing 1 to SUSP bit of PORTSC */
547 val = readl(&hw->port_status[0]);
548 if ((val & PORT_POWER) && (val & PORT_PE)) {
549 val |= PORT_SUSPEND;
550 writel(val, &hw->port_status[0]);
551
552 /* Wait until port suspend completes */
553 if (handshake(ehci, &hw->port_status[0], PORT_SUSPEND,
554 PORT_SUSPEND, 1000)) {
555 pr_err("%s: timeout waiting for PORT_SUSPEND\n",
556 __func__);
557 goto restart;
558 }
559 }
560
561 tegra_ehci_phy_restore_end(tegra->phy);
562 goto done;
563
564 restart:
565 if (tegra->port_speed <= TEGRA_USB_PHY_PORT_SPEED_HIGH)
566 tegra_ehci_phy_restore_end(tegra->phy);
567
568 tegra_ehci_restart(hcd);
569
570 done:
571 tegra_usb_phy_preresume(tegra->phy);
572 tegra->port_resuming = 1;
573 return 0;
574}
575
576static int tegra_ehci_suspend(struct device *dev)
577{
578 struct tegra_ehci_hcd *tegra =
579 platform_get_drvdata(to_platform_device(dev));
580 struct usb_hcd *hcd = ehci_to_hcd(tegra->ehci);
581 int rc = 0;
582
583 /*
584 * When system sleep is supported and USB controller wakeup is
585 * implemented: If the controller is runtime-suspended and the
586 * wakeup setting needs to be changed, call pm_runtime_resume().
587 */
588 if (HCD_HW_ACCESSIBLE(hcd))
589 rc = controller_suspend(dev);
590 return rc;
591}
592
593static int tegra_ehci_resume(struct device *dev)
594{
595 int rc;
596
597 rc = controller_resume(dev);
598 if (rc == 0) {
599 pm_runtime_disable(dev);
600 pm_runtime_set_active(dev);
601 pm_runtime_enable(dev);
602 }
603 return rc;
604}
605
606static int tegra_ehci_runtime_suspend(struct device *dev)
607{
608 return controller_suspend(dev);
609}
610
611static int tegra_ehci_runtime_resume(struct device *dev)
612{
613 return controller_resume(dev);
614}
615
616static const struct dev_pm_ops tegra_ehci_pm_ops = {
617 .suspend = tegra_ehci_suspend,
618 .resume = tegra_ehci_resume,
619 .runtime_suspend = tegra_ehci_runtime_suspend,
620 .runtime_resume = tegra_ehci_runtime_resume,
621};
622
623#endif
624
594static u64 tegra_ehci_dma_mask = DMA_BIT_MASK(32); 625static u64 tegra_ehci_dma_mask = DMA_BIT_MASK(32);
595 626
596static int tegra_ehci_probe(struct platform_device *pdev) 627static int tegra_ehci_probe(struct platform_device *pdev)
@@ -705,7 +736,6 @@ static int tegra_ehci_probe(struct platform_device *pdev)
705 } 736 }
706 737
707 tegra->host_resumed = 1; 738 tegra->host_resumed = 1;
708 tegra->power_down_on_bus_suspend = pdata->power_down_on_bus_suspend;
709 tegra->ehci = hcd_to_ehci(hcd); 739 tegra->ehci = hcd_to_ehci(hcd);
710 740
711 irq = platform_get_irq(pdev, 0); 741 irq = platform_get_irq(pdev, 0);
@@ -729,6 +759,14 @@ static int tegra_ehci_probe(struct platform_device *pdev)
729 goto fail; 759 goto fail;
730 } 760 }
731 761
762 pm_runtime_set_active(&pdev->dev);
763 pm_runtime_get_noresume(&pdev->dev);
764
765 /* Don't skip the pm_runtime_forbid call if wakeup isn't working */
766 /* if (!pdata->power_down_on_bus_suspend) */
767 pm_runtime_forbid(&pdev->dev);
768 pm_runtime_enable(&pdev->dev);
769 pm_runtime_put_sync(&pdev->dev);
732 return err; 770 return err;
733 771
734fail: 772fail:
@@ -755,33 +793,6 @@ fail_hcd:
755 return err; 793 return err;
756} 794}
757 795
758#ifdef CONFIG_PM
759static int tegra_ehci_resume(struct platform_device *pdev)
760{
761 struct tegra_ehci_hcd *tegra = platform_get_drvdata(pdev);
762 struct usb_hcd *hcd = ehci_to_hcd(tegra->ehci);
763
764 if (tegra->bus_suspended)
765 return 0;
766
767 return tegra_usb_resume(hcd);
768}
769
770static int tegra_ehci_suspend(struct platform_device *pdev, pm_message_t state)
771{
772 struct tegra_ehci_hcd *tegra = platform_get_drvdata(pdev);
773 struct usb_hcd *hcd = ehci_to_hcd(tegra->ehci);
774
775 if (tegra->bus_suspended)
776 return 0;
777
778 if (time_before(jiffies, tegra->ehci->next_statechange))
779 msleep(10);
780
781 return tegra_usb_suspend(hcd);
782}
783#endif
784
785static int tegra_ehci_remove(struct platform_device *pdev) 796static int tegra_ehci_remove(struct platform_device *pdev)
786{ 797{
787 struct tegra_ehci_hcd *tegra = platform_get_drvdata(pdev); 798 struct tegra_ehci_hcd *tegra = platform_get_drvdata(pdev);
@@ -790,6 +801,10 @@ static int tegra_ehci_remove(struct platform_device *pdev)
790 if (tegra == NULL || hcd == NULL) 801 if (tegra == NULL || hcd == NULL)
791 return -EINVAL; 802 return -EINVAL;
792 803
804 pm_runtime_get_sync(&pdev->dev);
805 pm_runtime_disable(&pdev->dev);
806 pm_runtime_put_noidle(&pdev->dev);
807
793#ifdef CONFIG_USB_OTG_UTILS 808#ifdef CONFIG_USB_OTG_UTILS
794 if (tegra->transceiver) { 809 if (tegra->transceiver) {
795 otg_set_host(tegra->transceiver->otg, NULL); 810 otg_set_host(tegra->transceiver->otg, NULL);
@@ -830,13 +845,12 @@ static struct of_device_id tegra_ehci_of_match[] __devinitdata = {
830static struct platform_driver tegra_ehci_driver = { 845static struct platform_driver tegra_ehci_driver = {
831 .probe = tegra_ehci_probe, 846 .probe = tegra_ehci_probe,
832 .remove = tegra_ehci_remove, 847 .remove = tegra_ehci_remove,
833#ifdef CONFIG_PM
834 .suspend = tegra_ehci_suspend,
835 .resume = tegra_ehci_resume,
836#endif
837 .shutdown = tegra_ehci_hcd_shutdown, 848 .shutdown = tegra_ehci_hcd_shutdown,
838 .driver = { 849 .driver = {
839 .name = "tegra-ehci", 850 .name = "tegra-ehci",
840 .of_match_table = tegra_ehci_of_match, 851 .of_match_table = tegra_ehci_of_match,
852#ifdef CONFIG_PM
853 .pm = &tegra_ehci_pm_ops,
854#endif
841 } 855 }
842}; 856};