summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Documentation/devicetree/bindings/fb/mdss-mdp.txt2
-rw-r--r--drivers/video/fbdev/msm/mdss.h2
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp.c41
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp.h1
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_overlay.c5
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);