ehci-hcd: Fix typo in an error message
[safe/jmp/linux-2.6] / drivers / usb / host / ehci-ps3.c
index 4d781a2..1dee33b 100644 (file)
@@ -18,6 +18,7 @@
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
+#include <asm/firmware.h>
 #include <asm/ps3.h>
 
 static int ps3_ehci_hc_reset(struct usb_hcd *hcd)
@@ -46,7 +47,7 @@ static int ps3_ehci_hc_reset(struct usb_hcd *hcd)
        if (result)
                return result;
 
-       ehci_port_power(ehci, 0);
+       ehci_reset(ehci);
 
        return result;
 }
@@ -64,6 +65,7 @@ static const struct hc_driver ps3_ehci_hc_driver = {
        .urb_enqueue            = ehci_urb_enqueue,
        .urb_dequeue            = ehci_urb_dequeue,
        .endpoint_disable       = ehci_endpoint_disable,
+       .endpoint_reset         = ehci_endpoint_reset,
        .get_frame_number       = ehci_get_frame,
        .hub_status_data        = ehci_hub_status_data,
        .hub_control            = ehci_hub_control,
@@ -71,40 +73,54 @@ static const struct hc_driver ps3_ehci_hc_driver = {
        .bus_suspend            = ehci_bus_suspend,
        .bus_resume             = ehci_bus_resume,
 #endif
-};
-
-#if !defined(DEBUG)
-#undef dev_dbg
-static inline int __attribute__ ((format (printf, 2, 3))) dev_dbg(
-       const struct device *_dev, const char *fmt, ...) {return 0;}
-#endif
+       .relinquish_port        = ehci_relinquish_port,
+       .port_handed_over       = ehci_port_handed_over,
 
+       .clear_tt_buffer_complete       = ehci_clear_tt_buffer_complete,
+};
 
-static int ps3_ehci_sb_probe(struct ps3_system_bus_device *dev)
+static int __devinit ps3_ehci_probe(struct ps3_system_bus_device *dev)
 {
        int result;
        struct usb_hcd *hcd;
        unsigned int virq;
-       static u64 dummy_mask = DMA_32BIT_MASK;
+       static u64 dummy_mask = DMA_BIT_MASK(32);
 
        if (usb_disabled()) {
                result = -ENODEV;
                goto fail_start;
        }
 
+       result = ps3_open_hv_device(dev);
+
+       if (result) {
+               dev_dbg(&dev->core, "%s:%d: ps3_open_hv_device failed\n",
+                       __func__, __LINE__);
+               goto fail_open;
+       }
+
+       result = ps3_dma_region_create(dev->d_region);
+
+       if (result) {
+               dev_dbg(&dev->core, "%s:%d: ps3_dma_region_create failed: "
+                       "(%d)\n", __func__, __LINE__, result);
+               BUG_ON("check region type");
+               goto fail_dma_region;
+       }
+
        result = ps3_mmio_region_create(dev->m_region);
 
        if (result) {
                dev_dbg(&dev->core, "%s:%d: ps3_map_mmio_region failed\n",
                        __func__, __LINE__);
                result = -EPERM;
-               goto fail_mmio;
+               goto fail_mmio_region;
        }
 
        dev_dbg(&dev->core, "%s:%d: mmio mapped_addr %lxh\n", __func__,
                __LINE__, dev->m_region->lpar_addr);
 
-       result = ps3_alloc_io_irq(PS3_BINDING_CPU_ANY, dev->interrupt_id, &virq);
+       result = ps3_io_irq_setup(PS3_BINDING_CPU_ANY, dev->interrupt_id, &virq);
 
        if (result) {
                dev_dbg(&dev->core, "%s:%d: ps3_construct_io_irq(%d) failed.\n",
@@ -113,10 +129,9 @@ static int ps3_ehci_sb_probe(struct ps3_system_bus_device *dev)
                goto fail_irq;
        }
 
-       dev->core.power.power_state = PMSG_ON;
        dev->core.dma_mask = &dummy_mask; /* FIXME: for improper usb code */
 
-       hcd = usb_create_hcd(&ps3_ehci_hc_driver, &dev->core, dev->core.bus_id);
+       hcd = usb_create_hcd(&ps3_ehci_hc_driver, &dev->core, dev_name(&dev->core));
 
        if (!hcd) {
                dev_dbg(&dev->core, "%s:%d: usb_create_hcd failed\n", __func__,
@@ -127,6 +142,11 @@ static int ps3_ehci_sb_probe(struct ps3_system_bus_device *dev)
 
        hcd->rsrc_start = dev->m_region->lpar_addr;
        hcd->rsrc_len = dev->m_region->len;
+
+       if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name))
+               dev_dbg(&dev->core, "%s:%d: request_mem_region failed\n",
+                       __func__, __LINE__);
+
        hcd->regs = ioremap(dev->m_region->lpar_addr, dev->m_region->len);
 
        if (!hcd->regs) {
@@ -145,7 +165,7 @@ static int ps3_ehci_sb_probe(struct ps3_system_bus_device *dev)
        dev_dbg(&dev->core, "%s:%d: virq            %lu\n", __func__, __LINE__,
                (unsigned long)virq);
 
-       ps3_system_bus_set_driver_data(dev, hcd);
+       ps3_system_bus_set_drvdata(dev, hcd);
 
        result = usb_add_hcd(hcd, virq, IRQF_DISABLED);
 
@@ -160,34 +180,73 @@ static int ps3_ehci_sb_probe(struct ps3_system_bus_device *dev)
 fail_add_hcd:
        iounmap(hcd->regs);
 fail_ioremap:
+       release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
        usb_put_hcd(hcd);
 fail_create_hcd:
-       ps3_free_io_irq(virq);
+       ps3_io_irq_destroy(virq);
 fail_irq:
        ps3_free_mmio_region(dev->m_region);
-fail_mmio:
+fail_mmio_region:
+       ps3_dma_region_free(dev->d_region);
+fail_dma_region:
+       ps3_close_hv_device(dev);
+fail_open:
 fail_start:
        return result;
 }
 
-static int ps3_ehci_sb_remove(struct ps3_system_bus_device *dev)
+static int ps3_ehci_remove(struct ps3_system_bus_device *dev)
 {
-       struct usb_hcd *hcd =
-               (struct usb_hcd *)ps3_system_bus_get_driver_data(dev);
+       unsigned int tmp;
+       struct usb_hcd *hcd = ps3_system_bus_get_drvdata(dev);
 
+       BUG_ON(!hcd);
+
+       dev_dbg(&dev->core, "%s:%d: regs %p\n", __func__, __LINE__, hcd->regs);
+       dev_dbg(&dev->core, "%s:%d: irq %u\n", __func__, __LINE__, hcd->irq);
+
+       tmp = hcd->irq;
+
+       ehci_shutdown(hcd);
+       usb_remove_hcd(hcd);
+
+       ps3_system_bus_set_drvdata(dev, NULL);
+
+       BUG_ON(!hcd->regs);
+       iounmap(hcd->regs);
+
+       release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
        usb_put_hcd(hcd);
-       ps3_system_bus_set_driver_data(dev, NULL);
+
+       ps3_io_irq_destroy(tmp);
+       ps3_free_mmio_region(dev->m_region);
+
+       ps3_dma_region_free(dev->d_region);
+       ps3_close_hv_device(dev);
 
        return 0;
 }
 
-MODULE_ALIAS("ps3-ehci");
+static int __init ps3_ehci_driver_register(struct ps3_system_bus_driver *drv)
+{
+       return firmware_has_feature(FW_FEATURE_PS3_LV1)
+               ? ps3_system_bus_driver_register(drv)
+               : 0;
+}
+
+static void ps3_ehci_driver_unregister(struct ps3_system_bus_driver *drv)
+{
+       if (firmware_has_feature(FW_FEATURE_PS3_LV1))
+               ps3_system_bus_driver_unregister(drv);
+}
+
+MODULE_ALIAS(PS3_MODULE_ALIAS_EHCI);
 
-static struct ps3_system_bus_driver ps3_ehci_sb_driver = {
+static struct ps3_system_bus_driver ps3_ehci_driver = {
+       .core.name = "ps3-ehci-driver",
+       .core.owner = THIS_MODULE,
        .match_id = PS3_MATCH_ID_EHCI,
-       .core = {
-               .name = "ps3-ehci-driver",
-       },
-       .probe = ps3_ehci_sb_probe,
-       .remove = ps3_ehci_sb_remove,
+       .probe = ps3_ehci_probe,
+       .remove = ps3_ehci_remove,
+       .shutdown = ps3_ehci_remove,
 };