diff options
author | Suresh Mangipudi <smangipudi@nvidia.com> | 2011-11-04 10:44:38 +0530 |
---|---|---|
committer | Varun Colbert <vcolbert@nvidia.com> | 2011-11-07 13:46:12 -0800 |
commit | 1ee21262c9bfcef00a135b8e500709b2f717cf89 (patch) | |
tree | 5d7923b02ce67f48d0e02cb794b40bad217346da /drivers | |
parent | 6eb5f6192adf8ee996ba51b3d20bc26d1d9e9640 (diff) |
usb: gadget: fsl_udc_core: Fix race with vbus regulator
vbus regulator init should be done before the otg is set, once otg is
set otg calls the fsl_vbus_session while the fsl_udc_probe is still
under execution, causing a crash in the regulator code, as the regulator
is not set to NULL.
Reviewed-on: http://git-master/r/60167
(cherry picked from commit 594dd8dbaa6bf62f1859c54d58362ec12fa71a56)
Change-Id: I6adccb43f7859d5097257f441199b02a86b9fc66
Reviewed-on: http://git-master/r/62337
Reviewed-by: Suresh Mangipudi <smangipudi@nvidia.com>
Tested-by: Suresh Mangipudi <smangipudi@nvidia.com>
Reviewed-by: Venkat Moganty <vmoganty@nvidia.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/usb/gadget/fsl_udc_core.c | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/drivers/usb/gadget/fsl_udc_core.c b/drivers/usb/gadget/fsl_udc_core.c index 77e50edc6270..8aeb8cdae24a 100644 --- a/drivers/usb/gadget/fsl_udc_core.c +++ b/drivers/usb/gadget/fsl_udc_core.c @@ -2882,6 +2882,16 @@ static int __init fsl_udc_probe(struct platform_device *pdev) INIT_DELAYED_WORK(&udc_controller->work, fsl_udc_charger_detect_work); INIT_WORK(&udc_controller->charger_work, fsl_udc_set_current_limit_work); + /* Get the regulator for drawing the vbus current in udc driver */ + udc_controller->vbus_regulator = regulator_get(NULL, "usb_bat_chg"); + if (IS_ERR(udc_controller->vbus_regulator)) { + dev_err(&pdev->dev, + "can't get charge regulator,err:%ld\n", + PTR_ERR(udc_controller->vbus_regulator)); + udc_controller->vbus_regulator = NULL; + } + + #ifdef CONFIG_USB_OTG_UTILS udc_controller->transceiver = otg_get_transceiver(); if (udc_controller->transceiver) { @@ -2900,15 +2910,6 @@ static int __init fsl_udc_probe(struct platform_device *pdev) #endif #endif - /* Get the regulator for drawing the vbus current in udc driver */ - udc_controller->vbus_regulator = regulator_get(NULL, "usb_bat_chg"); - if (IS_ERR(udc_controller->vbus_regulator)) { - dev_err(&pdev->dev, - "can't get charge regulator,err:%ld\n", - PTR_ERR(udc_controller->vbus_regulator)); - udc_controller->vbus_regulator = NULL; - } - return 0; err_unregister: |