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