]> Git Repo - J-u-boot.git/blame - drivers/reset/reset-scmi.c
Merge patch series "Add OPP_LOW support for J7200"
[J-u-boot.git] / drivers / reset / reset-scmi.c
CommitLineData
34d76fef
EC
1// SPDX-License-Identifier: GPL-2.0+
2/*
f487a88c 3 * Copyright (C) 2019-2022 Linaro Limited
34d76fef 4 */
d9631541
PD
5
6#define LOG_CATEGORY UCLASS_RESET
7
34d76fef
EC
8#include <dm.h>
9#include <errno.h>
10#include <reset-uclass.h>
11#include <scmi_agent.h>
12#include <scmi_protocols.h>
13#include <asm/types.h>
14
15static int scmi_reset_set_level(struct reset_ctl *rst, bool assert_not_deassert)
16{
17 struct scmi_rd_reset_in in = {
18 .domain_id = rst->id,
19 .flags = assert_not_deassert ? SCMI_RD_RESET_FLAG_ASSERT : 0,
20 .reset_state = 0,
21 };
22 struct scmi_rd_reset_out out;
23 struct scmi_msg msg = SCMI_MSG_IN(SCMI_PROTOCOL_ID_RESET_DOMAIN,
24 SCMI_RESET_DOMAIN_RESET,
25 in, out);
26 int ret;
27
c6230cd8 28 ret = devm_scmi_process_msg(rst->dev, &msg);
34d76fef
EC
29 if (ret)
30 return ret;
31
32 return scmi_to_linux_errno(out.status);
33}
34
35static int scmi_reset_assert(struct reset_ctl *rst)
36{
37 return scmi_reset_set_level(rst, true);
38}
39
40static int scmi_reset_deassert(struct reset_ctl *rst)
41{
42 return scmi_reset_set_level(rst, false);
43}
44
45static int scmi_reset_request(struct reset_ctl *rst)
46{
47 struct scmi_rd_attr_in in = {
48 .domain_id = rst->id,
49 };
50 struct scmi_rd_attr_out out;
51 struct scmi_msg msg = SCMI_MSG_IN(SCMI_PROTOCOL_ID_RESET_DOMAIN,
52 SCMI_RESET_DOMAIN_ATTRIBUTES,
53 in, out);
54 int ret;
55
56 /*
57 * We don't really care about the attribute, just check
58 * the reset domain exists.
59 */
c6230cd8 60 ret = devm_scmi_process_msg(rst->dev, &msg);
34d76fef
EC
61 if (ret)
62 return ret;
63
64 return scmi_to_linux_errno(out.status);
65}
66
34d76fef
EC
67static const struct reset_ops scmi_reset_domain_ops = {
68 .request = scmi_reset_request,
34d76fef
EC
69 .rst_assert = scmi_reset_assert,
70 .rst_deassert = scmi_reset_deassert,
71};
72
f487a88c
EC
73static int scmi_reset_probe(struct udevice *dev)
74{
c6230cd8 75 return devm_scmi_of_get_channel(dev);
f487a88c
EC
76}
77
34d76fef
EC
78U_BOOT_DRIVER(scmi_reset_domain) = {
79 .name = "scmi_reset_domain",
80 .id = UCLASS_RESET,
81 .ops = &scmi_reset_domain_ops,
f487a88c 82 .probe = scmi_reset_probe,
34d76fef 83};
This page took 0.102658 seconds and 4 git commands to generate.