1/* SPDX-License-Identifier: ISC */ 2/* Copyright (C) 2021 MediaTek Inc. */ 3 4#define FIRMWARE_MT7622 "mediatek/mt7622pr2h.bin" 5#define FIRMWARE_MT7663 "mediatek/mt7663pr2h.bin" 6#define FIRMWARE_MT7668 "mediatek/mt7668pr2h.bin" 7#define FIRMWARE_MT7922 "mediatek/BT_RAM_CODE_MT7922_1_1_hdr.bin" 8#define FIRMWARE_MT7961 "mediatek/BT_RAM_CODE_MT7961_1_2_hdr.bin" 9#define FIRMWARE_MT7925 "mediatek/mt7925/BT_RAM_CODE_MT7925_1_1_hdr.bin" 10 11#define HCI_EV_WMT 0xe4 12#define HCI_WMT_MAX_EVENT_SIZE 64 13 14#define BTMTK_WMT_REG_WRITE 0x1 15#define BTMTK_WMT_REG_READ 0x2 16 17#define MT7921_BTSYS_RST 0x70002610 18#define MT7921_BTSYS_RST_WITH_GPIO BIT(7) 19 20#define MT7921_PINMUX_0 0x70005050 21#define MT7921_PINMUX_1 0x70005054 22 23#define MT7921_DLSTATUS 0x7c053c10 24#define BT_DL_STATE BIT(1) 25 26#define MTK_COREDUMP_SIZE (1024 * 1000) 27#define MTK_COREDUMP_END "coredump end" 28#define MTK_COREDUMP_END_LEN (sizeof(MTK_COREDUMP_END)) 29#define MTK_COREDUMP_NUM 255 30 31enum { 32 BTMTK_WMT_PATCH_DWNLD = 0x1, 33 BTMTK_WMT_TEST = 0x2, 34 BTMTK_WMT_WAKEUP = 0x3, 35 BTMTK_WMT_HIF = 0x4, 36 BTMTK_WMT_FUNC_CTRL = 0x6, 37 BTMTK_WMT_RST = 0x7, 38 BTMTK_WMT_REGISTER = 0x8, 39 BTMTK_WMT_SEMAPHORE = 0x17, 40}; 41 42enum { 43 BTMTK_WMT_INVALID, 44 BTMTK_WMT_PATCH_UNDONE, 45 BTMTK_WMT_PATCH_PROGRESS, 46 BTMTK_WMT_PATCH_DONE, 47 BTMTK_WMT_ON_UNDONE, 48 BTMTK_WMT_ON_DONE, 49 BTMTK_WMT_ON_PROGRESS, 50}; 51 52struct btmtk_wmt_hdr { 53 u8 dir; 54 u8 op; 55 __le16 dlen; 56 u8 flag; 57} __packed; 58 59struct btmtk_hci_wmt_cmd { 60 struct btmtk_wmt_hdr hdr; 61 u8 data[]; 62} __packed; 63 64struct btmtk_hci_wmt_evt { 65 struct hci_event_hdr hhdr; 66 struct btmtk_wmt_hdr whdr; 67} __packed; 68 69struct btmtk_hci_wmt_evt_funcc { 70 struct btmtk_hci_wmt_evt hwhdr; 71 __be16 status; 72} __packed; 73 74struct btmtk_hci_wmt_evt_reg { 75 struct btmtk_hci_wmt_evt hwhdr; 76 u8 rsv[2]; 77 u8 num; 78 __le32 addr; 79 __le32 val; 80} __packed; 81 82struct btmtk_tci_sleep { 83 u8 mode; 84 __le16 duration; 85 __le16 host_duration; 86 u8 host_wakeup_pin; 87 u8 time_compensation; 88} __packed; 89 90struct btmtk_wakeon { 91 u8 mode; 92 u8 gpo; 93 u8 active_high; 94 __le16 enable_delay; 95 __le16 wakeup_delay; 96} __packed; 97 98struct btmtk_sco { 99 u8 clock_config; 100 u8 transmit_format_config; 101 u8 channel_format_config; 102 u8 channel_select_config; 103} __packed; 104 105struct reg_read_cmd { 106 u8 type; 107 u8 rsv; 108 u8 num; 109 __le32 addr; 110} __packed; 111 112struct reg_write_cmd { 113 u8 type; 114 u8 rsv; 115 u8 num; 116 __le32 addr; 117 __le32 data; 118 __le32 mask; 119} __packed; 120 121struct btmtk_hci_wmt_params { 122 u8 op; 123 u8 flag; 124 u16 dlen; 125 const void *data; 126 u32 *status; 127}; 128 129typedef int (*btmtk_reset_sync_func_t)(struct hci_dev *, void *); 130 131struct btmtk_coredump_info { 132 const char *driver_name; 133 u32 fw_version; 134 u16 cnt; 135 int state; 136}; 137 138struct btmediatek_data { 139 u32 dev_id; 140 btmtk_reset_sync_func_t reset_sync; 141 struct btmtk_coredump_info cd_info; 142}; 143 144typedef int (*wmt_cmd_sync_func_t)(struct hci_dev *, 145 struct btmtk_hci_wmt_params *); 146 147#if IS_ENABLED(CONFIG_BT_MTK) 148 149int btmtk_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr); 150 151int btmtk_setup_firmware_79xx(struct hci_dev *hdev, const char *fwname, 152 wmt_cmd_sync_func_t wmt_cmd_sync); 153 154int btmtk_setup_firmware(struct hci_dev *hdev, const char *fwname, 155 wmt_cmd_sync_func_t wmt_cmd_sync); 156 157void btmtk_reset_sync(struct hci_dev *hdev); 158 159int btmtk_register_coredump(struct hci_dev *hdev, const char *name, 160 u32 fw_version); 161 162int btmtk_process_coredump(struct hci_dev *hdev, struct sk_buff *skb); 163#else 164 165static inline int btmtk_set_bdaddr(struct hci_dev *hdev, 166 const bdaddr_t *bdaddr) 167{ 168 return -EOPNOTSUPP; 169} 170 171static int btmtk_setup_firmware_79xx(struct hci_dev *hdev, const char *fwname, 172 wmt_cmd_sync_func_t wmt_cmd_sync) 173{ 174 return -EOPNOTSUPP; 175} 176 177static int btmtk_setup_firmware(struct hci_dev *hdev, const char *fwname, 178 wmt_cmd_sync_func_t wmt_cmd_sync) 179{ 180 return -EOPNOTSUPP; 181} 182 183static void btmtk_reset_sync(struct hci_dev *hdev) 184{ 185} 186 187static int btmtk_register_coredump(struct hci_dev *hdev, const char *name, 188 u32 fw_version) 189{ 190 return -EOPNOTSUPP; 191} 192 193static int btmtk_process_coredump(struct hci_dev *hdev, struct sk_buff *skb) 194{ 195 return -EOPNOTSUPP; 196} 197#endif 198