From 3ab1aa98ffecd08b7559eecc0e2dde2f1057f8db Mon Sep 17 00:00:00 2001 From: yi-hsin_hung Date: Tue, 2 Apr 2013 13:36:22 +0800 Subject: [PATCH] drivers: usb: otg: fix workqueue init race condition Initialize workqueues for the pins ACOK and USB ID before the IRQs are requested. This is to make sure workqueues are ready when IRQ occurs. Change-Id: I45daa32f40d114588f6bbcfac0ffdd433f6b6865 Signed-off-by: yi-hsin_hung Signed-off-by: Iliyan Malchev --- drivers/usb/otg/msm_otg.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/drivers/usb/otg/msm_otg.c b/drivers/usb/otg/msm_otg.c index fab47306749..0d022d63111 100755 --- a/drivers/usb/otg/msm_otg.c +++ b/drivers/usb/otg/msm_otg.c @@ -3197,6 +3197,10 @@ static void msm_otg_acok_init(struct msm_otg *motg) unsigned gpio = APQ_AP_ACOK; unsigned irq_num = gpio_to_irq(gpio); + msm_otg_acok_wq = create_singlethread_workqueue("msm_otg_acok_wq"); + INIT_DELAYED_WORK_DEFERRABLE(&motg->acok_irq_work, + acok_irq_work_function); + err = gpio_request(gpio, "msm_otg_ap_acok"); if (err) { printk("gpio %d request failed \n", gpio); @@ -3232,6 +3236,10 @@ static void msm_otg_id_pin_init(struct msm_otg *motg) unsigned gpio = APQ_OTG_ID_PIN; unsigned irq_num = gpio_to_irq(gpio); + msm_otg_id_pin_wq = create_singlethread_workqueue("msm_otg_id_pin_wq"); + INIT_DELAYED_WORK_DEFERRABLE(&motg->id_pin_irq_work, + id_pin_irq_work_function); + err = gpio_request(gpio, "msm_otg_id_pin"); if (err) { printk("gpio %d request failed \n", gpio); @@ -4015,12 +4023,7 @@ static int __init msm_otg_probe(struct platform_device *pdev) motg->mA_port = IUNIT; msm_otg_acok_init(motg); - msm_otg_acok_wq = create_singlethread_workqueue("msm_otg_acok_wq"); - INIT_DELAYED_WORK_DEFERRABLE(&motg->acok_irq_work, acok_irq_work_function); - msm_otg_id_pin_init(motg); - msm_otg_id_pin_wq = create_singlethread_workqueue("msm_otg_id_pin_wq"); - INIT_DELAYED_WORK_DEFERRABLE(&motg->id_pin_irq_work, id_pin_irq_work_function); ret = msm_otg_debugfs_init(motg); if (ret)