Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Driver for the Microchip PD692X0 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 PD692X0_PSE_NAME "pd692x0_pse"
17
18#define PD692X0_MAX_PIS 48
19#define PD692X0_MAX_MANAGERS 12
20#define PD692X0_MAX_MANAGER_PORTS 8
21#define PD692X0_MAX_HW_PORTS (PD692X0_MAX_MANAGERS * PD692X0_MAX_MANAGER_PORTS)
22
23#define PD69200_BT_PROD_VER 24
24#define PD69210_BT_PROD_VER 26
25#define PD69220_BT_PROD_VER 29
26
27#define PD692X0_FW_MAJ_VER 3
28#define PD692X0_FW_MIN_VER 5
29#define PD692X0_FW_PATCH_VER 5
30
31enum pd692x0_fw_state {
32 PD692X0_FW_UNKNOWN,
33 PD692X0_FW_OK,
34 PD692X0_FW_BROKEN,
35 PD692X0_FW_NEED_UPDATE,
36 PD692X0_FW_PREPARE,
37 PD692X0_FW_WRITE,
38 PD692X0_FW_COMPLETE,
39};
40
41struct pd692x0_msg {
42 u8 key;
43 u8 echo;
44 u8 sub[3];
45 u8 data[8];
46 __be16 chksum;
47} __packed;
48
49struct pd692x0_msg_ver {
50 u8 prod;
51 u8 maj_sw_ver;
52 u8 min_sw_ver;
53 u8 pa_sw_ver;
54 u8 param;
55 u8 build;
56};
57
58enum {
59 PD692X0_KEY_CMD,
60 PD692X0_KEY_PRG,
61 PD692X0_KEY_REQ,
62 PD692X0_KEY_TLM,
63 PD692X0_KEY_TEST,
64 PD692X0_KEY_REPORT = 0x52
65};
66
67enum {
68 PD692X0_MSG_RESET,
69 PD692X0_MSG_GET_SYS_STATUS,
70 PD692X0_MSG_GET_SW_VER,
71 PD692X0_MSG_SET_TMP_PORT_MATRIX,
72 PD692X0_MSG_PRG_PORT_MATRIX,
73 PD692X0_MSG_SET_PORT_PARAM,
74 PD692X0_MSG_GET_PORT_STATUS,
75 PD692X0_MSG_DOWNLOAD_CMD,
76
77 /* add new message above here */
78 PD692X0_MSG_CNT
79};
80
81struct pd692x0_priv {
82 struct i2c_client *client;
83 struct pse_controller_dev pcdev;
84 struct device_node *np;
85
86 enum pd692x0_fw_state fw_state;
87 struct fw_upload *fwl;
88 bool cancel_request;
89
90 u8 msg_id;
91 bool last_cmd_key;
92 unsigned long last_cmd_key_time;
93
94 enum ethtool_c33_pse_admin_state admin_state[PD692X0_MAX_PIS];
95};
96
97/* Template list of communication messages. The non-null bytes defined here
98 * constitute the fixed portion of the messages. The remaining bytes will
99 * be configured later within the functions. Refer to the "PD692x0 BT Serial
100 * Communication Protocol User Guide" for comprehensive details on messages
101 * content.
102 */
103static const struct pd692x0_msg pd692x0_msg_template_list[PD692X0_MSG_CNT] = {
104 [PD692X0_MSG_RESET] = {
105 .key = PD692X0_KEY_CMD,
106 .sub = {0x07, 0x55, 0x00},
107 .data = {0x55, 0x00, 0x55, 0x4e,
108 0x4e, 0x4e, 0x4e, 0x4e},
109 },
110 [PD692X0_MSG_GET_SYS_STATUS] = {
111 .key = PD692X0_KEY_REQ,
112 .sub = {0x07, 0xd0, 0x4e},
113 .data = {0x4e, 0x4e, 0x4e, 0x4e,
114 0x4e, 0x4e, 0x4e, 0x4e},
115 },
116 [PD692X0_MSG_GET_SW_VER] = {
117 .key = PD692X0_KEY_REQ,
118 .sub = {0x07, 0x1e, 0x21},
119 .data = {0x4e, 0x4e, 0x4e, 0x4e,
120 0x4e, 0x4e, 0x4e, 0x4e},
121 },
122 [PD692X0_MSG_SET_TMP_PORT_MATRIX] = {
123 .key = PD692X0_KEY_CMD,
124 .sub = {0x05, 0x43},
125 .data = { 0, 0x4e, 0x4e, 0x4e,
126 0x4e, 0x4e, 0x4e, 0x4e},
127 },
128 [PD692X0_MSG_PRG_PORT_MATRIX] = {
129 .key = PD692X0_KEY_CMD,
130 .sub = {0x07, 0x43, 0x4e},
131 .data = {0x4e, 0x4e, 0x4e, 0x4e,
132 0x4e, 0x4e, 0x4e, 0x4e},
133 },
134 [PD692X0_MSG_SET_PORT_PARAM] = {
135 .key = PD692X0_KEY_CMD,
136 .sub = {0x05, 0xc0},
137 .data = { 0, 0xff, 0xff, 0xff,
138 0x4e, 0x4e, 0x4e, 0x4e},
139 },
140 [PD692X0_MSG_GET_PORT_STATUS] = {
141 .key = PD692X0_KEY_REQ,
142 .sub = {0x05, 0xc1},
143 .data = {0x4e, 0x4e, 0x4e, 0x4e,
144 0x4e, 0x4e, 0x4e, 0x4e},
145 },
146 [PD692X0_MSG_DOWNLOAD_CMD] = {
147 .key = PD692X0_KEY_PRG,
148 .sub = {0xff, 0x99, 0x15},
149 .data = {0x16, 0x16, 0x99, 0x4e,
150 0x4e, 0x4e, 0x4e, 0x4e},
151 },
152};
153
154static u8 pd692x0_build_msg(struct pd692x0_msg *msg, u8 echo)
155{
156 u8 *data = (u8 *)msg;
157 u16 chksum = 0;
158 int i;
159
160 msg->echo = echo++;
161 if (echo == 0xff)
162 echo = 0;
163
164 for (i = 0; i < sizeof(*msg) - sizeof(msg->chksum); i++)
165 chksum += data[i];
166
167 msg->chksum = cpu_to_be16(chksum);
168
169 return echo;
170}
171
172static int pd692x0_send_msg(struct pd692x0_priv *priv, struct pd692x0_msg *msg)
173{
174 const struct i2c_client *client = priv->client;
175 int ret;
176
177 if (msg->key == PD692X0_KEY_CMD && priv->last_cmd_key) {
178 int cmd_msleep;
179
180 cmd_msleep = 30 - jiffies_to_msecs(jiffies - priv->last_cmd_key_time);
181 if (cmd_msleep > 0)
182 msleep(cmd_msleep);
183 }
184
185 /* Add echo and checksum bytes to the message */
186 priv->msg_id = pd692x0_build_msg(msg, priv->msg_id);
187
188 ret = i2c_master_send(client, (u8 *)msg, sizeof(*msg));
189 if (ret != sizeof(*msg))
190 return -EIO;
191
192 return 0;
193}
194
195static int pd692x0_reset(struct pd692x0_priv *priv)
196{
197 const struct i2c_client *client = priv->client;
198 struct pd692x0_msg msg, buf = {0};
199 int ret;
200
201 msg = pd692x0_msg_template_list[PD692X0_MSG_RESET];
202 ret = pd692x0_send_msg(priv, &msg);
203 if (ret) {
204 dev_err(&client->dev,
205 "Failed to reset the controller (%pe)\n", ERR_PTR(ret));
206 return ret;
207 }
208
209 msleep(30);
210
211 ret = i2c_master_recv(client, (u8 *)&buf, sizeof(buf));
212 if (ret != sizeof(buf))
213 return ret < 0 ? ret : -EIO;
214
215 /* Is the reply a successful report message */
216 if (buf.key != PD692X0_KEY_REPORT || buf.sub[0] || buf.sub[1])
217 return -EIO;
218
219 msleep(300);
220
221 ret = i2c_master_recv(client, (u8 *)&buf, sizeof(buf));
222 if (ret != sizeof(buf))
223 return ret < 0 ? ret : -EIO;
224
225 /* Is the boot status without error */
226 if (buf.key != 0x03 || buf.echo != 0xff || buf.sub[0] & 0x1) {
227 dev_err(&client->dev, "PSE controller error\n");
228 return -EIO;
229 }
230
231 return 0;
232}
233
234static bool pd692x0_try_recv_msg(const struct i2c_client *client,
235 struct pd692x0_msg *msg,
236 struct pd692x0_msg *buf)
237{
238 /* Wait 30ms before readback as mandated by the protocol */
239 msleep(30);
240
241 memset(buf, 0, sizeof(*buf));
242 i2c_master_recv(client, (u8 *)buf, sizeof(*buf));
243 if (buf->key)
244 return 0;
245
246 msleep(100);
247
248 memset(buf, 0, sizeof(*buf));
249 i2c_master_recv(client, (u8 *)buf, sizeof(*buf));
250 if (buf->key)
251 return 0;
252
253 return 1;
254}
255
256/* Implementation of I2C communication, specifically addressing scenarios
257 * involving communication loss. Refer to the "Synchronization During
258 * Communication Loss" section in the Communication Protocol document for
259 * further details.
260 */
261static int pd692x0_recv_msg(struct pd692x0_priv *priv,
262 struct pd692x0_msg *msg,
263 struct pd692x0_msg *buf)
264{
265 const struct i2c_client *client = priv->client;
266 int ret;
267
268 ret = pd692x0_try_recv_msg(client, msg, buf);
269 if (!ret)
270 goto out_success;
271
272 dev_warn(&client->dev,
273 "Communication lost, rtnl is locked until communication is back!");
274
275 ret = pd692x0_send_msg(priv, msg);
276 if (ret)
277 return ret;
278
279 ret = pd692x0_try_recv_msg(client, msg, buf);
280 if (!ret)
281 goto out_success2;
282
283 msleep(10000);
284
285 ret = pd692x0_send_msg(priv, msg);
286 if (ret)
287 return ret;
288
289 ret = pd692x0_try_recv_msg(client, msg, buf);
290 if (!ret)
291 goto out_success2;
292
293 return pd692x0_reset(priv);
294
295out_success2:
296 dev_warn(&client->dev, "Communication is back, rtnl is unlocked!");
297out_success:
298 if (msg->key == PD692X0_KEY_CMD) {
299 priv->last_cmd_key = true;
300 priv->last_cmd_key_time = jiffies;
301 } else {
302 priv->last_cmd_key = false;
303 }
304
305 return 0;
306}
307
308static int pd692x0_sendrecv_msg(struct pd692x0_priv *priv,
309 struct pd692x0_msg *msg,
310 struct pd692x0_msg *buf)
311{
312 struct device *dev = &priv->client->dev;
313 int ret;
314
315 ret = pd692x0_send_msg(priv, msg);
316 if (ret)
317 return ret;
318
319 ret = pd692x0_recv_msg(priv, msg, buf);
320 if (ret)
321 return ret;
322
323 if (msg->echo != buf->echo) {
324 dev_err(dev,
325 "Wrong match in message ID, expect %d received %d.\n",
326 msg->echo, buf->echo);
327 return -EIO;
328 }
329
330 /* If the reply is a report message is it successful */
331 if (buf->key == PD692X0_KEY_REPORT &&
332 (buf->sub[0] || buf->sub[1])) {
333 return -EIO;
334 }
335
336 return 0;
337}
338
339static struct pd692x0_priv *to_pd692x0_priv(struct pse_controller_dev *pcdev)
340{
341 return container_of(pcdev, struct pd692x0_priv, pcdev);
342}
343
344static int pd692x0_fw_unavailable(struct pd692x0_priv *priv)
345{
346 switch (priv->fw_state) {
347 case PD692X0_FW_OK:
348 return 0;
349 case PD692X0_FW_PREPARE:
350 case PD692X0_FW_WRITE:
351 case PD692X0_FW_COMPLETE:
352 dev_err(&priv->client->dev, "Firmware update in progress!\n");
353 return -EBUSY;
354 case PD692X0_FW_BROKEN:
355 case PD692X0_FW_NEED_UPDATE:
356 default:
357 dev_err(&priv->client->dev,
358 "Firmware issue. Please update it!\n");
359 return -EOPNOTSUPP;
360 }
361}
362
363static int pd692x0_pi_enable(struct pse_controller_dev *pcdev, int id)
364{
365 struct pd692x0_priv *priv = to_pd692x0_priv(pcdev);
366 struct pd692x0_msg msg, buf = {0};
367 int ret;
368
369 ret = pd692x0_fw_unavailable(priv);
370 if (ret)
371 return ret;
372
373 if (priv->admin_state[id] == ETHTOOL_C33_PSE_ADMIN_STATE_ENABLED)
374 return 0;
375
376 msg = pd692x0_msg_template_list[PD692X0_MSG_SET_PORT_PARAM];
377 msg.data[0] = 0x1;
378 msg.sub[2] = id;
379 ret = pd692x0_sendrecv_msg(priv, &msg, &buf);
380 if (ret < 0)
381 return ret;
382
383 priv->admin_state[id] = ETHTOOL_C33_PSE_ADMIN_STATE_ENABLED;
384
385 return 0;
386}
387
388static int pd692x0_pi_disable(struct pse_controller_dev *pcdev, int id)
389{
390 struct pd692x0_priv *priv = to_pd692x0_priv(pcdev);
391 struct pd692x0_msg msg, buf = {0};
392 int ret;
393
394 ret = pd692x0_fw_unavailable(priv);
395 if (ret)
396 return ret;
397
398 if (priv->admin_state[id] == ETHTOOL_C33_PSE_ADMIN_STATE_DISABLED)
399 return 0;
400
401 msg = pd692x0_msg_template_list[PD692X0_MSG_SET_PORT_PARAM];
402 msg.data[0] = 0x0;
403 msg.sub[2] = id;
404 ret = pd692x0_sendrecv_msg(priv, &msg, &buf);
405 if (ret < 0)
406 return ret;
407
408 priv->admin_state[id] = ETHTOOL_C33_PSE_ADMIN_STATE_DISABLED;
409
410 return 0;
411}
412
413static int pd692x0_pi_is_enabled(struct pse_controller_dev *pcdev, int id)
414{
415 struct pd692x0_priv *priv = to_pd692x0_priv(pcdev);
416 struct pd692x0_msg msg, buf = {0};
417 int ret;
418
419 ret = pd692x0_fw_unavailable(priv);
420 if (ret)
421 return ret;
422
423 msg = pd692x0_msg_template_list[PD692X0_MSG_GET_PORT_STATUS];
424 msg.sub[2] = id;
425 ret = pd692x0_sendrecv_msg(priv, &msg, &buf);
426 if (ret < 0)
427 return ret;
428
429 if (buf.sub[1]) {
430 priv->admin_state[id] = ETHTOOL_C33_PSE_ADMIN_STATE_ENABLED;
431 return 1;
432 } else {
433 priv->admin_state[id] = ETHTOOL_C33_PSE_ADMIN_STATE_DISABLED;
434 return 0;
435 }
436}
437
438static int pd692x0_ethtool_get_status(struct pse_controller_dev *pcdev,
439 unsigned long id,
440 struct netlink_ext_ack *extack,
441 struct pse_control_status *status)
442{
443 struct pd692x0_priv *priv = to_pd692x0_priv(pcdev);
444 struct pd692x0_msg msg, buf = {0};
445 int ret;
446
447 ret = pd692x0_fw_unavailable(priv);
448 if (ret)
449 return ret;
450
451 msg = pd692x0_msg_template_list[PD692X0_MSG_GET_PORT_STATUS];
452 msg.sub[2] = id;
453 ret = pd692x0_sendrecv_msg(priv, &msg, &buf);
454 if (ret < 0)
455 return ret;
456
457 /* Compare Port Status (Communication Protocol Document par. 7.1) */
458 if ((buf.sub[0] & 0xf0) == 0x80 || (buf.sub[0] & 0xf0) == 0x90)
459 status->c33_pw_status = ETHTOOL_C33_PSE_PW_D_STATUS_DELIVERING;
460 else if (buf.sub[0] == 0x1b || buf.sub[0] == 0x22)
461 status->c33_pw_status = ETHTOOL_C33_PSE_PW_D_STATUS_SEARCHING;
462 else if (buf.sub[0] == 0x12)
463 status->c33_pw_status = ETHTOOL_C33_PSE_PW_D_STATUS_FAULT;
464 else
465 status->c33_pw_status = ETHTOOL_C33_PSE_PW_D_STATUS_DISABLED;
466
467 if (buf.sub[1])
468 status->c33_admin_state = ETHTOOL_C33_PSE_ADMIN_STATE_ENABLED;
469 else
470 status->c33_admin_state = ETHTOOL_C33_PSE_ADMIN_STATE_DISABLED;
471
472 priv->admin_state[id] = status->c33_admin_state;
473
474 return 0;
475}
476
477static struct pd692x0_msg_ver pd692x0_get_sw_version(struct pd692x0_priv *priv)
478{
479 struct device *dev = &priv->client->dev;
480 struct pd692x0_msg msg, buf = {0};
481 struct pd692x0_msg_ver ver = {0};
482 int ret;
483
484 msg = pd692x0_msg_template_list[PD692X0_MSG_GET_SW_VER];
485 ret = pd692x0_sendrecv_msg(priv, &msg, &buf);
486 if (ret < 0) {
487 dev_err(dev, "Failed to get PSE version (%pe)\n", ERR_PTR(ret));
488 return ver;
489 }
490
491 /* Extract version from the message */
492 ver.prod = buf.sub[2];
493 ver.maj_sw_ver = (buf.data[0] << 8 | buf.data[1]) / 100;
494 ver.min_sw_ver = ((buf.data[0] << 8 | buf.data[1]) / 10) % 10;
495 ver.pa_sw_ver = (buf.data[0] << 8 | buf.data[1]) % 10;
496 ver.param = buf.data[2];
497 ver.build = buf.data[3];
498
499 return ver;
500}
501
502struct pd692x0_manager {
503 struct device_node *port_node[PD692X0_MAX_MANAGER_PORTS];
504 int nports;
505};
506
507struct pd692x0_matrix {
508 u8 hw_port_a;
509 u8 hw_port_b;
510};
511
512static int
513pd692x0_of_get_ports_manager(struct pd692x0_priv *priv,
514 struct pd692x0_manager *manager,
515 struct device_node *np)
516{
517 struct device_node *node;
518 int ret, nports, i;
519
520 nports = 0;
521 for_each_child_of_node(np, node) {
522 u32 port;
523
524 if (!of_node_name_eq(node, "port"))
525 continue;
526
527 ret = of_property_read_u32(node, "reg", &port);
528 if (ret)
529 goto out;
530
531 if (port >= PD692X0_MAX_MANAGER_PORTS || port != nports) {
532 dev_err(&priv->client->dev,
533 "wrong number or order of manager ports (%d)\n",
534 port);
535 ret = -EINVAL;
536 goto out;
537 }
538
539 of_node_get(node);
540 manager->port_node[port] = node;
541 nports++;
542 }
543
544 manager->nports = nports;
545 return 0;
546
547out:
548 for (i = 0; i < nports; i++) {
549 of_node_put(manager->port_node[i]);
550 manager->port_node[i] = NULL;
551 }
552 of_node_put(node);
553 return ret;
554}
555
556static int
557pd692x0_of_get_managers(struct pd692x0_priv *priv,
558 struct pd692x0_manager manager[PD692X0_MAX_MANAGERS])
559{
560 struct device_node *managers_node, *node;
561 int ret, nmanagers, i, j;
562
563 if (!priv->np)
564 return -EINVAL;
565
566 nmanagers = 0;
567 managers_node = of_get_child_by_name(priv->np, "managers");
568 if (!managers_node)
569 return -EINVAL;
570
571 for_each_child_of_node(managers_node, node) {
572 u32 manager_id;
573
574 if (!of_node_name_eq(node, "manager"))
575 continue;
576
577 ret = of_property_read_u32(node, "reg", &manager_id);
578 if (ret)
579 goto out;
580
581 if (manager_id >= PD692X0_MAX_MANAGERS ||
582 manager_id != nmanagers) {
583 dev_err(&priv->client->dev,
584 "wrong number or order of managers (%d)\n",
585 manager_id);
586 ret = -EINVAL;
587 goto out;
588 }
589
590 ret = pd692x0_of_get_ports_manager(priv, &manager[manager_id],
591 node);
592 if (ret)
593 goto out;
594
595 nmanagers++;
596 }
597
598 of_node_put(managers_node);
599 return nmanagers;
600
601out:
602 for (i = 0; i < nmanagers; i++) {
603 for (j = 0; j < manager[i].nports; j++) {
604 of_node_put(manager[i].port_node[j]);
605 manager[i].port_node[j] = NULL;
606 }
607 }
608
609 of_node_put(node);
610 of_node_put(managers_node);
611 return ret;
612}
613
614static int
615pd692x0_set_port_matrix(const struct pse_pi_pairset *pairset,
616 const struct pd692x0_manager *manager,
617 int nmanagers, struct pd692x0_matrix *port_matrix)
618{
619 int i, j, port_cnt;
620 bool found = false;
621
622 if (!pairset->np)
623 return 0;
624
625 /* Look on every managers */
626 port_cnt = 0;
627 for (i = 0; i < nmanagers; i++) {
628 /* Look on every ports of the manager */
629 for (j = 0; j < manager[i].nports; j++) {
630 if (pairset->np == manager[i].port_node[j]) {
631 found = true;
632 break;
633 }
634 }
635 port_cnt += j;
636
637 if (found)
638 break;
639 }
640
641 if (!found)
642 return -ENODEV;
643
644 if (pairset->pinout == ALTERNATIVE_A)
645 port_matrix->hw_port_a = port_cnt;
646 else if (pairset->pinout == ALTERNATIVE_B)
647 port_matrix->hw_port_b = port_cnt;
648
649 return 0;
650}
651
652static int
653pd692x0_set_ports_matrix(struct pd692x0_priv *priv,
654 const struct pd692x0_manager *manager,
655 int nmanagers,
656 struct pd692x0_matrix port_matrix[PD692X0_MAX_PIS])
657{
658 struct pse_controller_dev *pcdev = &priv->pcdev;
659 int i, ret;
660
661 /* Init Matrix */
662 for (i = 0; i < PD692X0_MAX_PIS; i++) {
663 port_matrix[i].hw_port_a = 0xff;
664 port_matrix[i].hw_port_b = 0xff;
665 }
666
667 /* Update with values for every PSE PIs */
668 for (i = 0; i < pcdev->nr_lines; i++) {
669 ret = pd692x0_set_port_matrix(&pcdev->pi[i].pairset[0],
670 manager, nmanagers,
671 &port_matrix[i]);
672 if (ret) {
673 dev_err(&priv->client->dev,
674 "unable to configure pi %d pairset 0", i);
675 return ret;
676 }
677
678 ret = pd692x0_set_port_matrix(&pcdev->pi[i].pairset[1],
679 manager, nmanagers,
680 &port_matrix[i]);
681 if (ret) {
682 dev_err(&priv->client->dev,
683 "unable to configure pi %d pairset 1", i);
684 return ret;
685 }
686 }
687
688 return 0;
689}
690
691static int
692pd692x0_write_ports_matrix(struct pd692x0_priv *priv,
693 const struct pd692x0_matrix port_matrix[PD692X0_MAX_PIS])
694{
695 struct pd692x0_msg msg, buf;
696 int ret, i;
697
698 /* Write temporary Matrix */
699 msg = pd692x0_msg_template_list[PD692X0_MSG_SET_TMP_PORT_MATRIX];
700 for (i = 0; i < PD692X0_MAX_PIS; i++) {
701 msg.sub[2] = i;
702 msg.data[0] = port_matrix[i].hw_port_b;
703 msg.data[1] = port_matrix[i].hw_port_a;
704
705 ret = pd692x0_sendrecv_msg(priv, &msg, &buf);
706 if (ret < 0)
707 return ret;
708 }
709
710 /* Program Matrix */
711 msg = pd692x0_msg_template_list[PD692X0_MSG_PRG_PORT_MATRIX];
712 ret = pd692x0_sendrecv_msg(priv, &msg, &buf);
713 if (ret < 0)
714 return ret;
715
716 return 0;
717}
718
719static int pd692x0_setup_pi_matrix(struct pse_controller_dev *pcdev)
720{
721 struct pd692x0_manager manager[PD692X0_MAX_MANAGERS] = {0};
722 struct pd692x0_priv *priv = to_pd692x0_priv(pcdev);
723 struct pd692x0_matrix port_matrix[PD692X0_MAX_PIS];
724 int ret, i, j, nmanagers;
725
726 /* Should we flash the port matrix */
727 if (priv->fw_state != PD692X0_FW_OK &&
728 priv->fw_state != PD692X0_FW_COMPLETE)
729 return 0;
730
731 ret = pd692x0_of_get_managers(priv, manager);
732 if (ret < 0)
733 return ret;
734
735 nmanagers = ret;
736 ret = pd692x0_set_ports_matrix(priv, manager, nmanagers, port_matrix);
737 if (ret)
738 goto out;
739
740 ret = pd692x0_write_ports_matrix(priv, port_matrix);
741 if (ret)
742 goto out;
743
744out:
745 for (i = 0; i < nmanagers; i++) {
746 for (j = 0; j < manager[i].nports; j++)
747 of_node_put(manager[i].port_node[j]);
748 }
749 return ret;
750}
751
752static const struct pse_controller_ops pd692x0_ops = {
753 .setup_pi_matrix = pd692x0_setup_pi_matrix,
754 .ethtool_get_status = pd692x0_ethtool_get_status,
755 .pi_enable = pd692x0_pi_enable,
756 .pi_disable = pd692x0_pi_disable,
757 .pi_is_enabled = pd692x0_pi_is_enabled,
758};
759
760#define PD692X0_FW_LINE_MAX_SZ 0xff
761static int pd692x0_fw_get_next_line(const u8 *data,
762 char *line, size_t size)
763{
764 size_t line_size;
765 int i;
766
767 line_size = min_t(size_t, size, PD692X0_FW_LINE_MAX_SZ);
768
769 memset(line, 0, PD692X0_FW_LINE_MAX_SZ);
770 for (i = 0; i < line_size - 1; i++) {
771 if (*data == '\r' && *(data + 1) == '\n') {
772 line[i] = '\r';
773 line[i + 1] = '\n';
774 return i + 2;
775 }
776 line[i] = *data;
777 data++;
778 }
779
780 return -EIO;
781}
782
783static enum fw_upload_err
784pd692x0_fw_recv_resp(const struct i2c_client *client, unsigned long ms_timeout,
785 const char *msg_ok, unsigned int msg_size)
786{
787 /* Maximum controller response size */
788 char fw_msg_buf[5] = {0};
789 unsigned long timeout;
790 int ret;
791
792 if (msg_size > sizeof(fw_msg_buf))
793 return FW_UPLOAD_ERR_RW_ERROR;
794
795 /* Read until we get something */
796 timeout = msecs_to_jiffies(ms_timeout) + jiffies;
797 while (true) {
798 if (time_is_before_jiffies(timeout))
799 return FW_UPLOAD_ERR_TIMEOUT;
800
801 ret = i2c_master_recv(client, fw_msg_buf, 1);
802 if (ret < 0 || *fw_msg_buf == 0) {
803 usleep_range(1000, 2000);
804 continue;
805 } else {
806 break;
807 }
808 }
809
810 /* Read remaining characters */
811 ret = i2c_master_recv(client, fw_msg_buf + 1, msg_size - 1);
812 if (strncmp(fw_msg_buf, msg_ok, msg_size)) {
813 dev_err(&client->dev,
814 "Wrong FW download process answer (%*pE)\n",
815 msg_size, fw_msg_buf);
816 return FW_UPLOAD_ERR_HW_ERROR;
817 }
818
819 return FW_UPLOAD_ERR_NONE;
820}
821
822static int pd692x0_fw_write_line(const struct i2c_client *client,
823 const char line[PD692X0_FW_LINE_MAX_SZ],
824 const bool last_line)
825{
826 int ret;
827
828 while (*line != 0) {
829 ret = i2c_master_send(client, line, 1);
830 if (ret < 0)
831 return FW_UPLOAD_ERR_RW_ERROR;
832 line++;
833 }
834
835 if (last_line) {
836 ret = pd692x0_fw_recv_resp(client, 100, "TP\r\n",
837 sizeof("TP\r\n") - 1);
838 if (ret)
839 return ret;
840 } else {
841 ret = pd692x0_fw_recv_resp(client, 100, "T*\r\n",
842 sizeof("T*\r\n") - 1);
843 if (ret)
844 return ret;
845 }
846
847 return FW_UPLOAD_ERR_NONE;
848}
849
850static enum fw_upload_err pd692x0_fw_reset(const struct i2c_client *client)
851{
852 const struct pd692x0_msg zero = {0};
853 struct pd692x0_msg buf = {0};
854 unsigned long timeout;
855 char cmd[] = "RST";
856 int ret;
857
858 ret = i2c_master_send(client, cmd, strlen(cmd));
859 if (ret < 0) {
860 dev_err(&client->dev,
861 "Failed to reset the controller (%pe)\n",
862 ERR_PTR(ret));
863 return ret;
864 }
865
866 timeout = msecs_to_jiffies(10000) + jiffies;
867 while (true) {
868 if (time_is_before_jiffies(timeout))
869 return FW_UPLOAD_ERR_TIMEOUT;
870
871 ret = i2c_master_recv(client, (u8 *)&buf, sizeof(buf));
872 if (ret < 0 ||
873 !memcmp(&buf, &zero, sizeof(buf)))
874 usleep_range(1000, 2000);
875 else
876 break;
877 }
878
879 /* Is the reply a successful report message */
880 if (buf.key != PD692X0_KEY_TLM || buf.echo != 0xff ||
881 buf.sub[0] & 0x01) {
882 dev_err(&client->dev, "PSE controller error\n");
883 return FW_UPLOAD_ERR_HW_ERROR;
884 }
885
886 /* Is the firmware operational */
887 if (buf.sub[0] & 0x02) {
888 dev_err(&client->dev,
889 "PSE firmware error. Please update it.\n");
890 return FW_UPLOAD_ERR_HW_ERROR;
891 }
892
893 return FW_UPLOAD_ERR_NONE;
894}
895
896static enum fw_upload_err pd692x0_fw_prepare(struct fw_upload *fwl,
897 const u8 *data, u32 size)
898{
899 struct pd692x0_priv *priv = fwl->dd_handle;
900 const struct i2c_client *client = priv->client;
901 enum pd692x0_fw_state last_fw_state;
902 int ret;
903
904 priv->cancel_request = false;
905 last_fw_state = priv->fw_state;
906
907 priv->fw_state = PD692X0_FW_PREPARE;
908
909 /* Enter program mode */
910 if (last_fw_state == PD692X0_FW_BROKEN) {
911 const char *msg = "ENTR";
912 const char *c;
913
914 c = msg;
915 do {
916 ret = i2c_master_send(client, c, 1);
917 if (ret < 0)
918 return FW_UPLOAD_ERR_RW_ERROR;
919 if (*(c + 1))
920 usleep_range(10000, 20000);
921 } while (*(++c));
922 } else {
923 struct pd692x0_msg msg, buf;
924
925 msg = pd692x0_msg_template_list[PD692X0_MSG_DOWNLOAD_CMD];
926 ret = pd692x0_sendrecv_msg(priv, &msg, &buf);
927 if (ret < 0) {
928 dev_err(&client->dev,
929 "Failed to enter programming mode (%pe)\n",
930 ERR_PTR(ret));
931 return FW_UPLOAD_ERR_RW_ERROR;
932 }
933 }
934
935 ret = pd692x0_fw_recv_resp(client, 100, "TPE\r\n", sizeof("TPE\r\n") - 1);
936 if (ret)
937 goto err_out;
938
939 if (priv->cancel_request) {
940 ret = FW_UPLOAD_ERR_CANCELED;
941 goto err_out;
942 }
943
944 return FW_UPLOAD_ERR_NONE;
945
946err_out:
947 pd692x0_fw_reset(priv->client);
948 priv->fw_state = last_fw_state;
949 return ret;
950}
951
952static enum fw_upload_err pd692x0_fw_write(struct fw_upload *fwl,
953 const u8 *data, u32 offset,
954 u32 size, u32 *written)
955{
956 struct pd692x0_priv *priv = fwl->dd_handle;
957 char line[PD692X0_FW_LINE_MAX_SZ];
958 const struct i2c_client *client;
959 int ret, i;
960 char cmd;
961
962 client = priv->client;
963 priv->fw_state = PD692X0_FW_WRITE;
964
965 /* Erase */
966 cmd = 'E';
967 ret = i2c_master_send(client, &cmd, 1);
968 if (ret < 0) {
969 dev_err(&client->dev,
970 "Failed to boot programming mode (%pe)\n",
971 ERR_PTR(ret));
972 return FW_UPLOAD_ERR_RW_ERROR;
973 }
974
975 ret = pd692x0_fw_recv_resp(client, 100, "TOE\r\n", sizeof("TOE\r\n") - 1);
976 if (ret)
977 return ret;
978
979 ret = pd692x0_fw_recv_resp(client, 5000, "TE\r\n", sizeof("TE\r\n") - 1);
980 if (ret)
981 dev_warn(&client->dev,
982 "Failed to erase internal memory, however still try to write Firmware\n");
983
984 ret = pd692x0_fw_recv_resp(client, 100, "TPE\r\n", sizeof("TPE\r\n") - 1);
985 if (ret)
986 dev_warn(&client->dev,
987 "Failed to erase internal memory, however still try to write Firmware\n");
988
989 if (priv->cancel_request)
990 return FW_UPLOAD_ERR_CANCELED;
991
992 /* Program */
993 cmd = 'P';
994 ret = i2c_master_send(client, &cmd, sizeof(char));
995 if (ret < 0) {
996 dev_err(&client->dev,
997 "Failed to boot programming mode (%pe)\n",
998 ERR_PTR(ret));
999 return ret;
1000 }
1001
1002 ret = pd692x0_fw_recv_resp(client, 100, "TOP\r\n", sizeof("TOP\r\n") - 1);
1003 if (ret)
1004 return ret;
1005
1006 i = 0;
1007 while (i < size) {
1008 ret = pd692x0_fw_get_next_line(data, line, size - i);
1009 if (ret < 0) {
1010 ret = FW_UPLOAD_ERR_FW_INVALID;
1011 goto err;
1012 }
1013
1014 i += ret;
1015 data += ret;
1016 if (line[0] == 'S' && line[1] == '0') {
1017 continue;
1018 } else if (line[0] == 'S' && line[1] == '7') {
1019 ret = pd692x0_fw_write_line(client, line, true);
1020 if (ret)
1021 goto err;
1022 } else {
1023 ret = pd692x0_fw_write_line(client, line, false);
1024 if (ret)
1025 goto err;
1026 }
1027
1028 if (priv->cancel_request) {
1029 ret = FW_UPLOAD_ERR_CANCELED;
1030 goto err;
1031 }
1032 }
1033 *written = i;
1034
1035 msleep(400);
1036
1037 return FW_UPLOAD_ERR_NONE;
1038
1039err:
1040 strscpy_pad(line, "S7\r\n", sizeof(line));
1041 pd692x0_fw_write_line(client, line, true);
1042 return ret;
1043}
1044
1045static enum fw_upload_err pd692x0_fw_poll_complete(struct fw_upload *fwl)
1046{
1047 struct pd692x0_priv *priv = fwl->dd_handle;
1048 const struct i2c_client *client = priv->client;
1049 struct pd692x0_msg_ver ver;
1050 int ret;
1051
1052 priv->fw_state = PD692X0_FW_COMPLETE;
1053
1054 ret = pd692x0_fw_reset(client);
1055 if (ret)
1056 return ret;
1057
1058 ver = pd692x0_get_sw_version(priv);
1059 if (ver.maj_sw_ver < PD692X0_FW_MAJ_VER) {
1060 dev_err(&client->dev,
1061 "Too old firmware version. Please update it\n");
1062 priv->fw_state = PD692X0_FW_NEED_UPDATE;
1063 return FW_UPLOAD_ERR_FW_INVALID;
1064 }
1065
1066 ret = pd692x0_setup_pi_matrix(&priv->pcdev);
1067 if (ret < 0) {
1068 dev_err(&client->dev, "Error configuring ports matrix (%pe)\n",
1069 ERR_PTR(ret));
1070 priv->fw_state = PD692X0_FW_NEED_UPDATE;
1071 return FW_UPLOAD_ERR_HW_ERROR;
1072 }
1073
1074 priv->fw_state = PD692X0_FW_OK;
1075 return FW_UPLOAD_ERR_NONE;
1076}
1077
1078static void pd692x0_fw_cancel(struct fw_upload *fwl)
1079{
1080 struct pd692x0_priv *priv = fwl->dd_handle;
1081
1082 priv->cancel_request = true;
1083}
1084
1085static void pd692x0_fw_cleanup(struct fw_upload *fwl)
1086{
1087 struct pd692x0_priv *priv = fwl->dd_handle;
1088
1089 switch (priv->fw_state) {
1090 case PD692X0_FW_WRITE:
1091 pd692x0_fw_reset(priv->client);
1092 fallthrough;
1093 case PD692X0_FW_COMPLETE:
1094 priv->fw_state = PD692X0_FW_BROKEN;
1095 break;
1096 default:
1097 break;
1098 }
1099}
1100
1101static const struct fw_upload_ops pd692x0_fw_ops = {
1102 .prepare = pd692x0_fw_prepare,
1103 .write = pd692x0_fw_write,
1104 .poll_complete = pd692x0_fw_poll_complete,
1105 .cancel = pd692x0_fw_cancel,
1106 .cleanup = pd692x0_fw_cleanup,
1107};
1108
1109static int pd692x0_i2c_probe(struct i2c_client *client)
1110{
1111 struct pd692x0_msg msg, buf = {0}, zero = {0};
1112 struct device *dev = &client->dev;
1113 struct pd692x0_msg_ver ver;
1114 struct pd692x0_priv *priv;
1115 struct fw_upload *fwl;
1116 int ret;
1117
1118 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
1119 dev_err(dev, "i2c check functionality failed\n");
1120 return -ENXIO;
1121 }
1122
1123 priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
1124 if (!priv)
1125 return -ENOMEM;
1126
1127 priv->client = client;
1128 i2c_set_clientdata(client, priv);
1129
1130 ret = i2c_master_recv(client, (u8 *)&buf, sizeof(buf));
1131 if (ret != sizeof(buf)) {
1132 dev_err(dev, "Failed to get device status\n");
1133 return -EIO;
1134 }
1135
1136 /* Probe has been already run and the status dumped */
1137 if (!memcmp(&buf, &zero, sizeof(buf))) {
1138 /* Ask again the controller status */
1139 msg = pd692x0_msg_template_list[PD692X0_MSG_GET_SYS_STATUS];
1140 ret = pd692x0_sendrecv_msg(priv, &msg, &buf);
1141 if (ret < 0) {
1142 dev_err(dev, "Failed to get device status\n");
1143 return ret;
1144 }
1145 }
1146
1147 if (buf.key != 0x03 || buf.sub[0] & 0x01) {
1148 dev_err(dev, "PSE controller error\n");
1149 return -EIO;
1150 }
1151 if (buf.sub[0] & 0x02) {
1152 dev_err(dev, "PSE firmware error. Please update it.\n");
1153 priv->fw_state = PD692X0_FW_BROKEN;
1154 } else {
1155 ver = pd692x0_get_sw_version(priv);
1156 dev_info(&client->dev, "Software version %d.%02d.%d.%d\n",
1157 ver.prod, ver.maj_sw_ver, ver.min_sw_ver,
1158 ver.pa_sw_ver);
1159
1160 if (ver.maj_sw_ver < PD692X0_FW_MAJ_VER) {
1161 dev_err(dev, "Too old firmware version. Please update it\n");
1162 priv->fw_state = PD692X0_FW_NEED_UPDATE;
1163 } else {
1164 priv->fw_state = PD692X0_FW_OK;
1165 }
1166 }
1167
1168 priv->np = dev->of_node;
1169 priv->pcdev.nr_lines = PD692X0_MAX_PIS;
1170 priv->pcdev.owner = THIS_MODULE;
1171 priv->pcdev.ops = &pd692x0_ops;
1172 priv->pcdev.dev = dev;
1173 priv->pcdev.types = ETHTOOL_PSE_C33;
1174 ret = devm_pse_controller_register(dev, &priv->pcdev);
1175 if (ret)
1176 return dev_err_probe(dev, ret,
1177 "failed to register PSE controller\n");
1178
1179 fwl = firmware_upload_register(THIS_MODULE, dev, dev_name(dev),
1180 &pd692x0_fw_ops, priv);
1181 if (IS_ERR(fwl))
1182 return dev_err_probe(dev, PTR_ERR(fwl),
1183 "failed to register to the Firmware Upload API\n");
1184 priv->fwl = fwl;
1185
1186 return 0;
1187}
1188
1189static void pd692x0_i2c_remove(struct i2c_client *client)
1190{
1191 struct pd692x0_priv *priv = i2c_get_clientdata(client);
1192
1193 firmware_upload_unregister(priv->fwl);
1194}
1195
1196static const struct i2c_device_id pd692x0_id[] = {
1197 { PD692X0_PSE_NAME, 0 },
1198 { },
1199};
1200MODULE_DEVICE_TABLE(i2c, pd692x0_id);
1201
1202static const struct of_device_id pd692x0_of_match[] = {
1203 { .compatible = "microchip,pd69200", },
1204 { .compatible = "microchip,pd69210", },
1205 { .compatible = "microchip,pd69220", },
1206 { },
1207};
1208MODULE_DEVICE_TABLE(of, pd692x0_of_match);
1209
1210static struct i2c_driver pd692x0_driver = {
1211 .probe = pd692x0_i2c_probe,
1212 .remove = pd692x0_i2c_remove,
1213 .id_table = pd692x0_id,
1214 .driver = {
1215 .name = PD692X0_PSE_NAME,
1216 .of_match_table = pd692x0_of_match,
1217 },
1218};
1219module_i2c_driver(pd692x0_driver);
1220
1221MODULE_AUTHOR("Kory Maincent <kory.maincent@bootlin.com>");
1222MODULE_DESCRIPTION("Microchip PD692x0 PoE PSE Controller driver");
1223MODULE_LICENSE("GPL");