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

This commit is contained in:
qctecmdr 2022-03-23 11:33:22 -07:00 committed by Gerrit - the friendly Code Review server
commit a3d1758f89
2 changed files with 60 additions and 15 deletions

View File

@ -1,6 +1,7 @@
// 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);
pr_err("sde rsc: hw init 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);
INIT_LIST_HEAD(&rsc->client_list);
INIT_LIST_HEAD(&rsc->event_list);
mutex_init(&rsc->client_lock);
@ -1792,6 +1817,20 @@ rsc_alloc_fail:
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,
},
};

View File

@ -1,6 +1,7 @@
/* 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;