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