uhci-hcd.c (9faa091a409851ac6b3812164d53644074bc89b1) | uhci-hcd.c (d3219d1c4c9ab7cd959f8f294420faf5f936cf55) |
---|---|
1/* 2 * Universal Host Controller Interface driver for USB. 3 * 4 * Maintainer: Alan Stern <stern@rowland.harvard.edu> 5 * 6 * (C) Copyright 1999 Linus Torvalds 7 * (C) Copyright 1999-2002 Johannes Erdfelt, johannes@erdfelt.com 8 * (C) Copyright 1999 Randy Dunlap --- 153 unchanged lines hidden (view full) --- 162 * can we be sure of its previous state. 163 */ 164static void check_and_reset_hc(struct uhci_hcd *uhci) 165{ 166 if (uhci->check_and_reset_hc(uhci)) 167 finish_reset(uhci); 168} 169 | 1/* 2 * Universal Host Controller Interface driver for USB. 3 * 4 * Maintainer: Alan Stern <stern@rowland.harvard.edu> 5 * 6 * (C) Copyright 1999 Linus Torvalds 7 * (C) Copyright 1999-2002 Johannes Erdfelt, johannes@erdfelt.com 8 * (C) Copyright 1999 Randy Dunlap --- 153 unchanged lines hidden (view full) --- 162 * can we be sure of its previous state. 163 */ 164static void check_and_reset_hc(struct uhci_hcd *uhci) 165{ 166 if (uhci->check_and_reset_hc(uhci)) 167 finish_reset(uhci); 168} 169 |
170#if defined(CONFIG_USB_UHCI_SUPPORT_NON_PCI_HC) |
|
170/* | 171/* |
172 * The two functions below are generic reset functions that are used on systems 173 * that do not have keyboard and mouse legacy support. We assume that we are 174 * running on such a system if CONFIG_USB_UHCI_SUPPORT_NON_PCI_HC is defined. 175 */ 176 177/* 178 * Make sure the controller is completely inactive, unable to 179 * generate interrupts or do DMA. 180 */ 181static void uhci_generic_reset_hc(struct uhci_hcd *uhci) 182{ 183 /* Reset the HC - this will force us to get a 184 * new notification of any already connected 185 * ports due to the virtual disconnect that it 186 * implies. 187 */ 188 uhci_writew(uhci, USBCMD_HCRESET, USBCMD); 189 mb(); 190 udelay(5); 191 if (uhci_readw(uhci, USBCMD) & USBCMD_HCRESET) 192 dev_warn(uhci_dev(uhci), "HCRESET not completed yet!\n"); 193 194 /* Just to be safe, disable interrupt requests and 195 * make sure the controller is stopped. 196 */ 197 uhci_writew(uhci, 0, USBINTR); 198 uhci_writew(uhci, 0, USBCMD); 199} 200 201/* 202 * Initialize a controller that was newly discovered or has just been 203 * resumed. In either case we can't be sure of its previous state. 204 * 205 * Returns: 1 if the controller was reset, 0 otherwise. 206 */ 207static int uhci_generic_check_and_reset_hc(struct uhci_hcd *uhci) 208{ 209 unsigned int cmd, intr; 210 211 /* 212 * When restarting a suspended controller, we expect all the 213 * settings to be the same as we left them: 214 * 215 * Controller is stopped and configured with EGSM set; 216 * No interrupts enabled except possibly Resume Detect. 217 * 218 * If any of these conditions are violated we do a complete reset. 219 */ 220 221 cmd = uhci_readw(uhci, USBCMD); 222 if ((cmd & USBCMD_RS) || !(cmd & USBCMD_CF) || !(cmd & USBCMD_EGSM)) { 223 dev_dbg(uhci_dev(uhci), "%s: cmd = 0x%04x\n", 224 __func__, cmd); 225 goto reset_needed; 226 } 227 228 intr = uhci_readw(uhci, USBINTR); 229 if (intr & (~USBINTR_RESUME)) { 230 dev_dbg(uhci_dev(uhci), "%s: intr = 0x%04x\n", 231 __func__, intr); 232 goto reset_needed; 233 } 234 return 0; 235 236reset_needed: 237 dev_dbg(uhci_dev(uhci), "Performing full reset\n"); 238 uhci_generic_reset_hc(uhci); 239 return 1; 240} 241#endif /* CONFIG_USB_UHCI_SUPPORT_NON_PCI_HC */ 242 243/* |
|
171 * Store the basic register settings needed by the controller. 172 */ 173static void configure_hc(struct uhci_hcd *uhci) 174{ 175 /* Set the frame length to the default: 1 ms exactly */ 176 uhci_writeb(uhci, USBSOF_DEFAULT, USBSOF); 177 178 /* Store the frame list base address */ --- 645 unchanged lines hidden --- | 244 * Store the basic register settings needed by the controller. 245 */ 246static void configure_hc(struct uhci_hcd *uhci) 247{ 248 /* Set the frame length to the default: 1 ms exactly */ 249 uhci_writeb(uhci, USBSOF_DEFAULT, USBSOF); 250 251 /* Store the frame list base address */ --- 645 unchanged lines hidden --- |