diff options
| author | Ujwal Patel <ujwalp@codeaurora.org> | 2013-08-07 21:52:15 -0700 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 20:19:56 -0700 |
| commit | 5338f4df646c71be7dc5c693dc25c19c4079f64b (patch) | |
| tree | bbb9b91d75b378bd936f3366ae60493d26a63cdb | |
| parent | 5d546aa4e1fad084e3fe0e8f2aa2839a6acc4753 (diff) | |
msm: mdss: Add battery FET regulator usage
During idle power-collapse using smart-panel, when PMIC chip goes to
sleep, it puts battery FET (batfet) to low power mode (LPM) which allows
less than 100mA current to be drawn. Since smart-panel is in self-refresh
mode, it can still draw more than 100mA current causing PMIC and MSM
reset. To fix this issue, batfet has to be kept in high power mode (HPM).
In order to keep batfet in HPM, display driver enables batfet regulator
whenever display panel is on.
Change-Id: I2f3d9f20fcf86b3147ac7396d56f93bfc08377c7
Signed-off-by: Ujwal Patel <ujwalp@codeaurora.org>
| -rw-r--r-- | Documentation/devicetree/bindings/fb/mdss-mdp.txt | 2 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss.h | 2 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp.c | 41 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp.h | 1 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_overlay.c | 5 |
5 files changed, 49 insertions, 2 deletions
diff --git a/Documentation/devicetree/bindings/fb/mdss-mdp.txt b/Documentation/devicetree/bindings/fb/mdss-mdp.txt index 7ba9a887925c..cdd8140768bd 100644 --- a/Documentation/devicetree/bindings/fb/mdss-mdp.txt +++ b/Documentation/devicetree/bindings/fb/mdss-mdp.txt @@ -97,6 +97,7 @@ Required properties interface blocks avaialble in hardware. Optional properties: +- batfet-supply : Phandle for battery FET regulator device node. - qcom,vbif-settings : Array with key-value pairs of constant VBIF register settings used to setup MDSS QoS for optimum performance. The key used should be offset from "vbif_phys" register @@ -163,6 +164,7 @@ Example: reg-names = "mdp_phys", "vbif_phys"; interrupts = <0 72 0>; vdd-supply = <&gdsc_mdss>; + batfet-supply = <&pm8941_chg_batif>; qcom,max-clk-rate = <320000000>; qcom,vbif-settings = <0x0004 0x00000001>, <0x00D8 0x00000707>; diff --git a/drivers/video/fbdev/msm/mdss.h b/drivers/video/fbdev/msm/mdss.h index 1d9224493a7f..e8b88a11c476 100644 --- a/drivers/video/fbdev/msm/mdss.h +++ b/drivers/video/fbdev/msm/mdss.h @@ -60,6 +60,8 @@ struct mdss_data_type { u32 mdp_rev; struct clk *mdp_clk[MDSS_MAX_CLK]; struct regulator *fs; + bool batfet_required; + struct regulator *batfet; u32 max_mdp_clk_rate; struct platform_device *pdev; diff --git a/drivers/video/fbdev/msm/mdss_mdp.c b/drivers/video/fbdev/msm/mdss_mdp.c index 2bc9d04e1336..ea382efde65a 100644 --- a/drivers/video/fbdev/msm/mdss_mdp.c +++ b/drivers/video/fbdev/msm/mdss_mdp.c @@ -1594,6 +1594,7 @@ static int mdss_mdp_parse_dt_misc(struct platform_device *pdev) struct mdss_data_type *mdata = platform_get_drvdata(pdev); u32 data; int rc; + struct property *prop = NULL; rc = of_property_read_u32(pdev->dev.of_node, "qcom,mdss-rot-block-size", &data); @@ -1605,6 +1606,9 @@ static int mdss_mdp_parse_dt_misc(struct platform_device *pdev) "qcom,mdss-has-decimation"); mdata->has_wfd_blk = of_property_read_bool(pdev->dev.of_node, "qcom,mdss-has-wfd-blk"); + prop = of_find_property(pdev->dev.of_node, "batfet-supply", NULL); + mdata->batfet_required = prop ? true : false; + return 0; } @@ -1680,6 +1684,38 @@ struct mdss_data_type *mdss_mdp_get_mdata() return mdss_res; } +void mdss_mdp_batfet_ctrl(struct mdss_data_type *mdata, int enable) +{ + int ret; + + if (!mdata->batfet_required) + return; + + if (!mdata->batfet) { + if (enable) { + mdata->batfet = devm_regulator_get(&mdata->pdev->dev, + "batfet"); + if (IS_ERR_OR_NULL(mdata->batfet)) { + pr_debug("unable to get batfet reg. rc=%d\n", + PTR_RET(mdata->batfet)); + mdata->batfet = NULL; + return; + } + } else { + pr_debug("Batfet regulator disable w/o enable\n"); + return; + } + } + + if (enable) { + ret = regulator_enable(mdata->batfet); + if (ret) + pr_err("regulator_enable failed\n"); + } else { + regulator_disable(mdata->batfet); + } +} + static void mdss_mdp_footswitch_ctrl(struct mdss_data_type *mdata, int on) { int ret; @@ -1693,13 +1729,16 @@ static void mdss_mdp_footswitch_ctrl(struct mdss_data_type *mdata, int on) ret = regulator_enable(mdata->fs); if (ret) pr_err("Footswitch failed to enable\n"); + mdss_mdp_batfet_ctrl(mdata, true); } mdata->fs_ena = true; } else { pr_debug("Disable MDP FS\n"); mdss_iommu_dettach(mdata); - if (mdata->fs_ena) + if (mdata->fs_ena) { regulator_disable(mdata->fs); + mdss_mdp_batfet_ctrl(mdata, false); + } mdata->fs_ena = false; } } diff --git a/drivers/video/fbdev/msm/mdss_mdp.h b/drivers/video/fbdev/msm/mdss_mdp.h index c4669d0045e2..ea3c52343e42 100644 --- a/drivers/video/fbdev/msm/mdss_mdp.h +++ b/drivers/video/fbdev/msm/mdss_mdp.h @@ -423,6 +423,7 @@ int mdss_mdp_set_intr_callback(u32 intr_type, u32 intf_num, void (*fnc_ptr)(void *), void *arg); void mdss_mdp_footswitch_ctrl_splash(int on); +void mdss_mdp_batfet_ctrl(struct mdss_data_type *mdata, int enable); int mdss_mdp_bus_scale_set_quota(u64 ab_quota, u64 ib_quota); void mdss_mdp_set_clk_rate(unsigned long min_clk_rate); unsigned long mdss_mdp_get_clk_rate(u32 clk_idx); diff --git a/drivers/video/fbdev/msm/mdss_mdp_overlay.c b/drivers/video/fbdev/msm/mdss_mdp_overlay.c index 4510b1689201..cf6bd615e90d 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_overlay.c +++ b/drivers/video/fbdev/msm/mdss_mdp_overlay.c @@ -728,8 +728,11 @@ static int mdss_mdp_overlay_start(struct msm_fb_data_type *mfd) int rc; struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd); - if (mdp5_data->ctl->power_on) + if (mdp5_data->ctl->power_on) { + if (!mdp5_data->mdata->batfet) + mdss_mdp_batfet_ctrl(mdp5_data->mdata, true); return 0; + } pr_debug("starting fb%d overlay\n", mfd->index); |
