Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b8602e22 authored by Ujwal Patel's avatar Ujwal Patel Committed by Stephen Boyd
Browse files

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: default avatarUjwal Patel <ujwalp@codeaurora.org>
parent be8e8e1b
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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>;
+2 −0
Original line number Diff line number Diff line
@@ -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;
+40 −1
Original line number Diff line number Diff line
@@ -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;
	}
}
+1 −0
Original line number Diff line number Diff line
@@ -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);
+4 −1
Original line number Diff line number Diff line
@@ -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);