From cd40acb26b5d88f7c662e807843b53f5e0fd65f7 Mon Sep 17 00:00:00 2001 From: GuEe-GUI <2991707448@qq.com> Date: Thu, 29 Oct 2026 16:17:10 +0800 Subject: [PATCH] [drivers][scmi] Fix reset provider lookup and driver registration order - register SCMI reset and power-domain drivers during subsystem initialization - resolve SCMI reset state through the reset-controller provider - use the parsed DT reset domain ID when querying reset attributes - retain the SCMI device reference in the reset provider instance Signed-off-by: GuEe-GUI <2991707448@qq.com> --- components/drivers/pmdomain/pm-domain-scmi.c | 9 ++++++++- components/drivers/reset/reset-scmi.c | 20 ++++++++++++++------ 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/components/drivers/pmdomain/pm-domain-scmi.c b/components/drivers/pmdomain/pm-domain-scmi.c index 7a232ec0e888..3576b69e6cde 100755 --- a/components/drivers/pmdomain/pm-domain-scmi.c +++ b/components/drivers/pmdomain/pm-domain-scmi.c @@ -131,4 +131,11 @@ static struct rt_scmi_driver scmi_pm_domain_driver = .probe = scmi_pm_domain_probe, }; -RT_SCMI_DRIVER_EXPORT(scmi_pm_domain_driver); + +static int scmi_pm_domain_drv_register(void) +{ + rt_scmi_driver_register(&scmi_pm_domain_driver); + + return 0; +} +INIT_SUBSYS_EXPORT(scmi_pm_domain_drv_register); diff --git a/components/drivers/reset/reset-scmi.c b/components/drivers/reset/reset-scmi.c index d10d296d86fe..94b61eb23163 100755 --- a/components/drivers/reset/reset-scmi.c +++ b/components/drivers/reset/reset-scmi.c @@ -41,21 +41,21 @@ static rt_err_t scmi_reset_do(struct scmi_reset *srst, int domain, static rt_err_t scmi_reset_reset(struct rt_reset_control *rstc) { - struct scmi_reset *srst = raw_to_scmi_reset(rstc); + struct scmi_reset *srst = raw_to_scmi_reset(rstc->rstcer); return scmi_reset_do(srst, rstc->id, SCMI_RESET_FLAG_RESET, SCMI_ARCH_COLD_RESET); } static rt_err_t scmi_reset_assert(struct rt_reset_control *rstc) { - struct scmi_reset *srst = raw_to_scmi_reset(rstc); + struct scmi_reset *srst = raw_to_scmi_reset(rstc->rstcer); return scmi_reset_do(srst, rstc->id, SCMI_RESET_FLAG_ASSERT, SCMI_ARCH_COLD_RESET); } static rt_err_t scmi_reset_deassert(struct rt_reset_control *rstc) { - struct scmi_reset *srst = raw_to_scmi_reset(rstc); + struct scmi_reset *srst = raw_to_scmi_reset(rstc->rstcer); return scmi_reset_do(srst, rstc->id, 0, SCMI_ARCH_COLD_RESET); } @@ -64,10 +64,10 @@ static rt_err_t scmi_reset_ofw_parse(struct rt_reset_control *rstc, struct rt_ofw_cell_args *args) { rt_err_t err; - struct scmi_reset *srst = raw_to_scmi_reset(rstc); + struct scmi_reset *srst = raw_to_scmi_reset(rstc->rstcer); struct scmi_reset_attr_in in = { - .domain_id = rt_cpu_to_le32(rstc->id), + .domain_id = rt_cpu_to_le32(args->args[0]), }; struct scmi_reset_attr_out out; struct rt_scmi_msg msg = RT_SCMI_MSG_IN_OUT(SCMI_RESET_DOMAIN_ATTRIBUTES, &in, &out); @@ -98,6 +98,7 @@ static rt_err_t scmi_reset_probe(struct rt_scmi_device *sdev) { return -RT_ENOMEM; } + srst->sdev = sdev; rstcer = &srst->parent; @@ -126,4 +127,11 @@ static struct rt_scmi_driver scmi_reset_driver = .probe = scmi_reset_probe, }; -RT_SCMI_DRIVER_EXPORT(scmi_reset_driver); + +static int scmi_reset_drv_register(void) +{ + rt_scmi_driver_register(&scmi_reset_driver); + + return 0; +} +INIT_SUBSYS_EXPORT(scmi_reset_drv_register);