.. | .. |
---|
2 | 2 | /* |
---|
3 | 3 | * ARM System Control and Management Interface (ARM SCMI) reset driver |
---|
4 | 4 | * |
---|
5 | | - * Copyright (C) 2019 ARM Ltd. |
---|
| 5 | + * Copyright (C) 2019-2020 ARM Ltd. |
---|
6 | 6 | */ |
---|
7 | 7 | |
---|
8 | 8 | #include <linux/module.h> |
---|
.. | .. |
---|
11 | 11 | #include <linux/reset-controller.h> |
---|
12 | 12 | #include <linux/scmi_protocol.h> |
---|
13 | 13 | |
---|
| 14 | +static const struct scmi_reset_proto_ops *reset_ops; |
---|
| 15 | + |
---|
14 | 16 | /** |
---|
15 | 17 | * struct scmi_reset_data - reset controller information structure |
---|
16 | 18 | * @rcdev: reset controller entity |
---|
17 | | - * @handle: ARM SCMI handle used for communication with system controller |
---|
| 19 | + * @ph: ARM SCMI protocol handle used for communication with system controller |
---|
18 | 20 | */ |
---|
19 | 21 | struct scmi_reset_data { |
---|
20 | 22 | struct reset_controller_dev rcdev; |
---|
21 | | - const struct scmi_handle *handle; |
---|
| 23 | + const struct scmi_protocol_handle *ph; |
---|
22 | 24 | }; |
---|
23 | 25 | |
---|
24 | 26 | #define to_scmi_reset_data(p) container_of((p), struct scmi_reset_data, rcdev) |
---|
25 | | -#define to_scmi_handle(p) (to_scmi_reset_data(p)->handle) |
---|
| 27 | +#define to_scmi_handle(p) (to_scmi_reset_data(p)->ph) |
---|
26 | 28 | |
---|
27 | 29 | /** |
---|
28 | 30 | * scmi_reset_assert() - assert device reset |
---|
.. | .. |
---|
37 | 39 | static int |
---|
38 | 40 | scmi_reset_assert(struct reset_controller_dev *rcdev, unsigned long id) |
---|
39 | 41 | { |
---|
40 | | - const struct scmi_handle *handle = to_scmi_handle(rcdev); |
---|
| 42 | + const struct scmi_protocol_handle *ph = to_scmi_handle(rcdev); |
---|
41 | 43 | |
---|
42 | | - return handle->reset_ops->assert(handle, id); |
---|
| 44 | + return reset_ops->assert(ph, id); |
---|
43 | 45 | } |
---|
44 | 46 | |
---|
45 | 47 | /** |
---|
.. | .. |
---|
55 | 57 | static int |
---|
56 | 58 | scmi_reset_deassert(struct reset_controller_dev *rcdev, unsigned long id) |
---|
57 | 59 | { |
---|
58 | | - const struct scmi_handle *handle = to_scmi_handle(rcdev); |
---|
| 60 | + const struct scmi_protocol_handle *ph = to_scmi_handle(rcdev); |
---|
59 | 61 | |
---|
60 | | - return handle->reset_ops->deassert(handle, id); |
---|
| 62 | + return reset_ops->deassert(ph, id); |
---|
61 | 63 | } |
---|
62 | 64 | |
---|
63 | 65 | /** |
---|
.. | .. |
---|
73 | 75 | static int |
---|
74 | 76 | scmi_reset_reset(struct reset_controller_dev *rcdev, unsigned long id) |
---|
75 | 77 | { |
---|
76 | | - const struct scmi_handle *handle = to_scmi_handle(rcdev); |
---|
| 78 | + const struct scmi_protocol_handle *ph = to_scmi_handle(rcdev); |
---|
77 | 79 | |
---|
78 | | - return handle->reset_ops->reset(handle, id); |
---|
| 80 | + return reset_ops->reset(ph, id); |
---|
79 | 81 | } |
---|
80 | 82 | |
---|
81 | 83 | static const struct reset_control_ops scmi_reset_ops = { |
---|
.. | .. |
---|
90 | 92 | struct device *dev = &sdev->dev; |
---|
91 | 93 | struct device_node *np = dev->of_node; |
---|
92 | 94 | const struct scmi_handle *handle = sdev->handle; |
---|
| 95 | + struct scmi_protocol_handle *ph; |
---|
93 | 96 | |
---|
94 | | - if (!handle || !handle->reset_ops) |
---|
| 97 | + if (!handle) |
---|
95 | 98 | return -ENODEV; |
---|
| 99 | + |
---|
| 100 | + reset_ops = handle->devm_get_protocol(sdev, SCMI_PROTOCOL_RESET, &ph); |
---|
| 101 | + if (IS_ERR(reset_ops)) |
---|
| 102 | + return PTR_ERR(reset_ops); |
---|
96 | 103 | |
---|
97 | 104 | data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); |
---|
98 | 105 | if (!data) |
---|
.. | .. |
---|
101 | 108 | data->rcdev.ops = &scmi_reset_ops; |
---|
102 | 109 | data->rcdev.owner = THIS_MODULE; |
---|
103 | 110 | data->rcdev.of_node = np; |
---|
104 | | - data->rcdev.nr_resets = handle->reset_ops->num_domains_get(handle); |
---|
105 | | - data->handle = handle; |
---|
| 111 | + data->rcdev.nr_resets = reset_ops->num_domains_get(ph); |
---|
| 112 | + data->ph = ph; |
---|
106 | 113 | |
---|
107 | 114 | return devm_reset_controller_register(dev, &data->rcdev); |
---|
108 | 115 | } |
---|