xref: /linux/drivers/net/pse-pd/realtek-pse-mcu.h (revision 91ec2035134982b98fab0609a9fd8480e8217dc1)
1*44566e61SJonas Jelonek /* SPDX-License-Identifier: GPL-2.0-or-later */
2*44566e61SJonas Jelonek 
3*44566e61SJonas Jelonek #ifndef _REALTEK_PSE_MCU_H
4*44566e61SJonas Jelonek #define _REALTEK_PSE_MCU_H
5*44566e61SJonas Jelonek 
6*44566e61SJonas Jelonek #include <linux/mutex.h>
7*44566e61SJonas Jelonek #include <linux/pse-pd/pse.h>
8*44566e61SJonas Jelonek #include <linux/types.h>
9*44566e61SJonas Jelonek 
10*44566e61SJonas Jelonek /*
11*44566e61SJonas Jelonek  * Time the MCU itself needs between accepting a request and having a
12*44566e61SJonas Jelonek  * response ready. These are properties of the MCU firmware, not of the
13*44566e61SJonas Jelonek  * underlying transport: the core paces transactions by RTPSE_MCU_RESPONSE_MS
14*44566e61SJonas Jelonek  * and both transports size their per-transaction recv ceiling from
15*44566e61SJonas Jelonek  * RTPSE_MCU_RESPONSE_MAX_MS, since some commands are documented as
16*44566e61SJonas Jelonek  * needing up to ~1s to produce a reply.
17*44566e61SJonas Jelonek  */
18*44566e61SJonas Jelonek #define RTPSE_MCU_RESPONSE_MS			25
19*44566e61SJonas Jelonek #define RTPSE_MCU_RESPONSE_MAX_MS		1000
20*44566e61SJonas Jelonek 
21*44566e61SJonas Jelonek /*
22*44566e61SJonas Jelonek  * Total time to keep retrying the first MCU read at probe, and the pause
23*44566e61SJonas Jelonek  * between attempts. Right after reset-gpios is deasserted the MCU may not
24*44566e61SJonas Jelonek  * answer on the bus yet; give it a bounded window to come up before
25*44566e61SJonas Jelonek  * declaring the probe failed.
26*44566e61SJonas Jelonek  */
27*44566e61SJonas Jelonek #define RTPSE_MCU_BOOT_TIMEOUT_MS		3000
28*44566e61SJonas Jelonek #define RTPSE_MCU_BOOT_RETRY_MS			100
29*44566e61SJonas Jelonek 
30*44566e61SJonas Jelonek #define RTPSE_MCU_MSG_SIZE			12
31*44566e61SJonas Jelonek 
32*44566e61SJonas Jelonek struct rtpse_mcu_msg {
33*44566e61SJonas Jelonek 	u8 opcode;
34*44566e61SJonas Jelonek 	u8 seq_num;
35*44566e61SJonas Jelonek 	u8 payload[9];
36*44566e61SJonas Jelonek 	u8 checksum;
37*44566e61SJonas Jelonek } __packed;
38*44566e61SJonas Jelonek 
39*44566e61SJonas Jelonek /*
40*44566e61SJonas Jelonek  * MCU status opcodes (seen on the Gen1 dialect; Gen2 never emits them).
41*44566e61SJonas Jelonek  * INCOMPLETE/BAD_CSUM are terminal; NOT_READY is transient.
42*44566e61SJonas Jelonek  */
43*44566e61SJonas Jelonek #define RTPSE_MCU_OPCODE_INCOMPLETE		0xfd	/* -EBADE   */
44*44566e61SJonas Jelonek #define RTPSE_MCU_OPCODE_BAD_CSUM		0xfe	/* -EBADMSG */
45*44566e61SJonas Jelonek #define RTPSE_MCU_OPCODE_NOT_READY		0xff	/* -EAGAIN  */
46*44566e61SJonas Jelonek 
47*44566e61SJonas Jelonek /*
48*44566e61SJonas Jelonek  * A polling transport can stop here: the reply to this request (opcode and
49*44566e61SJonas Jelonek  * seq_num) or a terminal error. The seq_num rejects a stale normal reply; the
50*44566e61SJonas Jelonek  * terminal errors match unconditionally, as a request the MCU couldn't parse
51*44566e61SJonas Jelonek  * carries no seq_num to correlate against.
52*44566e61SJonas Jelonek  */
rtpse_mcu_resp_is_final(const struct rtpse_mcu_msg * req,const struct rtpse_mcu_msg * resp)53*44566e61SJonas Jelonek static inline bool rtpse_mcu_resp_is_final(const struct rtpse_mcu_msg *req,
54*44566e61SJonas Jelonek 					   const struct rtpse_mcu_msg *resp)
55*44566e61SJonas Jelonek {
56*44566e61SJonas Jelonek 	return (resp->opcode == req->opcode && resp->seq_num == req->seq_num) ||
57*44566e61SJonas Jelonek 	       resp->opcode == RTPSE_MCU_OPCODE_INCOMPLETE ||
58*44566e61SJonas Jelonek 	       resp->opcode == RTPSE_MCU_OPCODE_BAD_CSUM;
59*44566e61SJonas Jelonek }
60*44566e61SJonas Jelonek 
61*44566e61SJonas Jelonek /* Opaque to transports; defined in realtek-pse-mcu-core.c. */
62*44566e61SJonas Jelonek struct rtpse_mcu_dialect;
63*44566e61SJonas Jelonek struct rtpse_mcu_chip_info;
64*44566e61SJonas Jelonek struct rtpse_mcu_ctrl;
65*44566e61SJonas Jelonek 
66*44566e61SJonas Jelonek /* Per-compatible match data (the of_match .data). */
67*44566e61SJonas Jelonek struct rtpse_mcu_match_data {
68*44566e61SJonas Jelonek 	const struct rtpse_mcu_dialect *dialect;
69*44566e61SJonas Jelonek 	bool native_i2c;	/* raw-I2C framing (vs SMBus); I2C transport only */
70*44566e61SJonas Jelonek };
71*44566e61SJonas Jelonek 
72*44566e61SJonas Jelonek struct rtpse_mcu_transport_ops {
73*44566e61SJonas Jelonek 	int (*send)(struct rtpse_mcu_ctrl *pse, const struct rtpse_mcu_msg *req);
74*44566e61SJonas Jelonek 	int (*recv)(struct rtpse_mcu_ctrl *pse, const struct rtpse_mcu_msg *req,
75*44566e61SJonas Jelonek 		    struct rtpse_mcu_msg *resp);
76*44566e61SJonas Jelonek };
77*44566e61SJonas Jelonek 
78*44566e61SJonas Jelonek struct rtpse_mcu_ctrl {
79*44566e61SJonas Jelonek 	struct device *dev;
80*44566e61SJonas Jelonek 	struct pse_controller_dev pcdev;
81*44566e61SJonas Jelonek 	struct mutex mutex;	/* serializes MCU request/response transactions */
82*44566e61SJonas Jelonek 	const struct rtpse_mcu_dialect *dialect;
83*44566e61SJonas Jelonek 	const struct rtpse_mcu_chip_info *chip;
84*44566e61SJonas Jelonek 	const struct rtpse_mcu_transport_ops *transport;
85*44566e61SJonas Jelonek 	u8 seq;			/* rolling request seq_num, echoed by the MCU */
86*44566e61SJonas Jelonek };
87*44566e61SJonas Jelonek 
88*44566e61SJonas Jelonek int rtpse_mcu_register(struct rtpse_mcu_ctrl *pse);
89*44566e61SJonas Jelonek 
90*44566e61SJonas Jelonek extern const struct rtpse_mcu_match_data rtpse_mcu_gen1_data;
91*44566e61SJonas Jelonek extern const struct rtpse_mcu_match_data rtpse_mcu_gen2_data;
92*44566e61SJonas Jelonek extern const struct rtpse_mcu_match_data rtpse_mcu_gen2_i2c_data;
93*44566e61SJonas Jelonek 
94*44566e61SJonas Jelonek #endif
95