Lines Matching refs:uhci
44 static int any_ports_active(struct uhci_hcd *uhci) in any_ports_active() argument
48 for (port = 0; port < uhci->rh_numports; ++port) { in any_ports_active()
49 if ((uhci_readw(uhci, USBPORTSC1 + port * 2) & in any_ports_active()
51 test_bit(port, &uhci->port_c_suspend)) in any_ports_active()
57 static inline int get_hub_status_data(struct uhci_hcd *uhci, char *buf) in get_hub_status_data() argument
72 for (port = 0; port < uhci->rh_numports; ++port) { in get_hub_status_data()
73 if ((uhci_readw(uhci, USBPORTSC1 + port * 2) & mask) || in get_hub_status_data()
74 test_bit(port, &uhci->port_c_suspend)) in get_hub_status_data()
81 status = uhci_readw(uhci, port_addr); \
85 uhci_writew(uhci, status, port_addr)
88 status = uhci_readw(uhci, port_addr); \
91 uhci_writew(uhci, status, port_addr)
96 static void uhci_finish_suspend(struct uhci_hcd *uhci, int port, in uhci_finish_suspend() argument
102 if (uhci_readw(uhci, port_addr) & SUSPEND_BITS) { in uhci_finish_suspend()
104 if (test_bit(port, &uhci->resuming_ports)) in uhci_finish_suspend()
105 set_bit(port, &uhci->port_c_suspend); in uhci_finish_suspend()
113 if (!(uhci_readw(uhci, port_addr) & SUSPEND_BITS)) in uhci_finish_suspend()
118 clear_bit(port, &uhci->resuming_ports); in uhci_finish_suspend()
119 usb_hcd_end_port_resume(&uhci_to_hcd(uhci)->self, port); in uhci_finish_suspend()
125 static void wait_for_HP(struct uhci_hcd *uhci, unsigned long port_addr) in wait_for_HP() argument
130 if (uhci_readw(uhci, port_addr) & USBPORTSC_CSC) in wait_for_HP()
137 static void uhci_check_ports(struct uhci_hcd *uhci) in uhci_check_ports() argument
143 for (port = 0; port < uhci->rh_numports; ++port) { in uhci_check_ports()
145 status = uhci_readw(uhci, port_addr); in uhci_check_ports()
147 if (time_after_eq(jiffies, uhci->ports_timeout)) { in uhci_check_ports()
153 if (uhci->wait_for_hp) in uhci_check_ports()
154 wait_for_HP(uhci, port_addr); in uhci_check_ports()
165 if (!test_bit(port, &uhci->resuming_ports)) { in uhci_check_ports()
168 set_bit(port, &uhci->resuming_ports); in uhci_check_ports()
169 uhci->ports_timeout = jiffies + in uhci_check_ports()
172 &uhci_to_hcd(uhci)->self, port); in uhci_check_ports()
176 mod_timer(&uhci_to_hcd(uhci)->rh_timer, in uhci_check_ports()
177 uhci->ports_timeout); in uhci_check_ports()
179 uhci->ports_timeout)) { in uhci_check_ports()
180 uhci_finish_suspend(uhci, port, port_addr); in uhci_check_ports()
188 struct uhci_hcd *uhci = hcd_to_uhci(hcd); in uhci_hub_status_data() local
192 spin_lock_irqsave(&uhci->lock, flags); in uhci_hub_status_data()
194 uhci_scan_schedule(uhci); in uhci_hub_status_data()
195 if (!HCD_HW_ACCESSIBLE(hcd) || uhci->dead) in uhci_hub_status_data()
197 uhci_check_ports(uhci); in uhci_hub_status_data()
199 status = get_hub_status_data(uhci, buf); in uhci_hub_status_data()
201 switch (uhci->rh_state) { in uhci_hub_status_data()
204 if (status || uhci->resuming_ports) { in uhci_hub_status_data()
213 wakeup_rh(uhci); in uhci_hub_status_data()
218 if (!any_ports_active(uhci)) { in uhci_hub_status_data()
219 uhci->rh_state = UHCI_RH_RUNNING_NODEVS; in uhci_hub_status_data()
220 uhci->auto_stop_time = jiffies + HZ; in uhci_hub_status_data()
226 if (any_ports_active(uhci)) in uhci_hub_status_data()
227 uhci->rh_state = UHCI_RH_RUNNING; in uhci_hub_status_data()
228 else if (time_after_eq(jiffies, uhci->auto_stop_time) && in uhci_hub_status_data()
229 !uhci->wait_for_hp) in uhci_hub_status_data()
230 suspend_rh(uhci, UHCI_RH_AUTO_STOPPED); in uhci_hub_status_data()
238 spin_unlock_irqrestore(&uhci->lock, flags); in uhci_hub_status_data()
246 struct uhci_hcd *uhci = hcd_to_uhci(hcd); in uhci_hub_control() local
253 if (!HCD_HW_ACCESSIBLE(hcd) || uhci->dead) in uhci_hub_control()
256 spin_lock_irqsave(&uhci->lock, flags); in uhci_hub_control()
264 if (port >= uhci->rh_numports) in uhci_hub_control()
267 uhci_check_ports(uhci); in uhci_hub_control()
268 status = uhci_readw(uhci, port_addr); in uhci_hub_control()
274 if (uhci->oc_low) in uhci_hub_control()
286 if (test_bit(port, &uhci->port_c_suspend)) { in uhci_hub_control()
290 if (test_bit(port, &uhci->resuming_ports)) in uhci_hub_control()
310 dev_dbg(uhci_dev(uhci), "port %d portsc %04x,%02x\n", in uhci_hub_control()
328 if (port >= uhci->rh_numports) in uhci_hub_control()
339 uhci_finish_suspend(uhci, port, port_addr); in uhci_hub_control()
342 uhci->ports_timeout = jiffies + in uhci_hub_control()
353 if (port >= uhci->rh_numports) in uhci_hub_control()
361 uhci_finish_suspend(uhci, port, port_addr); in uhci_hub_control()
367 if (!(uhci_readw(uhci, port_addr) & USBPORTSC_SUSP)) { in uhci_hub_control()
370 uhci_finish_suspend(uhci, port, port_addr); in uhci_hub_control()
372 &uhci->resuming_ports)) { in uhci_hub_control()
379 if (!(uhci_readw(uhci, port_addr) & in uhci_hub_control()
381 uhci_finish_suspend(uhci, port, in uhci_hub_control()
385 uhci->ports_timeout = jiffies + in uhci_hub_control()
390 clear_bit(port, &uhci->port_c_suspend); in uhci_hub_control()
412 buf[2] = uhci->rh_numports; in uhci_hub_control()
418 spin_unlock_irqrestore(&uhci->lock, flags); in uhci_hub_control()