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