1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Driver for the TI TPS23881 PoE PSE Controller driver (I2C bus)
4 *
5 * Copyright (c) 2023 Bootlin, Kory Maincent <kory.maincent@bootlin.com>
6 */
7
8#include <linux/delay.h>
9#include <linux/firmware.h>
10#include <linux/i2c.h>
11#include <linux/module.h>
12#include <linux/of.h>
13#include <linux/platform_device.h>
14#include <linux/pse-pd/pse.h>
15
16#define TPS23881_MAX_CHANS 8
17
18#define TPS23881_REG_PW_STATUS	0x10
19#define TPS23881_REG_OP_MODE	0x12
20#define TPS23881_OP_MODE_SEMIAUTO	0xaaaa
21#define TPS23881_REG_DIS_EN	0x13
22#define TPS23881_REG_DET_CLA_EN	0x14
23#define TPS23881_REG_GEN_MASK	0x17
24#define TPS23881_REG_NBITACC	BIT(5)
25#define TPS23881_REG_PW_EN	0x19
26#define TPS23881_REG_PORT_MAP	0x26
27#define TPS23881_REG_PORT_POWER	0x29
28#define TPS23881_REG_POEPLUS	0x40
29#define TPS23881_REG_TPON	BIT(0)
30#define TPS23881_REG_FWREV	0x41
31#define TPS23881_REG_DEVID	0x43
32#define TPS23881_REG_SRAM_CTRL	0x60
33#define TPS23881_REG_SRAM_DATA	0x61
34
35struct tps23881_port_desc {
36	u8 chan[2];
37	bool is_4p;
38};
39
40struct tps23881_priv {
41	struct i2c_client *client;
42	struct pse_controller_dev pcdev;
43	struct device_node *np;
44	struct tps23881_port_desc port[TPS23881_MAX_CHANS];
45};
46
47static struct tps23881_priv *to_tps23881_priv(struct pse_controller_dev *pcdev)
48{
49	return container_of(pcdev, struct tps23881_priv, pcdev);
50}
51
52static int tps23881_pi_enable(struct pse_controller_dev *pcdev, int id)
53{
54	struct tps23881_priv *priv = to_tps23881_priv(pcdev);
55	struct i2c_client *client = priv->client;
56	u8 chan;
57	u16 val;
58	int ret;
59
60	if (id >= TPS23881_MAX_CHANS)
61		return -ERANGE;
62
63	ret = i2c_smbus_read_word_data(client, TPS23881_REG_PW_STATUS);
64	if (ret < 0)
65		return ret;
66
67	chan = priv->port[id].chan[0];
68	if (chan < 4)
69		val = (u16)(ret | BIT(chan));
70	else
71		val = (u16)(ret | BIT(chan + 4));
72
73	if (priv->port[id].is_4p) {
74		chan = priv->port[id].chan[1];
75		if (chan < 4)
76			val |= BIT(chan);
77		else
78			val |= BIT(chan + 4);
79	}
80
81	ret = i2c_smbus_write_word_data(client, TPS23881_REG_PW_EN, val);
82	if (ret)
83		return ret;
84
85	return 0;
86}
87
88static int tps23881_pi_disable(struct pse_controller_dev *pcdev, int id)
89{
90	struct tps23881_priv *priv = to_tps23881_priv(pcdev);
91	struct i2c_client *client = priv->client;
92	u8 chan;
93	u16 val;
94	int ret;
95
96	if (id >= TPS23881_MAX_CHANS)
97		return -ERANGE;
98
99	ret = i2c_smbus_read_word_data(client, TPS23881_REG_PW_STATUS);
100	if (ret < 0)
101		return ret;
102
103	chan = priv->port[id].chan[0];
104	if (chan < 4)
105		val = (u16)(ret | BIT(chan + 4));
106	else
107		val = (u16)(ret | BIT(chan + 8));
108
109	if (priv->port[id].is_4p) {
110		chan = priv->port[id].chan[1];
111		if (chan < 4)
112			val |= BIT(chan + 4);
113		else
114			val |= BIT(chan + 8);
115	}
116
117	ret = i2c_smbus_write_word_data(client, TPS23881_REG_PW_EN, val);
118	if (ret)
119		return ret;
120
121	return 0;
122}
123
124static int tps23881_pi_is_enabled(struct pse_controller_dev *pcdev, int id)
125{
126	struct tps23881_priv *priv = to_tps23881_priv(pcdev);
127	struct i2c_client *client = priv->client;
128	bool enabled;
129	u8 chan;
130	int ret;
131
132	ret = i2c_smbus_read_word_data(client, TPS23881_REG_PW_STATUS);
133	if (ret < 0)
134		return ret;
135
136	chan = priv->port[id].chan[0];
137	if (chan < 4)
138		enabled = ret & BIT(chan);
139	else
140		enabled = ret & BIT(chan + 4);
141
142	if (priv->port[id].is_4p) {
143		chan = priv->port[id].chan[1];
144		if (chan < 4)
145			enabled &= !!(ret & BIT(chan));
146		else
147			enabled &= !!(ret & BIT(chan + 4));
148	}
149
150	/* Return enabled status only if both channel are on this state */
151	return enabled;
152}
153
154static int tps23881_ethtool_get_status(struct pse_controller_dev *pcdev,
155				       unsigned long id,
156				       struct netlink_ext_ack *extack,
157				       struct pse_control_status *status)
158{
159	struct tps23881_priv *priv = to_tps23881_priv(pcdev);
160	struct i2c_client *client = priv->client;
161	bool enabled, delivering;
162	u8 chan;
163	int ret;
164
165	ret = i2c_smbus_read_word_data(client, TPS23881_REG_PW_STATUS);
166	if (ret < 0)
167		return ret;
168
169	chan = priv->port[id].chan[0];
170	if (chan < 4) {
171		enabled = ret & BIT(chan);
172		delivering = ret & BIT(chan + 4);
173	} else {
174		enabled = ret & BIT(chan + 4);
175		delivering = ret & BIT(chan + 8);
176	}
177
178	if (priv->port[id].is_4p) {
179		chan = priv->port[id].chan[1];
180		if (chan < 4) {
181			enabled &= !!(ret & BIT(chan));
182			delivering &= !!(ret & BIT(chan + 4));
183		} else {
184			enabled &= !!(ret & BIT(chan + 4));
185			delivering &= !!(ret & BIT(chan + 8));
186		}
187	}
188
189	/* Return delivering status only if both channel are on this state */
190	if (delivering)
191		status->c33_pw_status = ETHTOOL_C33_PSE_PW_D_STATUS_DELIVERING;
192	else
193		status->c33_pw_status = ETHTOOL_C33_PSE_PW_D_STATUS_DISABLED;
194
195	/* Return enabled status only if both channel are on this state */
196	if (enabled)
197		status->c33_admin_state = ETHTOOL_C33_PSE_ADMIN_STATE_ENABLED;
198	else
199		status->c33_admin_state = ETHTOOL_C33_PSE_ADMIN_STATE_DISABLED;
200
201	return 0;
202}
203
204/* Parse managers subnode into a array of device node */
205static int
206tps23881_get_of_channels(struct tps23881_priv *priv,
207			 struct device_node *chan_node[TPS23881_MAX_CHANS])
208{
209	struct device_node *channels_node, *node;
210	int i, ret;
211
212	if (!priv->np)
213		return -EINVAL;
214
215	channels_node = of_find_node_by_name(priv->np, "channels");
216	if (!channels_node)
217		return -EINVAL;
218
219	for_each_child_of_node(channels_node, node) {
220		u32 chan_id;
221
222		if (!of_node_name_eq(node, "channel"))
223			continue;
224
225		ret = of_property_read_u32(node, "reg", &chan_id);
226		if (ret) {
227			ret = -EINVAL;
228			goto out;
229		}
230
231		if (chan_id >= TPS23881_MAX_CHANS || chan_node[chan_id]) {
232			dev_err(&priv->client->dev,
233				"wrong number of port (%d)\n", chan_id);
234			ret = -EINVAL;
235			goto out;
236		}
237
238		of_node_get(node);
239		chan_node[chan_id] = node;
240	}
241
242	of_node_put(channels_node);
243	return 0;
244
245out:
246	for (i = 0; i < TPS23881_MAX_CHANS; i++) {
247		of_node_put(chan_node[i]);
248		chan_node[i] = NULL;
249	}
250
251	of_node_put(node);
252	of_node_put(channels_node);
253	return ret;
254}
255
256struct tps23881_port_matrix {
257	u8 pi_id;
258	u8 lgcl_chan[2];
259	u8 hw_chan[2];
260	bool is_4p;
261	bool exist;
262};
263
264static int
265tps23881_match_channel(const struct pse_pi_pairset *pairset,
266		       struct device_node *chan_node[TPS23881_MAX_CHANS])
267{
268	int i;
269
270	/* Look on every channels */
271	for (i = 0; i < TPS23881_MAX_CHANS; i++) {
272		if (pairset->np == chan_node[i])
273			return i;
274	}
275
276	return -ENODEV;
277}
278
279static bool
280tps23881_is_chan_free(struct tps23881_port_matrix port_matrix[TPS23881_MAX_CHANS],
281		      int chan)
282{
283	int i;
284
285	for (i = 0; i < TPS23881_MAX_CHANS; i++) {
286		if (port_matrix[i].exist &&
287		    (port_matrix[i].hw_chan[0] == chan ||
288		    port_matrix[i].hw_chan[1] == chan))
289			return false;
290	}
291
292	return true;
293}
294
295/* Fill port matrix with the matching channels */
296static int
297tps23881_match_port_matrix(struct pse_pi *pi, int pi_id,
298			   struct device_node *chan_node[TPS23881_MAX_CHANS],
299			   struct tps23881_port_matrix port_matrix[TPS23881_MAX_CHANS])
300{
301	int ret;
302
303	if (!pi->pairset[0].np)
304		return 0;
305
306	ret = tps23881_match_channel(&pi->pairset[0], chan_node);
307	if (ret < 0)
308		return ret;
309
310	if (!tps23881_is_chan_free(port_matrix, ret)) {
311		pr_err("tps23881: channel %d already used\n", ret);
312		return -ENODEV;
313	}
314
315	port_matrix[pi_id].hw_chan[0] = ret;
316	port_matrix[pi_id].exist = true;
317
318	if (!pi->pairset[1].np)
319		return 0;
320
321	ret = tps23881_match_channel(&pi->pairset[1], chan_node);
322	if (ret < 0)
323		return ret;
324
325	if (!tps23881_is_chan_free(port_matrix, ret)) {
326		pr_err("tps23881: channel %d already used\n", ret);
327		return -ENODEV;
328	}
329
330	if (port_matrix[pi_id].hw_chan[0] / 4 != ret / 4) {
331		pr_err("tps23881: 4-pair PSE can only be set within the same 4 ports group");
332		return -ENODEV;
333	}
334
335	port_matrix[pi_id].hw_chan[1] = ret;
336	port_matrix[pi_id].is_4p = true;
337
338	return 0;
339}
340
341static int
342tps23881_get_unused_chan(struct tps23881_port_matrix port_matrix[TPS23881_MAX_CHANS],
343			 int port_cnt)
344{
345	bool used;
346	int i, j;
347
348	for (i = 0; i < TPS23881_MAX_CHANS; i++) {
349		used = false;
350
351		for (j = 0; j < port_cnt; j++) {
352			if (port_matrix[j].hw_chan[0] == i) {
353				used = true;
354				break;
355			}
356
357			if (port_matrix[j].is_4p &&
358			    port_matrix[j].hw_chan[1] == i) {
359				used = true;
360				break;
361			}
362		}
363
364		if (!used)
365			return i;
366	}
367
368	return -ENODEV;
369}
370
371/* Sort the port matrix to following particular hardware ports matrix
372 * specification of the tps23881. The device has two 4-ports groups and
373 * each 4-pair powered device has to be configured to use two consecutive
374 * logical channel in each 4 ports group (1 and 2 or 3 and 4). Also the
375 * hardware matrix has to be fully configured even with unused chan to be
376 * valid.
377 */
378static int
379tps23881_sort_port_matrix(struct tps23881_port_matrix port_matrix[TPS23881_MAX_CHANS])
380{
381	struct tps23881_port_matrix tmp_port_matrix[TPS23881_MAX_CHANS] = {0};
382	int i, ret, port_cnt = 0, cnt_4ch_grp1 = 0, cnt_4ch_grp2 = 4;
383
384	/* Configure 4p port matrix */
385	for (i = 0; i < TPS23881_MAX_CHANS; i++) {
386		int *cnt;
387
388		if (!port_matrix[i].exist || !port_matrix[i].is_4p)
389			continue;
390
391		if (port_matrix[i].hw_chan[0] < 4)
392			cnt = &cnt_4ch_grp1;
393		else
394			cnt = &cnt_4ch_grp2;
395
396		tmp_port_matrix[port_cnt].exist = true;
397		tmp_port_matrix[port_cnt].is_4p = true;
398		tmp_port_matrix[port_cnt].pi_id = i;
399		tmp_port_matrix[port_cnt].hw_chan[0] = port_matrix[i].hw_chan[0];
400		tmp_port_matrix[port_cnt].hw_chan[1] = port_matrix[i].hw_chan[1];
401
402		/* 4-pair ports have to be configured with consecutive
403		 * logical channels 0 and 1, 2 and 3.
404		 */
405		tmp_port_matrix[port_cnt].lgcl_chan[0] = (*cnt)++;
406		tmp_port_matrix[port_cnt].lgcl_chan[1] = (*cnt)++;
407
408		port_cnt++;
409	}
410
411	/* Configure 2p port matrix */
412	for (i = 0; i < TPS23881_MAX_CHANS; i++) {
413		int *cnt;
414
415		if (!port_matrix[i].exist || port_matrix[i].is_4p)
416			continue;
417
418		if (port_matrix[i].hw_chan[0] < 4)
419			cnt = &cnt_4ch_grp1;
420		else
421			cnt = &cnt_4ch_grp2;
422
423		tmp_port_matrix[port_cnt].exist = true;
424		tmp_port_matrix[port_cnt].pi_id = i;
425		tmp_port_matrix[port_cnt].lgcl_chan[0] = (*cnt)++;
426		tmp_port_matrix[port_cnt].hw_chan[0] = port_matrix[i].hw_chan[0];
427
428		port_cnt++;
429	}
430
431	/* Complete the rest of the first 4 port group matrix even if
432	 * channels are unused
433	 */
434	while (cnt_4ch_grp1 < 4) {
435		ret = tps23881_get_unused_chan(tmp_port_matrix, port_cnt);
436		if (ret < 0) {
437			pr_err("tps23881: port matrix issue, no chan available\n");
438			return ret;
439		}
440
441		if (port_cnt >= TPS23881_MAX_CHANS) {
442			pr_err("tps23881: wrong number of channels\n");
443			return -ENODEV;
444		}
445		tmp_port_matrix[port_cnt].lgcl_chan[0] = cnt_4ch_grp1;
446		tmp_port_matrix[port_cnt].hw_chan[0] = ret;
447		cnt_4ch_grp1++;
448		port_cnt++;
449	}
450
451	/* Complete the rest of the second 4 port group matrix even if
452	 * channels are unused
453	 */
454	while (cnt_4ch_grp2 < 8) {
455		ret = tps23881_get_unused_chan(tmp_port_matrix, port_cnt);
456		if (ret < 0) {
457			pr_err("tps23881: port matrix issue, no chan available\n");
458			return -ENODEV;
459		}
460
461		if (port_cnt >= TPS23881_MAX_CHANS) {
462			pr_err("tps23881: wrong number of channels\n");
463			return -ENODEV;
464		}
465		tmp_port_matrix[port_cnt].lgcl_chan[0] = cnt_4ch_grp2;
466		tmp_port_matrix[port_cnt].hw_chan[0] = ret;
467		cnt_4ch_grp2++;
468		port_cnt++;
469	}
470
471	memcpy(port_matrix, tmp_port_matrix, sizeof(tmp_port_matrix));
472
473	return port_cnt;
474}
475
476/* Write port matrix to the hardware port matrix and the software port
477 * matrix.
478 */
479static int
480tps23881_write_port_matrix(struct tps23881_priv *priv,
481			   struct tps23881_port_matrix port_matrix[TPS23881_MAX_CHANS],
482			   int port_cnt)
483{
484	struct i2c_client *client = priv->client;
485	u8 pi_id, lgcl_chan, hw_chan;
486	u16 val = 0;
487	int i, ret;
488
489	for (i = 0; i < port_cnt; i++) {
490		pi_id = port_matrix[i].pi_id;
491		lgcl_chan = port_matrix[i].lgcl_chan[0];
492		hw_chan = port_matrix[i].hw_chan[0] % 4;
493
494		/* Set software port matrix for existing ports */
495		if (port_matrix[i].exist)
496			priv->port[pi_id].chan[0] = lgcl_chan;
497
498		/* Set hardware port matrix for all ports */
499		val |= hw_chan << (lgcl_chan * 2);
500
501		if (!port_matrix[i].is_4p)
502			continue;
503
504		lgcl_chan = port_matrix[i].lgcl_chan[1];
505		hw_chan = port_matrix[i].hw_chan[1] % 4;
506
507		/* Set software port matrix for existing ports */
508		if (port_matrix[i].exist) {
509			priv->port[pi_id].is_4p = true;
510			priv->port[pi_id].chan[1] = lgcl_chan;
511		}
512
513		/* Set hardware port matrix for all ports */
514		val |= hw_chan << (lgcl_chan * 2);
515	}
516
517	/* Write hardware ports matrix */
518	ret = i2c_smbus_write_word_data(client, TPS23881_REG_PORT_MAP, val);
519	if (ret)
520		return ret;
521
522	return 0;
523}
524
525static int
526tps23881_set_ports_conf(struct tps23881_priv *priv,
527			struct tps23881_port_matrix port_matrix[TPS23881_MAX_CHANS])
528{
529	struct i2c_client *client = priv->client;
530	int i, ret;
531	u16 val;
532
533	/* Set operating mode */
534	ret = i2c_smbus_write_word_data(client, TPS23881_REG_OP_MODE,
535					TPS23881_OP_MODE_SEMIAUTO);
536	if (ret)
537		return ret;
538
539	/* Disable DC disconnect */
540	ret = i2c_smbus_write_word_data(client, TPS23881_REG_DIS_EN, 0x0);
541	if (ret)
542		return ret;
543
544	/* Set port power allocation */
545	val = 0;
546	for (i = 0; i < TPS23881_MAX_CHANS; i++) {
547		if (!port_matrix[i].exist)
548			continue;
549
550		if (port_matrix[i].is_4p)
551			val |= 0xf << ((port_matrix[i].lgcl_chan[0] / 2) * 4);
552		else
553			val |= 0x3 << ((port_matrix[i].lgcl_chan[0] / 2) * 4);
554	}
555	ret = i2c_smbus_write_word_data(client, TPS23881_REG_PORT_POWER, val);
556	if (ret)
557		return ret;
558
559	/* Enable detection and classification */
560	val = 0;
561	for (i = 0; i < TPS23881_MAX_CHANS; i++) {
562		if (!port_matrix[i].exist)
563			continue;
564
565		val |= BIT(port_matrix[i].lgcl_chan[0]) |
566		       BIT(port_matrix[i].lgcl_chan[0] + 4);
567		if (port_matrix[i].is_4p)
568			val |= BIT(port_matrix[i].lgcl_chan[1]) |
569			       BIT(port_matrix[i].lgcl_chan[1] + 4);
570	}
571	ret = i2c_smbus_write_word_data(client, TPS23881_REG_DET_CLA_EN, val);
572	if (ret)
573		return ret;
574
575	return 0;
576}
577
578static int
579tps23881_set_ports_matrix(struct tps23881_priv *priv,
580			  struct device_node *chan_node[TPS23881_MAX_CHANS])
581{
582	struct tps23881_port_matrix port_matrix[TPS23881_MAX_CHANS] = {0};
583	int i, ret;
584
585	/* Update with values for every PSE PIs */
586	for (i = 0; i < TPS23881_MAX_CHANS; i++) {
587		ret = tps23881_match_port_matrix(&priv->pcdev.pi[i], i,
588						 chan_node, port_matrix);
589		if (ret)
590			return ret;
591	}
592
593	ret = tps23881_sort_port_matrix(port_matrix);
594	if (ret < 0)
595		return ret;
596
597	ret = tps23881_write_port_matrix(priv, port_matrix, ret);
598	if (ret)
599		return ret;
600
601	ret = tps23881_set_ports_conf(priv, port_matrix);
602	if (ret)
603		return ret;
604
605	return 0;
606}
607
608static int tps23881_setup_pi_matrix(struct pse_controller_dev *pcdev)
609{
610	struct device_node *chan_node[TPS23881_MAX_CHANS] = {NULL};
611	struct tps23881_priv *priv = to_tps23881_priv(pcdev);
612	int ret, i;
613
614	ret = tps23881_get_of_channels(priv, chan_node);
615	if (ret < 0) {
616		dev_warn(&priv->client->dev,
617			 "Unable to parse port-matrix, default matrix will be used\n");
618		return 0;
619	}
620
621	ret = tps23881_set_ports_matrix(priv, chan_node);
622
623	for (i = 0; i < TPS23881_MAX_CHANS; i++)
624		of_node_put(chan_node[i]);
625
626	return ret;
627}
628
629static const struct pse_controller_ops tps23881_ops = {
630	.setup_pi_matrix = tps23881_setup_pi_matrix,
631	.pi_enable = tps23881_pi_enable,
632	.pi_disable = tps23881_pi_disable,
633	.pi_is_enabled = tps23881_pi_is_enabled,
634	.ethtool_get_status = tps23881_ethtool_get_status,
635};
636
637static const char fw_parity_name[] = "ti/tps23881/tps23881-parity-14.bin";
638static const char fw_sram_name[] = "ti/tps23881/tps23881-sram-14.bin";
639
640struct tps23881_fw_conf {
641	u8 reg;
642	u8 val;
643};
644
645static const struct tps23881_fw_conf tps23881_fw_parity_conf[] = {
646	{.reg = 0x60, .val = 0x01},
647	{.reg = 0x62, .val = 0x00},
648	{.reg = 0x63, .val = 0x80},
649	{.reg = 0x60, .val = 0xC4},
650	{.reg = 0x1D, .val = 0xBC},
651	{.reg = 0xD7, .val = 0x02},
652	{.reg = 0x91, .val = 0x00},
653	{.reg = 0x90, .val = 0x00},
654	{.reg = 0xD7, .val = 0x00},
655	{.reg = 0x1D, .val = 0x00},
656	{ /* sentinel */ }
657};
658
659static const struct tps23881_fw_conf tps23881_fw_sram_conf[] = {
660	{.reg = 0x60, .val = 0xC5},
661	{.reg = 0x62, .val = 0x00},
662	{.reg = 0x63, .val = 0x80},
663	{.reg = 0x60, .val = 0xC0},
664	{.reg = 0x1D, .val = 0xBC},
665	{.reg = 0xD7, .val = 0x02},
666	{.reg = 0x91, .val = 0x00},
667	{.reg = 0x90, .val = 0x00},
668	{.reg = 0xD7, .val = 0x00},
669	{.reg = 0x1D, .val = 0x00},
670	{ /* sentinel */ }
671};
672
673static int tps23881_flash_sram_fw_part(struct i2c_client *client,
674				       const char *fw_name,
675				       const struct tps23881_fw_conf *fw_conf)
676{
677	const struct firmware *fw = NULL;
678	int i, ret;
679
680	ret = request_firmware(&fw, fw_name, &client->dev);
681	if (ret)
682		return ret;
683
684	dev_dbg(&client->dev, "Flashing %s\n", fw_name);
685
686	/* Prepare device for RAM download */
687	while (fw_conf->reg) {
688		ret = i2c_smbus_write_byte_data(client, fw_conf->reg,
689						fw_conf->val);
690		if (ret)
691			goto out;
692
693		fw_conf++;
694	}
695
696	/* Flash the firmware file */
697	for (i = 0; i < fw->size; i++) {
698		ret = i2c_smbus_write_byte_data(client,
699						TPS23881_REG_SRAM_DATA,
700						fw->data[i]);
701		if (ret)
702			goto out;
703	}
704
705out:
706	release_firmware(fw);
707	return ret;
708}
709
710static int tps23881_flash_sram_fw(struct i2c_client *client)
711{
712	int ret;
713
714	ret = tps23881_flash_sram_fw_part(client, fw_parity_name,
715					  tps23881_fw_parity_conf);
716	if (ret)
717		return ret;
718
719	ret = tps23881_flash_sram_fw_part(client, fw_sram_name,
720					  tps23881_fw_sram_conf);
721	if (ret)
722		return ret;
723
724	ret = i2c_smbus_write_byte_data(client, TPS23881_REG_SRAM_CTRL, 0x18);
725	if (ret)
726		return ret;
727
728	mdelay(12);
729
730	return 0;
731}
732
733static int tps23881_i2c_probe(struct i2c_client *client)
734{
735	struct device *dev = &client->dev;
736	struct tps23881_priv *priv;
737	int ret;
738	u8 val;
739
740	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
741		dev_err(dev, "i2c check functionality failed\n");
742		return -ENXIO;
743	}
744
745	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
746	if (!priv)
747		return -ENOMEM;
748
749	ret = i2c_smbus_read_byte_data(client, TPS23881_REG_DEVID);
750	if (ret < 0)
751		return ret;
752
753	if (ret != 0x22) {
754		dev_err(dev, "Wrong device ID\n");
755		return -ENXIO;
756	}
757
758	ret = tps23881_flash_sram_fw(client);
759	if (ret < 0)
760		return ret;
761
762	ret = i2c_smbus_read_byte_data(client, TPS23881_REG_FWREV);
763	if (ret < 0)
764		return ret;
765
766	dev_info(&client->dev, "Firmware revision 0x%x\n", ret);
767
768	/* Set configuration B, 16 bit access on a single device address */
769	ret = i2c_smbus_read_byte_data(client, TPS23881_REG_GEN_MASK);
770	if (ret < 0)
771		return ret;
772
773	val = ret | TPS23881_REG_NBITACC;
774	ret = i2c_smbus_write_byte_data(client, TPS23881_REG_GEN_MASK, val);
775	if (ret)
776		return ret;
777
778	priv->client = client;
779	i2c_set_clientdata(client, priv);
780	priv->np = dev->of_node;
781
782	priv->pcdev.owner = THIS_MODULE;
783	priv->pcdev.ops = &tps23881_ops;
784	priv->pcdev.dev = dev;
785	priv->pcdev.types = ETHTOOL_PSE_C33;
786	priv->pcdev.nr_lines = TPS23881_MAX_CHANS;
787	ret = devm_pse_controller_register(dev, &priv->pcdev);
788	if (ret) {
789		return dev_err_probe(dev, ret,
790				     "failed to register PSE controller\n");
791	}
792
793	return ret;
794}
795
796static const struct i2c_device_id tps23881_id[] = {
797	{ "tps23881", 0 },
798	{ },
799};
800MODULE_DEVICE_TABLE(i2c, tps23881_id);
801
802static const struct of_device_id tps23881_of_match[] = {
803	{ .compatible = "ti,tps23881", },
804	{ },
805};
806MODULE_DEVICE_TABLE(of, tps23881_of_match);
807
808static struct i2c_driver tps23881_driver = {
809	.probe		= tps23881_i2c_probe,
810	.id_table	= tps23881_id,
811	.driver		= {
812		.name		= "tps23881",
813		.of_match_table = tps23881_of_match,
814	},
815};
816module_i2c_driver(tps23881_driver);
817
818MODULE_AUTHOR("Kory Maincent <kory.maincent@bootlin.com>");
819MODULE_DESCRIPTION("TI TPS23881 PoE PSE Controller driver");
820MODULE_LICENSE("GPL");
821