xref: /linux/drivers/usb/host/ohci-pci.c (revision 858259cf7d1c443c836a2022b78cb281f0a9b95e)
1 /*
2  * OHCI HCD (Host Controller Driver) for USB.
3  *
4  * (C) Copyright 1999 Roman Weissgaerber <weissg@vienna.at>
5  * (C) Copyright 2000-2002 David Brownell <dbrownell@users.sourceforge.net>
6  *
7  * [ Initialisation is based on Linus'  ]
8  * [ uhci code and gregs ohci fragments ]
9  * [ (C) Copyright 1999 Linus Torvalds  ]
10  * [ (C) Copyright 1999 Gregory P. Smith]
11  *
12  * PCI Bus Glue
13  *
14  * This file is licenced under the GPL.
15  */
16 
17 #include <linux/jiffies.h>
18 
19 #ifdef CONFIG_PPC_PMAC
20 #include <asm/machdep.h>
21 #include <asm/pmac_feature.h>
22 #include <asm/pci-bridge.h>
23 #include <asm/prom.h>
24 #endif
25 
26 #ifndef CONFIG_PCI
27 #error "This file is PCI bus glue.  CONFIG_PCI must be defined."
28 #endif
29 
30 /*-------------------------------------------------------------------------*/
31 
32 static int
33 ohci_pci_reset (struct usb_hcd *hcd)
34 {
35 	struct ohci_hcd	*ohci = hcd_to_ohci (hcd);
36 
37 	ohci_hcd_init (ohci);
38 	return ohci_init (ohci);
39 }
40 
41 static int __devinit
42 ohci_pci_start (struct usb_hcd *hcd)
43 {
44 	struct ohci_hcd	*ohci = hcd_to_ohci (hcd);
45 	int		ret;
46 
47 	if(hcd->self.controller && hcd->self.controller->bus == &pci_bus_type) {
48 		struct pci_dev *pdev = to_pci_dev(hcd->self.controller);
49 
50 		/* AMD 756, for most chips (early revs), corrupts register
51 		 * values on read ... so enable the vendor workaround.
52 		 */
53 		if (pdev->vendor == PCI_VENDOR_ID_AMD
54 				&& pdev->device == 0x740c) {
55 			ohci->flags = OHCI_QUIRK_AMD756;
56 			ohci_dbg (ohci, "AMD756 erratum 4 workaround\n");
57 			// also somewhat erratum 10 (suspend/resume issues)
58 		}
59 
60 		/* FIXME for some of the early AMD 760 southbridges, OHCI
61 		 * won't work at all.  blacklist them.
62 		 */
63 
64 		/* Apple's OHCI driver has a lot of bizarre workarounds
65 		 * for this chip.  Evidently control and bulk lists
66 		 * can get confused.  (B&W G3 models, and ...)
67 		 */
68 		else if (pdev->vendor == PCI_VENDOR_ID_OPTI
69 				&& pdev->device == 0xc861) {
70 			ohci_dbg (ohci,
71 				"WARNING: OPTi workarounds unavailable\n");
72 		}
73 
74 		/* Check for NSC87560. We have to look at the bridge (fn1) to
75 		 * identify the USB (fn2). This quirk might apply to more or
76 		 * even all NSC stuff.
77 		 */
78 		else if (pdev->vendor == PCI_VENDOR_ID_NS) {
79 			struct pci_dev	*b;
80 
81 			b  = pci_find_slot (pdev->bus->number,
82 					PCI_DEVFN (PCI_SLOT (pdev->devfn), 1));
83 			if (b && b->device == PCI_DEVICE_ID_NS_87560_LIO
84 					&& b->vendor == PCI_VENDOR_ID_NS) {
85 				ohci->flags |= OHCI_QUIRK_SUPERIO;
86 				ohci_dbg (ohci, "Using NSC SuperIO setup\n");
87 			}
88 		}
89 
90 		/* Check for Compaq's ZFMicro chipset, which needs short
91 		 * delays before control or bulk queues get re-activated
92 		 * in finish_unlinks()
93 		 */
94 		else if (pdev->vendor == PCI_VENDOR_ID_COMPAQ
95 				&& pdev->device  == 0xa0f8) {
96 			ohci->flags |= OHCI_QUIRK_ZFMICRO;
97 			ohci_dbg (ohci,
98 				"enabled Compaq ZFMicro chipset quirk\n");
99 		}
100 	}
101 
102 	/* NOTE: there may have already been a first reset, to
103 	 * keep bios/smm irqs from making trouble
104 	 */
105 	if ((ret = ohci_run (ohci)) < 0) {
106 		ohci_err (ohci, "can't start\n");
107 		ohci_stop (hcd);
108 		return ret;
109 	}
110 	return 0;
111 }
112 
113 #ifdef	CONFIG_PM
114 
115 static int ohci_pci_suspend (struct usb_hcd *hcd, pm_message_t message)
116 {
117 	/* root hub was already suspended */
118 
119 	/* FIXME these PMAC things get called in the wrong places.  ASIC
120 	 * clocks should be turned off AFTER entering D3, and on BEFORE
121 	 * trying to enter D0.  Evidently the PCI layer doesn't currently
122 	 * provide the right sort of platform hooks for this ...
123 	 */
124 #ifdef CONFIG_PPC_PMAC
125 	if (_machine == _MACH_Pmac) {
126 	   	struct device_node	*of_node;
127 
128 		/* Disable USB PAD & cell clock */
129 		of_node = pci_device_to_OF_node (to_pci_dev(hcd->self.controller));
130 		if (of_node)
131 			pmac_call_feature(PMAC_FTR_USB_ENABLE, of_node, 0, 0);
132 	}
133 #endif /* CONFIG_PPC_PMAC */
134 	return 0;
135 }
136 
137 
138 static int ohci_pci_resume (struct usb_hcd *hcd)
139 {
140 #ifdef CONFIG_PPC_PMAC
141 	if (_machine == _MACH_Pmac) {
142 		struct device_node *of_node;
143 
144 		/* Re-enable USB PAD & cell clock */
145 		of_node = pci_device_to_OF_node (to_pci_dev(hcd->self.controller));
146 		if (of_node)
147 			pmac_call_feature (PMAC_FTR_USB_ENABLE, of_node, 0, 1);
148 	}
149 #endif /* CONFIG_PPC_PMAC */
150 
151 	usb_hcd_resume_root_hub(hcd);
152 	return 0;
153 }
154 
155 #endif	/* CONFIG_PM */
156 
157 
158 /*-------------------------------------------------------------------------*/
159 
160 static const struct hc_driver ohci_pci_hc_driver = {
161 	.description =		hcd_name,
162 	.product_desc =		"OHCI Host Controller",
163 	.hcd_priv_size =	sizeof(struct ohci_hcd),
164 
165 	/*
166 	 * generic hardware linkage
167 	 */
168 	.irq =			ohci_irq,
169 	.flags =		HCD_MEMORY | HCD_USB11,
170 
171 	/*
172 	 * basic lifecycle operations
173 	 */
174 	.reset =		ohci_pci_reset,
175 	.start =		ohci_pci_start,
176 #ifdef	CONFIG_PM
177 	.suspend =		ohci_pci_suspend,
178 	.resume =		ohci_pci_resume,
179 #endif
180 	.stop =			ohci_stop,
181 
182 	/*
183 	 * managing i/o requests and associated device resources
184 	 */
185 	.urb_enqueue =		ohci_urb_enqueue,
186 	.urb_dequeue =		ohci_urb_dequeue,
187 	.endpoint_disable =	ohci_endpoint_disable,
188 
189 	/*
190 	 * scheduling support
191 	 */
192 	.get_frame_number =	ohci_get_frame,
193 
194 	/*
195 	 * root hub support
196 	 */
197 	.hub_status_data =	ohci_hub_status_data,
198 	.hub_control =		ohci_hub_control,
199 #ifdef	CONFIG_PM
200 	.bus_suspend =		ohci_bus_suspend,
201 	.bus_resume =		ohci_bus_resume,
202 #endif
203 	.start_port_reset =	ohci_start_port_reset,
204 };
205 
206 /*-------------------------------------------------------------------------*/
207 
208 
209 static const struct pci_device_id pci_ids [] = { {
210 	/* handle any USB OHCI controller */
211 	PCI_DEVICE_CLASS((PCI_CLASS_SERIAL_USB << 8) | 0x10, ~0),
212 	.driver_data =	(unsigned long) &ohci_pci_hc_driver,
213 	}, { /* end: all zeroes */ }
214 };
215 MODULE_DEVICE_TABLE (pci, pci_ids);
216 
217 /* pci driver glue; this is a "new style" PCI driver module */
218 static struct pci_driver ohci_pci_driver = {
219 	.name =		(char *) hcd_name,
220 	.id_table =	pci_ids,
221 	.owner =	THIS_MODULE,
222 
223 	.probe =	usb_hcd_pci_probe,
224 	.remove =	usb_hcd_pci_remove,
225 
226 #ifdef	CONFIG_PM
227 	.suspend =	usb_hcd_pci_suspend,
228 	.resume =	usb_hcd_pci_resume,
229 #endif
230 };
231 
232 
233 static int __init ohci_hcd_pci_init (void)
234 {
235 	printk (KERN_DEBUG "%s: " DRIVER_INFO " (PCI)\n", hcd_name);
236 	if (usb_disabled())
237 		return -ENODEV;
238 
239 	pr_debug ("%s: block sizes: ed %Zd td %Zd\n", hcd_name,
240 		sizeof (struct ed), sizeof (struct td));
241 	return pci_register_driver (&ohci_pci_driver);
242 }
243 module_init (ohci_hcd_pci_init);
244 
245 /*-------------------------------------------------------------------------*/
246 
247 static void __exit ohci_hcd_pci_cleanup (void)
248 {
249 	pci_unregister_driver (&ohci_pci_driver);
250 }
251 module_exit (ohci_hcd_pci_cleanup);
252