xref: /linux/drivers/hwmon/pmbus/q54sj108a2.c (revision 9e4e86a604dfd06402933467578c4b79f5412b2c)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Driver for Delta modules, Q54SJ108A2 series 1/4 Brick DC/DC
4  * Regulated Power Module
5  *
6  * Copyright 2020 Delta LLC.
7  */
8 
9 #include <linux/debugfs.h>
10 #include <linux/hex.h>
11 #include <linux/i2c.h>
12 #include <linux/kstrtox.h>
13 #include <linux/module.h>
14 #include <linux/of.h>
15 #include "pmbus.h"
16 
17 #define STORE_DEFAULT_ALL		0x11
18 #define ERASE_BLACKBOX_DATA		0xD1
19 #define READ_HISTORY_EVENT_NUMBER	0xD2
20 #define READ_HISTORY_EVENTS		0xE0
21 #define SET_HISTORY_EVENT_OFFSET	0xE1
22 #define PMBUS_FLASH_KEY_WRITE		0xEC
23 
24 enum chips {
25 	q54sj108a2
26 };
27 
28 enum {
29 	Q54SJ108A2_DEBUGFS_OPERATION = 0,
30 	Q54SJ108A2_DEBUGFS_CLEARFAULT,
31 	Q54SJ108A2_DEBUGFS_WRITEPROTECT,
32 	Q54SJ108A2_DEBUGFS_STOREDEFAULT,
33 	Q54SJ108A2_DEBUGFS_VOOV_RESPONSE,
34 	Q54SJ108A2_DEBUGFS_IOOC_RESPONSE,
35 	Q54SJ108A2_DEBUGFS_PMBUS_VERSION,
36 	Q54SJ108A2_DEBUGFS_MFR_ID,
37 	Q54SJ108A2_DEBUGFS_MFR_MODEL,
38 	Q54SJ108A2_DEBUGFS_MFR_REVISION,
39 	Q54SJ108A2_DEBUGFS_MFR_LOCATION,
40 	Q54SJ108A2_DEBUGFS_BLACKBOX_ERASE,
41 	Q54SJ108A2_DEBUGFS_BLACKBOX_READ_OFFSET,
42 	Q54SJ108A2_DEBUGFS_BLACKBOX_SET_OFFSET,
43 	Q54SJ108A2_DEBUGFS_BLACKBOX_READ,
44 	Q54SJ108A2_DEBUGFS_FLASH_KEY,
45 	Q54SJ108A2_DEBUGFS_NUM_ENTRIES
46 };
47 
48 struct q54sj108a2_data {
49 	enum chips chip;
50 	struct i2c_client *client;
51 
52 	int debugfs_entries[Q54SJ108A2_DEBUGFS_NUM_ENTRIES];
53 };
54 
55 #define to_psu(x, y) container_of((x), struct q54sj108a2_data, debugfs_entries[(y)])
56 
57 static struct pmbus_driver_info q54sj108a2_info[] = {
58 	[q54sj108a2] = {
59 		.pages = 1,
60 
61 		/* Source : Delta Q54SJ108A2 */
62 		.format[PSC_TEMPERATURE] = linear,
63 		.format[PSC_VOLTAGE_IN] = linear,
64 		.format[PSC_CURRENT_OUT] = linear,
65 
66 		.func[0] = PMBUS_HAVE_VIN |
67 		PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT |
68 		PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT |
69 		PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP |
70 		PMBUS_HAVE_STATUS_INPUT,
71 	},
72 };
73 
q54sj108a2_debugfs_read(struct file * file,char __user * buf,size_t count,loff_t * ppos)74 static ssize_t q54sj108a2_debugfs_read(struct file *file, char __user *buf,
75 				       size_t count, loff_t *ppos)
76 {
77 	int rc;
78 	int *idxp = file->private_data;
79 	int idx = *idxp;
80 	struct q54sj108a2_data *psu = to_psu(idxp, idx);
81 	char data[I2C_SMBUS_BLOCK_MAX + 2] = { 0 };
82 	char data_char[I2C_SMBUS_BLOCK_MAX * 2 + 2] = { 0 };
83 	char *out = data;
84 	char *res;
85 
86 	switch (idx) {
87 	case Q54SJ108A2_DEBUGFS_OPERATION:
88 		rc = i2c_smbus_read_byte_data(psu->client, PMBUS_OPERATION);
89 		if (rc < 0)
90 			return rc;
91 
92 		rc = snprintf(data, 3, "%02x", rc);
93 		break;
94 	case Q54SJ108A2_DEBUGFS_WRITEPROTECT:
95 		rc = i2c_smbus_read_byte_data(psu->client, PMBUS_WRITE_PROTECT);
96 		if (rc < 0)
97 			return rc;
98 
99 		rc = snprintf(data, 3, "%02x", rc);
100 		break;
101 	case Q54SJ108A2_DEBUGFS_VOOV_RESPONSE:
102 		rc = i2c_smbus_read_byte_data(psu->client, PMBUS_VOUT_OV_FAULT_RESPONSE);
103 		if (rc < 0)
104 			return rc;
105 
106 		rc = snprintf(data, 3, "%02x", rc);
107 		break;
108 	case Q54SJ108A2_DEBUGFS_IOOC_RESPONSE:
109 		rc = i2c_smbus_read_byte_data(psu->client, PMBUS_IOUT_OC_FAULT_RESPONSE);
110 		if (rc < 0)
111 			return rc;
112 
113 		rc = snprintf(data, 3, "%02x", rc);
114 		break;
115 	case Q54SJ108A2_DEBUGFS_PMBUS_VERSION:
116 		rc = i2c_smbus_read_byte_data(psu->client, PMBUS_REVISION);
117 		if (rc < 0)
118 			return rc;
119 
120 		rc = snprintf(data, 3, "%02x", rc);
121 		break;
122 	case Q54SJ108A2_DEBUGFS_MFR_ID:
123 		rc = i2c_smbus_read_block_data(psu->client, PMBUS_MFR_ID, data);
124 		if (rc < 0)
125 			return rc;
126 		break;
127 	case Q54SJ108A2_DEBUGFS_MFR_MODEL:
128 		rc = i2c_smbus_read_block_data(psu->client, PMBUS_MFR_MODEL, data);
129 		if (rc < 0)
130 			return rc;
131 		break;
132 	case Q54SJ108A2_DEBUGFS_MFR_REVISION:
133 		rc = i2c_smbus_read_block_data(psu->client, PMBUS_MFR_REVISION, data);
134 		if (rc < 0)
135 			return rc;
136 		break;
137 	case Q54SJ108A2_DEBUGFS_MFR_LOCATION:
138 		rc = i2c_smbus_read_block_data(psu->client, PMBUS_MFR_LOCATION, data);
139 		if (rc < 0)
140 			return rc;
141 		break;
142 	case Q54SJ108A2_DEBUGFS_BLACKBOX_READ_OFFSET:
143 		rc = i2c_smbus_read_byte_data(psu->client, READ_HISTORY_EVENT_NUMBER);
144 		if (rc < 0)
145 			return rc;
146 
147 		rc = snprintf(data, 3, "%02x", rc);
148 		break;
149 	case Q54SJ108A2_DEBUGFS_BLACKBOX_READ:
150 		rc = i2c_smbus_read_block_data(psu->client, READ_HISTORY_EVENTS, data);
151 		if (rc < 0)
152 			return rc;
153 
154 		res = bin2hex(data_char, data, rc);
155 		rc = res - data_char;
156 		out = data_char;
157 		break;
158 	case Q54SJ108A2_DEBUGFS_FLASH_KEY:
159 		rc = i2c_smbus_read_block_data(psu->client, PMBUS_FLASH_KEY_WRITE, data);
160 		if (rc < 0)
161 			return rc;
162 
163 		res = bin2hex(data_char, data, rc);
164 		rc = res - data_char;
165 		out = data_char;
166 		break;
167 	default:
168 		return -EINVAL;
169 	}
170 
171 	out[rc] = '\n';
172 	rc += 2;
173 
174 	return simple_read_from_buffer(buf, count, ppos, out, rc);
175 }
176 
q54sj108a2_debugfs_write(struct file * file,const char __user * buf,size_t count,loff_t * ppos)177 static ssize_t q54sj108a2_debugfs_write(struct file *file, const char __user *buf,
178 					size_t count, loff_t *ppos)
179 {
180 	u8 flash_key[4];
181 	u8 dst_data;
182 	ssize_t rc;
183 	int *idxp = file->private_data;
184 	int idx = *idxp;
185 	struct q54sj108a2_data *psu = to_psu(idxp, idx);
186 
187 	rc = i2c_smbus_write_byte_data(psu->client, PMBUS_WRITE_PROTECT, 0);
188 	if (rc)
189 		return rc;
190 
191 	switch (idx) {
192 	case Q54SJ108A2_DEBUGFS_OPERATION:
193 		rc = kstrtou8_from_user(buf, count, 0, &dst_data);
194 		if (rc < 0)
195 			return rc;
196 
197 		rc = i2c_smbus_write_byte_data(psu->client, PMBUS_OPERATION, dst_data);
198 		if (rc < 0)
199 			return rc;
200 
201 		break;
202 	case Q54SJ108A2_DEBUGFS_CLEARFAULT:
203 		rc = i2c_smbus_write_byte(psu->client, PMBUS_CLEAR_FAULTS);
204 		if (rc < 0)
205 			return rc;
206 
207 		break;
208 	case Q54SJ108A2_DEBUGFS_STOREDEFAULT:
209 		flash_key[0] = 0x7E;
210 		flash_key[1] = 0x15;
211 		flash_key[2] = 0xDC;
212 		flash_key[3] = 0x42;
213 		rc = i2c_smbus_write_block_data(psu->client, PMBUS_FLASH_KEY_WRITE, 4, flash_key);
214 		if (rc < 0)
215 			return rc;
216 
217 		rc = i2c_smbus_write_byte(psu->client, STORE_DEFAULT_ALL);
218 		if (rc < 0)
219 			return rc;
220 
221 		break;
222 	case Q54SJ108A2_DEBUGFS_VOOV_RESPONSE:
223 		rc = kstrtou8_from_user(buf, count, 0, &dst_data);
224 		if (rc < 0)
225 			return rc;
226 
227 		rc = i2c_smbus_write_byte_data(psu->client, PMBUS_VOUT_OV_FAULT_RESPONSE, dst_data);
228 		if (rc < 0)
229 			return rc;
230 
231 		break;
232 	case Q54SJ108A2_DEBUGFS_IOOC_RESPONSE:
233 		rc = kstrtou8_from_user(buf, count, 0, &dst_data);
234 		if (rc < 0)
235 			return rc;
236 
237 		rc = i2c_smbus_write_byte_data(psu->client, PMBUS_IOUT_OC_FAULT_RESPONSE, dst_data);
238 		if (rc < 0)
239 			return rc;
240 
241 		break;
242 	case Q54SJ108A2_DEBUGFS_BLACKBOX_ERASE:
243 		rc = i2c_smbus_write_byte(psu->client, ERASE_BLACKBOX_DATA);
244 		if (rc < 0)
245 			return rc;
246 
247 		break;
248 	case Q54SJ108A2_DEBUGFS_BLACKBOX_SET_OFFSET:
249 		rc = kstrtou8_from_user(buf, count, 0, &dst_data);
250 		if (rc < 0)
251 			return rc;
252 
253 		rc = i2c_smbus_write_byte_data(psu->client, SET_HISTORY_EVENT_OFFSET, dst_data);
254 		if (rc < 0)
255 			return rc;
256 
257 		break;
258 	default:
259 		return -EINVAL;
260 	}
261 
262 	return count;
263 }
264 
265 static const struct file_operations q54sj108a2_fops = {
266 	.llseek = noop_llseek,
267 	.read = q54sj108a2_debugfs_read,
268 	.write = q54sj108a2_debugfs_write,
269 	.open = simple_open,
270 };
271 
272 static const struct i2c_device_id q54sj108a2_id[] = {
273 	{ "q54sj108a2", q54sj108a2 },
274 	{ "q54sn120a1", q54sj108a2 },
275 	{ "q54sw120a7", q54sj108a2 },
276 	{ },
277 };
278 
279 MODULE_DEVICE_TABLE(i2c, q54sj108a2_id);
280 
q54sj108a2_probe(struct i2c_client * client)281 static int q54sj108a2_probe(struct i2c_client *client)
282 {
283 	struct device *dev = &client->dev;
284 	u8 buf[I2C_SMBUS_BLOCK_MAX + 1];
285 	const struct i2c_device_id *mid;
286 	enum chips chip_id;
287 	int ret, i;
288 	struct dentry *debugfs;
289 	struct dentry *q54sj108a2_dir;
290 	struct q54sj108a2_data *psu;
291 
292 	if (!i2c_check_functionality(client->adapter,
293 				     I2C_FUNC_SMBUS_BYTE_DATA |
294 				     I2C_FUNC_SMBUS_WORD_DATA |
295 				     I2C_FUNC_SMBUS_BLOCK_DATA))
296 		return -ENODEV;
297 
298 	chip_id = (enum chips)(uintptr_t)i2c_get_match_data(client);
299 
300 	ret = i2c_smbus_read_block_data(client, PMBUS_MFR_ID, buf);
301 	if (ret < 0) {
302 		dev_err(&client->dev, "Failed to read Manufacturer ID\n");
303 		return ret;
304 	}
305 	if (ret != 6 || strncmp(buf, "DELTA", 5)) {
306 		buf[ret] = '\0';
307 		dev_err(dev, "Unsupported Manufacturer ID '%s'\n", buf);
308 		return -ENODEV;
309 	}
310 
311 	/*
312 	 * The chips support reading PMBUS_MFR_MODEL.
313 	 */
314 	ret = i2c_smbus_read_block_data(client, PMBUS_MFR_MODEL, buf);
315 	if (ret < 0) {
316 		dev_err(dev, "Failed to read Manufacturer Model\n");
317 		return ret;
318 	}
319 	buf[ret] = '\0';
320 	for (mid = q54sj108a2_id; mid->name[0]; mid++) {
321 		if (!strncasecmp(mid->name, buf, strlen(mid->name)))
322 			break;
323 	}
324 	if (!mid->name[0]) {
325 		dev_err(dev, "Unsupported Manufacturer Model '%s'\n", buf);
326 		return -ENODEV;
327 	}
328 
329 	ret = i2c_smbus_read_block_data(client, PMBUS_MFR_REVISION, buf);
330 	if (ret < 0) {
331 		dev_err(dev, "Failed to read Manufacturer Revision\n");
332 		return ret;
333 	}
334 	/*
335 	 * accept manufacturer revision with optional NUL byte
336 	 */
337 	if (!(ret == 4 || ret == 5) || buf[0] != 'S') {
338 		buf[ret] = '\0';
339 		dev_err(dev, "Unsupported Manufacturer Revision '%s'\n", buf);
340 		return -ENODEV;
341 	}
342 
343 	ret = pmbus_do_probe(client, &q54sj108a2_info[chip_id]);
344 	if (ret)
345 		return ret;
346 
347 	psu = devm_kzalloc(&client->dev, sizeof(*psu), GFP_KERNEL);
348 	if (!psu)
349 		return 0;
350 
351 	psu->client = client;
352 
353 	debugfs = pmbus_get_debugfs_dir(client);
354 
355 	q54sj108a2_dir = debugfs_create_dir(client->name, debugfs);
356 
357 	for (i = 0; i < Q54SJ108A2_DEBUGFS_NUM_ENTRIES; ++i)
358 		psu->debugfs_entries[i] = i;
359 
360 	debugfs_create_file("operation", 0644, q54sj108a2_dir,
361 			    &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_OPERATION],
362 			    &q54sj108a2_fops);
363 	debugfs_create_file("clear_fault", 0200, q54sj108a2_dir,
364 			    &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_CLEARFAULT],
365 			    &q54sj108a2_fops);
366 	debugfs_create_file("write_protect", 0444, q54sj108a2_dir,
367 			    &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_WRITEPROTECT],
368 			    &q54sj108a2_fops);
369 	debugfs_create_file("store_default", 0200, q54sj108a2_dir,
370 			    &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_STOREDEFAULT],
371 			    &q54sj108a2_fops);
372 	debugfs_create_file("vo_ov_response", 0644, q54sj108a2_dir,
373 			    &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_VOOV_RESPONSE],
374 			    &q54sj108a2_fops);
375 	debugfs_create_file("io_oc_response", 0644, q54sj108a2_dir,
376 			    &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_IOOC_RESPONSE],
377 			    &q54sj108a2_fops);
378 	debugfs_create_file("pmbus_revision", 0444, q54sj108a2_dir,
379 			    &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_PMBUS_VERSION],
380 			    &q54sj108a2_fops);
381 	debugfs_create_file("mfr_id", 0444, q54sj108a2_dir,
382 			    &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_MFR_ID],
383 			    &q54sj108a2_fops);
384 	debugfs_create_file("mfr_model", 0444, q54sj108a2_dir,
385 			    &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_MFR_MODEL],
386 			    &q54sj108a2_fops);
387 	debugfs_create_file("mfr_revision", 0444, q54sj108a2_dir,
388 			    &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_MFR_REVISION],
389 			    &q54sj108a2_fops);
390 	debugfs_create_file("mfr_location", 0444, q54sj108a2_dir,
391 			    &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_MFR_LOCATION],
392 			    &q54sj108a2_fops);
393 	debugfs_create_file("blackbox_erase", 0200, q54sj108a2_dir,
394 			    &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_BLACKBOX_ERASE],
395 			    &q54sj108a2_fops);
396 	debugfs_create_file("blackbox_read_offset", 0444, q54sj108a2_dir,
397 			    &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_BLACKBOX_READ_OFFSET],
398 			    &q54sj108a2_fops);
399 	debugfs_create_file("blackbox_set_offset", 0200, q54sj108a2_dir,
400 			    &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_BLACKBOX_SET_OFFSET],
401 			    &q54sj108a2_fops);
402 	debugfs_create_file("blackbox_read", 0444, q54sj108a2_dir,
403 			    &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_BLACKBOX_READ],
404 			    &q54sj108a2_fops);
405 	debugfs_create_file("flash_key", 0444, q54sj108a2_dir,
406 			    &psu->debugfs_entries[Q54SJ108A2_DEBUGFS_FLASH_KEY],
407 			    &q54sj108a2_fops);
408 
409 	return 0;
410 }
411 
412 static const struct of_device_id q54sj108a2_of_match[] = {
413 	{ .compatible = "delta,q54sj108a2", .data = (void *)q54sj108a2 },
414 	{ .compatible = "delta,q54sn120a1", .data = (void *)q54sj108a2 },
415 	{ .compatible = "delta,q54sw120a7", .data = (void *)q54sj108a2 },
416 	{ },
417 };
418 
419 MODULE_DEVICE_TABLE(of, q54sj108a2_of_match);
420 
421 static struct i2c_driver q54sj108a2_driver = {
422 	.driver = {
423 		.name = "q54sj108a2",
424 		.of_match_table = q54sj108a2_of_match,
425 	},
426 	.probe = q54sj108a2_probe,
427 	.id_table = q54sj108a2_id,
428 };
429 
430 module_i2c_driver(q54sj108a2_driver);
431 
432 MODULE_AUTHOR("Xiao.Ma <xiao.mx.ma@deltaww.com>");
433 MODULE_DESCRIPTION("PMBus driver for Delta Q54SJ108A2 series modules");
434 MODULE_LICENSE("GPL");
435 MODULE_IMPORT_NS("PMBUS");
436