1495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut/* 2495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut * OHCI HCD (Host Controller Driver) for USB. 3495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut * 4495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut * (C) Copyright 1999 Roman Weissgaerber <weissg@vienna.at> 5495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut * (C) Copyright 2000-2002 David Brownell <dbrownell@users.sourceforge.net> 6495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut * (C) Copyright 2002 Hewlett-Packard Company 7495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut * (C) Copyright 2006 Sylvain Munaut <tnt@246tNt.com> 8495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut * 9495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut * Bus glue for OHCI HC on the of_platform bus 10495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut * 11495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut * Modified for of_platform bus from ohci-sa1111.c 12495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut * 13495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut * This file is licenced under the GPL. 14495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut */ 15495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 16495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut#include <linux/signal.h> 17554cc171e3b08a0cecd5cf7c0c38f66c43f76b39Stephen Rothwell#include <linux/of_platform.h> 18495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 19495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut#include <asm/prom.h> 20495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 21495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 22495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munautstatic int __devinit 23495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munautohci_ppc_of_start(struct usb_hcd *hcd) 24495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut{ 25495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut struct ohci_hcd *ohci = hcd_to_ohci(hcd); 26495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut int ret; 27495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 28495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut if ((ret = ohci_init(ohci)) < 0) 29495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut return ret; 30495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 31495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut if ((ret = ohci_run(ohci)) < 0) { 32495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut err("can't start %s", ohci_to_hcd(ohci)->self.bus_name); 33495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut ohci_stop(hcd); 34495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut return ret; 35495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut } 36495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 37495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut return 0; 38495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut} 39495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 40495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munautstatic const struct hc_driver ohci_ppc_of_hc_driver = { 41495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut .description = hcd_name, 42495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut .product_desc = "OF OHCI", 43495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut .hcd_priv_size = sizeof(struct ohci_hcd), 44495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 45495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut /* 46495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut * generic hardware linkage 47495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut */ 48495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut .irq = ohci_irq, 49495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut .flags = HCD_USB11 | HCD_MEMORY, 50495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 51495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut /* 52495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut * basic lifecycle operations 53495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut */ 54495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut .start = ohci_ppc_of_start, 55495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut .stop = ohci_stop, 56495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut .shutdown = ohci_shutdown, 57495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 58495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut /* 59495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut * managing i/o requests and associated device resources 60495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut */ 61495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut .urb_enqueue = ohci_urb_enqueue, 62495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut .urb_dequeue = ohci_urb_dequeue, 63495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut .endpoint_disable = ohci_endpoint_disable, 64495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 65495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut /* 66495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut * scheduling support 67495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut */ 68495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut .get_frame_number = ohci_get_frame, 69495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 70495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut /* 71495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut * root hub support 72495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut */ 73495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut .hub_status_data = ohci_hub_status_data, 74495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut .hub_control = ohci_hub_control, 75495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut#ifdef CONFIG_PM 76495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut .bus_suspend = ohci_bus_suspend, 77495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut .bus_resume = ohci_bus_resume, 78495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut#endif 79495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut .start_port_reset = ohci_start_port_reset, 80495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut}; 81495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 82495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 83d35fb6417655ebf6de93e2135dc386c3c470f545Grant Likelystatic int __devinit ohci_hcd_ppc_of_probe(struct platform_device *op) 84495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut{ 8561c7a080a5a061c976988fd4b844dfb468dda255Grant Likely struct device_node *dn = op->dev.of_node; 86495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut struct usb_hcd *hcd; 87495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut struct ohci_hcd *ohci; 88495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut struct resource res; 89495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut int irq; 90495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 91495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut int rv; 92495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut int is_bigendian; 93796bcae7361c28cf825780f6f1aac9dd3411394eVitaly Bordug struct device_node *np; 94495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 95495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut if (usb_disabled()) 96495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut return -ENODEV; 97495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 98495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut is_bigendian = 9955b61fec22caa3e7872caea6c4100fc75cb8f49bStephen Rothwell of_device_is_compatible(dn, "ohci-bigendian") || 10055b61fec22caa3e7872caea6c4100fc75cb8f49bStephen Rothwell of_device_is_compatible(dn, "ohci-be"); 101495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 102495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut dev_dbg(&op->dev, "initializing PPC-OF USB Controller\n"); 103495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 104495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut rv = of_address_to_resource(dn, 0, &res); 105495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut if (rv) 106495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut return rv; 107495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 108495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut hcd = usb_create_hcd(&ohci_ppc_of_hc_driver, &op->dev, "PPC-OF USB"); 109495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut if (!hcd) 110495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut return -ENOMEM; 111495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 112495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut hcd->rsrc_start = res.start; 11328f65c11f2ffb3957259dece647a24f8ad2e241bJoe Perches hcd->rsrc_len = resource_size(&res); 114495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 115495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) { 116f45ba776da4fe6c9a9eddd42b0fd5d1f15c260f3Joe Perches printk(KERN_ERR "%s: request_mem_region failed\n", __FILE__); 117495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut rv = -EBUSY; 118495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut goto err_rmr; 119495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut } 120495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 121495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut irq = irq_of_parse_and_map(dn, 0); 122495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut if (irq == NO_IRQ) { 123f45ba776da4fe6c9a9eddd42b0fd5d1f15c260f3Joe Perches printk(KERN_ERR "%s: irq_of_parse_and_map failed\n", __FILE__); 124495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut rv = -EBUSY; 125495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut goto err_irq; 126495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut } 127495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 128495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len); 129495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut if (!hcd->regs) { 130f45ba776da4fe6c9a9eddd42b0fd5d1f15c260f3Joe Perches printk(KERN_ERR "%s: ioremap failed\n", __FILE__); 131495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut rv = -ENOMEM; 132495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut goto err_ioremap; 133495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut } 134495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 135495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut ohci = hcd_to_ohci(hcd); 1364f45426cfd6170311e116442ccd8ce0e31979237Valentine Barshak if (is_bigendian) { 137495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut ohci->flags |= OHCI_QUIRK_BE_MMIO | OHCI_QUIRK_BE_DESC; 13866ffbe490b6156898364b3f20a571a78f8d77bc8Grant Likely if (of_device_is_compatible(dn, "fsl,mpc5200-ohci")) 13966ffbe490b6156898364b3f20a571a78f8d77bc8Grant Likely ohci->flags |= OHCI_QUIRK_FRAME_NO; 1404f45426cfd6170311e116442ccd8ce0e31979237Valentine Barshak if (of_device_is_compatible(dn, "mpc5200-ohci")) 1414f45426cfd6170311e116442ccd8ce0e31979237Valentine Barshak ohci->flags |= OHCI_QUIRK_FRAME_NO; 1424f45426cfd6170311e116442ccd8ce0e31979237Valentine Barshak } 143495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 144495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut ohci_hcd_init(ohci); 145495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 146b5dd18d8747010e3f3eb1cc76a49f94291938559Yong Zhang rv = usb_add_hcd(hcd, irq, 0); 147495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut if (rv == 0) 148495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut return 0; 149495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 150796bcae7361c28cf825780f6f1aac9dd3411394eVitaly Bordug /* by now, 440epx is known to show usb_23 erratum */ 151796bcae7361c28cf825780f6f1aac9dd3411394eVitaly Bordug np = of_find_compatible_node(NULL, NULL, "ibm,usb-ehci-440epx"); 152796bcae7361c28cf825780f6f1aac9dd3411394eVitaly Bordug 153796bcae7361c28cf825780f6f1aac9dd3411394eVitaly Bordug /* Work around - At this point ohci_run has executed, the 154796bcae7361c28cf825780f6f1aac9dd3411394eVitaly Bordug * controller is running, everything, the root ports, etc., is 155796bcae7361c28cf825780f6f1aac9dd3411394eVitaly Bordug * set up. If the ehci driver is loaded, put the ohci core in 156796bcae7361c28cf825780f6f1aac9dd3411394eVitaly Bordug * the suspended state. The ehci driver will bring it out of 157796bcae7361c28cf825780f6f1aac9dd3411394eVitaly Bordug * suspended state when / if a non-high speed USB device is 158796bcae7361c28cf825780f6f1aac9dd3411394eVitaly Bordug * attached to the USB Host port. If the ehci driver is not 159796bcae7361c28cf825780f6f1aac9dd3411394eVitaly Bordug * loaded, do nothing. request_mem_region is used to test if 160796bcae7361c28cf825780f6f1aac9dd3411394eVitaly Bordug * the ehci driver is loaded. 161796bcae7361c28cf825780f6f1aac9dd3411394eVitaly Bordug */ 162796bcae7361c28cf825780f6f1aac9dd3411394eVitaly Bordug if (np != NULL) { 163796bcae7361c28cf825780f6f1aac9dd3411394eVitaly Bordug if (!of_address_to_resource(np, 0, &res)) { 164796bcae7361c28cf825780f6f1aac9dd3411394eVitaly Bordug if (!request_mem_region(res.start, 0x4, hcd_name)) { 165796bcae7361c28cf825780f6f1aac9dd3411394eVitaly Bordug writel_be((readl_be(&ohci->regs->control) | 166796bcae7361c28cf825780f6f1aac9dd3411394eVitaly Bordug OHCI_USB_SUSPEND), &ohci->regs->control); 167796bcae7361c28cf825780f6f1aac9dd3411394eVitaly Bordug (void) readl_be(&ohci->regs->control); 168796bcae7361c28cf825780f6f1aac9dd3411394eVitaly Bordug } else 169796bcae7361c28cf825780f6f1aac9dd3411394eVitaly Bordug release_mem_region(res.start, 0x4); 170796bcae7361c28cf825780f6f1aac9dd3411394eVitaly Bordug } else 171f45ba776da4fe6c9a9eddd42b0fd5d1f15c260f3Joe Perches pr_debug("%s: cannot get ehci offset from fdt\n", __FILE__); 172796bcae7361c28cf825780f6f1aac9dd3411394eVitaly Bordug } 173796bcae7361c28cf825780f6f1aac9dd3411394eVitaly Bordug 174495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut iounmap(hcd->regs); 175495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munauterr_ioremap: 176495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut irq_dispose_mapping(irq); 177495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munauterr_irq: 178495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut release_mem_region(hcd->rsrc_start, hcd->rsrc_len); 179495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munauterr_rmr: 180495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut usb_put_hcd(hcd); 181495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 182495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut return rv; 183495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut} 184495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 1852dc11581376829303b98eadb2de253bee065a56aGrant Likelystatic int ohci_hcd_ppc_of_remove(struct platform_device *op) 186495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut{ 187495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut struct usb_hcd *hcd = dev_get_drvdata(&op->dev); 188495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut dev_set_drvdata(&op->dev, NULL); 189495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 190495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut dev_dbg(&op->dev, "stopping PPC-OF USB Controller\n"); 191495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 192495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut usb_remove_hcd(hcd); 193495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 194495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut iounmap(hcd->regs); 195495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut irq_dispose_mapping(hcd->irq); 196495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut release_mem_region(hcd->rsrc_start, hcd->rsrc_len); 197495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 198495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut usb_put_hcd(hcd); 199495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 200495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut return 0; 201495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut} 202495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 203d35fb6417655ebf6de93e2135dc386c3c470f545Grant Likelystatic void ohci_hcd_ppc_of_shutdown(struct platform_device *op) 204495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut{ 205495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut struct usb_hcd *hcd = dev_get_drvdata(&op->dev); 206495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 207495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut if (hcd->driver->shutdown) 208495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut hcd->driver->shutdown(hcd); 209495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut} 210495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 211495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 212c4386ad07c318ae6188190e63b517ecc5ee3c883Németh Mártonstatic const struct of_device_id ohci_hcd_ppc_of_match[] = { 213495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut#ifdef CONFIG_USB_OHCI_HCD_PPC_OF_BE 214495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut { 215495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut .name = "usb", 216495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut .compatible = "ohci-bigendian", 217495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut }, 218495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut { 219495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut .name = "usb", 220495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut .compatible = "ohci-be", 221495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut }, 222495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut#endif 223495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut#ifdef CONFIG_USB_OHCI_HCD_PPC_OF_LE 224495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut { 225495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut .name = "usb", 226495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut .compatible = "ohci-littledian", 227495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut }, 228495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut { 229495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut .name = "usb", 230495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut .compatible = "ohci-le", 231495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut }, 232495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut#endif 233495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut {}, 234495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut}; 235495a678fc62e850d15f860d39faee07ba0a8910cSylvain MunautMODULE_DEVICE_TABLE(of, ohci_hcd_ppc_of_match); 236495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 237495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut#if !defined(CONFIG_USB_OHCI_HCD_PPC_OF_BE) && \ 238495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut !defined(CONFIG_USB_OHCI_HCD_PPC_OF_LE) 239495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut#error "No endianess selected for ppc-of-ohci" 240495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut#endif 241495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 242495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 243d35fb6417655ebf6de93e2135dc386c3c470f545Grant Likelystatic struct platform_driver ohci_hcd_ppc_of_driver = { 244495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut .probe = ohci_hcd_ppc_of_probe, 245495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut .remove = ohci_hcd_ppc_of_remove, 246495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut .shutdown = ohci_hcd_ppc_of_shutdown, 2474018294b53d1dae026880e45f174c1cc63b5d435Grant Likely .driver = { 2484018294b53d1dae026880e45f174c1cc63b5d435Grant Likely .name = "ppc-of-ohci", 2494018294b53d1dae026880e45f174c1cc63b5d435Grant Likely .owner = THIS_MODULE, 2504018294b53d1dae026880e45f174c1cc63b5d435Grant Likely .of_match_table = ohci_hcd_ppc_of_match, 251495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut }, 252495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut}; 253495a678fc62e850d15f860d39faee07ba0a8910cSylvain Munaut 254