1 /* 2 * (C) Copyright David Brownell 2000-2002 3 * 4 * This program is free software; you can redistribute it and/or modify it 5 * under the terms of the GNU General Public License as published by the 6 * Free Software Foundation; either version 2 of the License, or (at your 7 * option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, but 10 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 11 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write to the Free Software Foundation, 16 * Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 17 */ 18 19 #include <linux/kernel.h> 20 #include <linux/module.h> 21 #include <linux/pci.h> 22 #include <linux/usb.h> 23 #include <linux/usb/hcd.h> 24 25 #include <asm/io.h> 26 #include <asm/irq.h> 27 28 #ifdef CONFIG_PPC_PMAC 29 #include <asm/machdep.h> 30 #include <asm/pmac_feature.h> 31 #include <asm/pci-bridge.h> 32 #include <asm/prom.h> 33 #endif 34 35 #include "usb.h" 36 37 38 /* PCI-based HCs are common, but plenty of non-PCI HCs are used too */ 39 40 #ifdef CONFIG_PM_SLEEP 41 42 /* Coordinate handoffs between EHCI and companion controllers 43 * during system resume 44 */ 45 46 static DEFINE_MUTEX(companions_mutex); 47 48 #define CL_UHCI PCI_CLASS_SERIAL_USB_UHCI 49 #define CL_OHCI PCI_CLASS_SERIAL_USB_OHCI 50 #define CL_EHCI PCI_CLASS_SERIAL_USB_EHCI 51 52 enum companion_action { 53 SET_HS_COMPANION, CLEAR_HS_COMPANION, WAIT_FOR_COMPANIONS 54 }; 55 56 static void companion_common(struct pci_dev *pdev, struct usb_hcd *hcd, 57 enum companion_action action) 58 { 59 struct pci_dev *companion; 60 struct usb_hcd *companion_hcd; 61 unsigned int slot = PCI_SLOT(pdev->devfn); 62 63 /* Iterate through other PCI functions in the same slot. 64 * If pdev is OHCI or UHCI then we are looking for EHCI, and 65 * vice versa. 66 */ 67 companion = NULL; 68 for_each_pci_dev(companion) { 69 if (companion->bus != pdev->bus || 70 PCI_SLOT(companion->devfn) != slot) 71 continue; 72 73 companion_hcd = pci_get_drvdata(companion); 74 if (!companion_hcd) 75 continue; 76 77 /* For SET_HS_COMPANION, store a pointer to the EHCI bus in 78 * the OHCI/UHCI companion bus structure. 79 * For CLEAR_HS_COMPANION, clear the pointer to the EHCI bus 80 * in the OHCI/UHCI companion bus structure. 81 * For WAIT_FOR_COMPANIONS, wait until the OHCI/UHCI 82 * companion controllers have fully resumed. 83 */ 84 85 if ((pdev->class == CL_OHCI || pdev->class == CL_UHCI) && 86 companion->class == CL_EHCI) { 87 /* action must be SET_HS_COMPANION */ 88 dev_dbg(&companion->dev, "HS companion for %s\n", 89 dev_name(&pdev->dev)); 90 hcd->self.hs_companion = &companion_hcd->self; 91 92 } else if (pdev->class == CL_EHCI && 93 (companion->class == CL_OHCI || 94 companion->class == CL_UHCI)) { 95 switch (action) { 96 case SET_HS_COMPANION: 97 dev_dbg(&pdev->dev, "HS companion for %s\n", 98 dev_name(&companion->dev)); 99 companion_hcd->self.hs_companion = &hcd->self; 100 break; 101 case CLEAR_HS_COMPANION: 102 companion_hcd->self.hs_companion = NULL; 103 break; 104 case WAIT_FOR_COMPANIONS: 105 device_pm_wait_for_dev(&pdev->dev, 106 &companion->dev); 107 break; 108 } 109 } 110 } 111 } 112 113 static void set_hs_companion(struct pci_dev *pdev, struct usb_hcd *hcd) 114 { 115 mutex_lock(&companions_mutex); 116 dev_set_drvdata(&pdev->dev, hcd); 117 companion_common(pdev, hcd, SET_HS_COMPANION); 118 mutex_unlock(&companions_mutex); 119 } 120 121 static void clear_hs_companion(struct pci_dev *pdev, struct usb_hcd *hcd) 122 { 123 mutex_lock(&companions_mutex); 124 dev_set_drvdata(&pdev->dev, NULL); 125 126 /* If pdev is OHCI or UHCI, just clear its hs_companion pointer */ 127 if (pdev->class == CL_OHCI || pdev->class == CL_UHCI) 128 hcd->self.hs_companion = NULL; 129 130 /* Otherwise search for companion buses and clear their pointers */ 131 else 132 companion_common(pdev, hcd, CLEAR_HS_COMPANION); 133 mutex_unlock(&companions_mutex); 134 } 135 136 static void wait_for_companions(struct pci_dev *pdev, struct usb_hcd *hcd) 137 { 138 /* Only EHCI controllers need to wait. 139 * No locking is needed because a controller cannot be resumed 140 * while one of its companions is getting unbound. 141 */ 142 if (pdev->class == CL_EHCI) 143 companion_common(pdev, hcd, WAIT_FOR_COMPANIONS); 144 } 145 146 #else /* !CONFIG_PM_SLEEP */ 147 148 static inline void set_hs_companion(struct pci_dev *d, struct usb_hcd *h) {} 149 static inline void clear_hs_companion(struct pci_dev *d, struct usb_hcd *h) {} 150 static inline void wait_for_companions(struct pci_dev *d, struct usb_hcd *h) {} 151 152 #endif /* !CONFIG_PM_SLEEP */ 153 154 /*-------------------------------------------------------------------------*/ 155 156 /* configure so an HC device and id are always provided */ 157 /* always called with process context; sleeping is OK */ 158 159 /** 160 * usb_hcd_pci_probe - initialize PCI-based HCDs 161 * @dev: USB Host Controller being probed 162 * @id: pci hotplug id connecting controller to HCD framework 163 * Context: !in_interrupt() 164 * 165 * Allocates basic PCI resources for this USB host controller, and 166 * then invokes the start() method for the HCD associated with it 167 * through the hotplug entry's driver_data. 168 * 169 * Store this function in the HCD's struct pci_driver as probe(). 170 */ 171 int usb_hcd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) 172 { 173 struct hc_driver *driver; 174 struct usb_hcd *hcd; 175 int retval; 176 int hcd_irq = 0; 177 178 if (usb_disabled()) 179 return -ENODEV; 180 181 if (!id) 182 return -EINVAL; 183 driver = (struct hc_driver *)id->driver_data; 184 if (!driver) 185 return -EINVAL; 186 187 if (pci_enable_device(dev) < 0) 188 return -ENODEV; 189 dev->current_state = PCI_D0; 190 191 /* 192 * The xHCI driver has its own irq management 193 * make sure irq setup is not touched for xhci in generic hcd code 194 */ 195 if ((driver->flags & HCD_MASK) != HCD_USB3) { 196 if (!dev->irq) { 197 dev_err(&dev->dev, 198 "Found HC with no IRQ. Check BIOS/PCI %s setup!\n", 199 pci_name(dev)); 200 retval = -ENODEV; 201 goto disable_pci; 202 } 203 hcd_irq = dev->irq; 204 } 205 206 hcd = usb_create_hcd(driver, &dev->dev, pci_name(dev)); 207 if (!hcd) { 208 retval = -ENOMEM; 209 goto disable_pci; 210 } 211 212 if (driver->flags & HCD_MEMORY) { 213 /* EHCI, OHCI */ 214 hcd->rsrc_start = pci_resource_start(dev, 0); 215 hcd->rsrc_len = pci_resource_len(dev, 0); 216 if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, 217 driver->description)) { 218 dev_dbg(&dev->dev, "controller already in use\n"); 219 retval = -EBUSY; 220 goto clear_companion; 221 } 222 hcd->regs = ioremap_nocache(hcd->rsrc_start, hcd->rsrc_len); 223 if (hcd->regs == NULL) { 224 dev_dbg(&dev->dev, "error mapping memory\n"); 225 retval = -EFAULT; 226 goto release_mem_region; 227 } 228 229 } else { 230 /* UHCI */ 231 int region; 232 233 for (region = 0; region < PCI_ROM_RESOURCE; region++) { 234 if (!(pci_resource_flags(dev, region) & 235 IORESOURCE_IO)) 236 continue; 237 238 hcd->rsrc_start = pci_resource_start(dev, region); 239 hcd->rsrc_len = pci_resource_len(dev, region); 240 if (request_region(hcd->rsrc_start, hcd->rsrc_len, 241 driver->description)) 242 break; 243 } 244 if (region == PCI_ROM_RESOURCE) { 245 dev_dbg(&dev->dev, "no i/o regions available\n"); 246 retval = -EBUSY; 247 goto clear_companion; 248 } 249 } 250 251 pci_set_master(dev); 252 253 retval = usb_add_hcd(hcd, hcd_irq, IRQF_SHARED); 254 if (retval != 0) 255 goto unmap_registers; 256 set_hs_companion(dev, hcd); 257 258 if (pci_dev_run_wake(dev)) 259 pm_runtime_put_noidle(&dev->dev); 260 return retval; 261 262 unmap_registers: 263 if (driver->flags & HCD_MEMORY) { 264 iounmap(hcd->regs); 265 release_mem_region: 266 release_mem_region(hcd->rsrc_start, hcd->rsrc_len); 267 } else 268 release_region(hcd->rsrc_start, hcd->rsrc_len); 269 clear_companion: 270 clear_hs_companion(dev, hcd); 271 usb_put_hcd(hcd); 272 disable_pci: 273 pci_disable_device(dev); 274 dev_err(&dev->dev, "init %s fail, %d\n", pci_name(dev), retval); 275 return retval; 276 } 277 EXPORT_SYMBOL_GPL(usb_hcd_pci_probe); 278 279 280 /* may be called without controller electrically present */ 281 /* may be called with controller, bus, and devices active */ 282 283 /** 284 * usb_hcd_pci_remove - shutdown processing for PCI-based HCDs 285 * @dev: USB Host Controller being removed 286 * Context: !in_interrupt() 287 * 288 * Reverses the effect of usb_hcd_pci_probe(), first invoking 289 * the HCD's stop() method. It is always called from a thread 290 * context, normally "rmmod", "apmd", or something similar. 291 * 292 * Store this function in the HCD's struct pci_driver as remove(). 293 */ 294 void usb_hcd_pci_remove(struct pci_dev *dev) 295 { 296 struct usb_hcd *hcd; 297 298 hcd = pci_get_drvdata(dev); 299 if (!hcd) 300 return; 301 302 if (pci_dev_run_wake(dev)) 303 pm_runtime_get_noresume(&dev->dev); 304 305 /* Fake an interrupt request in order to give the driver a chance 306 * to test whether the controller hardware has been removed (e.g., 307 * cardbus physical eject). 308 */ 309 local_irq_disable(); 310 usb_hcd_irq(0, hcd); 311 local_irq_enable(); 312 313 usb_remove_hcd(hcd); 314 if (hcd->driver->flags & HCD_MEMORY) { 315 iounmap(hcd->regs); 316 release_mem_region(hcd->rsrc_start, hcd->rsrc_len); 317 } else { 318 release_region(hcd->rsrc_start, hcd->rsrc_len); 319 } 320 clear_hs_companion(dev, hcd); 321 usb_put_hcd(hcd); 322 pci_disable_device(dev); 323 } 324 EXPORT_SYMBOL_GPL(usb_hcd_pci_remove); 325 326 /** 327 * usb_hcd_pci_shutdown - shutdown host controller 328 * @dev: USB Host Controller being shutdown 329 */ 330 void usb_hcd_pci_shutdown(struct pci_dev *dev) 331 { 332 struct usb_hcd *hcd; 333 334 hcd = pci_get_drvdata(dev); 335 if (!hcd) 336 return; 337 338 if (test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags) && 339 hcd->driver->shutdown) { 340 hcd->driver->shutdown(hcd); 341 pci_disable_device(dev); 342 } 343 } 344 EXPORT_SYMBOL_GPL(usb_hcd_pci_shutdown); 345 346 #ifdef CONFIG_PM 347 348 #ifdef CONFIG_PPC_PMAC 349 static void powermac_set_asic(struct pci_dev *pci_dev, int enable) 350 { 351 /* Enanble or disable ASIC clocks for USB */ 352 if (machine_is(powermac)) { 353 struct device_node *of_node; 354 355 of_node = pci_device_to_OF_node(pci_dev); 356 if (of_node) 357 pmac_call_feature(PMAC_FTR_USB_ENABLE, 358 of_node, 0, enable); 359 } 360 } 361 362 #else 363 364 static inline void powermac_set_asic(struct pci_dev *pci_dev, int enable) 365 {} 366 367 #endif /* CONFIG_PPC_PMAC */ 368 369 static int check_root_hub_suspended(struct device *dev) 370 { 371 struct pci_dev *pci_dev = to_pci_dev(dev); 372 struct usb_hcd *hcd = pci_get_drvdata(pci_dev); 373 374 if (HCD_RH_RUNNING(hcd)) { 375 dev_warn(dev, "Root hub is not suspended\n"); 376 return -EBUSY; 377 } 378 if (hcd->shared_hcd) { 379 hcd = hcd->shared_hcd; 380 if (HCD_RH_RUNNING(hcd)) { 381 dev_warn(dev, "Secondary root hub is not suspended\n"); 382 return -EBUSY; 383 } 384 } 385 return 0; 386 } 387 388 #if defined(CONFIG_PM_SLEEP) || defined(CONFIG_PM_RUNTIME) 389 static int suspend_common(struct device *dev, bool do_wakeup) 390 { 391 struct pci_dev *pci_dev = to_pci_dev(dev); 392 struct usb_hcd *hcd = pci_get_drvdata(pci_dev); 393 int retval; 394 395 /* Root hub suspend should have stopped all downstream traffic, 396 * and all bus master traffic. And done so for both the interface 397 * and the stub usb_device (which we check here). But maybe it 398 * didn't; writing sysfs power/state files ignores such rules... 399 */ 400 retval = check_root_hub_suspended(dev); 401 if (retval) 402 return retval; 403 404 if (hcd->driver->pci_suspend && !HCD_DEAD(hcd)) { 405 /* Optimization: Don't suspend if a root-hub wakeup is 406 * pending and it would cause the HCD to wake up anyway. 407 */ 408 if (do_wakeup && HCD_WAKEUP_PENDING(hcd)) 409 return -EBUSY; 410 if (do_wakeup && hcd->shared_hcd && 411 HCD_WAKEUP_PENDING(hcd->shared_hcd)) 412 return -EBUSY; 413 retval = hcd->driver->pci_suspend(hcd, do_wakeup); 414 suspend_report_result(hcd->driver->pci_suspend, retval); 415 416 /* Check again in case wakeup raced with pci_suspend */ 417 if ((retval == 0 && do_wakeup && HCD_WAKEUP_PENDING(hcd)) || 418 (retval == 0 && do_wakeup && hcd->shared_hcd && 419 HCD_WAKEUP_PENDING(hcd->shared_hcd))) { 420 if (hcd->driver->pci_resume) 421 hcd->driver->pci_resume(hcd, false); 422 retval = -EBUSY; 423 } 424 if (retval) 425 return retval; 426 } 427 428 /* If MSI-X is enabled, the driver will have synchronized all vectors 429 * in pci_suspend(). If MSI or legacy PCI is enabled, that will be 430 * synchronized here. 431 */ 432 if (!hcd->msix_enabled) 433 synchronize_irq(pci_dev->irq); 434 435 /* Downstream ports from this root hub should already be quiesced, so 436 * there will be no DMA activity. Now we can shut down the upstream 437 * link (except maybe for PME# resume signaling). We'll enter a 438 * low power state during suspend_noirq, if the hardware allows. 439 */ 440 pci_disable_device(pci_dev); 441 return retval; 442 } 443 444 static int resume_common(struct device *dev, int event) 445 { 446 struct pci_dev *pci_dev = to_pci_dev(dev); 447 struct usb_hcd *hcd = pci_get_drvdata(pci_dev); 448 int retval; 449 450 if (HCD_RH_RUNNING(hcd) || 451 (hcd->shared_hcd && 452 HCD_RH_RUNNING(hcd->shared_hcd))) { 453 dev_dbg(dev, "can't resume, not suspended!\n"); 454 return 0; 455 } 456 457 retval = pci_enable_device(pci_dev); 458 if (retval < 0) { 459 dev_err(dev, "can't re-enable after resume, %d!\n", retval); 460 return retval; 461 } 462 463 pci_set_master(pci_dev); 464 465 if (hcd->driver->pci_resume && !HCD_DEAD(hcd)) { 466 if (event != PM_EVENT_AUTO_RESUME) 467 wait_for_companions(pci_dev, hcd); 468 469 retval = hcd->driver->pci_resume(hcd, 470 event == PM_EVENT_RESTORE); 471 if (retval) { 472 dev_err(dev, "PCI post-resume error %d!\n", retval); 473 if (hcd->shared_hcd) 474 usb_hc_died(hcd->shared_hcd); 475 usb_hc_died(hcd); 476 } 477 } 478 return retval; 479 } 480 #endif /* SLEEP || RUNTIME */ 481 482 #ifdef CONFIG_PM_SLEEP 483 484 static int hcd_pci_suspend(struct device *dev) 485 { 486 return suspend_common(dev, device_may_wakeup(dev)); 487 } 488 489 static int hcd_pci_suspend_noirq(struct device *dev) 490 { 491 struct pci_dev *pci_dev = to_pci_dev(dev); 492 struct usb_hcd *hcd = pci_get_drvdata(pci_dev); 493 int retval; 494 495 retval = check_root_hub_suspended(dev); 496 if (retval) 497 return retval; 498 499 pci_save_state(pci_dev); 500 501 /* If the root hub is dead rather than suspended, disallow remote 502 * wakeup. usb_hc_died() should ensure that both hosts are marked as 503 * dying, so we only need to check the primary roothub. 504 */ 505 if (HCD_DEAD(hcd)) 506 device_set_wakeup_enable(dev, 0); 507 dev_dbg(dev, "wakeup: %d\n", device_may_wakeup(dev)); 508 509 /* Possibly enable remote wakeup, 510 * choose the appropriate low-power state, and go to that state. 511 */ 512 retval = pci_prepare_to_sleep(pci_dev); 513 if (retval == -EIO) { /* Low-power not supported */ 514 dev_dbg(dev, "--> PCI D0 legacy\n"); 515 retval = 0; 516 } else if (retval == 0) { 517 dev_dbg(dev, "--> PCI %s\n", 518 pci_power_name(pci_dev->current_state)); 519 } else { 520 suspend_report_result(pci_prepare_to_sleep, retval); 521 return retval; 522 } 523 524 powermac_set_asic(pci_dev, 0); 525 return retval; 526 } 527 528 static int hcd_pci_resume_noirq(struct device *dev) 529 { 530 struct pci_dev *pci_dev = to_pci_dev(dev); 531 532 powermac_set_asic(pci_dev, 1); 533 534 /* Go back to D0 and disable remote wakeup */ 535 pci_back_from_sleep(pci_dev); 536 return 0; 537 } 538 539 static int hcd_pci_resume(struct device *dev) 540 { 541 return resume_common(dev, PM_EVENT_RESUME); 542 } 543 544 static int hcd_pci_restore(struct device *dev) 545 { 546 return resume_common(dev, PM_EVENT_RESTORE); 547 } 548 549 #else 550 551 #define hcd_pci_suspend NULL 552 #define hcd_pci_suspend_noirq NULL 553 #define hcd_pci_resume_noirq NULL 554 #define hcd_pci_resume NULL 555 #define hcd_pci_restore NULL 556 557 #endif /* CONFIG_PM_SLEEP */ 558 559 #ifdef CONFIG_PM_RUNTIME 560 561 static int hcd_pci_runtime_suspend(struct device *dev) 562 { 563 int retval; 564 565 retval = suspend_common(dev, true); 566 if (retval == 0) 567 powermac_set_asic(to_pci_dev(dev), 0); 568 dev_dbg(dev, "hcd_pci_runtime_suspend: %d\n", retval); 569 return retval; 570 } 571 572 static int hcd_pci_runtime_resume(struct device *dev) 573 { 574 int retval; 575 576 powermac_set_asic(to_pci_dev(dev), 1); 577 retval = resume_common(dev, PM_EVENT_AUTO_RESUME); 578 dev_dbg(dev, "hcd_pci_runtime_resume: %d\n", retval); 579 return retval; 580 } 581 582 #else 583 584 #define hcd_pci_runtime_suspend NULL 585 #define hcd_pci_runtime_resume NULL 586 587 #endif /* CONFIG_PM_RUNTIME */ 588 589 const struct dev_pm_ops usb_hcd_pci_pm_ops = { 590 .suspend = hcd_pci_suspend, 591 .suspend_noirq = hcd_pci_suspend_noirq, 592 .resume_noirq = hcd_pci_resume_noirq, 593 .resume = hcd_pci_resume, 594 .freeze = check_root_hub_suspended, 595 .freeze_noirq = check_root_hub_suspended, 596 .thaw_noirq = NULL, 597 .thaw = NULL, 598 .poweroff = hcd_pci_suspend, 599 .poweroff_noirq = hcd_pci_suspend_noirq, 600 .restore_noirq = hcd_pci_resume_noirq, 601 .restore = hcd_pci_restore, 602 .runtime_suspend = hcd_pci_runtime_suspend, 603 .runtime_resume = hcd_pci_runtime_resume, 604 }; 605 EXPORT_SYMBOL_GPL(usb_hcd_pci_pm_ops); 606 607 #endif /* CONFIG_PM */ 608