diff options
| -rw-r--r-- | drivers/usb/core/hcd-pci.c | 129 |
1 files changed, 67 insertions, 62 deletions
diff --git a/drivers/usb/core/hcd-pci.c b/drivers/usb/core/hcd-pci.c index 851d5e1625d9..84760ddbc332 100644 --- a/drivers/usb/core/hcd-pci.c +++ b/drivers/usb/core/hcd-pci.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * (C) Copyright David Brownell 2000-2002 | 2 | * (C) Copyright David Brownell 2000-2002 |
| 3 | * | 3 | * |
| 4 | * This program is free software; you can redistribute it and/or modify it | 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 | 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 | 6 | * Free Software Foundation; either version 2 of the License, or (at your |
| @@ -55,7 +55,7 @@ | |||
| 55 | * | 55 | * |
| 56 | * Store this function in the HCD's struct pci_driver as probe(). | 56 | * Store this function in the HCD's struct pci_driver as probe(). |
| 57 | */ | 57 | */ |
| 58 | int usb_hcd_pci_probe (struct pci_dev *dev, const struct pci_device_id *id) | 58 | int usb_hcd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) |
| 59 | { | 59 | { |
| 60 | struct hc_driver *driver; | 60 | struct hc_driver *driver; |
| 61 | struct usb_hcd *hcd; | 61 | struct usb_hcd *hcd; |
| @@ -64,66 +64,71 @@ int usb_hcd_pci_probe (struct pci_dev *dev, const struct pci_device_id *id) | |||
| 64 | if (usb_disabled()) | 64 | if (usb_disabled()) |
| 65 | return -ENODEV; | 65 | return -ENODEV; |
| 66 | 66 | ||
| 67 | if (!id || !(driver = (struct hc_driver *) id->driver_data)) | 67 | if (!id) |
| 68 | return -EINVAL; | ||
| 69 | driver = (struct hc_driver *)id->driver_data; | ||
| 70 | if (!driver) | ||
| 68 | return -EINVAL; | 71 | return -EINVAL; |
| 69 | 72 | ||
| 70 | if (pci_enable_device (dev) < 0) | 73 | if (pci_enable_device(dev) < 0) |
| 71 | return -ENODEV; | 74 | return -ENODEV; |
| 72 | dev->current_state = PCI_D0; | 75 | dev->current_state = PCI_D0; |
| 73 | dev->dev.power.power_state = PMSG_ON; | 76 | dev->dev.power.power_state = PMSG_ON; |
| 74 | 77 | ||
| 75 | if (!dev->irq) { | 78 | if (!dev->irq) { |
| 76 | dev_err (&dev->dev, | 79 | dev_err(&dev->dev, |
| 77 | "Found HC with no IRQ. Check BIOS/PCI %s setup!\n", | 80 | "Found HC with no IRQ. Check BIOS/PCI %s setup!\n", |
| 78 | pci_name(dev)); | 81 | pci_name(dev)); |
| 79 | retval = -ENODEV; | 82 | retval = -ENODEV; |
| 80 | goto err1; | 83 | goto err1; |
| 81 | } | 84 | } |
| 82 | 85 | ||
| 83 | hcd = usb_create_hcd (driver, &dev->dev, pci_name(dev)); | 86 | hcd = usb_create_hcd(driver, &dev->dev, pci_name(dev)); |
| 84 | if (!hcd) { | 87 | if (!hcd) { |
| 85 | retval = -ENOMEM; | 88 | retval = -ENOMEM; |
| 86 | goto err1; | 89 | goto err1; |
| 87 | } | 90 | } |
| 88 | 91 | ||
| 89 | if (driver->flags & HCD_MEMORY) { // EHCI, OHCI | 92 | if (driver->flags & HCD_MEMORY) { |
| 90 | hcd->rsrc_start = pci_resource_start (dev, 0); | 93 | /* EHCI, OHCI */ |
| 91 | hcd->rsrc_len = pci_resource_len (dev, 0); | 94 | hcd->rsrc_start = pci_resource_start(dev, 0); |
| 92 | if (!request_mem_region (hcd->rsrc_start, hcd->rsrc_len, | 95 | hcd->rsrc_len = pci_resource_len(dev, 0); |
| 96 | if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, | ||
| 93 | driver->description)) { | 97 | driver->description)) { |
| 94 | dev_dbg (&dev->dev, "controller already in use\n"); | 98 | dev_dbg(&dev->dev, "controller already in use\n"); |
| 95 | retval = -EBUSY; | 99 | retval = -EBUSY; |
| 96 | goto err2; | 100 | goto err2; |
| 97 | } | 101 | } |
| 98 | hcd->regs = ioremap_nocache (hcd->rsrc_start, hcd->rsrc_len); | 102 | hcd->regs = ioremap_nocache(hcd->rsrc_start, hcd->rsrc_len); |
| 99 | if (hcd->regs == NULL) { | 103 | if (hcd->regs == NULL) { |
| 100 | dev_dbg (&dev->dev, "error mapping memory\n"); | 104 | dev_dbg(&dev->dev, "error mapping memory\n"); |
| 101 | retval = -EFAULT; | 105 | retval = -EFAULT; |
| 102 | goto err3; | 106 | goto err3; |
| 103 | } | 107 | } |
| 104 | 108 | ||
| 105 | } else { // UHCI | 109 | } else { |
| 110 | /* UHCI */ | ||
| 106 | int region; | 111 | int region; |
| 107 | 112 | ||
| 108 | for (region = 0; region < PCI_ROM_RESOURCE; region++) { | 113 | for (region = 0; region < PCI_ROM_RESOURCE; region++) { |
| 109 | if (!(pci_resource_flags (dev, region) & | 114 | if (!(pci_resource_flags(dev, region) & |
| 110 | IORESOURCE_IO)) | 115 | IORESOURCE_IO)) |
| 111 | continue; | 116 | continue; |
| 112 | 117 | ||
| 113 | hcd->rsrc_start = pci_resource_start (dev, region); | 118 | hcd->rsrc_start = pci_resource_start(dev, region); |
| 114 | hcd->rsrc_len = pci_resource_len (dev, region); | 119 | hcd->rsrc_len = pci_resource_len(dev, region); |
| 115 | if (request_region (hcd->rsrc_start, hcd->rsrc_len, | 120 | if (request_region(hcd->rsrc_start, hcd->rsrc_len, |
| 116 | driver->description)) | 121 | driver->description)) |
| 117 | break; | 122 | break; |
| 118 | } | 123 | } |
| 119 | if (region == PCI_ROM_RESOURCE) { | 124 | if (region == PCI_ROM_RESOURCE) { |
| 120 | dev_dbg (&dev->dev, "no i/o regions available\n"); | 125 | dev_dbg(&dev->dev, "no i/o regions available\n"); |
| 121 | retval = -EBUSY; | 126 | retval = -EBUSY; |
| 122 | goto err1; | 127 | goto err1; |
| 123 | } | 128 | } |
| 124 | } | 129 | } |
| 125 | 130 | ||
| 126 | pci_set_master (dev); | 131 | pci_set_master(dev); |
| 127 | 132 | ||
| 128 | retval = usb_add_hcd(hcd, dev->irq, IRQF_DISABLED | IRQF_SHARED); | 133 | retval = usb_add_hcd(hcd, dev->irq, IRQF_DISABLED | IRQF_SHARED); |
| 129 | if (retval != 0) | 134 | if (retval != 0) |
| @@ -132,18 +137,18 @@ int usb_hcd_pci_probe (struct pci_dev *dev, const struct pci_device_id *id) | |||
| 132 | 137 | ||
| 133 | err4: | 138 | err4: |
| 134 | if (driver->flags & HCD_MEMORY) { | 139 | if (driver->flags & HCD_MEMORY) { |
| 135 | iounmap (hcd->regs); | 140 | iounmap(hcd->regs); |
| 136 | err3: | 141 | err3: |
| 137 | release_mem_region (hcd->rsrc_start, hcd->rsrc_len); | 142 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); |
| 138 | } else | 143 | } else |
| 139 | release_region (hcd->rsrc_start, hcd->rsrc_len); | 144 | release_region(hcd->rsrc_start, hcd->rsrc_len); |
| 140 | err2: | 145 | err2: |
| 141 | usb_put_hcd (hcd); | 146 | usb_put_hcd(hcd); |
| 142 | err1: | 147 | err1: |
| 143 | pci_disable_device (dev); | 148 | pci_disable_device(dev); |
| 144 | dev_err (&dev->dev, "init %s fail, %d\n", pci_name(dev), retval); | 149 | dev_err(&dev->dev, "init %s fail, %d\n", pci_name(dev), retval); |
| 145 | return retval; | 150 | return retval; |
| 146 | } | 151 | } |
| 147 | EXPORT_SYMBOL_GPL(usb_hcd_pci_probe); | 152 | EXPORT_SYMBOL_GPL(usb_hcd_pci_probe); |
| 148 | 153 | ||
| 149 | 154 | ||
| @@ -161,7 +166,7 @@ EXPORT_SYMBOL_GPL(usb_hcd_pci_probe); | |||
| 161 | * | 166 | * |
| 162 | * Store this function in the HCD's struct pci_driver as remove(). | 167 | * Store this function in the HCD's struct pci_driver as remove(). |
| 163 | */ | 168 | */ |
| 164 | void usb_hcd_pci_remove (struct pci_dev *dev) | 169 | void usb_hcd_pci_remove(struct pci_dev *dev) |
| 165 | { | 170 | { |
| 166 | struct usb_hcd *hcd; | 171 | struct usb_hcd *hcd; |
| 167 | 172 | ||
| @@ -169,14 +174,14 @@ void usb_hcd_pci_remove (struct pci_dev *dev) | |||
| 169 | if (!hcd) | 174 | if (!hcd) |
| 170 | return; | 175 | return; |
| 171 | 176 | ||
| 172 | usb_remove_hcd (hcd); | 177 | usb_remove_hcd(hcd); |
| 173 | if (hcd->driver->flags & HCD_MEMORY) { | 178 | if (hcd->driver->flags & HCD_MEMORY) { |
| 174 | iounmap (hcd->regs); | 179 | iounmap(hcd->regs); |
| 175 | release_mem_region (hcd->rsrc_start, hcd->rsrc_len); | 180 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); |
| 176 | } else { | 181 | } else { |
| 177 | release_region (hcd->rsrc_start, hcd->rsrc_len); | 182 | release_region(hcd->rsrc_start, hcd->rsrc_len); |
| 178 | } | 183 | } |
| 179 | usb_put_hcd (hcd); | 184 | usb_put_hcd(hcd); |
| 180 | pci_disable_device(dev); | 185 | pci_disable_device(dev); |
| 181 | } | 186 | } |
| 182 | EXPORT_SYMBOL_GPL(usb_hcd_pci_remove); | 187 | EXPORT_SYMBOL_GPL(usb_hcd_pci_remove); |
| @@ -191,7 +196,7 @@ EXPORT_SYMBOL_GPL(usb_hcd_pci_remove); | |||
| 191 | * | 196 | * |
| 192 | * Store this function in the HCD's struct pci_driver as suspend(). | 197 | * Store this function in the HCD's struct pci_driver as suspend(). |
| 193 | */ | 198 | */ |
| 194 | int usb_hcd_pci_suspend (struct pci_dev *dev, pm_message_t message) | 199 | int usb_hcd_pci_suspend(struct pci_dev *dev, pm_message_t message) |
| 195 | { | 200 | { |
| 196 | struct usb_hcd *hcd; | 201 | struct usb_hcd *hcd; |
| 197 | int retval = 0; | 202 | int retval = 0; |
| @@ -246,8 +251,8 @@ int usb_hcd_pci_suspend (struct pci_dev *dev, pm_message_t message) | |||
| 246 | 251 | ||
| 247 | /* no DMA or IRQs except when HC is active */ | 252 | /* no DMA or IRQs except when HC is active */ |
| 248 | if (dev->current_state == PCI_D0) { | 253 | if (dev->current_state == PCI_D0) { |
| 249 | pci_save_state (dev); | 254 | pci_save_state(dev); |
| 250 | pci_disable_device (dev); | 255 | pci_disable_device(dev); |
| 251 | } | 256 | } |
| 252 | 257 | ||
| 253 | if (message.event == PM_EVENT_FREEZE || | 258 | if (message.event == PM_EVENT_FREEZE || |
| @@ -257,7 +262,7 @@ int usb_hcd_pci_suspend (struct pci_dev *dev, pm_message_t message) | |||
| 257 | } | 262 | } |
| 258 | 263 | ||
| 259 | if (!has_pci_pm) { | 264 | if (!has_pci_pm) { |
| 260 | dev_dbg (hcd->self.controller, "--> PCI D0/legacy\n"); | 265 | dev_dbg(hcd->self.controller, "--> PCI D0/legacy\n"); |
| 261 | goto done; | 266 | goto done; |
| 262 | } | 267 | } |
| 263 | 268 | ||
| @@ -266,30 +271,30 @@ int usb_hcd_pci_suspend (struct pci_dev *dev, pm_message_t message) | |||
| 266 | * PCI_D3 (but not PCI_D1 or PCI_D2) is allowed to reset | 271 | * PCI_D3 (but not PCI_D1 or PCI_D2) is allowed to reset |
| 267 | * some device state (e.g. as part of clock reinit). | 272 | * some device state (e.g. as part of clock reinit). |
| 268 | */ | 273 | */ |
| 269 | retval = pci_set_power_state (dev, PCI_D3hot); | 274 | retval = pci_set_power_state(dev, PCI_D3hot); |
| 270 | suspend_report_result(pci_set_power_state, retval); | 275 | suspend_report_result(pci_set_power_state, retval); |
| 271 | if (retval == 0) { | 276 | if (retval == 0) { |
| 272 | int wake = device_can_wakeup(&hcd->self.root_hub->dev); | 277 | int wake = device_can_wakeup(&hcd->self.root_hub->dev); |
| 273 | 278 | ||
| 274 | wake = wake && device_may_wakeup(hcd->self.controller); | 279 | wake = wake && device_may_wakeup(hcd->self.controller); |
| 275 | 280 | ||
| 276 | dev_dbg (hcd->self.controller, "--> PCI D3%s\n", | 281 | dev_dbg(hcd->self.controller, "--> PCI D3%s\n", |
| 277 | wake ? "/wakeup" : ""); | 282 | wake ? "/wakeup" : ""); |
| 278 | 283 | ||
| 279 | /* Ignore these return values. We rely on pci code to | 284 | /* Ignore these return values. We rely on pci code to |
| 280 | * reject requests the hardware can't implement, rather | 285 | * reject requests the hardware can't implement, rather |
| 281 | * than coding the same thing. | 286 | * than coding the same thing. |
| 282 | */ | 287 | */ |
| 283 | (void) pci_enable_wake (dev, PCI_D3hot, wake); | 288 | (void) pci_enable_wake(dev, PCI_D3hot, wake); |
| 284 | (void) pci_enable_wake (dev, PCI_D3cold, wake); | 289 | (void) pci_enable_wake(dev, PCI_D3cold, wake); |
| 285 | } else { | 290 | } else { |
| 286 | dev_dbg (&dev->dev, "PCI D3 suspend fail, %d\n", | 291 | dev_dbg(&dev->dev, "PCI D3 suspend fail, %d\n", |
| 287 | retval); | 292 | retval); |
| 288 | (void) usb_hcd_pci_resume (dev); | 293 | (void) usb_hcd_pci_resume(dev); |
| 289 | } | 294 | } |
| 290 | 295 | ||
| 291 | } else if (hcd->state != HC_STATE_HALT) { | 296 | } else if (hcd->state != HC_STATE_HALT) { |
| 292 | dev_dbg (hcd->self.controller, "hcd state %d; not suspended\n", | 297 | dev_dbg(hcd->self.controller, "hcd state %d; not suspended\n", |
| 293 | hcd->state); | 298 | hcd->state); |
| 294 | WARN_ON(1); | 299 | WARN_ON(1); |
| 295 | retval = -EINVAL; | 300 | retval = -EINVAL; |
| @@ -304,7 +309,7 @@ done: | |||
| 304 | if (machine_is(powermac)) { | 309 | if (machine_is(powermac)) { |
| 305 | struct device_node *of_node; | 310 | struct device_node *of_node; |
| 306 | 311 | ||
| 307 | of_node = pci_device_to_OF_node (dev); | 312 | of_node = pci_device_to_OF_node(dev); |
| 308 | if (of_node) | 313 | if (of_node) |
| 309 | pmac_call_feature(PMAC_FTR_USB_ENABLE, | 314 | pmac_call_feature(PMAC_FTR_USB_ENABLE, |
| 310 | of_node, 0, 0); | 315 | of_node, 0, 0); |
| @@ -322,14 +327,14 @@ EXPORT_SYMBOL_GPL(usb_hcd_pci_suspend); | |||
| 322 | * | 327 | * |
| 323 | * Store this function in the HCD's struct pci_driver as resume(). | 328 | * Store this function in the HCD's struct pci_driver as resume(). |
| 324 | */ | 329 | */ |
| 325 | int usb_hcd_pci_resume (struct pci_dev *dev) | 330 | int usb_hcd_pci_resume(struct pci_dev *dev) |
| 326 | { | 331 | { |
| 327 | struct usb_hcd *hcd; | 332 | struct usb_hcd *hcd; |
| 328 | int retval; | 333 | int retval; |
| 329 | 334 | ||
| 330 | hcd = pci_get_drvdata(dev); | 335 | hcd = pci_get_drvdata(dev); |
| 331 | if (hcd->state != HC_STATE_SUSPENDED) { | 336 | if (hcd->state != HC_STATE_SUSPENDED) { |
| 332 | dev_dbg (hcd->self.controller, | 337 | dev_dbg(hcd->self.controller, |
| 333 | "can't resume, not suspended!\n"); | 338 | "can't resume, not suspended!\n"); |
| 334 | return 0; | 339 | return 0; |
| 335 | } | 340 | } |
| @@ -339,9 +344,9 @@ int usb_hcd_pci_resume (struct pci_dev *dev) | |||
| 339 | if (machine_is(powermac)) { | 344 | if (machine_is(powermac)) { |
| 340 | struct device_node *of_node; | 345 | struct device_node *of_node; |
| 341 | 346 | ||
| 342 | of_node = pci_device_to_OF_node (dev); | 347 | of_node = pci_device_to_OF_node(dev); |
| 343 | if (of_node) | 348 | if (of_node) |
| 344 | pmac_call_feature (PMAC_FTR_USB_ENABLE, | 349 | pmac_call_feature(PMAC_FTR_USB_ENABLE, |
| 345 | of_node, 0, 1); | 350 | of_node, 0, 1); |
| 346 | } | 351 | } |
| 347 | #endif | 352 | #endif |
| @@ -380,8 +385,8 @@ int usb_hcd_pci_resume (struct pci_dev *dev) | |||
| 380 | } | 385 | } |
| 381 | #endif | 386 | #endif |
| 382 | /* yes, ignore these results too... */ | 387 | /* yes, ignore these results too... */ |
| 383 | (void) pci_enable_wake (dev, dev->current_state, 0); | 388 | (void) pci_enable_wake(dev, dev->current_state, 0); |
| 384 | (void) pci_enable_wake (dev, PCI_D3cold, 0); | 389 | (void) pci_enable_wake(dev, PCI_D3cold, 0); |
| 385 | } else { | 390 | } else { |
| 386 | /* Same basic cases: clean (powered/not), dirty */ | 391 | /* Same basic cases: clean (powered/not), dirty */ |
| 387 | dev_dbg(hcd->self.controller, "PCI legacy resume\n"); | 392 | dev_dbg(hcd->self.controller, "PCI legacy resume\n"); |
| @@ -392,14 +397,14 @@ int usb_hcd_pci_resume (struct pci_dev *dev) | |||
| 392 | * but that won't re-enable bus mastering. Yet pci_disable_device() | 397 | * but that won't re-enable bus mastering. Yet pci_disable_device() |
| 393 | * explicitly disables bus mastering... | 398 | * explicitly disables bus mastering... |
| 394 | */ | 399 | */ |
| 395 | retval = pci_enable_device (dev); | 400 | retval = pci_enable_device(dev); |
| 396 | if (retval < 0) { | 401 | if (retval < 0) { |
| 397 | dev_err (hcd->self.controller, | 402 | dev_err(hcd->self.controller, |
| 398 | "can't re-enable after resume, %d!\n", retval); | 403 | "can't re-enable after resume, %d!\n", retval); |
| 399 | return retval; | 404 | return retval; |
| 400 | } | 405 | } |
| 401 | pci_set_master (dev); | 406 | pci_set_master(dev); |
| 402 | pci_restore_state (dev); | 407 | pci_restore_state(dev); |
| 403 | 408 | ||
| 404 | dev->dev.power.power_state = PMSG_ON; | 409 | dev->dev.power.power_state = PMSG_ON; |
| 405 | 410 | ||
| @@ -408,9 +413,9 @@ int usb_hcd_pci_resume (struct pci_dev *dev) | |||
| 408 | if (hcd->driver->resume) { | 413 | if (hcd->driver->resume) { |
| 409 | retval = hcd->driver->resume(hcd); | 414 | retval = hcd->driver->resume(hcd); |
| 410 | if (retval) { | 415 | if (retval) { |
| 411 | dev_err (hcd->self.controller, | 416 | dev_err(hcd->self.controller, |
| 412 | "PCI post-resume error %d!\n", retval); | 417 | "PCI post-resume error %d!\n", retval); |
| 413 | usb_hc_died (hcd); | 418 | usb_hc_died(hcd); |
| 414 | } | 419 | } |
| 415 | } | 420 | } |
| 416 | 421 | ||
| @@ -424,7 +429,7 @@ EXPORT_SYMBOL_GPL(usb_hcd_pci_resume); | |||
| 424 | * usb_hcd_pci_shutdown - shutdown host controller | 429 | * usb_hcd_pci_shutdown - shutdown host controller |
| 425 | * @dev: USB Host Controller being shutdown | 430 | * @dev: USB Host Controller being shutdown |
| 426 | */ | 431 | */ |
| 427 | void usb_hcd_pci_shutdown (struct pci_dev *dev) | 432 | void usb_hcd_pci_shutdown(struct pci_dev *dev) |
| 428 | { | 433 | { |
| 429 | struct usb_hcd *hcd; | 434 | struct usb_hcd *hcd; |
| 430 | 435 | ||
