forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-01-31 f9004dbfff8a3fbbd7e2a88c8a4327c7f2f8e5b2
kernel/arch/arm/mach-omap2/sr_device.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * OMAP3/OMAP4 smartreflex device file
34 *
....@@ -12,10 +13,6 @@
1213 *
1314 * Copyright (C) 2007 Texas Instruments, Inc.
1415 * Lesly A M <x0080970@ti.com>
15
- *
16
- * This program is free software; you can redistribute it and/or modify
17
- * it under the terms of the GNU General Public License version 2 as
18
- * published by the Free Software Foundation.
1916 */
2017 #include <linux/power/smartreflex.h>
2118
....@@ -91,35 +88,30 @@
9188
9289 extern struct omap_sr_data omap_sr_pdata[];
9390
94
-static int __init sr_dev_init(struct omap_hwmod *oh, void *user)
91
+static int __init sr_init_by_name(const char *name, const char *voltdm)
9592 {
9693 struct omap_sr_data *sr_data = NULL;
9794 struct omap_volt_data *volt_data;
98
- struct omap_smartreflex_dev_attr *sr_dev_attr;
9995 static int i;
10096
101
- if (!strncmp(oh->name, "smartreflex_mpu_iva", 20) ||
102
- !strncmp(oh->name, "smartreflex_mpu", 16))
97
+ if (!strncmp(name, "smartreflex_mpu_iva", 20) ||
98
+ !strncmp(name, "smartreflex_mpu", 16))
10399 sr_data = &omap_sr_pdata[OMAP_SR_MPU];
104
- else if (!strncmp(oh->name, "smartreflex_core", 17))
100
+ else if (!strncmp(name, "smartreflex_core", 17))
105101 sr_data = &omap_sr_pdata[OMAP_SR_CORE];
106
- else if (!strncmp(oh->name, "smartreflex_iva", 16))
102
+ else if (!strncmp(name, "smartreflex_iva", 16))
107103 sr_data = &omap_sr_pdata[OMAP_SR_IVA];
108104
109105 if (!sr_data) {
110
- pr_err("%s: Unknown instance %s\n", __func__, oh->name);
106
+ pr_err("%s: Unknown instance %s\n", __func__, name);
111107 return -EINVAL;
112108 }
113109
114
- sr_dev_attr = (struct omap_smartreflex_dev_attr *)oh->dev_attr;
115
- if (!sr_dev_attr || !sr_dev_attr->sensor_voltdm_name) {
116
- pr_err("%s: No voltage domain specified for %s. Cannot initialize\n",
117
- __func__, oh->name);
118
- goto exit;
119
- }
120
-
121
- sr_data->name = oh->name;
122
- sr_data->ip_type = oh->class->rev;
110
+ sr_data->name = name;
111
+ if (cpu_is_omap343x())
112
+ sr_data->ip_type = 1;
113
+ else
114
+ sr_data->ip_type = 2;
123115 sr_data->senn_mod = 0x1;
124116 sr_data->senp_mod = 0x1;
125117
....@@ -136,10 +128,10 @@
136128 }
137129 }
138130
139
- sr_data->voltdm = voltdm_lookup(sr_dev_attr->sensor_voltdm_name);
131
+ sr_data->voltdm = voltdm_lookup(voltdm);
140132 if (!sr_data->voltdm) {
141133 pr_err("%s: Unable to get voltage domain pointer for VDD %s\n",
142
- __func__, sr_dev_attr->sensor_voltdm_name);
134
+ __func__, voltdm);
143135 goto exit;
144136 }
145137
....@@ -160,6 +152,20 @@
160152 return 0;
161153 }
162154
155
+static int __init sr_dev_init(struct omap_hwmod *oh, void *user)
156
+{
157
+ struct omap_smartreflex_dev_attr *sr_dev_attr;
158
+
159
+ sr_dev_attr = (struct omap_smartreflex_dev_attr *)oh->dev_attr;
160
+ if (!sr_dev_attr || !sr_dev_attr->sensor_voltdm_name) {
161
+ pr_err("%s: No voltage domain specified for %s. Cannot initialize\n",
162
+ __func__, oh->name);
163
+ return 0;
164
+ }
165
+
166
+ return sr_init_by_name(oh->name, sr_dev_attr->sensor_voltdm_name);
167
+}
168
+
163169 /*
164170 * API to be called from board files to enable smartreflex
165171 * autocompensation at init.
....@@ -169,7 +175,42 @@
169175 sr_enable_on_init = true;
170176 }
171177
178
+static const char * const omap4_sr_instances[] = {
179
+ "mpu",
180
+ "iva",
181
+ "core",
182
+};
183
+
184
+static const char * const dra7_sr_instances[] = {
185
+ "mpu",
186
+ "core",
187
+};
188
+
172189 int __init omap_devinit_smartreflex(void)
173190 {
191
+ const char * const *sr_inst = NULL;
192
+ int i, nr_sr = 0;
193
+
194
+ if (soc_is_omap44xx()) {
195
+ sr_inst = omap4_sr_instances;
196
+ nr_sr = ARRAY_SIZE(omap4_sr_instances);
197
+
198
+ } else if (soc_is_dra7xx()) {
199
+ sr_inst = dra7_sr_instances;
200
+ nr_sr = ARRAY_SIZE(dra7_sr_instances);
201
+ }
202
+
203
+ if (nr_sr) {
204
+ const char *name, *voltdm;
205
+
206
+ for (i = 0; i < nr_sr; i++) {
207
+ name = kasprintf(GFP_KERNEL, "smartreflex_%s", sr_inst[i]);
208
+ voltdm = sr_inst[i];
209
+ sr_init_by_name(name, voltdm);
210
+ }
211
+
212
+ return 0;
213
+ }
214
+
174215 return omap_hwmod_for_each_by_class("smartreflex", sr_dev_init, NULL);
175216 }