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