static int create_usb_notify(void) { int ret = 0; if (u_notify) goto err; u_notify = kzalloc(sizeof(struct usb_notify), GFP_KERNEL); if (!u_notify) { pr_err("unable to allocate usb_notify\n"); ret = -ENOMEM; goto err; } u_notify->notifier_wq = create_singlethread_workqueue("usb_notify"); if (!u_notify->notifier_wq) { pr_err("%s failed to create work queue\n", __func__); ret = -ENOMEM; goto err1; } ovc_init(u_notify); return 0; err1: kfree(u_notify); err: return ret; }
static int host_notifier_probe(struct platform_device *pdev) { int ret = 0; if (pdev && pdev->dev.platform_data) ninfo.pdata = pdev->dev.platform_data; else { pr_err("host_notifier: platform_data is null.\n"); return -ENODEV; } dev_info(&pdev->dev, "notifier_probe\n"); if (ninfo.pdata->thread_enable) { ret = gpio_request(ninfo.pdata->gpio, "host_notifier"); if (ret) { dev_err(&pdev->dev, "failed to request %d\n", ninfo.pdata->gpio); return -EPERM; } gpio_direction_input(ninfo.pdata->gpio); dev_info(&pdev->dev, "gpio = %d\n", ninfo.pdata->gpio); ninfo.pdata->ndev.set_booster = host_notifier_booster; ninfo.pdata->usbhostd_start = start_usbhostd_thread; ninfo.pdata->usbhostd_stop = stop_usbhostd_thread; } else if (ninfo.pdata->irq_enable) { INIT_DELAYED_WORK(&ninfo.current_dwork, currentlimit_irq_work); schedule_delayed_work(&ninfo.current_dwork, msecs_to_jiffies(10000)); ninfo.pdata->ndev.set_booster = host_notifier_booster; ninfo.pdata->usbhostd_start = start_usbhostd_notify; ninfo.pdata->usbhostd_stop = stop_usbhostd_notify; } else { ninfo.pdata->ndev.set_booster = host_notifier_booster; ninfo.pdata->usbhostd_start = start_usbhostd_notify; ninfo.pdata->usbhostd_stop = stop_usbhostd_notify; } ret = host_notify_dev_register(&ninfo.pdata->ndev); if (ret < 0) { dev_err(&pdev->dev, "Failed to host_notify_dev_register\n"); return ret; } ovc_init(&ninfo); #if defined(CONFIG_HAS_EARLYSUSPEND) && defined(CONFIG_FAST_BOOT) early_suspend.level = EARLY_SUSPEND_LEVEL_DISABLE_FB - 1; early_suspend.suspend = host_notifier_early_suspend; early_suspend.resume = host_notifier_late_resume; register_early_suspend(&early_suspend); #endif wake_lock_init(&ninfo.wlock, WAKE_LOCK_SUSPEND, "hostd"); return 0; }