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

Commit 1c5b3b0f authored by Clarence Ip's avatar Clarence Ip Committed by Gerrit - the friendly Code Review server
Browse files

msm: sde: support rotator power enable through rsc



Attempt to enable the rotator footswitch through the
sde RSC driver, if available. The driver will fall
back to the original method of controlling the
regulators directly if it fails to register itself
as an RSC client.

CRs-Fixed: 2041710
Change-Id: I522df252153cef66ac57ab457eb0a498e43c7594
Signed-off-by: default avatarClarence Ip <cip@codeaurora.org>
parent ed98af78
Loading
Loading
Loading
Loading
+29 −5
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@
#include <linux/msm-bus-board.h>
#include <linux/regulator/consumer.h>
#include <linux/dma-direction.h>
#include <linux/sde_rsc.h>
#include <soc/qcom/scm.h>
#include <soc/qcom/secure_buffer.h>
#include <asm/cacheflush.h>
@@ -318,6 +319,11 @@ static void sde_rotator_footswitch_ctrl(struct sde_rot_mgr *mgr, bool on)
	if (mgr->ops_hw_pre_pmevent)
		mgr->ops_hw_pre_pmevent(mgr, on);

	if (mgr->rsc_client)
		ret = sde_rsc_client_state_update(mgr->rsc_client,
				on ? SDE_RSC_CLK_STATE : SDE_RSC_IDLE_STATE,
				NULL, -1);
	else
		ret = sde_rot_enable_vreg(mgr->module_power.vreg_config,
			mgr->module_power.num_vreg, on);
	if (ret) {
@@ -2780,9 +2786,21 @@ static int sde_rotator_res_init(struct platform_device *pdev,
{
	int ret;

	ret = sde_rotator_get_dt_vreg_data(&pdev->dev, &mgr->module_power);
	mgr->rsc_client = sde_rsc_client_create(
			SDE_RSC_INDEX, "sde_rotator_core", false);
	if (IS_ERR(mgr->rsc_client)) {
		ret = PTR_ERR(mgr->rsc_client);
		pr_err("rsc client create returned %d\n", ret);
		mgr->rsc_client = NULL;
		return ret;
	}

	if (!mgr->rsc_client) {
		ret = sde_rotator_get_dt_vreg_data(
				&pdev->dev, &mgr->module_power);
		if (ret)
			return ret;
	}

	ret = sde_rotator_register_clk(pdev, mgr);
	if (ret)
@@ -2802,9 +2820,15 @@ static void sde_rotator_res_destroy(struct sde_rot_mgr *mgr)
{
	struct platform_device *pdev = mgr->pdev;

	sde_rotator_put_dt_vreg_data(&pdev->dev, &mgr->module_power);
	sde_rotator_unregister_clk(mgr);
	sde_rotator_bus_scale_unregister(mgr);

	if (mgr->rsc_client) {
		sde_rsc_client_destroy(mgr->rsc_client);
		mgr->rsc_client = NULL;
	} else {
		sde_rotator_put_dt_vreg_data(&pdev->dev, &mgr->module_power);
	}
}

int sde_rotator_core_init(struct sde_rot_mgr **pmgr,
+3 −0
Original line number Diff line number Diff line
@@ -373,6 +373,7 @@ struct sde_rot_bus_data_type {
 * @reg_bus: register bus configuration state
 * @module_power: power/clock configuration state
 * @regulator_enable: true if foot switch is enabled; false otherwise
 * @rsc_client: pointer to rsc client handle
 * @res_ref_cnt: reference count of how many times resource is requested
 * @rot_enable_clk_cnt: reference count of how many times clock is requested
 * @rot_clk: array of rotator and periphery clocks
@@ -417,6 +418,8 @@ struct sde_rot_mgr {
	struct sde_module_power module_power;
	bool regulator_enable;

	struct sde_rsc_client *rsc_client;

	int res_ref_cnt;
	int rot_enable_clk_cnt;
	struct sde_rot_clk *rot_clk;