diff --git a/drivers/platform/tegra/dce/dce-bootstrap.c b/drivers/platform/tegra/dce/dce-bootstrap.c index f434e2a6..16522053 100644 --- a/drivers/platform/tegra/dce/dce-bootstrap.c +++ b/drivers/platform/tegra/dce/dce-bootstrap.c @@ -408,6 +408,12 @@ int dce_boot_interface_init(struct tegra_dce *d) goto err_init; } + ret = dce_init_work(d, &d->dce_bootstrap_work, dce_bootstrap_work_fn); + if (ret) { + dce_err(d, "Bootstrap work init failed"); + goto err_init; + } + err_init: return ret; } diff --git a/drivers/platform/tegra/dce/dce-init-deinit.c b/drivers/platform/tegra/dce/dce-init-deinit.c index b7efa9ce..553bcbc1 100644 --- a/drivers/platform/tegra/dce/dce-init-deinit.c +++ b/drivers/platform/tegra/dce/dce-init-deinit.c @@ -65,6 +65,12 @@ int dce_driver_init(struct tegra_dce *d) goto err_client_init; } + ret = dce_pm_init(d); + if (ret) { + dce_err(d, "Failed to init DCE Power management"); + goto err_pm_init; + } + ret = dce_work_cond_sw_resource_init(d); if (ret) { dce_err(d, "dce sw resource init failed"); @@ -82,6 +88,8 @@ int dce_driver_init(struct tegra_dce *d) err_fsm_init: dce_work_cond_sw_resource_deinit(d); err_sw_init: + dce_pm_deinit(d); +err_pm_init: dce_client_deinit(d); err_client_init: dce_admin_deinit(d); @@ -109,6 +117,8 @@ void dce_driver_deinit(struct tegra_dce *d) dce_work_cond_sw_resource_deinit(d); + dce_pm_deinit(d); + dce_client_deinit(d); dce_admin_deinit(d); diff --git a/drivers/platform/tegra/dce/dce-pm.c b/drivers/platform/tegra/dce/dce-pm.c index 5d004d6e..aa1f63d1 100644 --- a/drivers/platform/tegra/dce/dce-pm.c +++ b/drivers/platform/tegra/dce/dce-pm.c @@ -170,3 +170,23 @@ int dce_pm_exit_sc7(struct tegra_dce *d) out: return ret; } + +int dce_pm_init(struct tegra_dce *d) +{ + int ret = 0; + + ret = dce_init_work(d, &d->dce_resume_work, dce_resume_work_fn); + if (ret) { + dce_err(d, "resume work init failed"); + goto done; + } + +done: + return ret; +} + +void dce_pm_deinit(struct tegra_dce *d) +{ + USE(d); + // Nothing to do. +} diff --git a/drivers/platform/tegra/dce/dce-worker.c b/drivers/platform/tegra/dce/dce-worker.c index aad6e51c..ea054d20 100644 --- a/drivers/platform/tegra/dce/dce-worker.c +++ b/drivers/platform/tegra/dce/dce-worker.c @@ -110,18 +110,6 @@ int dce_work_cond_sw_resource_init(struct tegra_dce *d) int ret = 0; int i; - ret = dce_init_work(d, &d->dce_bootstrap_work, dce_bootstrap_work_fn); - if (ret) { - dce_err(d, "Bootstrap work init failed"); - goto exit; - } - - ret = dce_init_work(d, &d->dce_resume_work, dce_resume_work_fn); - if (ret) { - dce_err(d, "resume work init failed"); - goto exit; - } - if (dce_cond_init(&d->dce_bootstrap_done)) { dce_err(d, "dce boot wait condition init failed"); ret = -1; diff --git a/drivers/platform/tegra/dce/include/dce-pm.h b/drivers/platform/tegra/dce/include/dce-pm.h index a7f4f3f5..0ca8afb8 100644 --- a/drivers/platform/tegra/dce/include/dce-pm.h +++ b/drivers/platform/tegra/dce/include/dce-pm.h @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* - * Copyright (c) 2022-2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2022-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. */ #ifndef DCE_PM_H @@ -12,6 +12,8 @@ struct dce_sc7_state { uint32_t hsp_ie; }; +int dce_pm_init(struct tegra_dce *d); +void dce_pm_deinit(struct tegra_dce *d); int dce_pm_enter_sc7(struct tegra_dce *d); int dce_pm_exit_sc7(struct tegra_dce *d); void dce_resume_work_fn(struct tegra_dce *d);