forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-10 9999e48639b3cecb08ffb37358bcba3b48161b29
kernel/drivers/hwmon/pmbus/pmbus.c
....@@ -1,21 +1,8 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /*
23 * Hardware monitoring driver for PMBus devices
34 *
45 * Copyright (c) 2010, 2011 Ericsson AB.
5
- *
6
- * This program is free software; you can redistribute it and/or modify
7
- * it under the terms of the GNU General Public License as published by
8
- * the Free Software Foundation; either version 2 of the License, or
9
- * (at your option) any later version.
10
- *
11
- * This program is distributed in the hope that it will be useful,
12
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
- * GNU General Public License for more details.
15
- *
16
- * You should have received a copy of the GNU General Public License
17
- * along with this program; if not, write to the Free Software
18
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
196 */
207
218 #include <linux/kernel.h>
....@@ -27,6 +14,13 @@
2714 #include <linux/i2c.h>
2815 #include <linux/pmbus.h>
2916 #include "pmbus.h"
17
+
18
+struct pmbus_device_info {
19
+ int pages;
20
+ u32 flags;
21
+};
22
+
23
+static const struct i2c_device_id pmbus_id[];
3024
3125 /*
3226 * Find sensor groups and status registers on each page.
....@@ -110,10 +104,10 @@
110104 int page;
111105
112106 for (page = 1; page < PMBUS_PAGES; page++) {
113
- if (pmbus_set_page(client, page) < 0)
107
+ if (pmbus_set_page(client, page, 0xff) < 0)
114108 break;
115109 }
116
- pmbus_set_page(client, 0);
110
+ pmbus_set_page(client, 0, 0xff);
117111 info->pages = page;
118112 } else {
119113 info->pages = 1;
....@@ -123,7 +117,7 @@
123117 }
124118
125119 if (pmbus_check_byte_register(client, 0, PMBUS_VOUT_MODE)) {
126
- int vout_mode;
120
+ int vout_mode, i;
127121
128122 vout_mode = pmbus_read_byte_data(client, 0, PMBUS_VOUT_MODE);
129123 if (vout_mode >= 0 && vout_mode != 0xff) {
....@@ -132,7 +126,8 @@
132126 break;
133127 case 1:
134128 info->format[PSC_VOLTAGE_OUT] = vid;
135
- info->vrm_version = vr11;
129
+ for (i = 0; i < info->pages; i++)
130
+ info->vrm_version[i] = vr11;
136131 break;
137132 case 2:
138133 info->format[PSC_VOLTAGE_OUT] = direct;
....@@ -166,19 +161,19 @@
166161 return ret;
167162 }
168163
169
-static int pmbus_probe(struct i2c_client *client,
170
- const struct i2c_device_id *id)
164
+static int pmbus_probe(struct i2c_client *client)
171165 {
172166 struct pmbus_driver_info *info;
173167 struct pmbus_platform_data *pdata = NULL;
174168 struct device *dev = &client->dev;
169
+ struct pmbus_device_info *device_info;
175170
176171 info = devm_kzalloc(dev, sizeof(struct pmbus_driver_info), GFP_KERNEL);
177172 if (!info)
178173 return -ENOMEM;
179174
180
- if (!strcmp(id->name, "dps460") || !strcmp(id->name, "dps800") ||
181
- !strcmp(id->name, "sgd009")) {
175
+ device_info = (struct pmbus_device_info *)i2c_match_id(pmbus_id, client)->driver_data;
176
+ if (device_info->flags & PMBUS_SKIP_STATUS_CHECK) {
182177 pdata = devm_kzalloc(dev, sizeof(struct pmbus_platform_data),
183178 GFP_KERNEL);
184179 if (!pdata)
....@@ -187,36 +182,51 @@
187182 pdata->flags = PMBUS_SKIP_STATUS_CHECK;
188183 }
189184
190
- info->pages = id->driver_data;
185
+ info->pages = device_info->pages;
191186 info->identify = pmbus_identify;
192187 dev->platform_data = pdata;
193188
194
- return pmbus_do_probe(client, id, info);
189
+ return pmbus_do_probe(client, info);
195190 }
191
+
192
+static const struct pmbus_device_info pmbus_info_one = {
193
+ .pages = 1,
194
+ .flags = 0
195
+};
196
+static const struct pmbus_device_info pmbus_info_zero = {
197
+ .pages = 0,
198
+ .flags = 0
199
+};
200
+static const struct pmbus_device_info pmbus_info_one_skip = {
201
+ .pages = 1,
202
+ .flags = PMBUS_SKIP_STATUS_CHECK
203
+};
196204
197205 /*
198206 * Use driver_data to set the number of pages supported by the chip.
199207 */
200208 static const struct i2c_device_id pmbus_id[] = {
201
- {"adp4000", 1},
202
- {"bmr453", 1},
203
- {"bmr454", 1},
204
- {"dps460", 1},
205
- {"dps800", 1},
206
- {"mdt040", 1},
207
- {"ncp4200", 1},
208
- {"ncp4208", 1},
209
- {"pdt003", 1},
210
- {"pdt006", 1},
211
- {"pdt012", 1},
212
- {"pmbus", 0},
213
- {"sgd009", 1},
214
- {"tps40400", 1},
215
- {"tps544b20", 1},
216
- {"tps544b25", 1},
217
- {"tps544c20", 1},
218
- {"tps544c25", 1},
219
- {"udt020", 1},
209
+ {"adp4000", (kernel_ulong_t)&pmbus_info_one},
210
+ {"bmr453", (kernel_ulong_t)&pmbus_info_one},
211
+ {"bmr454", (kernel_ulong_t)&pmbus_info_one},
212
+ {"dps460", (kernel_ulong_t)&pmbus_info_one_skip},
213
+ {"dps650ab", (kernel_ulong_t)&pmbus_info_one_skip},
214
+ {"dps800", (kernel_ulong_t)&pmbus_info_one_skip},
215
+ {"max20796", (kernel_ulong_t)&pmbus_info_one},
216
+ {"mdt040", (kernel_ulong_t)&pmbus_info_one},
217
+ {"ncp4200", (kernel_ulong_t)&pmbus_info_one},
218
+ {"ncp4208", (kernel_ulong_t)&pmbus_info_one},
219
+ {"pdt003", (kernel_ulong_t)&pmbus_info_one},
220
+ {"pdt006", (kernel_ulong_t)&pmbus_info_one},
221
+ {"pdt012", (kernel_ulong_t)&pmbus_info_one},
222
+ {"pmbus", (kernel_ulong_t)&pmbus_info_zero},
223
+ {"sgd009", (kernel_ulong_t)&pmbus_info_one_skip},
224
+ {"tps40400", (kernel_ulong_t)&pmbus_info_one},
225
+ {"tps544b20", (kernel_ulong_t)&pmbus_info_one},
226
+ {"tps544b25", (kernel_ulong_t)&pmbus_info_one},
227
+ {"tps544c20", (kernel_ulong_t)&pmbus_info_one},
228
+ {"tps544c25", (kernel_ulong_t)&pmbus_info_one},
229
+ {"udt020", (kernel_ulong_t)&pmbus_info_one},
220230 {}
221231 };
222232
....@@ -227,7 +237,7 @@
227237 .driver = {
228238 .name = "pmbus",
229239 },
230
- .probe = pmbus_probe,
240
+ .probe_new = pmbus_probe,
231241 .remove = pmbus_do_remove,
232242 .id_table = pmbus_id,
233243 };