xref: /linux/drivers/bluetooth/btmtk.h (revision 3e465a07)
18c0d17b6SSean Wang /* SPDX-License-Identifier: ISC */
28c0d17b6SSean Wang /* Copyright (C) 2021 MediaTek Inc. */
38c0d17b6SSean Wang 
4f5c3f989SSean Wang #define FIRMWARE_MT7622		"mediatek/mt7622pr2h.bin"
58c0d17b6SSean Wang #define FIRMWARE_MT7663		"mediatek/mt7663pr2h.bin"
68c0d17b6SSean Wang #define FIRMWARE_MT7668		"mediatek/mt7668pr2h.bin"
7*3e465a07STakashi Iwai #define FIRMWARE_MT7922		"mediatek/BT_RAM_CODE_MT7922_1_1_hdr.bin"
88c0d17b6SSean Wang #define FIRMWARE_MT7961		"mediatek/BT_RAM_CODE_MT7961_1_2_hdr.bin"
94c92ae75SPeter Tsao #define FIRMWARE_MT7925		"mediatek/mt7925/BT_RAM_CODE_MT7925_1_1_hdr.bin"
108c0d17b6SSean Wang 
11e4412654SSean Wang #define HCI_EV_WMT 0xe4
128c0d17b6SSean Wang #define HCI_WMT_MAX_EVENT_SIZE		64
138c0d17b6SSean Wang 
14191c8723SMark Chen #define BTMTK_WMT_REG_WRITE 0x1
15c603bf1fSSean Wang #define BTMTK_WMT_REG_READ 0x2
16c603bf1fSSean Wang 
178fafe702SChih-Ying Chiang #define MT7921_BTSYS_RST 0x70002610
188fafe702SChih-Ying Chiang #define MT7921_BTSYS_RST_WITH_GPIO BIT(7)
198fafe702SChih-Ying Chiang 
20191c8723SMark Chen #define MT7921_PINMUX_0 0x70005050
21191c8723SMark Chen #define MT7921_PINMUX_1 0x70005054
22191c8723SMark Chen 
238fafe702SChih-Ying Chiang #define MT7921_DLSTATUS 0x7c053c10
248fafe702SChih-Ying Chiang #define BT_DL_STATE BIT(1)
258fafe702SChih-Ying Chiang 
260b701513SJing Cai #define MTK_COREDUMP_SIZE		(1024 * 1000)
270b701513SJing Cai #define MTK_COREDUMP_END		"coredump end"
280e72e3b1SChris Lu #define MTK_COREDUMP_END_LEN		(sizeof(MTK_COREDUMP_END))
290b701513SJing Cai #define MTK_COREDUMP_NUM		255
300b701513SJing Cai 
318c0d17b6SSean Wang enum {
328c0d17b6SSean Wang 	BTMTK_WMT_PATCH_DWNLD = 0x1,
333a722044SSean Wang 	BTMTK_WMT_TEST = 0x2,
343a722044SSean Wang 	BTMTK_WMT_WAKEUP = 0x3,
353a722044SSean Wang 	BTMTK_WMT_HIF = 0x4,
368c0d17b6SSean Wang 	BTMTK_WMT_FUNC_CTRL = 0x6,
378c0d17b6SSean Wang 	BTMTK_WMT_RST = 0x7,
38c603bf1fSSean Wang 	BTMTK_WMT_REGISTER = 0x8,
398c0d17b6SSean Wang 	BTMTK_WMT_SEMAPHORE = 0x17,
408c0d17b6SSean Wang };
418c0d17b6SSean Wang 
428c0d17b6SSean Wang enum {
438c0d17b6SSean Wang 	BTMTK_WMT_INVALID,
448c0d17b6SSean Wang 	BTMTK_WMT_PATCH_UNDONE,
458c0d17b6SSean Wang 	BTMTK_WMT_PATCH_PROGRESS,
468c0d17b6SSean Wang 	BTMTK_WMT_PATCH_DONE,
478c0d17b6SSean Wang 	BTMTK_WMT_ON_UNDONE,
488c0d17b6SSean Wang 	BTMTK_WMT_ON_DONE,
498c0d17b6SSean Wang 	BTMTK_WMT_ON_PROGRESS,
508c0d17b6SSean Wang };
518c0d17b6SSean Wang 
528c0d17b6SSean Wang struct btmtk_wmt_hdr {
538c0d17b6SSean Wang 	u8	dir;
548c0d17b6SSean Wang 	u8	op;
558c0d17b6SSean Wang 	__le16	dlen;
568c0d17b6SSean Wang 	u8	flag;
578c0d17b6SSean Wang } __packed;
588c0d17b6SSean Wang 
598c0d17b6SSean Wang struct btmtk_hci_wmt_cmd {
608c0d17b6SSean Wang 	struct btmtk_wmt_hdr hdr;
618c0d17b6SSean Wang 	u8 data[];
628c0d17b6SSean Wang } __packed;
638c0d17b6SSean Wang 
648c0d17b6SSean Wang struct btmtk_hci_wmt_evt {
658c0d17b6SSean Wang 	struct hci_event_hdr hhdr;
668c0d17b6SSean Wang 	struct btmtk_wmt_hdr whdr;
678c0d17b6SSean Wang } __packed;
688c0d17b6SSean Wang 
698c0d17b6SSean Wang struct btmtk_hci_wmt_evt_funcc {
708c0d17b6SSean Wang 	struct btmtk_hci_wmt_evt hwhdr;
718c0d17b6SSean Wang 	__be16 status;
728c0d17b6SSean Wang } __packed;
738c0d17b6SSean Wang 
74c603bf1fSSean Wang struct btmtk_hci_wmt_evt_reg {
75c603bf1fSSean Wang 	struct btmtk_hci_wmt_evt hwhdr;
76c603bf1fSSean Wang 	u8 rsv[2];
77c603bf1fSSean Wang 	u8 num;
78c603bf1fSSean Wang 	__le32 addr;
79c603bf1fSSean Wang 	__le32 val;
80c603bf1fSSean Wang } __packed;
81c603bf1fSSean Wang 
828c0d17b6SSean Wang struct btmtk_tci_sleep {
838c0d17b6SSean Wang 	u8 mode;
848c0d17b6SSean Wang 	__le16 duration;
858c0d17b6SSean Wang 	__le16 host_duration;
868c0d17b6SSean Wang 	u8 host_wakeup_pin;
878c0d17b6SSean Wang 	u8 time_compensation;
888c0d17b6SSean Wang } __packed;
898c0d17b6SSean Wang 
90ce64b3e9SMark Chen struct btmtk_wakeon {
91ce64b3e9SMark Chen 	u8 mode;
92ce64b3e9SMark Chen 	u8 gpo;
93ce64b3e9SMark Chen 	u8 active_high;
94ce64b3e9SMark Chen 	__le16 enable_delay;
95ce64b3e9SMark Chen 	__le16 wakeup_delay;
96ce64b3e9SMark Chen } __packed;
97ce64b3e9SMark Chen 
98191c8723SMark Chen struct btmtk_sco {
99191c8723SMark Chen 	u8 clock_config;
100191c8723SMark Chen 	u8 transmit_format_config;
101191c8723SMark Chen 	u8 channel_format_config;
102191c8723SMark Chen 	u8 channel_select_config;
103191c8723SMark Chen } __packed;
104191c8723SMark Chen 
1055677bcf6SSean Wang struct reg_read_cmd {
1065677bcf6SSean Wang 	u8 type;
1075677bcf6SSean Wang 	u8 rsv;
1085677bcf6SSean Wang 	u8 num;
1095677bcf6SSean Wang 	__le32 addr;
1105677bcf6SSean Wang } __packed;
1115677bcf6SSean Wang 
112191c8723SMark Chen struct reg_write_cmd {
113191c8723SMark Chen 	u8 type;
114191c8723SMark Chen 	u8 rsv;
115191c8723SMark Chen 	u8 num;
116191c8723SMark Chen 	__le32 addr;
117191c8723SMark Chen 	__le32 data;
118191c8723SMark Chen 	__le32 mask;
119191c8723SMark Chen } __packed;
120191c8723SMark Chen 
1218c0d17b6SSean Wang struct btmtk_hci_wmt_params {
1228c0d17b6SSean Wang 	u8 op;
1238c0d17b6SSean Wang 	u8 flag;
1248c0d17b6SSean Wang 	u16 dlen;
1258c0d17b6SSean Wang 	const void *data;
1268c0d17b6SSean Wang 	u32 *status;
1278c0d17b6SSean Wang };
1288c0d17b6SSean Wang 
12925b6d759SJing Cai typedef int (*btmtk_reset_sync_func_t)(struct hci_dev *, void *);
13025b6d759SJing Cai 
1310b701513SJing Cai struct btmtk_coredump_info {
1320b701513SJing Cai 	const char *driver_name;
1330b701513SJing Cai 	u32 fw_version;
1340b701513SJing Cai 	u16 cnt;
1350b701513SJing Cai 	int state;
1360b701513SJing Cai };
1370b701513SJing Cai 
1384c92ae75SPeter Tsao struct btmediatek_data {
1394c92ae75SPeter Tsao 	u32 dev_id;
14025b6d759SJing Cai 	btmtk_reset_sync_func_t reset_sync;
1410b701513SJing Cai 	struct btmtk_coredump_info cd_info;
1424c92ae75SPeter Tsao };
1434c92ae75SPeter Tsao 
1448c0d17b6SSean Wang typedef int (*wmt_cmd_sync_func_t)(struct hci_dev *,
1458c0d17b6SSean Wang 				   struct btmtk_hci_wmt_params *);
1468c0d17b6SSean Wang 
1478c0d17b6SSean Wang #if IS_ENABLED(CONFIG_BT_MTK)
1488c0d17b6SSean Wang 
1498c0d17b6SSean Wang int btmtk_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr);
1508c0d17b6SSean Wang 
1518c0d17b6SSean Wang int btmtk_setup_firmware_79xx(struct hci_dev *hdev, const char *fwname,
1528c0d17b6SSean Wang 			      wmt_cmd_sync_func_t wmt_cmd_sync);
1538c0d17b6SSean Wang 
1548c0d17b6SSean Wang int btmtk_setup_firmware(struct hci_dev *hdev, const char *fwname,
1558c0d17b6SSean Wang 			 wmt_cmd_sync_func_t wmt_cmd_sync);
15625b6d759SJing Cai 
15725b6d759SJing Cai void btmtk_reset_sync(struct hci_dev *hdev);
1580b701513SJing Cai 
1590b701513SJing Cai int btmtk_register_coredump(struct hci_dev *hdev, const char *name,
1600b701513SJing Cai 			    u32 fw_version);
1610b701513SJing Cai 
1620b701513SJing Cai int btmtk_process_coredump(struct hci_dev *hdev, struct sk_buff *skb);
1638c0d17b6SSean Wang #else
1648c0d17b6SSean Wang 
btmtk_set_bdaddr(struct hci_dev * hdev,const bdaddr_t * bdaddr)1658c0d17b6SSean Wang static inline int btmtk_set_bdaddr(struct hci_dev *hdev,
1668c0d17b6SSean Wang 				   const bdaddr_t *bdaddr)
1678c0d17b6SSean Wang {
1688c0d17b6SSean Wang 	return -EOPNOTSUPP;
1698c0d17b6SSean Wang }
1708c0d17b6SSean Wang 
btmtk_setup_firmware_79xx(struct hci_dev * hdev,const char * fwname,wmt_cmd_sync_func_t wmt_cmd_sync)1718c0d17b6SSean Wang static int btmtk_setup_firmware_79xx(struct hci_dev *hdev, const char *fwname,
1728c0d17b6SSean Wang 				     wmt_cmd_sync_func_t wmt_cmd_sync)
1738c0d17b6SSean Wang {
1748c0d17b6SSean Wang 	return -EOPNOTSUPP;
1758c0d17b6SSean Wang }
1768c0d17b6SSean Wang 
btmtk_setup_firmware(struct hci_dev * hdev,const char * fwname,wmt_cmd_sync_func_t wmt_cmd_sync)1778c0d17b6SSean Wang static int btmtk_setup_firmware(struct hci_dev *hdev, const char *fwname,
1788c0d17b6SSean Wang 				wmt_cmd_sync_func_t wmt_cmd_sync)
1798c0d17b6SSean Wang {
1808c0d17b6SSean Wang 	return -EOPNOTSUPP;
1818c0d17b6SSean Wang }
1828c0d17b6SSean Wang 
btmtk_reset_sync(struct hci_dev * hdev)18325b6d759SJing Cai static void btmtk_reset_sync(struct hci_dev *hdev)
18425b6d759SJing Cai {
18525b6d759SJing Cai }
1860b701513SJing Cai 
btmtk_register_coredump(struct hci_dev * hdev,const char * name,u32 fw_version)1870b701513SJing Cai static int btmtk_register_coredump(struct hci_dev *hdev, const char *name,
1880b701513SJing Cai 				   u32 fw_version)
1890b701513SJing Cai {
1900b701513SJing Cai 	return -EOPNOTSUPP;
1910b701513SJing Cai }
1920b701513SJing Cai 
btmtk_process_coredump(struct hci_dev * hdev,struct sk_buff * skb)1930b701513SJing Cai static int btmtk_process_coredump(struct hci_dev *hdev, struct sk_buff *skb)
1940b701513SJing Cai {
1950b701513SJing Cai 	return -EOPNOTSUPP;
1960b701513SJing Cai }
1978c0d17b6SSean Wang #endif
198