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

Commit a85a579a authored by Veera Sundaram Sankaran's avatar Veera Sundaram Sankaran Committed by Matt Wagantall
Browse files

clk: qcom: mdss: fix device crash on continuous splash disabled



TZ introduced a recent change which mandates the scm call
before accessing the pll registers. So, when continuous splash
is disabledin bootloader, the scm call is not made and it causes
device crash when the pll driver tries to access the registers.
This change makes it return with a disabled handoff clk from the
pll driver when continuous splash is disabled, thus not accessing
the pll registers at this point.

Change-Id: Ic487ef733f889d463d149ee347667cd8eb04084f
Signed-off-by: default avatarVeera Sundaram Sankaran <veeras@codeaurora.org>
parent 69fb2f35
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -47,8 +47,9 @@ Example:
		cell-index = <0>;

		reg = <0xfd922A00 0xD4>,
		      <0xfd922900 0x64>;
		reg-names = "pll_base", "dynamic_pll_base";
		      <0xfd922900 0x64>,
		      <0xfd8c2300 0x8>;
		reg-names = "pll_base", "dynamic_pll_base", "gdsc_base";
		gdsc-supply = <&gdsc_mdss>;
		vddio-supply = <&pm8941_l12>;
		vcca-supply = <&pm8941_l28>;
+18 −0
Original line number Diff line number Diff line
@@ -268,6 +268,9 @@ int get_bypass_lp_div_mux_sel(struct mux_clk *clk)
	int mux_mode, rc;
	struct mdss_pll_resources *dsi_pll_res = clk->priv;

	if (is_gdsc_disabled(dsi_pll_res))
		return 0;

	rc = mdss_pll_resource_enable(dsi_pll_res, true);
	if (rc) {
		pr_err("Failed to enable mdss dsi pll resources\n");
@@ -334,6 +337,9 @@ int ndiv_get_div(struct div_clk *clk)
	int div = 0, rc;
	struct mdss_pll_resources *dsi_pll_res = clk->priv;

	if (is_gdsc_disabled(dsi_pll_res))
		return 0;

	rc = mdss_pll_resource_enable(clk->priv, true);
	if (rc) {
		pr_err("Failed to enable mdss dsi pll resources\n");
@@ -391,6 +397,9 @@ int fixed_hr_oclk2_get_div(struct div_clk *clk)
	int div = 0, rc;
	struct mdss_pll_resources *dsi_pll_res = clk->priv;

	if (is_gdsc_disabled(dsi_pll_res))
		return 0;

	rc = mdss_pll_resource_enable(dsi_pll_res, true);
	if (rc) {
		pr_err("Failed to enable mdss dsi pll resources\n");
@@ -452,6 +461,9 @@ int hr_oclk3_get_div(struct div_clk *clk)
	int div = 0, rc;
	struct mdss_pll_resources *dsi_pll_res = clk->priv;

	if (is_gdsc_disabled(dsi_pll_res))
		return 0;

	rc = mdss_pll_resource_enable(dsi_pll_res, true);
	if (rc) {
		pr_err("Failed to enable mdss dsi pll resources\n");
@@ -917,6 +929,9 @@ unsigned long pll_20nm_vco_get_rate(struct clk *c)
	int rc;
	struct mdss_pll_resources *dsi_pll_res = vco->priv;

	if (is_gdsc_disabled(dsi_pll_res))
		return 0;

	rc = mdss_pll_resource_enable(dsi_pll_res, true);
	if (rc) {
		pr_err("Failed to enable mdss dsi pll resources\n");
@@ -965,6 +980,9 @@ enum handoff pll_20nm_vco_handoff(struct clk *c)
	struct dsi_pll_vco_clk *vco = to_vco_clk(c);
	struct mdss_pll_resources *dsi_pll_res = vco->priv;

	if (is_gdsc_disabled(dsi_pll_res))
		return HANDOFF_DISABLED_CLK;

	rc = mdss_pll_resource_enable(dsi_pll_res, true);
	if (rc) {
		pr_err("Failed to enable mdss dsi pll resources\n");
+18 −0
Original line number Diff line number Diff line
@@ -70,6 +70,9 @@ int get_byte_mux_sel(struct mux_clk *clk)
	int mux_mode, rc;
	struct mdss_pll_resources *dsi_pll_res = clk->priv;

	if (is_gdsc_disabled(dsi_pll_res))
		return 0;

	rc = mdss_pll_resource_enable(dsi_pll_res, true);
	if (rc) {
		pr_err("Failed to enable mdss dsi pll resources\n");
@@ -147,6 +150,9 @@ int fixed_4div_get_div(struct div_clk *clk)
	int div = 0, rc;
	struct mdss_pll_resources *dsi_pll_res = clk->priv;

	if (is_gdsc_disabled(dsi_pll_res))
		return 0;

	rc = mdss_pll_resource_enable(dsi_pll_res, true);
	if (rc) {
		pr_err("Failed to enable mdss dsi pll resources\n");
@@ -183,6 +189,9 @@ int digital_get_div(struct div_clk *clk)
	int div = 0, rc;
	struct mdss_pll_resources *dsi_pll_res = clk->priv;

	if (is_gdsc_disabled(dsi_pll_res))
		return 0;

	rc = mdss_pll_resource_enable(dsi_pll_res, true);
	if (rc) {
		pr_err("Failed to enable mdss dsi pll resources\n");
@@ -219,6 +228,9 @@ int analog_get_div(struct div_clk *clk)
	int div = 0, rc;
	struct mdss_pll_resources *dsi_pll_res = clk->priv;

	if (is_gdsc_disabled(dsi_pll_res))
		return 0;

	rc = mdss_pll_resource_enable(clk->priv, true);
	if (rc) {
		pr_err("Failed to enable mdss dsi pll resources\n");
@@ -394,6 +406,9 @@ unsigned long vco_get_rate(struct clk *c)
	int rc;
	struct mdss_pll_resources *dsi_pll_res = vco->priv;

	if (is_gdsc_disabled(dsi_pll_res))
		return 0;

	rc = mdss_pll_resource_enable(dsi_pll_res, true);
	if (rc) {
		pr_err("Failed to enable mdss dsi pll resources\n");
@@ -510,6 +525,9 @@ enum handoff vco_handoff(struct clk *c)
	struct dsi_pll_vco_clk *vco = to_vco_clk(c);
	struct mdss_pll_resources *dsi_pll_res = vco->priv;

	if (is_gdsc_disabled(dsi_pll_res))
		return HANDOFF_DISABLED_CLK;

	rc = mdss_pll_resource_enable(dsi_pll_res, true);
	if (rc) {
		pr_err("Failed to enable mdss dsi pll resources\n");
+9 −0
Original line number Diff line number Diff line
@@ -307,6 +307,9 @@ static unsigned long edp_vco_get_rate(struct clk *c)
	u32 pll_status, div2;
	int rc;

	if (is_gdsc_disabled(edp_pll_res))
		return 0;

	rc = mdss_pll_resource_enable(edp_pll_res, true);
	if (rc) {
		pr_err("edp pll resources not available\n");
@@ -400,6 +403,9 @@ static enum handoff edp_vco_handoff(struct clk *c)
	struct edp_pll_vco_clk *vco = to_edp_vco_clk(c);
	struct mdss_pll_resources *edp_pll_res = vco->priv;

	if (is_gdsc_disabled(edp_pll_res))
		return HANDOFF_DISABLED_CLK;

	if (mdss_pll_resource_enable(edp_pll_res, true)) {
		pr_err("edp pll resources not available\n");
		return ret;
@@ -510,6 +516,9 @@ static int edp_pixel_get_div(struct div_clk *clk)
	int rc;
	struct mdss_pll_resources *edp_pll_res = clk->priv;

	if (is_gdsc_disabled(edp_pll_res))
		return 0;

	rc = mdss_pll_resource_enable(edp_pll_res, true);
	if (rc) {
		pr_err("edp pll resources not available\n");
+6 −0
Original line number Diff line number Diff line
@@ -766,6 +766,9 @@ static unsigned long hdmi_20nm_vco_get_rate(struct clk *c)
	struct hdmi_pll_vco_clk *vco = to_hdmi_20nm_vco_clk(c);
	struct mdss_pll_resources *io = vco->priv;

	if (is_gdsc_disabled(io))
		return 0;

	rc = mdss_pll_resource_enable(io, true);
	if (rc) {
		pr_err("pll resource can't be enabled\n");
@@ -835,6 +838,9 @@ static enum handoff hdmi_20nm_vco_handoff(struct clk *c)
	struct hdmi_pll_vco_clk *vco = to_hdmi_20nm_vco_clk(c);
	struct mdss_pll_resources *io = vco->priv;

	if (is_gdsc_disabled(io))
		return HANDOFF_DISABLED_CLK;

	if (mdss_pll_resource_enable(io, true)) {
		pr_err("pll resource can't be enabled\n");
		return ret;
Loading