int dwc_peripheral_start(void *data, bool enable) { struct gadget_wrapper *d; d = gadget_wrapper; pr_info("usb: %s d->vbus=%d, enable=%d\n", __func__, d->vbus, enable); mutex_lock(&udc_lock); d->vbus = enable; if ( !d->softconnect ) { printk("usb: %s , d->softconnect is %d / udc don't start now \r\n",__func__, d->softconnect ); mutex_unlock(&udc_lock); return 0; } if(enable) { wake_lock(&usb_wake_lock); udc_enable(); dwc_otg_core_init(GET_CORE_IF(d->pcd)); dwc_otg_enable_global_interrupts(GET_CORE_IF(d->pcd)); dwc_otg_core_dev_init(GET_CORE_IF(d->pcd)); d->udc_startup = 1; } else { dwc_otg_disable_global_interrupts(GET_CORE_IF(d->pcd)); dwc_otg_clear_all_int(GET_CORE_IF(d->pcd)); dwc_otg_pcd_stop(d->pcd); udc_disable(); d->udc_startup = 0; wake_unlock(&usb_wake_lock); } mutex_unlock(&udc_lock); return 0; }
static void __udc_shutdown(void) { struct gadget_wrapper *d; d = gadget_wrapper; pr_info("USB:shutdown udc\n"); if (d->udc_startup) { dwc_otg_disable_global_interrupts(GET_CORE_IF(d->pcd)); dwc_otg_clear_all_int(GET_CORE_IF(d->pcd)); dwc_otg_pcd_stop(d->pcd); udc_disable(); d->udc_startup = 0; wake_unlock(&usb_wake_lock); } }