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

Commit a3d1758f authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "drm: msm: call rsc hw_init after hibernation"

parents 3823e9f6 f9b6363f
Loading
Loading
Loading
Loading
+55 −15
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
/*
 * Copyright (c) 2016-2021, The Linux Foundation. All rights reserved.
 * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
 */

#define pr_fmt(fmt)	"[sde_rsc:%s:%d]: " fmt, __func__, __LINE__
@@ -850,6 +851,33 @@ 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_resource_enable(rsc);
	if (ret < 0) {
		pr_err("failed to enable sde rsc power resources rc:%d\n", ret);
		goto sde_rsc_fail;
	}

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

	sde_rsc_resource_disable(rsc);

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
@@ -900,6 +928,13 @@ 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->hw_reinit && rsc->need_hwinit &&
				state != SDE_RSC_IDLE_STATE) {
		sde_rsc_hw_init(rsc);
		rsc->need_hwinit = false;
	}

	/**
	 * This can only happen if splash is active or qsync is enabled.
	 * In both cases timers need to be updated for when a transition to
@@ -1679,6 +1714,9 @@ static int sde_rsc_probe(struct platform_device *pdev)

	platform_set_drvdata(pdev, rsc);
	rsc->dev = &pdev->dev;
	rsc->hw_reinit = of_property_read_bool(pdev->dev.of_node,
						"qcom,sde-rsc-need-hw-reinit");

	of_property_read_u32(pdev->dev.of_node, "qcom,sde-rsc-version",
								&rsc->version);

@@ -1746,25 +1784,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;

	ret = sde_rsc_resource_enable(rsc);
	if (ret < 0) {
		pr_err("failed to enable sde rsc power resources rc:%d\n", ret);
		pr_err("sde rsc: hw init failed ret:%d\n", ret);
		goto sde_rsc_fail;
	}

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

	sde_rsc_resource_disable(rsc);

	INIT_LIST_HEAD(&rsc->client_list);
	INIT_LIST_HEAD(&rsc->event_list);
	mutex_init(&rsc->client_lock);
@@ -1792,6 +1817,20 @@ static int sde_rsc_probe(struct platform_device *pdev)
	return ret;
}

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 int sde_rsc_remove(struct platform_device *pdev)
{
	struct sde_rsc_priv *rsc = platform_get_drvdata(pdev);
@@ -1839,6 +1878,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,
	},
};
+5 −0
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright (c) 2016-2020, The Linux Foundation. All rights reserved.
 * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
 */

#ifndef _SDE_RSC_PRIV_H_
@@ -154,6 +155,8 @@ struct sde_rsc_bw_config {
 * @phandle:		module power handle for clocks
 * @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
 * @hw_reinit:		rsc hw reinit support enable
 *
 * @rpmh_dev:		rpmh device node
 * @drv_io:		sde drv io data mapping
@@ -201,6 +204,8 @@ struct sde_rsc_priv {
	struct sde_power_handle phandle;
	struct regulator *fs;
	bool sw_fs_enabled;
	bool need_hwinit;
	bool hw_reinit;

	struct device *rpmh_dev;
	struct dss_io_data drv_io;