diff options
| author | raghavendra ambadas <rambad@codeaurora.org> | 2014-09-08 13:58:22 +0530 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 20:34:11 -0700 |
| commit | 8f9568b4a08a3fa6d6fa40027779b9e019da2077 (patch) | |
| tree | 5f745dd6370ddf9947e2f54a15f4f8e43894136b | |
| parent | 6810e0099215967a02afb7dec2a1d0adb7de21ad (diff) | |
msm: mhl: sii8334: Fix null pointer dereference at power off
Check for null pointer before disabling the regulators.
During cable connect/disconnect and suspend/resume check for
previous power state of mhl to avoid enabling/disabling gpio's
and regulators twice.
Change-Id: I44dc51122da4630974147b829236cb39c1ad54b0
Signed-off-by: Raghavendra Ambadas <rambad@codeaurora.org>
| -rw-r--r-- | drivers/video/fbdev/msm/mhl_sii8334.c | 37 |
1 files changed, 22 insertions, 15 deletions
diff --git a/drivers/video/fbdev/msm/mhl_sii8334.c b/drivers/video/fbdev/msm/mhl_sii8334.c index 650f7675b331..18bec44a1ba3 100644 --- a/drivers/video/fbdev/msm/mhl_sii8334.c +++ b/drivers/video/fbdev/msm/mhl_sii8334.c @@ -399,7 +399,7 @@ static int mhl_sii_config(struct mhl_tx_ctrl *mhl_ctrl, bool on) client = mhl_ctrl->i2c_handle; - if (on) { + if (on && !mhl_ctrl->irq_req_done) { rc = mhl_vreg_config(mhl_ctrl, 1); if (rc) { pr_err("%s: vreg init failed [%d]\n", @@ -424,7 +424,7 @@ static int mhl_sii_config(struct mhl_tx_ctrl *mhl_ctrl, bool on) } else { mhl_ctrl->irq_req_done = true; } - } else { + } else if (!on && mhl_ctrl->irq_req_done) { free_irq(mhl_ctrl->i2c_handle->irq, mhl_ctrl); mhl_gpio_config(mhl_ctrl, 0); mhl_vreg_config(mhl_ctrl, 0); @@ -1533,22 +1533,29 @@ static int mhl_sii_reg_config(struct i2c_client *client, bool enable) pr_debug("%s\n", __func__); if (!enable) { - regulator_disable(reg_8941_vdda); - regulator_put(reg_8941_vdda); - reg_8941_vdda = NULL; - - regulator_disable(reg_8941_smps3a); - regulator_put(reg_8941_smps3a); - reg_8941_smps3a = NULL; + if (reg_8941_vdda) { + regulator_disable(reg_8941_vdda); + regulator_put(reg_8941_vdda); + reg_8941_vdda = NULL; + } - regulator_disable(reg_8941_l02); - regulator_put(reg_8941_l02); - reg_8941_l02 = NULL; + if (reg_8941_smps3a) { + regulator_disable(reg_8941_smps3a); + regulator_put(reg_8941_smps3a); + reg_8941_smps3a = NULL; + } - regulator_disable(reg_8941_l24); - regulator_put(reg_8941_l24); - reg_8941_l24 = NULL; + if (reg_8941_l02) { + regulator_disable(reg_8941_l02); + regulator_put(reg_8941_l02); + reg_8941_l02 = NULL; + } + if (reg_8941_l24) { + regulator_disable(reg_8941_l24); + regulator_put(reg_8941_l24); + reg_8941_l24 = NULL; + } return 0; } |
