summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorraghavendra ambadas <rambad@codeaurora.org>2014-09-08 13:58:22 +0530
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 20:34:11 -0700
commit8f9568b4a08a3fa6d6fa40027779b9e019da2077 (patch)
tree5f745dd6370ddf9947e2f54a15f4f8e43894136b
parent6810e0099215967a02afb7dec2a1d0adb7de21ad (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.c37
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;
}