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