From b4f3bd79a358545dacf84261e2602fe5a578c96b Mon Sep 17 00:00:00 2001 From: Deepak Katragadda Date: Mon, 27 Oct 2014 15:31:26 -0700 Subject: [PATCH] msm: mdss: Unregister the regulator notifier when mdss_mdp probe fails Currently, when mdss_mdp probe fails after registering for regulator notifications, the regulator_unregister_notifier function is not called. Because of this, when the regulator has some state change now, the notification call fails. Change-Id: I2a41029aa145f88477701ab75a6e30883d2c4017 Signed-off-by: Deepak Katragadda --- drivers/video/fbdev/msm/mdss.h | 1 + drivers/video/fbdev/msm/mdss_mdp.c | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/drivers/video/fbdev/msm/mdss.h b/drivers/video/fbdev/msm/mdss.h index 07f3e86522c6..b0739ec74405 100644 --- a/drivers/video/fbdev/msm/mdss.h +++ b/drivers/video/fbdev/msm/mdss.h @@ -263,6 +263,7 @@ struct mdss_data_type { u32 latency_buff_per; atomic_t active_intf_cnt; bool has_rot_dwnscale; + bool regulator_notif_register; u64 ab[MDSS_MAX_BUS_CLIENTS]; u64 ib[MDSS_MAX_BUS_CLIENTS]; diff --git a/drivers/video/fbdev/msm/mdss_mdp.c b/drivers/video/fbdev/msm/mdss_mdp.c index c60298e337b1..08e9b671e958 100644 --- a/drivers/video/fbdev/msm/mdss_mdp.c +++ b/drivers/video/fbdev/msm/mdss_mdp.c @@ -912,6 +912,8 @@ static int mdss_mdp_irq_clk_setup(struct mdss_data_type *mdata) mdata->gdsc_cb.priority = 5; if (regulator_register_notifier(mdata->fs, &(mdata->gdsc_cb))) pr_warn("GDSC notification registration failed!\n"); + else + mdata->regulator_notif_register = true; mdata->vdd_cx = devm_regulator_get(&mdata->pdev->dev, "vdd-cx"); @@ -1571,6 +1573,9 @@ static int mdss_mdp_probe(struct platform_device *pdev) mdss_res->mdss_util->mdp_probe_done = true; probe_done: if (IS_ERR_VALUE(rc)) { + if (mdata->regulator_notif_register) + regulator_unregister_notifier(mdata->fs, + &(mdata->gdsc_cb)); mdss_mdp_hw.ptr = NULL; mdss_mdp_pp_term(&pdev->dev); mutex_destroy(&mdata->reg_lock); @@ -3186,6 +3191,8 @@ static int mdss_mdp_remove(struct platform_device *pdev) mdss_mdp_pp_term(&pdev->dev); mdss_mdp_bus_scale_unregister(mdata); mdss_debugfs_remove(mdata); + if (mdata->regulator_notif_register) + regulator_unregister_notifier(mdata->fs, &(mdata->gdsc_cb)); return 0; }