static int do_adb_reset_bus(void) { int ret, nret; if (adb_controller == NULL) return -ENXIO; if (adb_controller->autopoll) adb_controller->autopoll(0); nret = blocking_notifier_call_chain(&adb_client_list, ADB_MSG_PRE_RESET, NULL); if (nret & NOTIFY_STOP_MASK) { if (adb_controller->autopoll) adb_controller->autopoll(autopoll_devs); return -EBUSY; } if (sleepy_trackpad) { /* Let the trackpad settle down */ adb_wait_ms(500); } down(&adb_handler_sem); write_lock_irq(&adb_handler_lock); memset(adb_handler, 0, sizeof(adb_handler)); write_unlock_irq(&adb_handler_lock); /* That one is still a bit synchronous, oh well... */ if (adb_controller->reset_bus) ret = adb_controller->reset_bus(); else ret = 0; if (sleepy_trackpad) { /* Let the trackpad settle down */ adb_wait_ms(1500); } if (!ret) { autopoll_devs = adb_scan_bus(); if (adb_controller->autopoll) adb_controller->autopoll(autopoll_devs); } up(&adb_handler_sem); nret = blocking_notifier_call_chain(&adb_client_list, ADB_MSG_POST_RESET, NULL); if (nret & NOTIFY_STOP_MASK) return -EBUSY; return ret; }
int adb_reset_bus(void) { int ret, nret, devs; unsigned long flags; if (adb_controller == NULL) return -ENXIO; if (adb_controller->autopoll) adb_controller->autopoll(0); nret = notifier_call_chain(&adb_client_list, ADB_MSG_PRE_RESET, NULL); if (nret & NOTIFY_STOP_MASK) { if (adb_controller->autopoll) adb_controller->autopoll(devs); return -EBUSY; } save_flags(flags); cli(); memset(adb_handler, 0, sizeof(adb_handler)); restore_flags(flags); if (adb_controller->reset_bus) ret = adb_controller->reset_bus(); else ret = 0; if (!ret) { devs = adb_scan_bus(); if (adb_controller->autopoll) adb_controller->autopoll(devs); } nret = notifier_call_chain(&adb_client_list, ADB_MSG_POST_RESET, NULL); if (nret & NOTIFY_STOP_MASK) return -EBUSY; return ret; }