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

Commit 7849bb19 authored by Kyle Yan's avatar Kyle Yan Committed by Gerrit - the friendly Code Review server
Browse files

Merge "drm: msm: dsi-staging: alter clock enabling path in DSI driver" into msm-4.9

parents 521fd6b9 74a03f17
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@
#include <linux/platform_device.h>
#include <linux/types.h>
#include <linux/clk.h>
#include "sde_power_handle.h"

#define MAX_STRING_LEN 32
#define MAX_DSI_CTRL 2
@@ -67,6 +68,8 @@ struct clk_ctrl_cb {
 * @core_mmss_clk:       Handle to MMSS core clock.
 * @bus_clk:             Handle to bus clock.
 * @mnoc_clk:            Handle to MMSS NOC clock.
 * @dsi_core_client:	 Pointer to SDE power client
 * @phandle:             Pointer to SDE power handle
 */
struct dsi_core_clk_info {
	struct clk *mdp_core_clk;
@@ -74,6 +77,8 @@ struct dsi_core_clk_info {
	struct clk *core_mmss_clk;
	struct clk *bus_clk;
	struct clk *mnoc_clk;
	struct sde_power_client *dsi_core_client;
	struct sde_power_handle *phandle;
};

/**
+71 −25
Original line number Diff line number Diff line
@@ -185,11 +185,13 @@ int dsi_core_clk_start(struct dsi_core_clks *c_clks)
{
	int rc = 0;

	if (c_clks->clks.mdp_core_clk) {
		rc = clk_prepare_enable(c_clks->clks.mdp_core_clk);
		if (rc) {
			pr_err("failed to enable mdp_core_clk, rc=%d\n", rc);
			goto error;
		}
	}

	if (c_clks->clks.mnoc_clk) {
		rc = clk_prepare_enable(c_clks->clks.mnoc_clk);
@@ -199,29 +201,37 @@ int dsi_core_clk_start(struct dsi_core_clks *c_clks)
		}
	}

	if (c_clks->clks.iface_clk) {
		rc = clk_prepare_enable(c_clks->clks.iface_clk);
		if (rc) {
			pr_err("failed to enable iface_clk, rc=%d\n", rc);
			goto error_disable_mnoc_clk;
		}
	}

	if (c_clks->clks.bus_clk) {
		rc = clk_prepare_enable(c_clks->clks.bus_clk);
		if (rc) {
			pr_err("failed to enable bus_clk, rc=%d\n", rc);
			goto error_disable_iface_clk;
		}
	}

	if (c_clks->clks.core_mmss_clk) {
		rc = clk_prepare_enable(c_clks->clks.core_mmss_clk);
		if (rc) {
			pr_err("failed to enable core_mmss_clk, rc=%d\n", rc);
			goto error_disable_bus_clk;
		}
	}

	if (c_clks->bus_handle) {
		rc = msm_bus_scale_client_update_request(c_clks->bus_handle, 1);
		if (rc) {
			pr_err("bus scale client enable failed, rc=%d\n", rc);
			goto error_disable_mmss_clk;
		}
	}

	return rc;

@@ -458,11 +468,18 @@ static int dsi_display_core_clk_enable(struct dsi_core_clks *clks,
	 */

	m_clks = &clks[master_ndx];
	rc = sde_power_resource_enable(m_clks->clks.phandle,
			m_clks->clks.dsi_core_client, true);

	if (rc) {
		pr_err("Power resource enable failed, rc=%d\n", rc);
		goto error;
	}

	rc = dsi_core_clk_start(m_clks);
	if (rc) {
		pr_err("failed to turn on master clocks, rc=%d\n", rc);
		goto error;
		goto error_disable_master_resource;
	}

	/* Turn on rest of the core clocks */
@@ -471,15 +488,28 @@ static int dsi_display_core_clk_enable(struct dsi_core_clks *clks,
		if (!clk || (clk == m_clks))
			continue;

		rc = sde_power_resource_enable(clk->clks.phandle,
				clk->clks.dsi_core_client, true);
		if (rc) {
			pr_err("Power resource enable failed, rc=%d\n", rc);
			goto error_disable_master;
		}

		rc = dsi_core_clk_start(clk);
		if (rc) {
			pr_err("failed to turn on clocks, rc=%d\n", rc);
			(void)sde_power_resource_enable(clk->clks.phandle,
					clk->clks.dsi_core_client, false);
			goto error_disable_master;
		}
	}
	return rc;

error_disable_master:
	(void)dsi_core_clk_stop(m_clks);

error_disable_master_resource:
	(void)sde_power_resource_enable(m_clks->clks.phandle,
				m_clks->clks.dsi_core_client, false);
error:
	return rc;
}
@@ -547,14 +577,30 @@ static int dsi_display_core_clk_disable(struct dsi_core_clks *clks,
			continue;

		rc = dsi_core_clk_stop(clk);
		if (rc)
			pr_err("failed to turn off clocks, rc=%d\n", rc);
		if (rc) {
			pr_debug("failed to turn off clocks, rc=%d\n", rc);
			goto error;
		}

		rc = sde_power_resource_enable(clk->clks.phandle,
				clk->clks.dsi_core_client, false);
		if (rc) {
			pr_err("Power resource disable failed: %d\n", rc);
			goto error;
		}
	}

	rc = dsi_core_clk_stop(m_clks);
	if (rc)
	if (rc) {
		pr_err("failed to turn off master clocks, rc=%d\n", rc);
		goto error;
	}

	rc = sde_power_resource_enable(m_clks->clks.phandle,
				m_clks->clks.dsi_core_client, false);
	if (rc)
		pr_err("Power resource disable failed: %d\n", rc);
error:
	return rc;
}

+8 −12
Original line number Diff line number Diff line
@@ -490,30 +490,26 @@ static int dsi_ctrl_clocks_init(struct platform_device *pdev,

	core->mdp_core_clk = devm_clk_get(&pdev->dev, "mdp_core_clk");
	if (IS_ERR(core->mdp_core_clk)) {
		rc = PTR_ERR(core->mdp_core_clk);
		pr_err("failed to get mdp_core_clk, rc=%d\n", rc);
		goto fail;
		core->mdp_core_clk = NULL;
		pr_debug("failed to get mdp_core_clk, rc=%d\n", rc);
	}

	core->iface_clk = devm_clk_get(&pdev->dev, "iface_clk");
	if (IS_ERR(core->iface_clk)) {
		rc = PTR_ERR(core->iface_clk);
		pr_err("failed to get iface_clk, rc=%d\n", rc);
		goto fail;
		core->iface_clk = NULL;
		pr_debug("failed to get iface_clk, rc=%d\n", rc);
	}

	core->core_mmss_clk = devm_clk_get(&pdev->dev, "core_mmss_clk");
	if (IS_ERR(core->core_mmss_clk)) {
		rc = PTR_ERR(core->core_mmss_clk);
		pr_err("failed to get core_mmss_clk, rc=%d\n", rc);
		goto fail;
		core->core_mmss_clk = NULL;
		pr_debug("failed to get core_mmss_clk, rc=%d\n", rc);
	}

	core->bus_clk = devm_clk_get(&pdev->dev, "bus_clk");
	if (IS_ERR(core->bus_clk)) {
		rc = PTR_ERR(core->bus_clk);
		pr_err("failed to get bus_clk, rc=%d\n", rc);
		goto fail;
		core->bus_clk = NULL;
		pr_debug("failed to get bus_clk, rc=%d\n", rc);
	}

	core->mnoc_clk = devm_clk_get(&pdev->dev, "mnoc_clk");
+13 −1
Original line number Diff line number Diff line
@@ -2228,10 +2228,12 @@ static int dsi_display_bind(struct device *dev,
	struct dsi_display *display;
	struct dsi_clk_info info;
	struct clk_ctrl_cb clk_cb;
	struct msm_drm_private *priv;
	void *handle = NULL;
	struct platform_device *pdev = to_platform_device(dev);
	char *client1 = "dsi_clk_client";
	char *client2 = "mdp_event_client";
	char dsi_client_name[DSI_CLIENT_NAME_SIZE];
	int i, rc = 0;

	if (!dev || !pdev || !master) {
@@ -2247,6 +2249,7 @@ static int dsi_display_bind(struct device *dev,
				drm, display);
		return -EINVAL;
	}
	priv = drm->dev_private;

	mutex_lock(&display->display_lock);

@@ -2260,7 +2263,6 @@ static int dsi_display_bind(struct device *dev,

	for (i = 0; i < display->ctrl_count; i++) {
		display_ctrl = &display->ctrl[i];

		rc = dsi_ctrl_drv_init(display_ctrl->ctrl, display->root);
		if (rc) {
			pr_err("[%s] failed to initialize ctrl[%d], rc=%d\n",
@@ -2280,9 +2282,19 @@ static int dsi_display_bind(struct device *dev,
			sizeof(struct dsi_core_clk_info));
		memcpy(&info.l_clks[i], &display_ctrl->ctrl->clk_info.link_clks,
			sizeof(struct dsi_link_clk_info));
		info.c_clks[i].phandle = &priv->phandle;
		info.bus_handle[i] =
			display_ctrl->ctrl->axi_bus_info.bus_handle;
		info.ctrl_index[i] = display_ctrl->ctrl->cell_index;
		snprintf(dsi_client_name, DSI_CLIENT_NAME_SIZE,
						"dsi_core_client%u", i);
		info.c_clks[i].dsi_core_client = sde_power_client_create(
				info.c_clks[i].phandle, dsi_client_name);
		if (IS_ERR_OR_NULL(info.c_clks[i].dsi_core_client)) {
			pr_err("[%s] client creation failed for ctrl[%d]",
					dsi_client_name, i);
			goto error_ctrl_deinit;
		}
	}

	info.pre_clkoff_cb = dsi_pre_clkoff_cb;
+1 −1
Original line number Diff line number Diff line
@@ -29,7 +29,7 @@
#include "dsi_panel.h"

#define MAX_DSI_CTRLS_PER_DISPLAY             2

#define DSI_CLIENT_NAME_SIZE		20
/*
 * DSI Validate Mode modifiers
 * @DSI_VALIDATE_FLAG_ALLOW_ADJUST:	Allow mode validation to also do fixup
Loading