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

Commit 00f5a7d1 authored by Chandan Uddaraju's avatar Chandan Uddaraju
Browse files

msm: mdss: Configure minimum voltage for CX power rail



For smart panels, we observe abnormal waveforms
and unexpected voltage spikes on DSI data lanes
when the cx power rail goes to minimum voltage.
Vote for the cx regulator in mdp driver and control
the voltage to avoid frame shifting.

Change-Id: I7ec9e29a4972373775406fa29a5037fd43fef315
Signed-off-by: default avatarChandan Uddaraju <chandanu@codeaurora.org>
parent e4215a77
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -140,6 +140,7 @@ Bus Scaling Data:

Optional properties:
- batfet-supply :	Phandle for battery FET regulator device node.
- vdd-cx-supply :	Phandle for vdd CX 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
@@ -222,6 +223,7 @@ Example:
		interrupts = <0 72 0>;
		vdd-supply = <&gdsc_mdss>;
		batfet-supply = <&pm8941_chg_batif>;
		vdd-cx-supply = <&pm8841_s2_corner>;

		/* Bus Scale Settings */
		qcom,msm-bus,name = "mdss_mdp";
+1 −0
Original line number Diff line number Diff line
@@ -70,6 +70,7 @@ struct mdss_data_type {
	u32 mdp_rev;
	struct clk *mdp_clk[MDSS_MAX_CLK];
	struct regulator *fs;
	struct regulator *vdd_cx;
	bool batfet_required;
	struct regulator *batfet;
	u32 max_mdp_clk_rate;
+54 −0
Original line number Diff line number Diff line
@@ -48,6 +48,7 @@
#include <mach/iommu_domains.h>
#include <mach/memory.h>
#include <mach/msm_memtypes.h>
#include <mach/rpm-regulator-smd.h>

#include "mdss.h"
#include "mdss_fb.h"
@@ -741,6 +742,14 @@ static int mdss_mdp_irq_clk_setup(struct mdss_data_type *mdata)
	}
	mdata->fs_ena = false;

	mdata->vdd_cx = devm_regulator_get(&mdata->pdev->dev,
				"vdd-cx");
	if (IS_ERR_OR_NULL(mdata->vdd_cx)) {
		pr_debug("unable to get CX reg. rc=%d\n",
					PTR_RET(mdata->vdd_cx));
		mdata->vdd_cx = NULL;
	}

	if (mdss_mdp_irq_clk_register(mdata, "bus_clk", MDSS_CLK_AXI) ||
	    mdss_mdp_irq_clk_register(mdata, "iface_clk", MDSS_CLK_AHB) ||
	    mdss_mdp_irq_clk_register(mdata, "core_clk_src",
@@ -2144,6 +2153,49 @@ int mdss_panel_get_boot_cfg(void)
	return rc;
}

static int mdss_mdp_cx_ctrl(struct mdss_data_type *mdata, int enable)
{
	int rc = 0;

	if (!mdata->vdd_cx)
		return rc;

	if (enable) {
		rc = regulator_set_voltage(
				mdata->vdd_cx,
				RPM_REGULATOR_CORNER_SVS_SOC,
				RPM_REGULATOR_CORNER_SUPER_TURBO);
		if (rc < 0)
			goto vreg_set_voltage_fail;

		pr_debug("Enabling CX power rail\n");
		rc = regulator_enable(mdata->vdd_cx);
		if (rc) {
			pr_err("Failed to enable regulator.\n");
			return rc;
		}
	} else {
		pr_debug("Disabling CX power rail\n");
		rc = regulator_disable(mdata->vdd_cx);
		if (rc) {
			pr_err("Failed to disable regulator.\n");
			return rc;
		}
		rc = regulator_set_voltage(
				mdata->vdd_cx,
				RPM_REGULATOR_CORNER_NONE,
				RPM_REGULATOR_CORNER_SUPER_TURBO);
		if (rc < 0)
			goto vreg_set_voltage_fail;
	}

	return rc;

vreg_set_voltage_fail:
	pr_err("Set vltg fail\n");
	return rc;
}

static void mdss_mdp_footswitch_ctrl(struct mdss_data_type *mdata, int on)
{
	int ret;
@@ -2158,6 +2210,7 @@ static void mdss_mdp_footswitch_ctrl(struct mdss_data_type *mdata, int on)
			if (ret)
				pr_err("Footswitch failed to enable\n");
			mdss_mdp_batfet_ctrl(mdata, true);
			mdss_mdp_cx_ctrl(mdata, true);
		}
		mdata->fs_ena = true;
	} else {
@@ -2166,6 +2219,7 @@ static void mdss_mdp_footswitch_ctrl(struct mdss_data_type *mdata, int on)
		if (mdata->fs_ena) {
			regulator_disable(mdata->fs);
			mdss_mdp_batfet_ctrl(mdata, false);
			mdss_mdp_cx_ctrl(mdata, false);
		}
		mdata->fs_ena = false;
	}