| .. | .. |
|---|
| 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 | } |
|---|