162306a36Sopenharmony_ci/* SPDX-License-Identifier: ISC */ 262306a36Sopenharmony_ci/* Copyright (C) 2021 MediaTek Inc. */ 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci#define FIRMWARE_MT7622 "mediatek/mt7622pr2h.bin" 562306a36Sopenharmony_ci#define FIRMWARE_MT7663 "mediatek/mt7663pr2h.bin" 662306a36Sopenharmony_ci#define FIRMWARE_MT7668 "mediatek/mt7668pr2h.bin" 762306a36Sopenharmony_ci#define FIRMWARE_MT7961 "mediatek/BT_RAM_CODE_MT7961_1_2_hdr.bin" 862306a36Sopenharmony_ci#define FIRMWARE_MT7925 "mediatek/mt7925/BT_RAM_CODE_MT7925_1_1_hdr.bin" 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#define HCI_EV_WMT 0xe4 1162306a36Sopenharmony_ci#define HCI_WMT_MAX_EVENT_SIZE 64 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#define BTMTK_WMT_REG_WRITE 0x1 1462306a36Sopenharmony_ci#define BTMTK_WMT_REG_READ 0x2 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#define MT7921_BTSYS_RST 0x70002610 1762306a36Sopenharmony_ci#define MT7921_BTSYS_RST_WITH_GPIO BIT(7) 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci#define MT7921_PINMUX_0 0x70005050 2062306a36Sopenharmony_ci#define MT7921_PINMUX_1 0x70005054 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci#define MT7921_DLSTATUS 0x7c053c10 2362306a36Sopenharmony_ci#define BT_DL_STATE BIT(1) 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci#define MTK_COREDUMP_SIZE (1024 * 1000) 2662306a36Sopenharmony_ci#define MTK_COREDUMP_END "coredump end" 2762306a36Sopenharmony_ci#define MTK_COREDUMP_END_LEN (sizeof(MTK_COREDUMP_END)) 2862306a36Sopenharmony_ci#define MTK_COREDUMP_NUM 255 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_cienum { 3162306a36Sopenharmony_ci BTMTK_WMT_PATCH_DWNLD = 0x1, 3262306a36Sopenharmony_ci BTMTK_WMT_TEST = 0x2, 3362306a36Sopenharmony_ci BTMTK_WMT_WAKEUP = 0x3, 3462306a36Sopenharmony_ci BTMTK_WMT_HIF = 0x4, 3562306a36Sopenharmony_ci BTMTK_WMT_FUNC_CTRL = 0x6, 3662306a36Sopenharmony_ci BTMTK_WMT_RST = 0x7, 3762306a36Sopenharmony_ci BTMTK_WMT_REGISTER = 0x8, 3862306a36Sopenharmony_ci BTMTK_WMT_SEMAPHORE = 0x17, 3962306a36Sopenharmony_ci}; 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_cienum { 4262306a36Sopenharmony_ci BTMTK_WMT_INVALID, 4362306a36Sopenharmony_ci BTMTK_WMT_PATCH_UNDONE, 4462306a36Sopenharmony_ci BTMTK_WMT_PATCH_PROGRESS, 4562306a36Sopenharmony_ci BTMTK_WMT_PATCH_DONE, 4662306a36Sopenharmony_ci BTMTK_WMT_ON_UNDONE, 4762306a36Sopenharmony_ci BTMTK_WMT_ON_DONE, 4862306a36Sopenharmony_ci BTMTK_WMT_ON_PROGRESS, 4962306a36Sopenharmony_ci}; 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_cistruct btmtk_wmt_hdr { 5262306a36Sopenharmony_ci u8 dir; 5362306a36Sopenharmony_ci u8 op; 5462306a36Sopenharmony_ci __le16 dlen; 5562306a36Sopenharmony_ci u8 flag; 5662306a36Sopenharmony_ci} __packed; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_cistruct btmtk_hci_wmt_cmd { 5962306a36Sopenharmony_ci struct btmtk_wmt_hdr hdr; 6062306a36Sopenharmony_ci u8 data[]; 6162306a36Sopenharmony_ci} __packed; 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_cistruct btmtk_hci_wmt_evt { 6462306a36Sopenharmony_ci struct hci_event_hdr hhdr; 6562306a36Sopenharmony_ci struct btmtk_wmt_hdr whdr; 6662306a36Sopenharmony_ci} __packed; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_cistruct btmtk_hci_wmt_evt_funcc { 6962306a36Sopenharmony_ci struct btmtk_hci_wmt_evt hwhdr; 7062306a36Sopenharmony_ci __be16 status; 7162306a36Sopenharmony_ci} __packed; 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_cistruct btmtk_hci_wmt_evt_reg { 7462306a36Sopenharmony_ci struct btmtk_hci_wmt_evt hwhdr; 7562306a36Sopenharmony_ci u8 rsv[2]; 7662306a36Sopenharmony_ci u8 num; 7762306a36Sopenharmony_ci __le32 addr; 7862306a36Sopenharmony_ci __le32 val; 7962306a36Sopenharmony_ci} __packed; 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_cistruct btmtk_tci_sleep { 8262306a36Sopenharmony_ci u8 mode; 8362306a36Sopenharmony_ci __le16 duration; 8462306a36Sopenharmony_ci __le16 host_duration; 8562306a36Sopenharmony_ci u8 host_wakeup_pin; 8662306a36Sopenharmony_ci u8 time_compensation; 8762306a36Sopenharmony_ci} __packed; 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_cistruct btmtk_wakeon { 9062306a36Sopenharmony_ci u8 mode; 9162306a36Sopenharmony_ci u8 gpo; 9262306a36Sopenharmony_ci u8 active_high; 9362306a36Sopenharmony_ci __le16 enable_delay; 9462306a36Sopenharmony_ci __le16 wakeup_delay; 9562306a36Sopenharmony_ci} __packed; 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_cistruct btmtk_sco { 9862306a36Sopenharmony_ci u8 clock_config; 9962306a36Sopenharmony_ci u8 transmit_format_config; 10062306a36Sopenharmony_ci u8 channel_format_config; 10162306a36Sopenharmony_ci u8 channel_select_config; 10262306a36Sopenharmony_ci} __packed; 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_cistruct reg_read_cmd { 10562306a36Sopenharmony_ci u8 type; 10662306a36Sopenharmony_ci u8 rsv; 10762306a36Sopenharmony_ci u8 num; 10862306a36Sopenharmony_ci __le32 addr; 10962306a36Sopenharmony_ci} __packed; 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_cistruct reg_write_cmd { 11262306a36Sopenharmony_ci u8 type; 11362306a36Sopenharmony_ci u8 rsv; 11462306a36Sopenharmony_ci u8 num; 11562306a36Sopenharmony_ci __le32 addr; 11662306a36Sopenharmony_ci __le32 data; 11762306a36Sopenharmony_ci __le32 mask; 11862306a36Sopenharmony_ci} __packed; 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_cistruct btmtk_hci_wmt_params { 12162306a36Sopenharmony_ci u8 op; 12262306a36Sopenharmony_ci u8 flag; 12362306a36Sopenharmony_ci u16 dlen; 12462306a36Sopenharmony_ci const void *data; 12562306a36Sopenharmony_ci u32 *status; 12662306a36Sopenharmony_ci}; 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_citypedef int (*btmtk_reset_sync_func_t)(struct hci_dev *, void *); 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_cistruct btmtk_coredump_info { 13162306a36Sopenharmony_ci const char *driver_name; 13262306a36Sopenharmony_ci u32 fw_version; 13362306a36Sopenharmony_ci u16 cnt; 13462306a36Sopenharmony_ci int state; 13562306a36Sopenharmony_ci}; 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_cistruct btmediatek_data { 13862306a36Sopenharmony_ci u32 dev_id; 13962306a36Sopenharmony_ci btmtk_reset_sync_func_t reset_sync; 14062306a36Sopenharmony_ci struct btmtk_coredump_info cd_info; 14162306a36Sopenharmony_ci}; 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_citypedef int (*wmt_cmd_sync_func_t)(struct hci_dev *, 14462306a36Sopenharmony_ci struct btmtk_hci_wmt_params *); 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_BT_MTK) 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ciint btmtk_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr); 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ciint btmtk_setup_firmware_79xx(struct hci_dev *hdev, const char *fwname, 15162306a36Sopenharmony_ci wmt_cmd_sync_func_t wmt_cmd_sync); 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ciint btmtk_setup_firmware(struct hci_dev *hdev, const char *fwname, 15462306a36Sopenharmony_ci wmt_cmd_sync_func_t wmt_cmd_sync); 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_civoid btmtk_reset_sync(struct hci_dev *hdev); 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_ciint btmtk_register_coredump(struct hci_dev *hdev, const char *name, 15962306a36Sopenharmony_ci u32 fw_version); 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ciint btmtk_process_coredump(struct hci_dev *hdev, struct sk_buff *skb); 16262306a36Sopenharmony_ci#else 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_cistatic inline int btmtk_set_bdaddr(struct hci_dev *hdev, 16562306a36Sopenharmony_ci const bdaddr_t *bdaddr) 16662306a36Sopenharmony_ci{ 16762306a36Sopenharmony_ci return -EOPNOTSUPP; 16862306a36Sopenharmony_ci} 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_cistatic int btmtk_setup_firmware_79xx(struct hci_dev *hdev, const char *fwname, 17162306a36Sopenharmony_ci wmt_cmd_sync_func_t wmt_cmd_sync) 17262306a36Sopenharmony_ci{ 17362306a36Sopenharmony_ci return -EOPNOTSUPP; 17462306a36Sopenharmony_ci} 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_cistatic int btmtk_setup_firmware(struct hci_dev *hdev, const char *fwname, 17762306a36Sopenharmony_ci wmt_cmd_sync_func_t wmt_cmd_sync) 17862306a36Sopenharmony_ci{ 17962306a36Sopenharmony_ci return -EOPNOTSUPP; 18062306a36Sopenharmony_ci} 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_cistatic void btmtk_reset_sync(struct hci_dev *hdev) 18362306a36Sopenharmony_ci{ 18462306a36Sopenharmony_ci} 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_cistatic int btmtk_register_coredump(struct hci_dev *hdev, const char *name, 18762306a36Sopenharmony_ci u32 fw_version) 18862306a36Sopenharmony_ci{ 18962306a36Sopenharmony_ci return -EOPNOTSUPP; 19062306a36Sopenharmony_ci} 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_cistatic int btmtk_process_coredump(struct hci_dev *hdev, struct sk_buff *skb) 19362306a36Sopenharmony_ci{ 19462306a36Sopenharmony_ci return -EOPNOTSUPP; 19562306a36Sopenharmony_ci} 19662306a36Sopenharmony_ci#endif 197