diff options
| -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); |
