xref: /linux/drivers/net/pse-pd/realtek-pse-mcu-core.c (revision 91ec2035134982b98fab0609a9fd8480e8217dc1)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Driver for the microcontroller (MCU) fronting PSE silicon on various
4  * Realtek-based managed switches. The MCU speaks a 12-byte fixed-frame
5  * management protocol; this driver covers two generations of the
6  * protocol via a per-dialect opcode table and response parsers.
7  *
8  * Many PoE switch designs put a dedicated microcontroller in front of the
9  * actual PSE silicon: the host CPU talks to the MCU over I2C/SMBus or
10  * UART, and the MCU in turn manages the PSE chips on the board. The MCU
11  * speaks a small message-based protocol. The PSE chips themselves are not
12  * accessed directly; everything goes through MCU commands.
13  *
14  * This driver targets that architecture for the Realtek-family protocol.
15  * Two generations are supported: Gen1 being used on older switches where
16  * the MCU fronts and manages Broadcom PSE silicon; Gen2 being used with
17  * Realtek PSE silicon. The two share frame format and a sum-mod-256
18  * checksum but diverge on opcode numbers and on a few response layouts;
19  * this is handled by the per-dialect opcode table and parser hooks.
20  *
21  * Out of scope: PSE chips that are interfaced directly from the host
22  * without a management MCU, MCU designs that speak an unrelated protocol
23  * family, and "dumb PSE" modes where no host control is wired up at all.
24  *
25  * This core module implements the protocol, decoding/encoding of MCU
26  * responses, and the pse_controller_ops integration. Transport modules
27  * (realtek-pse-mcu-i2c, realtek-pse-mcu-uart) provide the send/recv
28  * callbacks.
29  */
30 
31 #include <linux/bitfield.h>
32 #include <linux/cleanup.h>
33 #include <linux/container_of.h>
34 #include <linux/delay.h>
35 #include <linux/gpio/consumer.h>
36 #include <linux/jiffies.h>
37 #include <linux/minmax.h>
38 #include <linux/module.h>
39 #include <linux/property.h>
40 #include <linux/pse-pd/pse.h>
41 #include <linux/unaligned.h>
42 
43 #include "realtek-pse-mcu.h"
44 
45 #define RTPSE_MCU_DEVICE_ID_RTL8238B		0x0138
46 #define RTPSE_MCU_DEVICE_ID_RTL8239		0x0039
47 #define RTPSE_MCU_DEVICE_ID_RTL8239C		0x0139
48 #define RTPSE_MCU_DEVICE_ID_BCM59111		0xe111
49 #define RTPSE_MCU_DEVICE_ID_BCM59121		0xe121
50 
51 #define RTPSE_MCU_PORT_STS_DISABLED		0x00
52 #define RTPSE_MCU_PORT_STS_SEARCHING		0x01
53 #define RTPSE_MCU_PORT_STS_DELIVERING		0x02
54 #define RTPSE_MCU_PORT_STS_TEST			0x03	/* Gen1-only; reserved on Gen2 */
55 #define RTPSE_MCU_PORT_STS_FAULT		0x04
56 #define RTPSE_MCU_PORT_STS_OTHER_FAULT		0x05	/* Gen1-only; reserved on Gen2 */
57 #define RTPSE_MCU_PORT_STS_REQUESTING		0x06
58 
59 /* RTPSE_MCU_PORT_SET_POWER_LIMIT_TYPE values */
60 #define RTPSE_MCU_PORT_PW_LIMIT_TYPE_USER	0x02
61 
62 #define RTPSE_MCU_MAX_PORTS			48
63 #define RTPSE_MCU_PORT_MAX_PRIORITY		3
64 
65 /* Bounded resends when the MCU replies NOT_READY (busy). */
66 #define RTPSE_MCU_NOT_READY_RETRIES		3
67 
68 /* Nominal PSE rail; 802.3at/bt operating range. */
69 #define RTPSE_MCU_PSE_VOLTAGE_UV		54000000
70 
71 enum rtpse_mcu_cmd {
72 	RTPSE_MCU_CMD_SET_GLOBAL_STATE,
73 	RTPSE_MCU_CMD_GET_SYSTEM_INFO,
74 	RTPSE_MCU_CMD_GET_EXT_CONFIG,
75 
76 	RTPSE_MCU_CMD_PORT_ENABLE,
77 	RTPSE_MCU_CMD_PORT_SET_POWER_LIMIT_TYPE,
78 	RTPSE_MCU_CMD_PORT_SET_POWER_LIMIT,
79 	RTPSE_MCU_CMD_PORT_SET_POWER_LIMIT_EXT,
80 	RTPSE_MCU_CMD_PORT_SET_PRIORITY,
81 	RTPSE_MCU_CMD_PORT_GET_STATUS,
82 	RTPSE_MCU_CMD_PORT_GET_POWER_STATS,
83 	RTPSE_MCU_CMD_PORT_GET_CONFIG,
84 	RTPSE_MCU_CMD_PORT_GET_EXT_CONFIG,
85 
86 	RTPSE_MCU_NUM_CMDS,
87 };
88 
89 struct rtpse_mcu_opcode {
90 	u8 op;
91 	bool valid;
92 };
93 
94 /* Shorthand for the designated-initializer entries in dialect opcode tables. */
95 #define RTPSE_MCU_OP(opc)	{ .op = (opc), .valid = true }
96 
97 /* Parsed MCU response structures (decoded from rtpse_mcu_msg replies) */
98 
99 struct rtpse_mcu_info {
100 	u8 max_ports;
101 	bool system_enable;
102 	u16 device_id;
103 	u8 mcu_type;
104 };
105 
106 struct rtpse_mcu_ext_config {
107 	u8 num_of_pses;
108 };
109 
110 struct rtpse_mcu_port_status {
111 	u8 sts1;
112 	u8 sts2;
113 	u8 sts3;
114 };
115 
116 struct rtpse_mcu_port_measurement {
117 	u16 voltage_raw;	/* 64.45mV/LSB */
118 	u16 current_raw;	/* 1mA/LSB */
119 	u16 temperature_raw;	/* T(mC) = 1250 * (220 - raw) */
120 	u16 power_raw;		/* 100mW/LSB */
121 };
122 
123 struct rtpse_mcu_port_config {
124 	bool enable;
125 };
126 
127 struct rtpse_mcu_port_ext_config {
128 	u8 max_power;
129 	u8 priority;
130 };
131 
132 struct rtpse_mcu_dialect {
133 	struct rtpse_mcu_opcode opcode[RTPSE_MCU_NUM_CMDS];
134 
135 	/*
136 	 * Response parsers for the fields that differ between dialects; each
137 	 * dialect supplies its own. Other responses share one layout and are
138 	 * decoded directly - a dialect that diverges there must add a hook,
139 	 * as a mismatched layout cannot be detected (the checksum still passes).
140 	 */
141 	void (*parse_system_info)(const u8 *payload, struct rtpse_mcu_info *info);
142 	int (*parse_port_class)(const struct rtpse_mcu_port_status *status);
143 	const char *(*mcu_type_str)(unsigned int mcu_type);
144 };
145 
146 struct rtpse_mcu_chip_info {
147 	const char *name;
148 	u32 max_mW_per_port;
149 	enum rtpse_mcu_cmd pw_set_cmd;	/* command used by set_pw_limit */
150 	u32 pw_set_lsb_mW;		/* LSB of pw_set_cmd value, in mW */
151 	u32 pw_read_lsb_mW;		/* LSB of ext_config.max_power read-back, in mW */
152 };
153 
154 static const struct rtpse_mcu_chip_info rtl8238b_info = {
155 	.max_mW_per_port = 30000,
156 	.name = "RTL8238B",
157 	.pw_read_lsb_mW = 200,
158 	.pw_set_cmd = RTPSE_MCU_CMD_PORT_SET_POWER_LIMIT,
159 	.pw_set_lsb_mW = 200,
160 };
161 
162 static const struct rtpse_mcu_chip_info rtl8239_info = {
163 	.max_mW_per_port = 90000,
164 	.name = "RTL8239",
165 	.pw_read_lsb_mW = 400,
166 	.pw_set_cmd = RTPSE_MCU_CMD_PORT_SET_POWER_LIMIT_EXT,
167 	.pw_set_lsb_mW = 400,
168 };
169 
170 static const struct rtpse_mcu_chip_info rtl8239c_info = {
171 	.max_mW_per_port = 90000,
172 	.name = "RTL8239C",
173 	.pw_read_lsb_mW = 400,
174 	.pw_set_cmd = RTPSE_MCU_CMD_PORT_SET_POWER_LIMIT_EXT,
175 	.pw_set_lsb_mW = 400,
176 };
177 
178 static const struct rtpse_mcu_chip_info bcm59111_info = {
179 	.max_mW_per_port = 30000,
180 	.name = "BCM59111",
181 	.pw_read_lsb_mW = 200,
182 	.pw_set_cmd = RTPSE_MCU_CMD_PORT_SET_POWER_LIMIT,
183 	.pw_set_lsb_mW = 200,
184 };
185 
186 static const struct rtpse_mcu_chip_info bcm59121_info = {
187 	/*
188 	 * BCM59121 is a 60W Type-3 part, but known boards run it at 802.3at
189 	 * and the Gen1 dialect has only the 8-bit/0.2W set command (<=51W);
190 	 * cap at the 30W the hardware actually offers.
191 	 */
192 	.max_mW_per_port = 30000,
193 	.name = "BCM59121",
194 	.pw_read_lsb_mW = 200,
195 	.pw_set_cmd = RTPSE_MCU_CMD_PORT_SET_POWER_LIMIT,
196 	.pw_set_lsb_mW = 200,
197 };
198 
199 /* Helpers and basic functions */
200 
to_rtpse_mcu_ctrl(struct pse_controller_dev * pcdev)201 static struct rtpse_mcu_ctrl *to_rtpse_mcu_ctrl(struct pse_controller_dev *pcdev)
202 {
203 	return container_of(pcdev, struct rtpse_mcu_ctrl, pcdev);
204 }
205 
rtpse_mcu_msg_init(struct rtpse_mcu_msg * msg,u8 opcode)206 static void rtpse_mcu_msg_init(struct rtpse_mcu_msg *msg, u8 opcode)
207 {
208 	memset(msg, 0xff, sizeof(*msg));
209 	msg->opcode = opcode;
210 }
211 
rtpse_mcu_checksum(const u8 * buf,size_t len)212 static u8 rtpse_mcu_checksum(const u8 *buf, size_t len)
213 {
214 	u8 sum = 0;
215 
216 	while (len--)
217 		sum += *buf++;
218 	return sum;
219 }
220 
rtpse_mcu_do_xfer(struct rtpse_mcu_ctrl * pse,struct rtpse_mcu_msg * req,struct rtpse_mcu_msg * resp)221 static int rtpse_mcu_do_xfer(struct rtpse_mcu_ctrl *pse, struct rtpse_mcu_msg *req,
222 			     struct rtpse_mcu_msg *resp)
223 {
224 	unsigned int tries;
225 	int ret;
226 
227 	for (tries = 0; ; tries++) {
228 		scoped_guard(mutex, &pse->mutex) {
229 			/* Rolling seq_num (skip 0) so a stale/all-zero reply can't match. */
230 			if (++pse->seq == 0)
231 				pse->seq = 1;
232 			req->seq_num = pse->seq;
233 			req->checksum = rtpse_mcu_checksum((u8 *)req, RTPSE_MCU_MSG_SIZE - 1);
234 
235 			ret = pse->transport->send(pse, req);
236 			if (ret)
237 				return ret;
238 
239 			/* Pace the base reply delay; the transport waits its own way. */
240 			msleep(RTPSE_MCU_RESPONSE_MS);
241 
242 			memset(resp, 0, sizeof(*resp));
243 			ret = pse->transport->recv(pse, req, resp);
244 			if (ret)
245 				return ret;
246 		}
247 
248 		/* NOT_READY: MCU busy, wants the command resent; bounded retry. */
249 		if (resp->opcode != RTPSE_MCU_OPCODE_NOT_READY ||
250 		    tries >= RTPSE_MCU_NOT_READY_RETRIES)
251 			break;
252 		msleep(RTPSE_MCU_RESPONSE_MS);
253 	}
254 
255 	/* Explicit MCU error opcodes (Gen1); map to a meaningful errno. */
256 	switch (resp->opcode) {
257 	case RTPSE_MCU_OPCODE_INCOMPLETE:
258 		return -EBADE;
259 	case RTPSE_MCU_OPCODE_BAD_CSUM:
260 		return -EBADMSG;
261 	case RTPSE_MCU_OPCODE_NOT_READY:
262 		return -EAGAIN;
263 	}
264 
265 	if (resp->opcode != req->opcode ||
266 	    resp->seq_num != req->seq_num ||
267 	    resp->checksum != rtpse_mcu_checksum((u8 *)resp, RTPSE_MCU_MSG_SIZE - 1))
268 		return -EBADMSG;
269 
270 	return 0;
271 }
272 
rtpse_mcu_port_query(struct rtpse_mcu_ctrl * pse,unsigned int port,u8 opcode,struct rtpse_mcu_msg * resp)273 static int rtpse_mcu_port_query(struct rtpse_mcu_ctrl *pse, unsigned int port, u8 opcode,
274 				struct rtpse_mcu_msg *resp)
275 {
276 	struct rtpse_mcu_msg req;
277 	int ret;
278 
279 	rtpse_mcu_msg_init(&req, opcode);
280 	req.payload[0] = port;
281 
282 	ret = rtpse_mcu_do_xfer(pse, &req, resp);
283 	if (ret)
284 		return ret;
285 
286 	if (resp->payload[0] != port)
287 		return -EIO;
288 
289 	return 0;
290 }
291 
rtpse_mcu_port_cmd(struct rtpse_mcu_ctrl * pse,unsigned int port,u8 opcode,u8 arg)292 static int rtpse_mcu_port_cmd(struct rtpse_mcu_ctrl *pse, unsigned int port, u8 opcode, u8 arg)
293 {
294 	struct rtpse_mcu_msg req, resp;
295 	int ret;
296 
297 	rtpse_mcu_msg_init(&req, opcode);
298 	req.payload[0] = port;
299 	req.payload[1] = arg;
300 
301 	ret = rtpse_mcu_do_xfer(pse, &req, &resp);
302 	if (ret)
303 		return ret;
304 
305 	if (resp.payload[0] != port || resp.payload[1] != 0)
306 		return -EIO;
307 
308 	return 0;
309 }
310 
311 /* Global operations */
312 
rtpse_mcu_get_info(struct rtpse_mcu_ctrl * pse,struct rtpse_mcu_info * info)313 static int rtpse_mcu_get_info(struct rtpse_mcu_ctrl *pse, struct rtpse_mcu_info *info)
314 {
315 	struct rtpse_mcu_msg req, resp;
316 	const struct rtpse_mcu_opcode *opc;
317 	int ret;
318 
319 	opc = &pse->dialect->opcode[RTPSE_MCU_CMD_GET_SYSTEM_INFO];
320 	if (!opc->valid)
321 		return -EOPNOTSUPP;
322 
323 	rtpse_mcu_msg_init(&req, opc->op);
324 	ret = rtpse_mcu_do_xfer(pse, &req, &resp);
325 	if (ret)
326 		return ret;
327 
328 	pse->dialect->parse_system_info(resp.payload, info);
329 	return 0;
330 }
331 
rtpse_mcu_get_ext_config(struct rtpse_mcu_ctrl * pse,struct rtpse_mcu_ext_config * config)332 static int rtpse_mcu_get_ext_config(struct rtpse_mcu_ctrl *pse, struct rtpse_mcu_ext_config *config)
333 {
334 	struct rtpse_mcu_msg req, resp;
335 	const struct rtpse_mcu_opcode *opc;
336 	int ret;
337 
338 	opc = &pse->dialect->opcode[RTPSE_MCU_CMD_GET_EXT_CONFIG];
339 	if (!opc->valid)
340 		return -EOPNOTSUPP;
341 
342 	rtpse_mcu_msg_init(&req, opc->op);
343 	ret = rtpse_mcu_do_xfer(pse, &req, &resp);
344 	if (ret)
345 		return ret;
346 
347 	config->num_of_pses = resp.payload[6];
348 
349 	return 0;
350 }
351 
rtpse_mcu_set_global_state(struct rtpse_mcu_ctrl * pse,bool enable)352 static int rtpse_mcu_set_global_state(struct rtpse_mcu_ctrl *pse, bool enable)
353 {
354 	struct rtpse_mcu_msg req, resp;
355 	const struct rtpse_mcu_opcode *opc;
356 	int ret;
357 
358 	opc = &pse->dialect->opcode[RTPSE_MCU_CMD_SET_GLOBAL_STATE];
359 	if (!opc->valid)
360 		return -EOPNOTSUPP;
361 
362 	rtpse_mcu_msg_init(&req, opc->op);
363 	req.payload[0] = enable ? 0x1 : 0x0;
364 
365 	ret = rtpse_mcu_do_xfer(pse, &req, &resp);
366 	if (ret)
367 		return ret;
368 
369 	return (resp.payload[0] == 0x0) ? 0 : -EIO;
370 }
371 
372 /* Port operations */
373 
rtpse_mcu_port_get_status(struct rtpse_mcu_ctrl * pse,unsigned int port,struct rtpse_mcu_port_status * status)374 static int rtpse_mcu_port_get_status(struct rtpse_mcu_ctrl *pse, unsigned int port,
375 				     struct rtpse_mcu_port_status *status)
376 {
377 	const struct rtpse_mcu_opcode *opc;
378 	struct rtpse_mcu_msg resp;
379 	int ret;
380 
381 	opc = &pse->dialect->opcode[RTPSE_MCU_CMD_PORT_GET_STATUS];
382 	if (!opc->valid)
383 		return -EOPNOTSUPP;
384 
385 	ret = rtpse_mcu_port_query(pse, port, opc->op, &resp);
386 	if (ret)
387 		return ret;
388 
389 	status->sts1 = resp.payload[1];
390 	status->sts2 = resp.payload[2];
391 	status->sts3 = resp.payload[3];
392 
393 	return 0;
394 }
395 
rtpse_mcu_port_get_measurement(struct rtpse_mcu_ctrl * pse,unsigned int port,struct rtpse_mcu_port_measurement * measurement)396 static int rtpse_mcu_port_get_measurement(struct rtpse_mcu_ctrl *pse, unsigned int port,
397 					  struct rtpse_mcu_port_measurement *measurement)
398 {
399 	const struct rtpse_mcu_opcode *opc;
400 	struct rtpse_mcu_msg resp;
401 	int ret;
402 
403 	opc = &pse->dialect->opcode[RTPSE_MCU_CMD_PORT_GET_POWER_STATS];
404 	if (!opc->valid)
405 		return -EOPNOTSUPP;
406 
407 	ret = rtpse_mcu_port_query(pse, port, opc->op, &resp);
408 	if (ret)
409 		return ret;
410 
411 	measurement->voltage_raw = get_unaligned_be16(&resp.payload[1]);
412 	measurement->current_raw = get_unaligned_be16(&resp.payload[3]);
413 	measurement->temperature_raw = get_unaligned_be16(&resp.payload[5]);
414 	measurement->power_raw = get_unaligned_be16(&resp.payload[7]);
415 
416 	return 0;
417 }
418 
rtpse_mcu_port_get_config(struct rtpse_mcu_ctrl * pse,unsigned int port,struct rtpse_mcu_port_config * config)419 static int rtpse_mcu_port_get_config(struct rtpse_mcu_ctrl *pse, unsigned int port,
420 				     struct rtpse_mcu_port_config *config)
421 {
422 	const struct rtpse_mcu_opcode *opc;
423 	struct rtpse_mcu_msg resp;
424 	int ret;
425 
426 	opc = &pse->dialect->opcode[RTPSE_MCU_CMD_PORT_GET_CONFIG];
427 	if (!opc->valid)
428 		return -EOPNOTSUPP;
429 
430 	ret = rtpse_mcu_port_query(pse, port, opc->op, &resp);
431 	if (ret)
432 		return ret;
433 
434 	config->enable = (resp.payload[1] == 1);
435 
436 	return 0;
437 }
438 
rtpse_mcu_port_get_ext_config(struct rtpse_mcu_ctrl * pse,unsigned int port,struct rtpse_mcu_port_ext_config * config)439 static int rtpse_mcu_port_get_ext_config(struct rtpse_mcu_ctrl *pse, unsigned int port,
440 					 struct rtpse_mcu_port_ext_config *config)
441 {
442 	const struct rtpse_mcu_opcode *opc;
443 	struct rtpse_mcu_msg resp;
444 	int ret;
445 
446 	opc = &pse->dialect->opcode[RTPSE_MCU_CMD_PORT_GET_EXT_CONFIG];
447 	if (!opc->valid)
448 		return -EOPNOTSUPP;
449 
450 	ret = rtpse_mcu_port_query(pse, port, opc->op, &resp);
451 	if (ret)
452 		return ret;
453 
454 	config->max_power = resp.payload[3];
455 	config->priority = resp.payload[4];
456 
457 	return 0;
458 }
459 
rtpse_mcu_port_set_state(struct rtpse_mcu_ctrl * pse,unsigned int port,bool enable)460 static int rtpse_mcu_port_set_state(struct rtpse_mcu_ctrl *pse, unsigned int port, bool enable)
461 {
462 	const struct rtpse_mcu_opcode *opc;
463 
464 	opc = &pse->dialect->opcode[RTPSE_MCU_CMD_PORT_ENABLE];
465 	if (!opc->valid)
466 		return -EOPNOTSUPP;
467 
468 	return rtpse_mcu_port_cmd(pse, port, opc->op, enable ? 0x1 : 0x0);
469 }
470 
471 /* PSE controller ops */
472 
rtpse_mcu_port_get_admin_state(struct pse_controller_dev * pcdev,int id,struct pse_admin_state * admin_state)473 static int rtpse_mcu_port_get_admin_state(struct pse_controller_dev *pcdev, int id,
474 					  struct pse_admin_state *admin_state)
475 {
476 	struct rtpse_mcu_ctrl *pse = to_rtpse_mcu_ctrl(pcdev);
477 	struct rtpse_mcu_port_config config;
478 	int ret;
479 
480 	ret = rtpse_mcu_port_get_config(pse, id, &config);
481 	if (ret)
482 		return ret;
483 
484 	admin_state->c33_admin_state = config.enable ? ETHTOOL_C33_PSE_ADMIN_STATE_ENABLED :
485 						       ETHTOOL_C33_PSE_ADMIN_STATE_DISABLED;
486 	return 0;
487 }
488 
rtpse_mcu_port_get_pw_status(struct pse_controller_dev * pcdev,int id,struct pse_pw_status * pw_status)489 static int rtpse_mcu_port_get_pw_status(struct pse_controller_dev *pcdev, int id,
490 					struct pse_pw_status *pw_status)
491 {
492 	struct rtpse_mcu_ctrl *pse = to_rtpse_mcu_ctrl(pcdev);
493 	struct rtpse_mcu_port_status status;
494 	int ret;
495 
496 	ret = rtpse_mcu_port_get_status(pse, id, &status);
497 	if (ret)
498 		return ret;
499 
500 	switch (status.sts1) {
501 	case RTPSE_MCU_PORT_STS_DISABLED:
502 		pw_status->c33_pw_status = ETHTOOL_C33_PSE_PW_D_STATUS_DISABLED;
503 		break;
504 	case RTPSE_MCU_PORT_STS_SEARCHING:
505 	case RTPSE_MCU_PORT_STS_REQUESTING:
506 		pw_status->c33_pw_status = ETHTOOL_C33_PSE_PW_D_STATUS_SEARCHING;
507 		break;
508 	case RTPSE_MCU_PORT_STS_DELIVERING:
509 		pw_status->c33_pw_status = ETHTOOL_C33_PSE_PW_D_STATUS_DELIVERING;
510 		break;
511 	case RTPSE_MCU_PORT_STS_TEST:
512 		pw_status->c33_pw_status = ETHTOOL_C33_PSE_PW_D_STATUS_TEST;
513 		break;
514 	case RTPSE_MCU_PORT_STS_FAULT:
515 		pw_status->c33_pw_status = ETHTOOL_C33_PSE_PW_D_STATUS_FAULT;
516 		break;
517 	case RTPSE_MCU_PORT_STS_OTHER_FAULT:
518 		pw_status->c33_pw_status = ETHTOOL_C33_PSE_PW_D_STATUS_OTHERFAULT;
519 		break;
520 	default:
521 		pw_status->c33_pw_status = ETHTOOL_C33_PSE_PW_D_STATUS_UNKNOWN;
522 		break;
523 	}
524 
525 	return 0;
526 }
527 
rtpse_mcu_port_get_pw_class(struct pse_controller_dev * pcdev,int id)528 static int rtpse_mcu_port_get_pw_class(struct pse_controller_dev *pcdev, int id)
529 {
530 	struct rtpse_mcu_ctrl *pse = to_rtpse_mcu_ctrl(pcdev);
531 	struct rtpse_mcu_port_status status;
532 	int ret;
533 
534 	ret = rtpse_mcu_port_get_status(pse, id, &status);
535 	if (ret)
536 		return ret;
537 
538 	/*
539 	 * As per datasheet, the classification result is only valid when in
540 	 * one of those operational modes, otherwise not.
541 	 */
542 	switch (status.sts1) {
543 	case RTPSE_MCU_PORT_STS_DISABLED:
544 	case RTPSE_MCU_PORT_STS_SEARCHING:
545 	case RTPSE_MCU_PORT_STS_DELIVERING:
546 	case RTPSE_MCU_PORT_STS_REQUESTING:
547 		return pse->dialect->parse_port_class(&status);
548 	default:
549 		/*
550 		 * No class to report, return 0 instead. This is indistinguishable
551 		 * from a real class-0 PD but userspace disambiguates via the
552 		 * power status.
553 		 */
554 		return 0;
555 	}
556 }
557 
rtpse_mcu_port_get_actual_pw(struct pse_controller_dev * pcdev,int id)558 static int rtpse_mcu_port_get_actual_pw(struct pse_controller_dev *pcdev, int id)
559 {
560 	struct rtpse_mcu_ctrl *pse = to_rtpse_mcu_ctrl(pcdev);
561 	struct rtpse_mcu_port_measurement measurement;
562 	int ret;
563 
564 	ret = rtpse_mcu_port_get_measurement(pse, id, &measurement);
565 	if (ret)
566 		return ret;
567 
568 	/* 100mW per LSB */
569 	return measurement.power_raw * 100U;
570 }
571 
rtpse_mcu_port_get_voltage(struct pse_controller_dev * pcdev,int id)572 static int rtpse_mcu_port_get_voltage(struct pse_controller_dev *pcdev, int id)
573 {
574 	struct rtpse_mcu_ctrl *pse = to_rtpse_mcu_ctrl(pcdev);
575 	struct rtpse_mcu_port_measurement measurement;
576 	int ret;
577 	u32 uV;
578 
579 	ret = rtpse_mcu_port_get_measurement(pse, id, &measurement);
580 	if (ret)
581 		return ret;
582 
583 	/* 64.45mV per LSB */
584 	uV = measurement.voltage_raw * 64450U;
585 
586 	/*
587 	 * Idle ports measure 0V, which the core rejects when turning a power
588 	 * limit into a current limit. Fall back to the nominal rail so a limit
589 	 * can be set before a PD is attached.
590 	 */
591 	if (!uV)
592 		return RTPSE_MCU_PSE_VOLTAGE_UV;
593 
594 	return min_t(u32, uV, INT_MAX);
595 }
596 
rtpse_mcu_port_enable(struct pse_controller_dev * pcdev,int id)597 static int rtpse_mcu_port_enable(struct pse_controller_dev *pcdev, int id)
598 {
599 	return rtpse_mcu_port_set_state(to_rtpse_mcu_ctrl(pcdev), id, true);
600 }
601 
rtpse_mcu_port_disable(struct pse_controller_dev * pcdev,int id)602 static int rtpse_mcu_port_disable(struct pse_controller_dev *pcdev, int id)
603 {
604 	return rtpse_mcu_port_set_state(to_rtpse_mcu_ctrl(pcdev), id, false);
605 }
606 
rtpse_mcu_port_get_pw_limit(struct pse_controller_dev * pcdev,int id)607 static int rtpse_mcu_port_get_pw_limit(struct pse_controller_dev *pcdev, int id)
608 {
609 	struct rtpse_mcu_ctrl *pse = to_rtpse_mcu_ctrl(pcdev);
610 	struct rtpse_mcu_port_ext_config config;
611 	int ret;
612 
613 	ret = rtpse_mcu_port_get_ext_config(pse, id, &config);
614 	if (ret)
615 		return ret;
616 
617 	/*
618 	 * The MCU's raw max_power byte can scale above the chip's rated cap;
619 	 * clamp to the same bound set_pw_limit() and the advertised range use.
620 	 */
621 	return min_t(u32, config.max_power * pse->chip->pw_read_lsb_mW,
622 		     pse->chip->max_mW_per_port);
623 }
624 
rtpse_mcu_port_set_pw_limit(struct pse_controller_dev * pcdev,int id,int max_mW)625 static int rtpse_mcu_port_set_pw_limit(struct pse_controller_dev *pcdev, int id, int max_mW)
626 {
627 	const struct rtpse_mcu_opcode *type_opc, *val_opc;
628 	struct rtpse_mcu_ctrl *pse = to_rtpse_mcu_ctrl(pcdev);
629 	const struct rtpse_mcu_chip_info *chip = pse->chip;
630 	u8 prg_val;
631 	int ret;
632 
633 	if (max_mW < 0 || max_mW > chip->max_mW_per_port)
634 		return -ERANGE;
635 
636 	type_opc = &pse->dialect->opcode[RTPSE_MCU_CMD_PORT_SET_POWER_LIMIT_TYPE];
637 	val_opc = &pse->dialect->opcode[chip->pw_set_cmd];
638 	/* pw_set_lsb_mW is the divisor below; reject a chip that lacks it. */
639 	if (!type_opc->valid || !val_opc->valid || !chip->pw_set_lsb_mW)
640 		return -EOPNOTSUPP;
641 
642 	/*
643 	 * Round up so a sub-LSB request maps to one LSB, not silently to 0;
644 	 * an explicit 0 still yields 0, and LSB-aligned maxima can't overshoot.
645 	 */
646 	prg_val = min_t(unsigned int, DIV_ROUND_UP(max_mW, chip->pw_set_lsb_mW), U8_MAX);
647 
648 	/*
649 	 * Program the value before switching to user-defined mode. The two
650 	 * commands aren't atomic, but this order never leaves a stale cap: a
651 	 * failure keeps the previous cap, or (already user mode) the requested.
652 	 */
653 	ret = rtpse_mcu_port_cmd(pse, id, val_opc->op, prg_val);
654 	if (ret)
655 		return ret;
656 
657 	return rtpse_mcu_port_cmd(pse, id, type_opc->op, RTPSE_MCU_PORT_PW_LIMIT_TYPE_USER);
658 }
659 
rtpse_mcu_port_get_pw_limit_ranges(struct pse_controller_dev * pcdev,int id,struct pse_pw_limit_ranges * out)660 static int rtpse_mcu_port_get_pw_limit_ranges(struct pse_controller_dev *pcdev, int id,
661 					      struct pse_pw_limit_ranges *out)
662 {
663 	struct rtpse_mcu_ctrl *pse = to_rtpse_mcu_ctrl(pcdev);
664 	struct ethtool_c33_pse_pw_limit_range *range;
665 
666 	range = kzalloc_obj(*range);
667 	if (!range)
668 		return -ENOMEM;
669 
670 	range[0].min = 0;
671 	range[0].max = pse->chip->max_mW_per_port;
672 
673 	out->c33_pw_limit_ranges = range;
674 	return 1;
675 }
676 
rtpse_mcu_port_get_prio(struct pse_controller_dev * pcdev,int id)677 static int rtpse_mcu_port_get_prio(struct pse_controller_dev *pcdev, int id)
678 {
679 	struct rtpse_mcu_ctrl *pse = to_rtpse_mcu_ctrl(pcdev);
680 	struct rtpse_mcu_port_ext_config config;
681 	int ret;
682 
683 	ret = rtpse_mcu_port_get_ext_config(pse, id, &config);
684 	if (ret)
685 		return ret;
686 
687 	/* Clamp to the advertised max; set_prio() and pis_prio_max use the same bound. */
688 	return min_t(u8, config.priority, RTPSE_MCU_PORT_MAX_PRIORITY);
689 }
690 
rtpse_mcu_port_set_prio(struct pse_controller_dev * pcdev,int id,unsigned int prio)691 static int rtpse_mcu_port_set_prio(struct pse_controller_dev *pcdev, int id, unsigned int prio)
692 {
693 	struct rtpse_mcu_ctrl *pse = to_rtpse_mcu_ctrl(pcdev);
694 	const struct rtpse_mcu_opcode *opc;
695 
696 	if (prio > RTPSE_MCU_PORT_MAX_PRIORITY)
697 		return -ERANGE;
698 
699 	opc = &pse->dialect->opcode[RTPSE_MCU_CMD_PORT_SET_PRIORITY];
700 	if (!opc->valid)
701 		return -EOPNOTSUPP;
702 
703 	return rtpse_mcu_port_cmd(pse, id, opc->op, prio);
704 }
705 
706 static const struct pse_controller_ops rtpse_mcu_ops = {
707 	.pi_get_admin_state = rtpse_mcu_port_get_admin_state,
708 	.pi_get_pw_status = rtpse_mcu_port_get_pw_status,
709 	.pi_get_pw_class = rtpse_mcu_port_get_pw_class,
710 	.pi_get_actual_pw = rtpse_mcu_port_get_actual_pw,
711 	.pi_enable = rtpse_mcu_port_enable,
712 	.pi_disable = rtpse_mcu_port_disable,
713 	.pi_get_voltage = rtpse_mcu_port_get_voltage,
714 	.pi_get_pw_limit = rtpse_mcu_port_get_pw_limit,
715 	.pi_set_pw_limit = rtpse_mcu_port_set_pw_limit,
716 	.pi_get_pw_limit_ranges = rtpse_mcu_port_get_pw_limit_ranges,
717 	.pi_get_prio = rtpse_mcu_port_get_prio,
718 	.pi_set_prio = rtpse_mcu_port_set_prio,
719 };
720 
rtpse_mcu_discover(struct rtpse_mcu_ctrl * pse,struct rtpse_mcu_info * info)721 static int rtpse_mcu_discover(struct rtpse_mcu_ctrl *pse, struct rtpse_mcu_info *info)
722 {
723 	struct rtpse_mcu_ext_config ext_config;
724 	unsigned long deadline;
725 	int ret;
726 
727 	/*
728 	 * A booting MCU may stay silent (-ETIMEDOUT), not ACK its address
729 	 * (-ENXIO / -EREMOTEIO), report not-ready (-EAGAIN), or emit a
730 	 * corrupt/partial frame (-EBADMSG / -EBADE). Retry those within a
731 	 * bounded window; other errors (e.g. -EOPNOTSUPP) are fatal and fail
732 	 * immediately.
733 	 */
734 	deadline = jiffies + msecs_to_jiffies(RTPSE_MCU_BOOT_TIMEOUT_MS);
735 	do {
736 		ret = rtpse_mcu_get_info(pse, info);
737 		if (ret != -ETIMEDOUT && ret != -ENXIO && ret != -EREMOTEIO &&
738 		    ret != -EAGAIN && ret != -EBADMSG && ret != -EBADE)
739 			break;
740 		msleep(RTPSE_MCU_BOOT_RETRY_MS);
741 	} while (time_before(jiffies, deadline));
742 	if (ret)
743 		return dev_err_probe(pse->dev, ret, "failed to read MCU info\n");
744 
745 	switch (info->device_id) {
746 	case RTPSE_MCU_DEVICE_ID_RTL8238B:
747 		pse->chip = &rtl8238b_info;
748 		break;
749 	case RTPSE_MCU_DEVICE_ID_RTL8239:
750 		pse->chip = &rtl8239_info;
751 		break;
752 	case RTPSE_MCU_DEVICE_ID_RTL8239C:
753 		pse->chip = &rtl8239c_info;
754 		break;
755 	case RTPSE_MCU_DEVICE_ID_BCM59111:
756 		pse->chip = &bcm59111_info;
757 		break;
758 	case RTPSE_MCU_DEVICE_ID_BCM59121:
759 		pse->chip = &bcm59121_info;
760 		break;
761 	default:
762 		return dev_err_probe(pse->dev, -EINVAL, "unknown PSE id 0x%x\n",
763 				     info->device_id);
764 	}
765 
766 	if (!info->max_ports || info->max_ports > RTPSE_MCU_MAX_PORTS)
767 		return dev_err_probe(pse->dev, -EINVAL,
768 				     "MCU reports invalid port count %u\n", info->max_ports);
769 
770 	ret = rtpse_mcu_get_ext_config(pse, &ext_config);
771 	if (ret)
772 		return dev_err_probe(pse->dev, ret, "failed to read MCU ext config\n");
773 
774 	dev_info(pse->dev, "%s MCU, %s (id 0x%04x), %u ports across %u PSE chip(s)\n",
775 		 pse->dialect->mcu_type_str(info->mcu_type), pse->chip->name,
776 		 info->device_id, info->max_ports, ext_config.num_of_pses);
777 	return 0;
778 }
779 
rtpse_mcu_global_disable(void * data)780 static void rtpse_mcu_global_disable(void *data)
781 {
782 	struct rtpse_mcu_ctrl *pse = data;
783 
784 	rtpse_mcu_set_global_state(pse, false);
785 }
786 
rtpse_mcu_register(struct rtpse_mcu_ctrl * pse)787 int rtpse_mcu_register(struct rtpse_mcu_ctrl *pse)
788 {
789 	const struct rtpse_mcu_match_data *match;
790 	struct rtpse_mcu_info info;
791 	struct gpio_desc *gpiod;
792 	int ret;
793 
794 	BUILD_BUG_ON(sizeof(struct rtpse_mcu_msg) != RTPSE_MCU_MSG_SIZE);
795 
796 	ret = devm_mutex_init(pse->dev, &pse->mutex);
797 	if (ret)
798 		return ret;
799 
800 	match = device_get_match_data(pse->dev);
801 	if (!match)
802 		return dev_err_probe(pse->dev, -ENODEV, "missing match data\n");
803 	pse->dialect = match->dialect;
804 
805 	/*
806 	 * Catch a dialect that forgot to set one of the required hooks at
807 	 * probe time, rather than NULL-deref'ing later from a fast path.
808 	 */
809 	if (!pse->dialect ||
810 	    !pse->dialect->parse_system_info ||
811 	    !pse->dialect->parse_port_class ||
812 	    !pse->dialect->mcu_type_str)
813 		return dev_err_probe(pse->dev, -EINVAL,
814 				     "dialect for chip is incomplete\n");
815 
816 	/*
817 	 * Release the MCU from reset before the first transaction; the
818 	 * boot-retry loop in discover() waits for it to answer.
819 	 */
820 	gpiod = devm_gpiod_get_optional(pse->dev, "reset", GPIOD_OUT_LOW);
821 	if (IS_ERR(gpiod))
822 		return dev_err_probe(pse->dev, PTR_ERR(gpiod),
823 				     "failed to get reset gpio\n");
824 
825 	ret = rtpse_mcu_discover(pse, &info);
826 	if (ret)
827 		return ret;
828 
829 	/*
830 	 * Some boards gate all ports through a hardware line; deassert it only
831 	 * after the MCU is confirmed, so a discover failure never ungates the
832 	 * ports. It is then left to the MCU - not re-gated on unbind or a later
833 	 * probe error - so a driver reload doesn't black out PoE.
834 	 */
835 	gpiod = devm_gpiod_get_optional(pse->dev, "disable-ports", GPIOD_OUT_LOW);
836 	if (IS_ERR(gpiod))
837 		return dev_err_probe(pse->dev, PTR_ERR(gpiod),
838 				     "failed to get disable-ports gpio\n");
839 
840 	if (!info.system_enable) {
841 		ret = rtpse_mcu_set_global_state(pse, true);
842 		/* Dialects without a global-state concept (e.g. Gen1) return
843 		 * -EOPNOTSUPP; treat that as "no separate enable required".
844 		 */
845 		if (ret && ret != -EOPNOTSUPP)
846 			return dev_err_probe(pse->dev, ret,
847 					     "failed to enable PSE system\n");
848 		if (!ret) {
849 			ret = devm_add_action_or_reset(pse->dev,
850 						       rtpse_mcu_global_disable, pse);
851 			if (ret)
852 				return ret;
853 		}
854 	}
855 
856 	/*
857 	 * Depending on the MCU firmware configuration (which might be different
858 	 * for every board), it isn't known whether the PoE subsystem is active or
859 	 * inactive by default. At this stage, the PSE chips might already deliver
860 	 * power to PDs without any explicit enable.
861 	 */
862 
863 	/* pcdev.owner is set by the transport, so the registered controller
864 	 * pins the transport module that owns the live device, not the core.
865 	 */
866 	pse->pcdev.ops      = &rtpse_mcu_ops;
867 	pse->pcdev.dev      = pse->dev;
868 	pse->pcdev.types    = ETHTOOL_PSE_C33;
869 	pse->pcdev.nr_lines = info.max_ports;
870 	pse->pcdev.pis_prio_max = RTPSE_MCU_PORT_MAX_PRIORITY;
871 	pse->pcdev.supp_budget_eval_strategies = PSE_BUDGET_EVAL_STRAT_DYNAMIC;
872 
873 	return devm_pse_controller_register(pse->dev, &pse->pcdev);
874 }
875 EXPORT_SYMBOL_GPL(rtpse_mcu_register);
876 
rtpse_mcu_gen2_parse_system_info(const u8 * payload,struct rtpse_mcu_info * info)877 static void rtpse_mcu_gen2_parse_system_info(const u8 *payload, struct rtpse_mcu_info *info)
878 {
879 	info->max_ports = payload[1];
880 	info->system_enable = (payload[2] == 0x1);
881 	info->device_id = get_unaligned_be16(&payload[3]);
882 	info->mcu_type = payload[6];
883 }
884 
rtpse_mcu_gen2_parse_port_class(const struct rtpse_mcu_port_status * status)885 static int rtpse_mcu_gen2_parse_port_class(const struct rtpse_mcu_port_status *status)
886 {
887 	/* Class lives in the upper nibble of sts2. */
888 	return FIELD_GET(GENMASK(7, 4), status->sts2);
889 }
890 
rtpse_mcu_gen2_mcu_type_str(unsigned int mcu_type)891 static const char *rtpse_mcu_gen2_mcu_type_str(unsigned int mcu_type)
892 {
893 	switch (mcu_type) {
894 	case 0x00:	return "GigaDevice GD32F310";
895 	case 0x01:	return "GigaDevice GD32F230";
896 	case 0x02:	return "GigaDevice GD32F303";
897 	case 0x03:	return "GigaDevice GD32F103";
898 	case 0x04:	return "GigaDevice GD32E103";
899 	case 0x10:	return "Nuvoton M0516";
900 	case 0x11:	return "Nuvoton M0564";
901 	case 0x12:	return "Nuvoton NUC029";
902 	default:	return "unknown";
903 	}
904 }
905 
rtpse_mcu_gen1_parse_system_info(const u8 * payload,struct rtpse_mcu_info * info)906 static void rtpse_mcu_gen1_parse_system_info(const u8 *payload, struct rtpse_mcu_info *info)
907 {
908 	info->max_ports = payload[1];
909 	/* Gen1 has no explicit system_enable byte; the closest analog is the
910 	 * "remote enable" bit in the system-status flags at payload[7].
911 	 */
912 	info->system_enable = !!(payload[7] & BIT(2));
913 	info->device_id = get_unaligned_be16(&payload[3]);
914 	info->mcu_type = payload[6];
915 }
916 
rtpse_mcu_gen1_parse_port_class(const struct rtpse_mcu_port_status * status)917 static int rtpse_mcu_gen1_parse_port_class(const struct rtpse_mcu_port_status *status)
918 {
919 	/* Gen1 puts the detected class in payload[3] (== sts3) directly.
920 	 * Mask to the low nibble; class is 0..8 and any high bits would be
921 	 * noise.
922 	 */
923 	return status->sts3 & 0x0f;
924 }
925 
rtpse_mcu_gen1_mcu_type_str(unsigned int mcu_type)926 static const char *rtpse_mcu_gen1_mcu_type_str(unsigned int mcu_type)
927 {
928 	switch (mcu_type) {
929 	case 0x00:	return "ST Micro ST32F100";
930 	case 0x01:	return "Nuvoton M05xx LAN";
931 	case 0x02:	return "ST Micro STF030C8";
932 	case 0x03:	return "Nuvoton M058SAN";
933 	case 0x04:	return "Nuvoton NUC122";
934 	default:	return "unknown";
935 	}
936 }
937 
938 /* Map each logical command the core issues to its per-dialect opcode. */
939 static const struct rtpse_mcu_dialect rtpse_mcu_dialect_gen2 = {
940 	.parse_system_info = rtpse_mcu_gen2_parse_system_info,
941 	.parse_port_class  = rtpse_mcu_gen2_parse_port_class,
942 	.mcu_type_str      = rtpse_mcu_gen2_mcu_type_str,
943 	.opcode = {
944 		[RTPSE_MCU_CMD_SET_GLOBAL_STATE]	= RTPSE_MCU_OP(0x00),
945 		[RTPSE_MCU_CMD_GET_SYSTEM_INFO]		= RTPSE_MCU_OP(0x40),
946 		[RTPSE_MCU_CMD_GET_EXT_CONFIG]		= RTPSE_MCU_OP(0x4a),
947 
948 		[RTPSE_MCU_CMD_PORT_ENABLE]		= RTPSE_MCU_OP(0x01),
949 		[RTPSE_MCU_CMD_PORT_SET_POWER_LIMIT_TYPE] = RTPSE_MCU_OP(0x12),
950 		[RTPSE_MCU_CMD_PORT_SET_POWER_LIMIT]	= RTPSE_MCU_OP(0x13),
951 		[RTPSE_MCU_CMD_PORT_SET_POWER_LIMIT_EXT] = RTPSE_MCU_OP(0x14),
952 		[RTPSE_MCU_CMD_PORT_SET_PRIORITY]	= RTPSE_MCU_OP(0x15),
953 		[RTPSE_MCU_CMD_PORT_GET_STATUS]		= RTPSE_MCU_OP(0x42),
954 		[RTPSE_MCU_CMD_PORT_GET_POWER_STATS]	= RTPSE_MCU_OP(0x44),
955 		[RTPSE_MCU_CMD_PORT_GET_CONFIG]		= RTPSE_MCU_OP(0x48),
956 		[RTPSE_MCU_CMD_PORT_GET_EXT_CONFIG]	= RTPSE_MCU_OP(0x49),
957 	},
958 };
959 
960 static const struct rtpse_mcu_dialect rtpse_mcu_dialect_gen1 = {
961 	.parse_system_info = rtpse_mcu_gen1_parse_system_info,
962 	.parse_port_class  = rtpse_mcu_gen1_parse_port_class,
963 	.mcu_type_str      = rtpse_mcu_gen1_mcu_type_str,
964 	.opcode = {
965 		[RTPSE_MCU_CMD_GET_SYSTEM_INFO]		= RTPSE_MCU_OP(0x20),
966 		[RTPSE_MCU_CMD_GET_EXT_CONFIG]		= RTPSE_MCU_OP(0x2b),
967 
968 		[RTPSE_MCU_CMD_PORT_ENABLE]		= RTPSE_MCU_OP(0x00),
969 		[RTPSE_MCU_CMD_PORT_SET_POWER_LIMIT_TYPE] = RTPSE_MCU_OP(0x15),
970 		[RTPSE_MCU_CMD_PORT_SET_POWER_LIMIT]	= RTPSE_MCU_OP(0x16),
971 		[RTPSE_MCU_CMD_PORT_SET_PRIORITY]	= RTPSE_MCU_OP(0x1a),
972 		[RTPSE_MCU_CMD_PORT_GET_STATUS]		= RTPSE_MCU_OP(0x21),
973 		[RTPSE_MCU_CMD_PORT_GET_POWER_STATS]	= RTPSE_MCU_OP(0x30),
974 		[RTPSE_MCU_CMD_PORT_GET_CONFIG]		= RTPSE_MCU_OP(0x25),
975 		[RTPSE_MCU_CMD_PORT_GET_EXT_CONFIG]	= RTPSE_MCU_OP(0x26),
976 	},
977 };
978 
979 const struct rtpse_mcu_match_data rtpse_mcu_gen1_data = {
980 	.dialect = &rtpse_mcu_dialect_gen1,
981 };
982 EXPORT_SYMBOL_GPL(rtpse_mcu_gen1_data);
983 
984 const struct rtpse_mcu_match_data rtpse_mcu_gen2_data = {
985 	.dialect = &rtpse_mcu_dialect_gen2,
986 };
987 EXPORT_SYMBOL_GPL(rtpse_mcu_gen2_data);
988 
989 /* Same dialect as gen2, but the MCU expects raw-I2C framing. */
990 const struct rtpse_mcu_match_data rtpse_mcu_gen2_i2c_data = {
991 	.dialect = &rtpse_mcu_dialect_gen2,
992 	.native_i2c = true,
993 };
994 EXPORT_SYMBOL_GPL(rtpse_mcu_gen2_i2c_data);
995 
996 MODULE_AUTHOR("Jonas Jelonek <jelonek.jonas@gmail.com>");
997 MODULE_DESCRIPTION("Realtek PSE MCU driver (core)");
998 MODULE_LICENSE("GPL");
999