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

Commit 7c453db2 authored by Xiaowen Wu's avatar Xiaowen Wu
Browse files

drm/msm: call rsc hw_init after hiberantion



When device boot from hibernation, there is no probe function called
and rsc need to initialize the hw at the first client update call.

Change-Id: Iba3a3aaebbb8052ce93b8aac1746f33ea80795fb
Signed-off-by: default avatarXiaowen Wu <wxiaowen@codeaurora.org>
parent 3638c290
Loading
Loading
Loading
Loading
+52 −15
Original line number Diff line number Diff line
/* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -755,6 +755,34 @@ bool sde_rsc_client_is_state_update_complete(
	return vsync_timestamp0 != 0;
}

static int sde_rsc_hw_init(struct sde_rsc_priv *rsc)
{
	int ret;

	ret = regulator_enable(rsc->fs);
	if (ret) {
		pr_err("sde rsc: fs on failed ret:%d\n", ret);
		goto sde_rsc_fail;
	}

	rsc->sw_fs_enabled = true;

	ret = sde_rsc_clk_enable(&rsc->phandle, rsc->pclient, true);
	if (ret) {
		pr_err("failed to enable sde rsc power resources\n");
		goto sde_rsc_fail;
	}

	ret = sde_rsc_timer_calculate(rsc, NULL);
	if (ret)
		goto sde_rsc_fail;

	sde_rsc_clk_enable(&rsc->phandle, rsc->pclient, false);

sde_rsc_fail:
	return ret;
}

/**
 * sde_rsc_client_state_update() - rsc client state update
 * Video mode, cmd mode and clk state are suppoed as modes. A client need to
@@ -816,6 +844,12 @@ int sde_rsc_client_state_update(struct sde_rsc_client *caller_client,
		__builtin_return_address(0), rsc->current_state,
		caller_client->name, state);

	/* hw init is required after hibernation */
	if (rsc->need_hwinit && state != SDE_RSC_IDLE_STATE) {
		sde_rsc_hw_init(rsc);
		rsc->need_hwinit = false;
	}

	if (rsc->current_state == SDE_RSC_IDLE_STATE)
		sde_rsc_clk_enable(&rsc->phandle, rsc->pclient, true);

@@ -1423,24 +1457,12 @@ static int sde_rsc_probe(struct platform_device *pdev)
		goto sde_rsc_fail;
	}

	ret = regulator_enable(rsc->fs);
	ret = sde_rsc_hw_init(rsc);
	if (ret) {
		pr_err("sde rsc: fs on failed ret:%d\n", ret);
		goto sde_rsc_fail;
	}

	rsc->sw_fs_enabled = true;

	if (sde_rsc_clk_enable(&rsc->phandle, rsc->pclient, true)) {
		pr_err("failed to enable sde rsc power resources\n");
		pr_err("sde rsc: hw init failed ret:%d\n", ret);
		goto sde_rsc_fail;
	}

	if (sde_rsc_timer_calculate(rsc, NULL))
		goto sde_rsc_fail;

	sde_rsc_clk_enable(&rsc->phandle, rsc->pclient, false);

	INIT_LIST_HEAD(&rsc->client_list);
	INIT_LIST_HEAD(&rsc->event_list);
	mutex_init(&rsc->client_lock);
@@ -1475,6 +1497,20 @@ static int sde_rsc_remove(struct platform_device *pdev)
	return 0;
}

static int sde_rsc_pm_freeze_late(struct device *dev)
{
	struct platform_device *pdev = to_platform_device(dev);
	struct sde_rsc_priv *rsc = platform_get_drvdata(pdev);

	rsc->need_hwinit = true;

	return 0;
}

static const struct dev_pm_ops sde_rsc_pm_ops = {
	.freeze_late = sde_rsc_pm_freeze_late,
};

static const struct of_device_id dt_match[] = {
	{ .compatible = "qcom,sde-rsc"},
	{}
@@ -1488,6 +1524,7 @@ static struct platform_driver sde_rsc_platform_driver = {
	.driver     = {
		.name   = "sde_rsc",
		.of_match_table = dt_match,
		.pm     = &sde_rsc_pm_ops,
		.suppress_bind_attrs = true,
	},
};
+3 −1
Original line number Diff line number Diff line
/* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -128,6 +128,7 @@ struct sde_rsc_timer_config {
 * @pclient:		module power client of phandle
 * @fs:			"MDSS GDSC" handle
 * @sw_fs_enabled:	track "MDSS GDSC" sw vote during probe
 * @need_hwinit:	rsc hw init is required for the next update
 *
 * @disp_rsc:		display rsc handle
 * @drv_io:		sde drv io data mapping
@@ -168,6 +169,7 @@ struct sde_rsc_priv {
	struct sde_power_client *pclient;
	struct regulator *fs;
	bool sw_fs_enabled;
	bool need_hwinit;

	struct rpmh_client *disp_rsc;
	struct dss_io_data drv_io;