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

Commit 97c3cbbe authored by Chandan Uddaraju's avatar Chandan Uddaraju Committed by Gerrit - the friendly Code Review server
Browse files

msm: mdss: add support to configure svs voltage on cx rail



For dsi panels, we observe display fading issue
on few of the existing hardware version when the
cx power rail goes to svs voltage. Add support to
vote for the cx regulator in mdp driver if needed
and control the voltage to avoid any
display fading issues.

Change-Id: I0ea98d46ec1464b9311fe2a5364499e27975651f
Signed-off-by: default avatarChandan Uddaraju <chandanu@codeaurora.org>
parent d2508db8
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -426,6 +426,8 @@ Fudge Factors: Fudge factors are used to boost demand for
				that a single pipe can support without underflow.
- qcom,mdss-has-panic-ctrl: Boolean property to indicate if panic/robust signal
				control feature is available or not.
- qcom,mdss-en-svs-high: Boolean property to indicate if this target needs to
				enable the svs high voltage level for CX rail.
- qcom,mdss-pipe-vig-panic-ctrl-offsets: Array of panic/robust signal offsets
				corresponding to the respective VIG pipes.
				Number of signal offsets should match the
+1 −0
Original line number Diff line number Diff line
@@ -132,6 +132,7 @@ struct mdss_data_type {
	struct regulator *vdd_cx;
	bool batfet_required;
	struct regulator *batfet;
	bool en_svs_high;
	u32 max_mdp_clk_rate;
	struct mdss_util_intf *mdss_util;

+61 −0
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@
#include <linux/msm-bus.h>
#include <linux/msm-bus-board.h>
#include <soc/qcom/scm.h>
#include <soc/qcom/rpm-smd.h>

#include "mdss.h"
#include "mdss_fb.h"
@@ -2702,6 +2703,10 @@ static int mdss_mdp_parse_dt_misc(struct platform_device *pdev)

	prop = of_find_property(pdev->dev.of_node, "batfet-supply", NULL);
	mdata->batfet_required = prop ? true : false;
	mdata->en_svs_high = of_property_read_bool(pdev->dev.of_node,
		"qcom,mdss-en-svs-high");
	if (!mdata->en_svs_high)
		pr_debug("%s: svs_high is not enabled\n", __func__);
	rc = of_property_read_u32(pdev->dev.of_node,
		 "qcom,mdss-highest-bank-bit", &(mdata->highest_bank_bit));
	if (rc)
@@ -3204,6 +3209,58 @@ exit:
	return;
}

#define RPM_MISC_REQ_TYPE 0x6373696d
#define RPM_MISC_REQ_SVS_PLUS_KEY 0x2B737673

static void mdss_mdp_config_cx_voltage(struct mdss_data_type *mdata, int enable)
{
	int ret = 0;
	static struct msm_rpm_kvp rpm_kvp;
	static uint8_t svs_en;

	if (!mdata->en_svs_high)
		return;

	if (!rpm_kvp.key) {
		rpm_kvp.key = RPM_MISC_REQ_SVS_PLUS_KEY;
		rpm_kvp.length = sizeof(unsigned);
		pr_debug("%s: Initialized rpm_kvp structure\n", __func__);
	}

	if (enable) {
		svs_en = 1;
		rpm_kvp.data = &svs_en;
		pr_debug("%s: voting for svs high\n", __func__);
		ret = msm_rpm_send_message(MSM_RPM_CTX_ACTIVE_SET,
					RPM_MISC_REQ_TYPE, 0,
					&rpm_kvp, 1);
		if (ret)
			pr_err("vote for active_set svs high failed: %d\n",
					ret);
		ret = msm_rpm_send_message(MSM_RPM_CTX_SLEEP_SET,
					RPM_MISC_REQ_TYPE, 0,
					&rpm_kvp, 1);
		if (ret)
			pr_err("vote for sleep_set svs high failed: %d\n",
					ret);
	} else {
		svs_en = 0;
		rpm_kvp.data = &svs_en;
		pr_debug("%s: Removing vote for svs high\n", __func__);
		ret = msm_rpm_send_message(MSM_RPM_CTX_ACTIVE_SET,
					RPM_MISC_REQ_TYPE, 0,
					&rpm_kvp, 1);
		if (ret)
			pr_err("Remove vote:active_set svs high failed: %d\n",
					ret);
		ret = msm_rpm_send_message(MSM_RPM_CTX_SLEEP_SET,
					RPM_MISC_REQ_TYPE, 0,
					&rpm_kvp, 1);
		if (ret)
			pr_err("Remove vote:sleep_set svs high failed: %d\n",
					ret);
	}
}

static int mdss_mdp_cx_ctrl(struct mdss_data_type *mdata, int enable)
{
@@ -3277,6 +3334,8 @@ static void mdss_mdp_footswitch_ctrl(struct mdss_data_type *mdata, int on)
				mdss_mdp_batfet_ctrl(mdata, true);
			}
		}
		if (mdata->en_svs_high)
			mdss_mdp_config_cx_voltage(mdata, true);
		mdata->fs_ena = true;
	} else {
		if (mdata->fs_ena) {
@@ -3294,6 +3353,8 @@ static void mdss_mdp_footswitch_ctrl(struct mdss_data_type *mdata, int on)
				mdss_mdp_cx_ctrl(mdata, false);
				mdss_mdp_batfet_ctrl(mdata, false);
			}
			if (mdata->en_svs_high)
				mdss_mdp_config_cx_voltage(mdata, false);
			regulator_disable(mdata->fs);
		}
		mdata->fs_ena = false;