forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
kernel/drivers/firmware/arm_scmi/scmi_pm_domain.c
....@@ -2,7 +2,7 @@
22 /*
33 * SCMI Generic power domain support.
44 *
5
- * Copyright (C) 2018 ARM Ltd.
5
+ * Copyright (C) 2018-2020 ARM Ltd.
66 */
77
88 #include <linux/err.h>
....@@ -11,9 +11,11 @@
1111 #include <linux/pm_domain.h>
1212 #include <linux/scmi_protocol.h>
1313
14
+static const struct scmi_power_proto_ops *power_ops;
15
+
1416 struct scmi_pm_domain {
1517 struct generic_pm_domain genpd;
16
- const struct scmi_handle *handle;
18
+ const struct scmi_protocol_handle *ph;
1719 const char *name;
1820 u32 domain;
1921 };
....@@ -25,16 +27,15 @@
2527 int ret;
2628 u32 state, ret_state;
2729 struct scmi_pm_domain *pd = to_scmi_pd(domain);
28
- const struct scmi_power_ops *ops = pd->handle->power_ops;
2930
3031 if (power_on)
3132 state = SCMI_POWER_STATE_GENERIC_ON;
3233 else
3334 state = SCMI_POWER_STATE_GENERIC_OFF;
3435
35
- ret = ops->state_set(pd->handle, pd->domain, state);
36
+ ret = power_ops->state_set(pd->ph, pd->domain, state);
3637 if (!ret)
37
- ret = ops->state_get(pd->handle, pd->domain, &ret_state);
38
+ ret = power_ops->state_get(pd->ph, pd->domain, &ret_state);
3839 if (!ret && state != ret_state)
3940 return -EIO;
4041
....@@ -60,11 +61,16 @@
6061 struct genpd_onecell_data *scmi_pd_data;
6162 struct generic_pm_domain **domains;
6263 const struct scmi_handle *handle = sdev->handle;
64
+ struct scmi_protocol_handle *ph;
6365
64
- if (!handle || !handle->power_ops)
66
+ if (!handle)
6567 return -ENODEV;
6668
67
- num_domains = handle->power_ops->num_domains_get(handle);
69
+ power_ops = handle->devm_get_protocol(sdev, SCMI_PROTOCOL_POWER, &ph);
70
+ if (IS_ERR(power_ops))
71
+ return PTR_ERR(power_ops);
72
+
73
+ num_domains = power_ops->num_domains_get(ph);
6874 if (num_domains < 0) {
6975 dev_err(dev, "number of domains not found\n");
7076 return num_domains;
....@@ -85,14 +91,14 @@
8591 for (i = 0; i < num_domains; i++, scmi_pd++) {
8692 u32 state;
8793
88
- if (handle->power_ops->state_get(handle, i, &state)) {
94
+ if (power_ops->state_get(ph, i, &state)) {
8995 dev_warn(dev, "failed to get state for domain %d\n", i);
9096 continue;
9197 }
9298
9399 scmi_pd->domain = i;
94
- scmi_pd->handle = handle;
95
- scmi_pd->name = handle->power_ops->name_get(handle, i);
100
+ scmi_pd->ph = ph;
101
+ scmi_pd->name = power_ops->name_get(ph, i);
96102 scmi_pd->genpd.name = scmi_pd->name;
97103 scmi_pd->genpd.power_off = scmi_pd_power_off;
98104 scmi_pd->genpd.power_on = scmi_pd_power_on;
....@@ -106,11 +112,30 @@
106112 scmi_pd_data->domains = domains;
107113 scmi_pd_data->num_domains = num_domains;
108114
115
+ dev_set_drvdata(dev, scmi_pd_data);
116
+
109117 return of_genpd_add_provider_onecell(np, scmi_pd_data);
110118 }
111119
120
+static void scmi_pm_domain_remove(struct scmi_device *sdev)
121
+{
122
+ int i;
123
+ struct genpd_onecell_data *scmi_pd_data;
124
+ struct device *dev = &sdev->dev;
125
+ struct device_node *np = dev->of_node;
126
+
127
+ of_genpd_del_provider(np);
128
+
129
+ scmi_pd_data = dev_get_drvdata(dev);
130
+ for (i = 0; i < scmi_pd_data->num_domains; i++) {
131
+ if (!scmi_pd_data->domains[i])
132
+ continue;
133
+ pm_genpd_remove(scmi_pd_data->domains[i]);
134
+ }
135
+}
136
+
112137 static const struct scmi_device_id scmi_id_table[] = {
113
- { SCMI_PROTOCOL_POWER },
138
+ { SCMI_PROTOCOL_POWER, "genpd" },
114139 { },
115140 };
116141 MODULE_DEVICE_TABLE(scmi, scmi_id_table);
....@@ -118,6 +143,7 @@
118143 static struct scmi_driver scmi_power_domain_driver = {
119144 .name = "scmi-power-domain",
120145 .probe = scmi_pm_domain_probe,
146
+ .remove = scmi_pm_domain_remove,
121147 .id_table = scmi_id_table,
122148 };
123149 module_scmi_driver(scmi_power_domain_driver);