brintos

brintos / linux-shallow public Read only

0
0
Text · 6.3 KiB · 5df7c32 Raw
298 lines · c
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 0xe412#define HCI_WMT_MAX_EVENT_SIZE		6413 14#define BTMTK_WMT_REG_WRITE 0x115#define BTMTK_WMT_REG_READ 0x216 17#define MT7921_BTSYS_RST 0x7000261018#define MT7921_BTSYS_RST_WITH_GPIO BIT(7)19 20#define MT7921_PINMUX_0 0x7000505021#define MT7921_PINMUX_1 0x7000505422 23#define MT7921_DLSTATUS 0x7c053c1024#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		25530 31/* UHW CR mapping */32#define MTK_BT_MISC		0x7000251033#define MTK_BT_SUBSYS_RST	0x7000261034#define MTK_UDMA_INT_STA_BT	0x7400002435#define MTK_UDMA_INT_STA_BT1	0x7400030836#define MTK_BT_WDT_STATUS	0x740003A037#define MTK_EP_RST_OPT		0x7401189038#define MTK_EP_RST_IN_OUT_OPT	0x0001000139#define MTK_BT_RST_DONE		0x0000010040#define MTK_BT_RESET_REG_CONNV3	0x7002861041#define MTK_BT_READ_DEV_ID	0x7001020042 43/* MediaTek ISO Interface */44#define MTK_ISO_IFNUM		245 46enum {47	BTMTK_WMT_PATCH_DWNLD = 0x1,48	BTMTK_WMT_TEST = 0x2,49	BTMTK_WMT_WAKEUP = 0x3,50	BTMTK_WMT_HIF = 0x4,51	BTMTK_WMT_FUNC_CTRL = 0x6,52	BTMTK_WMT_RST = 0x7,53	BTMTK_WMT_REGISTER = 0x8,54	BTMTK_WMT_SEMAPHORE = 0x17,55};56 57enum {58	BTMTK_WMT_INVALID,59	BTMTK_WMT_PATCH_UNDONE,60	BTMTK_WMT_PATCH_PROGRESS,61	BTMTK_WMT_PATCH_DONE,62	BTMTK_WMT_ON_UNDONE,63	BTMTK_WMT_ON_DONE,64	BTMTK_WMT_ON_PROGRESS,65};66 67struct btmtk_wmt_hdr {68	u8	dir;69	u8	op;70	__le16	dlen;71	u8	flag;72} __packed;73 74struct btmtk_hci_wmt_cmd {75	struct btmtk_wmt_hdr hdr;76	u8 data[];77} __packed;78 79struct btmtk_hci_wmt_evt {80	struct hci_event_hdr hhdr;81	struct btmtk_wmt_hdr whdr;82} __packed;83 84struct btmtk_hci_wmt_evt_funcc {85	struct btmtk_hci_wmt_evt hwhdr;86	__be16 status;87} __packed;88 89struct btmtk_hci_wmt_evt_reg {90	struct btmtk_hci_wmt_evt hwhdr;91	u8 rsv[2];92	u8 num;93	__le32 addr;94	__le32 val;95} __packed;96 97struct btmtk_tci_sleep {98	u8 mode;99	__le16 duration;100	__le16 host_duration;101	u8 host_wakeup_pin;102	u8 time_compensation;103} __packed;104 105struct btmtk_wakeon {106	u8 mode;107	u8 gpo;108	u8 active_high;109	__le16 enable_delay;110	__le16 wakeup_delay;111} __packed;112 113struct btmtk_sco {114	u8 clock_config;115	u8 transmit_format_config;116	u8 channel_format_config;117	u8 channel_select_config;118} __packed;119 120struct reg_read_cmd {121	u8 type;122	u8 rsv;123	u8 num;124	__le32 addr;125} __packed;126 127struct reg_write_cmd {128	u8 type;129	u8 rsv;130	u8 num;131	__le32 addr;132	__le32 data;133	__le32 mask;134} __packed;135 136struct btmtk_hci_wmt_params {137	u8 op;138	u8 flag;139	u16 dlen;140	const void *data;141	u32 *status;142};143 144enum {145	BTMTK_TX_WAIT_VND_EVT,146	BTMTK_FIRMWARE_LOADED,147	BTMTK_HW_RESET_ACTIVE,148	BTMTK_ISOPKT_OVER_INTR,149	BTMTK_ISOPKT_RUNNING,150};151 152typedef int (*btmtk_reset_sync_func_t)(struct hci_dev *, void *);153 154struct btmtk_coredump_info {155	const char *driver_name;156	u32 fw_version;157	u16 cnt;158	int state;159};160 161struct btmtk_data {162	const char *drv_name;163	unsigned long flags;164	u32 dev_id;165	btmtk_reset_sync_func_t reset_sync;166	struct btmtk_coredump_info cd_info;167 168	struct usb_device *udev;169	struct usb_interface *intf;170	struct usb_anchor *ctrl_anchor;171	struct sk_buff *evt_skb;172	struct usb_endpoint_descriptor *isopkt_tx_ep;173	struct usb_endpoint_descriptor *isopkt_rx_ep;174	struct usb_interface *isopkt_intf;175	struct usb_anchor isopkt_anchor;176	struct sk_buff *isopkt_skb;177 178	/* spinlock for ISO data transmission */179	spinlock_t isorxlock;180};181 182typedef int (*wmt_cmd_sync_func_t)(struct hci_dev *,183				   struct btmtk_hci_wmt_params *);184 185#if IS_ENABLED(CONFIG_BT_MTK)186 187int btmtk_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr);188 189int btmtk_setup_firmware_79xx(struct hci_dev *hdev, const char *fwname,190			      wmt_cmd_sync_func_t wmt_cmd_sync);191 192int btmtk_setup_firmware(struct hci_dev *hdev, const char *fwname,193			 wmt_cmd_sync_func_t wmt_cmd_sync);194 195void btmtk_reset_sync(struct hci_dev *hdev);196 197int btmtk_register_coredump(struct hci_dev *hdev, const char *name,198			    u32 fw_version);199 200int btmtk_process_coredump(struct hci_dev *hdev, struct sk_buff *skb);201 202void btmtk_fw_get_filename(char *buf, size_t size, u32 dev_id, u32 fw_ver,203			   u32 fw_flavor);204 205int btmtk_usb_subsys_reset(struct hci_dev *hdev, u32 dev_id);206 207int btmtk_usb_recv_acl(struct hci_dev *hdev, struct sk_buff *skb);208 209struct urb *alloc_mtk_intr_urb(struct hci_dev *hdev, struct sk_buff *skb,210			       usb_complete_t tx_complete);211 212int btmtk_usb_resume(struct hci_dev *hdev);213 214int btmtk_usb_suspend(struct hci_dev *hdev);215 216int btmtk_usb_setup(struct hci_dev *hdev);217 218int btmtk_usb_shutdown(struct hci_dev *hdev);219#else220 221static inline int btmtk_set_bdaddr(struct hci_dev *hdev,222				   const bdaddr_t *bdaddr)223{224	return -EOPNOTSUPP;225}226 227static inline int btmtk_setup_firmware_79xx(struct hci_dev *hdev,228					    const char *fwname,229					    wmt_cmd_sync_func_t wmt_cmd_sync)230{231	return -EOPNOTSUPP;232}233 234static inline int btmtk_setup_firmware(struct hci_dev *hdev, const char *fwname,235				       wmt_cmd_sync_func_t wmt_cmd_sync)236{237	return -EOPNOTSUPP;238}239 240static inline void btmtk_reset_sync(struct hci_dev *hdev)241{242}243 244static inline int btmtk_register_coredump(struct hci_dev *hdev,245					  const char *name, u32 fw_version)246{247	return -EOPNOTSUPP;248}249 250static inline int btmtk_process_coredump(struct hci_dev *hdev,251					 struct sk_buff *skb)252{253	return -EOPNOTSUPP;254}255 256static inline void btmtk_fw_get_filename(char *buf, size_t size, u32 dev_id,257					 u32 fw_ver, u32 fw_flavor)258{259}260 261static inline int btmtk_usb_subsys_reset(struct hci_dev *hdev, u32 dev_id)262{263	return -EOPNOTSUPP;264}265 266static inline int btmtk_usb_recv_acl(struct hci_dev *hdev, struct sk_buff *skb)267{268	return -EOPNOTSUPP;269}270 271static inline struct urb *alloc_mtk_intr_urb(struct hci_dev *hdev,272					     struct sk_buff *skb,273					     usb_complete_t tx_complete)274{275	return ERR_PTR(-EOPNOTSUPP);276}277 278static inline int btmtk_usb_resume(struct hci_dev *hdev)279{280	return -EOPNOTSUPP;281}282 283static inline int btmtk_usb_suspend(struct hci_dev *hdev)284{285	return -EOPNOTSUPP;286}287 288static inline int btmtk_usb_setup(struct hci_dev *hdev)289{290	return -EOPNOTSUPP;291}292 293static inline int btmtk_usb_shutdown(struct hci_dev *hdev)294{295	return -EOPNOTSUPP;296}297#endif298