xref: /linux/sound/soc/mediatek/common/mtk-btcvsd.c (revision 55d0969c451159cff86949b38c39171cab962069)
1 // SPDX-License-Identifier: GPL-2.0
2 //
3 // Mediatek ALSA BT SCO CVSD/MSBC Driver
4 //
5 // Copyright (c) 2019 MediaTek Inc.
6 // Author: KaiChieh Chuang <kaichieh.chuang@mediatek.com>
7 
8 #include <linux/mfd/syscon.h>
9 #include <linux/module.h>
10 #include <linux/of_address.h>
11 #include <linux/sched/clock.h>
12 
13 #include <sound/soc.h>
14 
15 #define BTCVSD_SND_NAME "mtk-btcvsd-snd"
16 
17 #define BT_CVSD_TX_NREADY	BIT(21)
18 #define BT_CVSD_RX_READY	BIT(22)
19 #define BT_CVSD_TX_UNDERFLOW	BIT(23)
20 #define BT_CVSD_RX_OVERFLOW	BIT(24)
21 #define BT_CVSD_INTERRUPT	BIT(31)
22 
23 #define BT_CVSD_CLEAR \
24 	(BT_CVSD_TX_NREADY | BT_CVSD_RX_READY | BT_CVSD_TX_UNDERFLOW |\
25 	 BT_CVSD_RX_OVERFLOW | BT_CVSD_INTERRUPT)
26 
27 /* TX */
28 #define SCO_TX_ENCODE_SIZE (60)
29 /* 18 = 6 * 180 / SCO_TX_ENCODE_SIZE */
30 #define SCO_TX_PACKER_BUF_NUM (18)
31 
32 /* RX */
33 #define SCO_RX_PLC_SIZE (30)
34 #define SCO_RX_PACKER_BUF_NUM (64)
35 #define SCO_RX_PACKET_MASK (0x3F)
36 
37 #define SCO_CVSD_PACKET_VALID_SIZE 2
38 
39 #define SCO_PACKET_120 120
40 #define SCO_PACKET_180 180
41 
42 #define BTCVSD_RX_PACKET_SIZE (SCO_RX_PLC_SIZE + SCO_CVSD_PACKET_VALID_SIZE)
43 #define BTCVSD_TX_PACKET_SIZE (SCO_TX_ENCODE_SIZE)
44 
45 #define BTCVSD_RX_BUF_SIZE (BTCVSD_RX_PACKET_SIZE * SCO_RX_PACKER_BUF_NUM)
46 #define BTCVSD_TX_BUF_SIZE (BTCVSD_TX_PACKET_SIZE * SCO_TX_PACKER_BUF_NUM)
47 
48 enum bt_sco_state {
49 	BT_SCO_STATE_IDLE,
50 	BT_SCO_STATE_RUNNING,
51 	BT_SCO_STATE_ENDING,
52 	BT_SCO_STATE_LOOPBACK,
53 };
54 
55 enum bt_sco_direct {
56 	BT_SCO_DIRECT_BT2ARM,
57 	BT_SCO_DIRECT_ARM2BT,
58 };
59 
60 enum bt_sco_packet_len {
61 	BT_SCO_CVSD_30 = 0,
62 	BT_SCO_CVSD_60,
63 	BT_SCO_CVSD_90,
64 	BT_SCO_CVSD_120,
65 	BT_SCO_CVSD_10,
66 	BT_SCO_CVSD_20,
67 	BT_SCO_CVSD_MAX,
68 };
69 
70 enum BT_SCO_BAND {
71 	BT_SCO_NB,
72 	BT_SCO_WB,
73 };
74 
75 struct mtk_btcvsd_snd_hw_info {
76 	unsigned int num_valid_addr;
77 	unsigned long bt_sram_addr[20];
78 	unsigned int packet_length;
79 	unsigned int packet_num;
80 };
81 
82 struct mtk_btcvsd_snd_stream {
83 	struct snd_pcm_substream *substream;
84 	int stream;
85 
86 	enum bt_sco_state state;
87 
88 	unsigned int packet_size;
89 	unsigned int buf_size;
90 	u8 temp_packet_buf[SCO_PACKET_180];
91 
92 	int packet_w;
93 	int packet_r;
94 	snd_pcm_uframes_t prev_frame;
95 	int prev_packet_idx;
96 
97 	unsigned int xrun:1;
98 	unsigned int timeout:1;
99 	unsigned int mute:1;
100 	unsigned int trigger_start:1;
101 	unsigned int wait_flag:1;
102 	unsigned int rw_cnt;
103 
104 	unsigned long long time_stamp;
105 	unsigned long long buf_data_equivalent_time;
106 
107 	struct mtk_btcvsd_snd_hw_info buffer_info;
108 };
109 
110 struct mtk_btcvsd_snd {
111 	struct device *dev;
112 	int irq_id;
113 
114 	struct regmap *infra;
115 	void __iomem *bt_pkv_base;
116 	void __iomem *bt_sram_bank2_base;
117 
118 	unsigned int infra_misc_offset;
119 	unsigned int conn_bt_cvsd_mask;
120 	unsigned int cvsd_mcu_read_offset;
121 	unsigned int cvsd_mcu_write_offset;
122 	unsigned int cvsd_packet_indicator;
123 
124 	u32 *bt_reg_pkt_r;
125 	u32 *bt_reg_pkt_w;
126 	u32 *bt_reg_ctl;
127 
128 	unsigned int irq_disabled:1;
129 
130 	spinlock_t tx_lock;	/* spinlock for bt tx stream control */
131 	spinlock_t rx_lock;	/* spinlock for bt rx stream control */
132 	wait_queue_head_t tx_wait;
133 	wait_queue_head_t rx_wait;
134 
135 	struct mtk_btcvsd_snd_stream *tx;
136 	struct mtk_btcvsd_snd_stream *rx;
137 	u8 tx_packet_buf[BTCVSD_TX_BUF_SIZE];
138 	u8 rx_packet_buf[BTCVSD_RX_BUF_SIZE];
139 
140 	enum BT_SCO_BAND band;
141 };
142 
143 struct mtk_btcvsd_snd_time_buffer_info {
144 	unsigned long long data_count_equi_time;
145 	unsigned long long time_stamp_us;
146 };
147 
148 static const unsigned int btsco_packet_valid_mask[BT_SCO_CVSD_MAX][6] = {
149 	{0x1, 0x1 << 1, 0x1 << 2, 0x1 << 3, 0x1 << 4, 0x1 << 5},
150 	{0x1, 0x1, 0x2, 0x2, 0x4, 0x4},
151 	{0x1, 0x1, 0x1, 0x2, 0x2, 0x2},
152 	{0x1, 0x1, 0x1, 0x1, 0x0, 0x0},
153 	{0x7, 0x7 << 3, 0x7 << 6, 0x7 << 9, 0x7 << 12, 0x7 << 15},
154 	{0x3, 0x3 << 1, 0x3 << 3, 0x3 << 4, 0x3 << 6, 0x3 << 7},
155 };
156 
157 static const unsigned int btsco_packet_info[BT_SCO_CVSD_MAX][4] = {
158 	{30, 6, SCO_PACKET_180 / SCO_TX_ENCODE_SIZE,
159 	 SCO_PACKET_180 / SCO_RX_PLC_SIZE},
160 	{60, 3, SCO_PACKET_180 / SCO_TX_ENCODE_SIZE,
161 	 SCO_PACKET_180 / SCO_RX_PLC_SIZE},
162 	{90, 2, SCO_PACKET_180 / SCO_TX_ENCODE_SIZE,
163 	 SCO_PACKET_180 / SCO_RX_PLC_SIZE},
164 	{120, 1, SCO_PACKET_120 / SCO_TX_ENCODE_SIZE,
165 	 SCO_PACKET_120 / SCO_RX_PLC_SIZE},
166 	{10, 18, SCO_PACKET_180 / SCO_TX_ENCODE_SIZE,
167 	 SCO_PACKET_180 / SCO_RX_PLC_SIZE},
168 	{20, 9, SCO_PACKET_180 / SCO_TX_ENCODE_SIZE,
169 	 SCO_PACKET_180 / SCO_RX_PLC_SIZE},
170 };
171 
172 static const u8 table_msbc_silence[SCO_PACKET_180] = {
173 	0x01, 0x38, 0xad, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, 0x00,
174 	0x77, 0x6d, 0xb6, 0xdd, 0xdb, 0x6d, 0xb7, 0x76, 0xdb, 0x6d,
175 	0xdd, 0xb6, 0xdb, 0x77, 0x6d, 0xb6, 0xdd, 0xdb, 0x6d, 0xb7,
176 	0x76, 0xdb, 0x6d, 0xdd, 0xb6, 0xdb, 0x77, 0x6d, 0xb6, 0xdd,
177 	0xdb, 0x6d, 0xb7, 0x76, 0xdb, 0x6d, 0xdd, 0xb6, 0xdb, 0x77,
178 	0x6d, 0xb6, 0xdd, 0xdb, 0x6d, 0xb7, 0x76, 0xdb, 0x6c, 0x00,
179 	0x01, 0xc8, 0xad, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, 0x00,
180 	0x77, 0x6d, 0xb6, 0xdd, 0xdb, 0x6d, 0xb7, 0x76, 0xdb, 0x6d,
181 	0xdd, 0xb6, 0xdb, 0x77, 0x6d, 0xb6, 0xdd, 0xdb, 0x6d, 0xb7,
182 	0x76, 0xdb, 0x6d, 0xdd, 0xb6, 0xdb, 0x77, 0x6d, 0xb6, 0xdd,
183 	0xdb, 0x6d, 0xb7, 0x76, 0xdb, 0x6d, 0xdd, 0xb6, 0xdb, 0x77,
184 	0x6d, 0xb6, 0xdd, 0xdb, 0x6d, 0xb7, 0x76, 0xdb, 0x6c, 0x00,
185 	0x01, 0xf8, 0xad, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, 0x00,
186 	0x77, 0x6d, 0xb6, 0xdd, 0xdb, 0x6d, 0xb7, 0x76, 0xdb, 0x6d,
187 	0xdd, 0xb6, 0xdb, 0x77, 0x6d, 0xb6, 0xdd, 0xdb, 0x6d, 0xb7,
188 	0x76, 0xdb, 0x6d, 0xdd, 0xb6, 0xdb, 0x77, 0x6d, 0xb6, 0xdd,
189 	0xdb, 0x6d, 0xb7, 0x76, 0xdb, 0x6d, 0xdd, 0xb6, 0xdb, 0x77,
190 	0x6d, 0xb6, 0xdd, 0xdb, 0x6d, 0xb7, 0x76, 0xdb, 0x6c, 0x00
191 };
192 
193 static void mtk_btcvsd_snd_irq_enable(struct mtk_btcvsd_snd *bt)
194 {
195 	regmap_update_bits(bt->infra, bt->infra_misc_offset,
196 			   bt->conn_bt_cvsd_mask, 0);
197 }
198 
199 static void mtk_btcvsd_snd_irq_disable(struct mtk_btcvsd_snd *bt)
200 {
201 	regmap_update_bits(bt->infra, bt->infra_misc_offset,
202 			   bt->conn_bt_cvsd_mask, bt->conn_bt_cvsd_mask);
203 }
204 
205 static void mtk_btcvsd_snd_set_state(struct mtk_btcvsd_snd *bt,
206 				     struct mtk_btcvsd_snd_stream *bt_stream,
207 				     int state)
208 {
209 	dev_dbg(bt->dev, "%s(), stream %d, state %d, tx->state %d, rx->state %d, irq_disabled %d\n",
210 		__func__,
211 		bt_stream->stream, state,
212 		bt->tx->state, bt->rx->state, bt->irq_disabled);
213 
214 	bt_stream->state = state;
215 
216 	if (bt->tx->state == BT_SCO_STATE_IDLE &&
217 	    bt->rx->state == BT_SCO_STATE_IDLE) {
218 		if (!bt->irq_disabled) {
219 			disable_irq(bt->irq_id);
220 			mtk_btcvsd_snd_irq_disable(bt);
221 			bt->irq_disabled = 1;
222 		}
223 	} else {
224 		if (bt->irq_disabled) {
225 			enable_irq(bt->irq_id);
226 			mtk_btcvsd_snd_irq_enable(bt);
227 			bt->irq_disabled = 0;
228 		}
229 	}
230 }
231 
232 static int mtk_btcvsd_snd_tx_init(struct mtk_btcvsd_snd *bt)
233 {
234 	memset(bt->tx, 0, sizeof(*bt->tx));
235 	memset(bt->tx_packet_buf, 0, sizeof(bt->tx_packet_buf));
236 
237 	bt->tx->packet_size = BTCVSD_TX_PACKET_SIZE;
238 	bt->tx->buf_size = BTCVSD_TX_BUF_SIZE;
239 	bt->tx->timeout = 0;
240 	bt->tx->rw_cnt = 0;
241 	bt->tx->stream = SNDRV_PCM_STREAM_PLAYBACK;
242 	return 0;
243 }
244 
245 static int mtk_btcvsd_snd_rx_init(struct mtk_btcvsd_snd *bt)
246 {
247 	memset(bt->rx, 0, sizeof(*bt->rx));
248 	memset(bt->rx_packet_buf, 0, sizeof(bt->rx_packet_buf));
249 
250 	bt->rx->packet_size = BTCVSD_RX_PACKET_SIZE;
251 	bt->rx->buf_size = BTCVSD_RX_BUF_SIZE;
252 	bt->rx->timeout = 0;
253 	bt->rx->rw_cnt = 0;
254 	bt->rx->stream = SNDRV_PCM_STREAM_CAPTURE;
255 	return 0;
256 }
257 
258 static void get_tx_time_stamp(struct mtk_btcvsd_snd *bt,
259 			      struct mtk_btcvsd_snd_time_buffer_info *ts)
260 {
261 	ts->time_stamp_us = bt->tx->time_stamp;
262 	ts->data_count_equi_time = bt->tx->buf_data_equivalent_time;
263 }
264 
265 static void get_rx_time_stamp(struct mtk_btcvsd_snd *bt,
266 			      struct mtk_btcvsd_snd_time_buffer_info *ts)
267 {
268 	ts->time_stamp_us = bt->rx->time_stamp;
269 	ts->data_count_equi_time = bt->rx->buf_data_equivalent_time;
270 }
271 
272 static int btcvsd_bytes_to_frame(struct snd_pcm_substream *substream,
273 				 int bytes)
274 {
275 	int count = bytes;
276 	struct snd_pcm_runtime *runtime = substream->runtime;
277 
278 	if (runtime->format == SNDRV_PCM_FORMAT_S32_LE ||
279 	    runtime->format == SNDRV_PCM_FORMAT_U32_LE)
280 		count = count >> 2;
281 	else
282 		count = count >> 1;
283 
284 	count = count / runtime->channels;
285 	return count;
286 }
287 
288 static void mtk_btcvsd_snd_data_transfer(enum bt_sco_direct dir,
289 					 u8 *src, u8 *dst,
290 					 unsigned int blk_size,
291 					 unsigned int blk_num)
292 {
293 	unsigned int i, j;
294 
295 	if (blk_size == 60 || blk_size == 120 || blk_size == 20) {
296 		u32 *src_32 = (u32 *)src;
297 		u32 *dst_32 = (u32 *)dst;
298 
299 		for (i = 0; i < (blk_size * blk_num / 4); i++)
300 			*dst_32++ = *src_32++;
301 	} else {
302 		u16 *src_16 = (u16 *)src;
303 		u16 *dst_16 = (u16 *)dst;
304 
305 		for (j = 0; j < blk_num; j++) {
306 			for (i = 0; i < (blk_size / 2); i++)
307 				*dst_16++ = *src_16++;
308 
309 			if (dir == BT_SCO_DIRECT_BT2ARM)
310 				src_16++;
311 			else
312 				dst_16++;
313 		}
314 	}
315 }
316 
317 /* write encoded mute data to bt sram */
318 static int btcvsd_tx_clean_buffer(struct mtk_btcvsd_snd *bt)
319 {
320 	unsigned int i;
321 	unsigned int num_valid_addr;
322 	unsigned long flags;
323 	enum BT_SCO_BAND band = bt->band;
324 
325 	/* prepare encoded mute data */
326 	if (band == BT_SCO_NB)
327 		memset(bt->tx->temp_packet_buf, 170, SCO_PACKET_180);
328 	else
329 		memcpy(bt->tx->temp_packet_buf,
330 		       table_msbc_silence, SCO_PACKET_180);
331 
332 	/* write mute data to bt tx sram buffer */
333 	spin_lock_irqsave(&bt->tx_lock, flags);
334 	num_valid_addr = bt->tx->buffer_info.num_valid_addr;
335 
336 	dev_info(bt->dev, "%s(), band %d, num_valid_addr %u\n",
337 		 __func__, band, num_valid_addr);
338 
339 	for (i = 0; i < num_valid_addr; i++) {
340 		void *dst;
341 
342 		dev_info(bt->dev, "%s(), clean addr 0x%lx\n", __func__,
343 			 bt->tx->buffer_info.bt_sram_addr[i]);
344 
345 		dst = (void *)bt->tx->buffer_info.bt_sram_addr[i];
346 
347 		mtk_btcvsd_snd_data_transfer(BT_SCO_DIRECT_ARM2BT,
348 					     bt->tx->temp_packet_buf, dst,
349 					     bt->tx->buffer_info.packet_length,
350 					     bt->tx->buffer_info.packet_num);
351 	}
352 	spin_unlock_irqrestore(&bt->tx_lock, flags);
353 
354 	return 0;
355 }
356 
357 static int mtk_btcvsd_read_from_bt(struct mtk_btcvsd_snd *bt,
358 				   enum bt_sco_packet_len packet_type,
359 				   unsigned int packet_length,
360 				   unsigned int packet_num,
361 				   unsigned int blk_size,
362 				   unsigned int control)
363 {
364 	unsigned int i;
365 	int pv;
366 	u8 *src;
367 	unsigned int packet_buf_ofs;
368 	unsigned long flags;
369 	unsigned long connsys_addr_rx, ap_addr_rx;
370 
371 	connsys_addr_rx = *bt->bt_reg_pkt_r;
372 	ap_addr_rx = (unsigned long)bt->bt_sram_bank2_base +
373 		     (connsys_addr_rx & 0xFFFF);
374 
375 	if (connsys_addr_rx == 0xdeadfeed) {
376 		/* bt return 0xdeadfeed if read register during bt sleep */
377 		dev_warn(bt->dev, "%s(), connsys_addr_rx == 0xdeadfeed",
378 			 __func__);
379 		return -EIO;
380 	}
381 
382 	src = (u8 *)ap_addr_rx;
383 
384 	mtk_btcvsd_snd_data_transfer(BT_SCO_DIRECT_BT2ARM, src,
385 				     bt->rx->temp_packet_buf, packet_length,
386 				     packet_num);
387 
388 	spin_lock_irqsave(&bt->rx_lock, flags);
389 	for (i = 0; i < blk_size; i++) {
390 		packet_buf_ofs = (bt->rx->packet_w & SCO_RX_PACKET_MASK) *
391 				 bt->rx->packet_size;
392 		memcpy(bt->rx_packet_buf + packet_buf_ofs,
393 		       bt->rx->temp_packet_buf + (SCO_RX_PLC_SIZE * i),
394 		       SCO_RX_PLC_SIZE);
395 		if ((control & btsco_packet_valid_mask[packet_type][i]) ==
396 		    btsco_packet_valid_mask[packet_type][i])
397 			pv = 1;
398 		else
399 			pv = 0;
400 
401 		packet_buf_ofs += SCO_RX_PLC_SIZE;
402 		memcpy(bt->rx_packet_buf + packet_buf_ofs, (void *)&pv,
403 		       SCO_CVSD_PACKET_VALID_SIZE);
404 		bt->rx->packet_w++;
405 	}
406 	spin_unlock_irqrestore(&bt->rx_lock, flags);
407 	return 0;
408 }
409 
410 static int mtk_btcvsd_write_to_bt(struct mtk_btcvsd_snd *bt,
411 				  enum bt_sco_packet_len packet_type,
412 				  unsigned int packet_length,
413 				  unsigned int packet_num,
414 				  unsigned int blk_size)
415 {
416 	unsigned int i;
417 	unsigned long flags;
418 	u8 *dst;
419 	unsigned long connsys_addr_tx, ap_addr_tx;
420 	bool new_ap_addr_tx = true;
421 
422 	connsys_addr_tx = *bt->bt_reg_pkt_w;
423 	ap_addr_tx = (unsigned long)bt->bt_sram_bank2_base +
424 		     (connsys_addr_tx & 0xFFFF);
425 
426 	if (connsys_addr_tx == 0xdeadfeed) {
427 		/* bt return 0xdeadfeed if read register during bt sleep */
428 		dev_warn(bt->dev, "%s(), connsys_addr_tx == 0xdeadfeed\n",
429 			 __func__);
430 		return -EIO;
431 	}
432 
433 	spin_lock_irqsave(&bt->tx_lock, flags);
434 	for (i = 0; i < blk_size; i++) {
435 		memcpy(bt->tx->temp_packet_buf + (bt->tx->packet_size * i),
436 		       (bt->tx_packet_buf +
437 			(bt->tx->packet_r % SCO_TX_PACKER_BUF_NUM) *
438 			bt->tx->packet_size),
439 		       bt->tx->packet_size);
440 
441 		bt->tx->packet_r++;
442 	}
443 	spin_unlock_irqrestore(&bt->tx_lock, flags);
444 
445 	dst = (u8 *)ap_addr_tx;
446 
447 	if (!bt->tx->mute) {
448 		mtk_btcvsd_snd_data_transfer(BT_SCO_DIRECT_ARM2BT,
449 					     bt->tx->temp_packet_buf, dst,
450 					     packet_length, packet_num);
451 	}
452 
453 	/* store bt tx buffer sram info */
454 	bt->tx->buffer_info.packet_length = packet_length;
455 	bt->tx->buffer_info.packet_num = packet_num;
456 	for (i = 0; i < bt->tx->buffer_info.num_valid_addr; i++) {
457 		if (bt->tx->buffer_info.bt_sram_addr[i] == ap_addr_tx) {
458 			new_ap_addr_tx = false;
459 			break;
460 		}
461 	}
462 	if (new_ap_addr_tx) {
463 		unsigned int next_idx;
464 
465 		spin_lock_irqsave(&bt->tx_lock, flags);
466 		bt->tx->buffer_info.num_valid_addr++;
467 		next_idx = bt->tx->buffer_info.num_valid_addr - 1;
468 		bt->tx->buffer_info.bt_sram_addr[next_idx] = ap_addr_tx;
469 		spin_unlock_irqrestore(&bt->tx_lock, flags);
470 		dev_info(bt->dev, "%s(), new ap_addr_tx = 0x%lx, num_valid_addr %d\n",
471 			 __func__, ap_addr_tx,
472 			 bt->tx->buffer_info.num_valid_addr);
473 	}
474 
475 	if (bt->tx->mute)
476 		btcvsd_tx_clean_buffer(bt);
477 
478 	return 0;
479 }
480 
481 static irqreturn_t mtk_btcvsd_snd_irq_handler(int irq_id, void *dev)
482 {
483 	struct mtk_btcvsd_snd *bt = dev;
484 	unsigned int packet_type, packet_num, packet_length;
485 	unsigned int buf_cnt_tx, buf_cnt_rx, control;
486 
487 	if (bt->rx->state != BT_SCO_STATE_RUNNING &&
488 	    bt->rx->state != BT_SCO_STATE_ENDING &&
489 	    bt->tx->state != BT_SCO_STATE_RUNNING &&
490 	    bt->tx->state != BT_SCO_STATE_ENDING &&
491 	    bt->tx->state != BT_SCO_STATE_LOOPBACK) {
492 		dev_warn(bt->dev, "%s(), in idle state: rx->state: %d, tx->state: %d\n",
493 			 __func__, bt->rx->state, bt->tx->state);
494 		goto irq_handler_exit;
495 	}
496 
497 	control = *bt->bt_reg_ctl;
498 	packet_type = (control >> 18) & 0x7;
499 
500 	if (((control >> 31) & 1) == 0) {
501 		dev_warn(bt->dev, "%s(), ((control >> 31) & 1) == 0, control 0x%x\n",
502 			 __func__, control);
503 		goto irq_handler_exit;
504 	}
505 
506 	if (packet_type >= BT_SCO_CVSD_MAX) {
507 		dev_warn(bt->dev, "%s(), invalid packet_type %u, exit\n",
508 			 __func__, packet_type);
509 		goto irq_handler_exit;
510 	}
511 
512 	packet_length = btsco_packet_info[packet_type][0];
513 	packet_num = btsco_packet_info[packet_type][1];
514 	buf_cnt_tx = btsco_packet_info[packet_type][2];
515 	buf_cnt_rx = btsco_packet_info[packet_type][3];
516 
517 	if (bt->tx->state == BT_SCO_STATE_LOOPBACK) {
518 		u8 *src, *dst;
519 		unsigned long connsys_addr_rx, ap_addr_rx;
520 		unsigned long connsys_addr_tx, ap_addr_tx;
521 
522 		connsys_addr_rx = *bt->bt_reg_pkt_r;
523 		ap_addr_rx = (unsigned long)bt->bt_sram_bank2_base +
524 			     (connsys_addr_rx & 0xFFFF);
525 
526 		connsys_addr_tx = *bt->bt_reg_pkt_w;
527 		ap_addr_tx = (unsigned long)bt->bt_sram_bank2_base +
528 			     (connsys_addr_tx & 0xFFFF);
529 
530 		if (connsys_addr_tx == 0xdeadfeed ||
531 		    connsys_addr_rx == 0xdeadfeed) {
532 			/* bt return 0xdeadfeed if read reg during bt sleep */
533 			dev_warn(bt->dev, "%s(), connsys_addr_tx == 0xdeadfeed\n",
534 				 __func__);
535 			goto irq_handler_exit;
536 		}
537 
538 		src = (u8 *)ap_addr_rx;
539 		dst = (u8 *)ap_addr_tx;
540 
541 		mtk_btcvsd_snd_data_transfer(BT_SCO_DIRECT_BT2ARM, src,
542 					     bt->tx->temp_packet_buf,
543 					     packet_length,
544 					     packet_num);
545 		mtk_btcvsd_snd_data_transfer(BT_SCO_DIRECT_ARM2BT,
546 					     bt->tx->temp_packet_buf, dst,
547 					     packet_length,
548 					     packet_num);
549 		bt->rx->rw_cnt++;
550 		bt->tx->rw_cnt++;
551 	}
552 
553 	if (bt->rx->state == BT_SCO_STATE_RUNNING ||
554 	    bt->rx->state == BT_SCO_STATE_ENDING) {
555 		if (bt->rx->xrun) {
556 			if (bt->rx->packet_w - bt->rx->packet_r <=
557 			    SCO_RX_PACKER_BUF_NUM - 2 * buf_cnt_rx) {
558 				/*
559 				 * free space is larger then
560 				 * twice interrupt rx data size
561 				 */
562 				bt->rx->xrun = 0;
563 				dev_warn(bt->dev, "%s(), rx->xrun 0!\n",
564 					 __func__);
565 			}
566 		}
567 
568 		if (!bt->rx->xrun &&
569 		    (bt->rx->packet_w - bt->rx->packet_r <=
570 		     SCO_RX_PACKER_BUF_NUM - buf_cnt_rx)) {
571 			mtk_btcvsd_read_from_bt(bt,
572 						packet_type,
573 						packet_length,
574 						packet_num,
575 						buf_cnt_rx,
576 						control);
577 			bt->rx->rw_cnt++;
578 		} else {
579 			bt->rx->xrun = 1;
580 			dev_warn(bt->dev, "%s(), rx->xrun 1\n", __func__);
581 		}
582 	}
583 
584 	/* tx */
585 	bt->tx->timeout = 0;
586 	if ((bt->tx->state == BT_SCO_STATE_RUNNING ||
587 	     bt->tx->state == BT_SCO_STATE_ENDING) &&
588 	    bt->tx->trigger_start) {
589 		if (bt->tx->xrun) {
590 			/* prepared data is larger then twice
591 			 * interrupt tx data size
592 			 */
593 			if (bt->tx->packet_w - bt->tx->packet_r >=
594 			    2 * buf_cnt_tx) {
595 				bt->tx->xrun = 0;
596 				dev_warn(bt->dev, "%s(), tx->xrun 0\n",
597 					 __func__);
598 			}
599 		}
600 
601 		if ((!bt->tx->xrun &&
602 		     (bt->tx->packet_w - bt->tx->packet_r >= buf_cnt_tx)) ||
603 		    bt->tx->state == BT_SCO_STATE_ENDING) {
604 			mtk_btcvsd_write_to_bt(bt,
605 					       packet_type,
606 					       packet_length,
607 					       packet_num,
608 					       buf_cnt_tx);
609 			bt->tx->rw_cnt++;
610 		} else {
611 			bt->tx->xrun = 1;
612 			dev_warn(bt->dev, "%s(), tx->xrun 1\n", __func__);
613 		}
614 	}
615 
616 	*bt->bt_reg_ctl &= ~BT_CVSD_CLEAR;
617 
618 	if (bt->rx->state == BT_SCO_STATE_RUNNING ||
619 	    bt->rx->state == BT_SCO_STATE_ENDING) {
620 		bt->rx->wait_flag = 1;
621 		wake_up_interruptible(&bt->rx_wait);
622 		snd_pcm_period_elapsed(bt->rx->substream);
623 	}
624 	if (bt->tx->state == BT_SCO_STATE_RUNNING ||
625 	    bt->tx->state == BT_SCO_STATE_ENDING) {
626 		bt->tx->wait_flag = 1;
627 		wake_up_interruptible(&bt->tx_wait);
628 		snd_pcm_period_elapsed(bt->tx->substream);
629 	}
630 
631 	return IRQ_HANDLED;
632 irq_handler_exit:
633 	*bt->bt_reg_ctl &= ~BT_CVSD_CLEAR;
634 	return IRQ_HANDLED;
635 }
636 
637 static int wait_for_bt_irq(struct mtk_btcvsd_snd *bt,
638 			   struct mtk_btcvsd_snd_stream *bt_stream)
639 {
640 	unsigned long long t1, t2;
641 	/* one interrupt period = 22.5ms */
642 	unsigned long long timeout_limit = 22500000;
643 	int max_timeout_trial = 2;
644 	int ret;
645 
646 	bt_stream->wait_flag = 0;
647 
648 	while (max_timeout_trial && !bt_stream->wait_flag) {
649 		t1 = sched_clock();
650 		if (bt_stream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
651 			ret = wait_event_interruptible_timeout(bt->tx_wait,
652 				bt_stream->wait_flag,
653 				nsecs_to_jiffies(timeout_limit));
654 		} else {
655 			ret = wait_event_interruptible_timeout(bt->rx_wait,
656 				bt_stream->wait_flag,
657 				nsecs_to_jiffies(timeout_limit));
658 		}
659 
660 		t2 = sched_clock();
661 		t2 = t2 - t1; /* in ns (10^9) */
662 
663 		if (t2 > timeout_limit) {
664 			dev_warn(bt->dev, "%s(), stream %d, timeout %llu, limit %llu, ret %d, flag %d\n",
665 				 __func__, bt_stream->stream,
666 				 t2, timeout_limit, ret,
667 				 bt_stream->wait_flag);
668 		}
669 
670 		if (ret < 0) {
671 			/*
672 			 * error, -ERESTARTSYS if it was interrupted by
673 			 * a signal
674 			 */
675 			dev_warn(bt->dev, "%s(), stream %d, error, trial left %d\n",
676 				 __func__,
677 				 bt_stream->stream, max_timeout_trial);
678 
679 			bt_stream->timeout = 1;
680 			return ret;
681 		} else if (ret == 0) {
682 			/* conidtion is false after timeout */
683 			max_timeout_trial--;
684 			dev_warn(bt->dev, "%s(), stream %d, error, timeout, condition is false, trial left %d\n",
685 				 __func__,
686 				 bt_stream->stream, max_timeout_trial);
687 
688 			if (max_timeout_trial <= 0) {
689 				bt_stream->timeout = 1;
690 				return -ETIME;
691 			}
692 		}
693 	}
694 
695 	return 0;
696 }
697 
698 static ssize_t mtk_btcvsd_snd_read(struct mtk_btcvsd_snd *bt,
699 				   struct iov_iter *buf,
700 				   size_t count)
701 {
702 	ssize_t read_size = 0, read_count = 0, cur_read_idx, cont;
703 	unsigned long avail;
704 	unsigned long flags;
705 	unsigned int packet_size = bt->rx->packet_size;
706 
707 	while (count) {
708 		spin_lock_irqsave(&bt->rx_lock, flags);
709 		/* available data in RX packet buffer */
710 		avail = (bt->rx->packet_w - bt->rx->packet_r) * packet_size;
711 
712 		cur_read_idx = (bt->rx->packet_r & SCO_RX_PACKET_MASK) *
713 			       packet_size;
714 		spin_unlock_irqrestore(&bt->rx_lock, flags);
715 
716 		if (!avail) {
717 			int ret = wait_for_bt_irq(bt, bt->rx);
718 
719 			if (ret)
720 				return read_count;
721 
722 			continue;
723 		}
724 
725 		/* count must be multiple of packet_size */
726 		if (count % packet_size != 0 ||
727 		    avail % packet_size != 0) {
728 			dev_warn(bt->dev, "%s(), count %zu or d %lu is not multiple of packet_size %dd\n",
729 				 __func__, count, avail, packet_size);
730 
731 			count -= count % packet_size;
732 			avail -= avail % packet_size;
733 		}
734 
735 		if (count > avail)
736 			read_size = avail;
737 		else
738 			read_size = count;
739 
740 		/* calculate continue space */
741 		cont = bt->rx->buf_size - cur_read_idx;
742 		if (read_size > cont)
743 			read_size = cont;
744 
745 		if (copy_to_iter(bt->rx_packet_buf + cur_read_idx,
746 				 read_size, buf) != read_size) {
747 			dev_warn(bt->dev, "%s(), copy_to_iter fail\n",
748 				 __func__);
749 			return -EFAULT;
750 		}
751 
752 		spin_lock_irqsave(&bt->rx_lock, flags);
753 		bt->rx->packet_r += read_size / packet_size;
754 		spin_unlock_irqrestore(&bt->rx_lock, flags);
755 
756 		read_count += read_size;
757 		count -= read_size;
758 	}
759 
760 	/*
761 	 * save current timestamp & buffer time in times_tamp and
762 	 * buf_data_equivalent_time
763 	 */
764 	bt->rx->time_stamp = sched_clock();
765 	bt->rx->buf_data_equivalent_time =
766 		(unsigned long long)(bt->rx->packet_w - bt->rx->packet_r) *
767 		SCO_RX_PLC_SIZE * 16 * 1000 / 2 / 64;
768 	bt->rx->buf_data_equivalent_time += read_count * SCO_RX_PLC_SIZE *
769 					    16 * 1000 / packet_size / 2 / 64;
770 	/* return equivalent time(us) to data count */
771 	bt->rx->buf_data_equivalent_time *= 1000;
772 
773 	return read_count;
774 }
775 
776 static ssize_t mtk_btcvsd_snd_write(struct mtk_btcvsd_snd *bt,
777 				    struct iov_iter *buf,
778 				    size_t count)
779 {
780 	int written_size = count, avail, cur_write_idx, write_size, cont;
781 	unsigned long flags;
782 	unsigned int packet_size = bt->tx->packet_size;
783 
784 	/*
785 	 * save current timestamp & buffer time in time_stamp and
786 	 * buf_data_equivalent_time
787 	 */
788 	bt->tx->time_stamp = sched_clock();
789 	bt->tx->buf_data_equivalent_time =
790 		(unsigned long long)(bt->tx->packet_w - bt->tx->packet_r) *
791 		packet_size * 16 * 1000 / 2 / 64;
792 
793 	/* return equivalent time(us) to data count */
794 	bt->tx->buf_data_equivalent_time *= 1000;
795 
796 	while (count) {
797 		spin_lock_irqsave(&bt->tx_lock, flags);
798 		/* free space of TX packet buffer */
799 		avail = bt->tx->buf_size -
800 			(bt->tx->packet_w - bt->tx->packet_r) * packet_size;
801 
802 		cur_write_idx = (bt->tx->packet_w % SCO_TX_PACKER_BUF_NUM) *
803 				packet_size;
804 		spin_unlock_irqrestore(&bt->tx_lock, flags);
805 
806 		if (!avail) {
807 			int ret = wait_for_bt_irq(bt, bt->tx);
808 
809 			if (ret)
810 				return written_size;
811 
812 			continue;
813 		}
814 
815 		/* count must be multiple of bt->tx->packet_size */
816 		if (count % packet_size != 0 ||
817 		    avail % packet_size != 0) {
818 			dev_warn(bt->dev, "%s(), count %zu or avail %d is not multiple of packet_size %d\n",
819 				 __func__, count, avail, packet_size);
820 			count -= count % packet_size;
821 			avail -= avail % packet_size;
822 		}
823 
824 		if (count > avail)
825 			write_size = avail;
826 		else
827 			write_size = count;
828 
829 		/* calculate continue space */
830 		cont = bt->tx->buf_size - cur_write_idx;
831 		if (write_size > cont)
832 			write_size = cont;
833 
834 		if (copy_from_iter(bt->tx_packet_buf + cur_write_idx,
835 				   write_size, buf) != write_size) {
836 			dev_warn(bt->dev, "%s(), copy_from_iter fail\n",
837 				 __func__);
838 			return -EFAULT;
839 		}
840 
841 		spin_lock_irqsave(&bt->tx_lock, flags);
842 		bt->tx->packet_w += write_size / packet_size;
843 		spin_unlock_irqrestore(&bt->tx_lock, flags);
844 		count -= write_size;
845 	}
846 
847 	return written_size;
848 }
849 
850 static struct mtk_btcvsd_snd_stream *get_bt_stream
851 	(struct mtk_btcvsd_snd *bt, struct snd_pcm_substream *substream)
852 {
853 	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
854 		return bt->tx;
855 	else
856 		return bt->rx;
857 }
858 
859 /* pcm ops */
860 static const struct snd_pcm_hardware mtk_btcvsd_hardware = {
861 	.info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
862 		 SNDRV_PCM_INFO_RESUME),
863 	.formats = SNDRV_PCM_FMTBIT_S16_LE,
864 	.buffer_bytes_max = 24 * 1024,
865 	.period_bytes_max = 24 * 1024,
866 	.periods_min = 2,
867 	.periods_max = 16,
868 	.fifo_size = 0,
869 };
870 
871 static int mtk_pcm_btcvsd_open(struct snd_soc_component *component,
872 			       struct snd_pcm_substream *substream)
873 {
874 	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(component);
875 	int ret;
876 
877 	dev_dbg(bt->dev, "%s(), stream %d, substream %p\n",
878 		__func__, substream->stream, substream);
879 
880 	snd_soc_set_runtime_hwparams(substream, &mtk_btcvsd_hardware);
881 
882 	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
883 		ret = mtk_btcvsd_snd_tx_init(bt);
884 		bt->tx->substream = substream;
885 	} else {
886 		ret = mtk_btcvsd_snd_rx_init(bt);
887 		bt->rx->substream = substream;
888 	}
889 
890 	return ret;
891 }
892 
893 static int mtk_pcm_btcvsd_close(struct snd_soc_component *component,
894 				struct snd_pcm_substream *substream)
895 {
896 	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(component);
897 	struct mtk_btcvsd_snd_stream *bt_stream = get_bt_stream(bt, substream);
898 
899 	dev_dbg(bt->dev, "%s(), stream %d\n", __func__, substream->stream);
900 
901 	mtk_btcvsd_snd_set_state(bt, bt_stream, BT_SCO_STATE_IDLE);
902 	bt_stream->substream = NULL;
903 	return 0;
904 }
905 
906 static int mtk_pcm_btcvsd_hw_params(struct snd_soc_component *component,
907 				    struct snd_pcm_substream *substream,
908 				    struct snd_pcm_hw_params *hw_params)
909 {
910 	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(component);
911 
912 	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK &&
913 	    params_buffer_bytes(hw_params) % bt->tx->packet_size != 0) {
914 		dev_warn(bt->dev, "%s(), error, buffer size %d not valid\n",
915 			 __func__,
916 			 params_buffer_bytes(hw_params));
917 		return -EINVAL;
918 	}
919 
920 	substream->runtime->dma_bytes = params_buffer_bytes(hw_params);
921 	return 0;
922 }
923 
924 static int mtk_pcm_btcvsd_hw_free(struct snd_soc_component *component,
925 				  struct snd_pcm_substream *substream)
926 {
927 	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(component);
928 
929 	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
930 		btcvsd_tx_clean_buffer(bt);
931 
932 	return 0;
933 }
934 
935 static int mtk_pcm_btcvsd_prepare(struct snd_soc_component *component,
936 				  struct snd_pcm_substream *substream)
937 {
938 	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(component);
939 	struct mtk_btcvsd_snd_stream *bt_stream = get_bt_stream(bt, substream);
940 
941 	dev_dbg(bt->dev, "%s(), stream %d\n", __func__, substream->stream);
942 
943 	mtk_btcvsd_snd_set_state(bt, bt_stream, BT_SCO_STATE_RUNNING);
944 	return 0;
945 }
946 
947 static int mtk_pcm_btcvsd_trigger(struct snd_soc_component *component,
948 				  struct snd_pcm_substream *substream, int cmd)
949 {
950 	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(component);
951 	struct mtk_btcvsd_snd_stream *bt_stream = get_bt_stream(bt, substream);
952 	int stream = substream->stream;
953 	int hw_packet_ptr;
954 
955 	dev_dbg(bt->dev, "%s(), stream %d, cmd %d\n",
956 		__func__, substream->stream, cmd);
957 
958 	switch (cmd) {
959 	case SNDRV_PCM_TRIGGER_START:
960 	case SNDRV_PCM_TRIGGER_RESUME:
961 		hw_packet_ptr = stream == SNDRV_PCM_STREAM_PLAYBACK ?
962 				bt_stream->packet_r : bt_stream->packet_w;
963 		bt_stream->prev_packet_idx = hw_packet_ptr;
964 		bt_stream->prev_frame = 0;
965 		bt_stream->trigger_start = 1;
966 		return 0;
967 	case SNDRV_PCM_TRIGGER_STOP:
968 	case SNDRV_PCM_TRIGGER_SUSPEND:
969 		bt_stream->trigger_start = 0;
970 		mtk_btcvsd_snd_set_state(bt, bt_stream, BT_SCO_STATE_ENDING);
971 		return 0;
972 	default:
973 		return -EINVAL;
974 	}
975 }
976 
977 static snd_pcm_uframes_t mtk_pcm_btcvsd_pointer(
978 	struct snd_soc_component *component,
979 	struct snd_pcm_substream *substream)
980 {
981 	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(component);
982 	struct mtk_btcvsd_snd_stream *bt_stream;
983 	snd_pcm_uframes_t frame = 0;
984 	int byte = 0;
985 	int hw_packet_ptr;
986 	int packet_diff;
987 	spinlock_t *lock;	/* spinlock for bt stream control */
988 	unsigned long flags;
989 
990 	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
991 		lock = &bt->tx_lock;
992 		bt_stream = bt->tx;
993 	} else {
994 		lock = &bt->rx_lock;
995 		bt_stream = bt->rx;
996 	}
997 
998 	spin_lock_irqsave(lock, flags);
999 	hw_packet_ptr = substream->stream == SNDRV_PCM_STREAM_PLAYBACK ?
1000 			bt->tx->packet_r : bt->rx->packet_w;
1001 
1002 	/* get packet diff from last time */
1003 	if (hw_packet_ptr >= bt_stream->prev_packet_idx) {
1004 		packet_diff = hw_packet_ptr - bt_stream->prev_packet_idx;
1005 	} else {
1006 		/* integer overflow */
1007 		packet_diff = (INT_MAX - bt_stream->prev_packet_idx) +
1008 			      (hw_packet_ptr - INT_MIN) + 1;
1009 	}
1010 	bt_stream->prev_packet_idx = hw_packet_ptr;
1011 
1012 	/* increased bytes */
1013 	byte = packet_diff * bt_stream->packet_size;
1014 
1015 	frame = btcvsd_bytes_to_frame(substream, byte);
1016 	frame += bt_stream->prev_frame;
1017 	frame %= substream->runtime->buffer_size;
1018 
1019 	bt_stream->prev_frame = frame;
1020 
1021 	spin_unlock_irqrestore(lock, flags);
1022 
1023 	return frame;
1024 }
1025 
1026 static int mtk_pcm_btcvsd_copy(struct snd_soc_component *component,
1027 			       struct snd_pcm_substream *substream,
1028 			       int channel, unsigned long pos,
1029 			       struct iov_iter *buf, unsigned long count)
1030 {
1031 	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(component);
1032 
1033 	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
1034 		return mtk_btcvsd_snd_write(bt, buf, count);
1035 	else
1036 		return mtk_btcvsd_snd_read(bt, buf, count);
1037 }
1038 
1039 /* kcontrol */
1040 static const char *const btsco_band_str[] = {"NB", "WB"};
1041 
1042 static const struct soc_enum btcvsd_enum[] = {
1043 	SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(btsco_band_str), btsco_band_str),
1044 };
1045 
1046 static int btcvsd_band_get(struct snd_kcontrol *kcontrol,
1047 			   struct snd_ctl_elem_value *ucontrol)
1048 {
1049 	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
1050 	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(cmpnt);
1051 
1052 	ucontrol->value.integer.value[0] = bt->band;
1053 	return 0;
1054 }
1055 
1056 static int btcvsd_band_set(struct snd_kcontrol *kcontrol,
1057 			   struct snd_ctl_elem_value *ucontrol)
1058 {
1059 	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
1060 	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(cmpnt);
1061 	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
1062 
1063 	if (ucontrol->value.enumerated.item[0] >= e->items)
1064 		return -EINVAL;
1065 
1066 	bt->band = ucontrol->value.integer.value[0];
1067 	dev_dbg(bt->dev, "%s(), band %d\n", __func__, bt->band);
1068 	return 0;
1069 }
1070 
1071 static int btcvsd_loopback_get(struct snd_kcontrol *kcontrol,
1072 			       struct snd_ctl_elem_value *ucontrol)
1073 {
1074 	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
1075 	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(cmpnt);
1076 	bool lpbk_en = bt->tx->state == BT_SCO_STATE_LOOPBACK;
1077 
1078 	ucontrol->value.integer.value[0] = lpbk_en;
1079 	return 0;
1080 }
1081 
1082 static int btcvsd_loopback_set(struct snd_kcontrol *kcontrol,
1083 			       struct snd_ctl_elem_value *ucontrol)
1084 {
1085 	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
1086 	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(cmpnt);
1087 
1088 	if (ucontrol->value.integer.value[0]) {
1089 		mtk_btcvsd_snd_set_state(bt, bt->tx, BT_SCO_STATE_LOOPBACK);
1090 		mtk_btcvsd_snd_set_state(bt, bt->rx, BT_SCO_STATE_LOOPBACK);
1091 	} else {
1092 		mtk_btcvsd_snd_set_state(bt, bt->tx, BT_SCO_STATE_RUNNING);
1093 		mtk_btcvsd_snd_set_state(bt, bt->rx, BT_SCO_STATE_RUNNING);
1094 	}
1095 	return 0;
1096 }
1097 
1098 static int btcvsd_tx_mute_get(struct snd_kcontrol *kcontrol,
1099 			      struct snd_ctl_elem_value *ucontrol)
1100 {
1101 	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
1102 	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(cmpnt);
1103 
1104 	if (!bt->tx) {
1105 		ucontrol->value.integer.value[0] = 0;
1106 		return 0;
1107 	}
1108 
1109 	ucontrol->value.integer.value[0] = bt->tx->mute;
1110 	return 0;
1111 }
1112 
1113 static int btcvsd_tx_mute_set(struct snd_kcontrol *kcontrol,
1114 			      struct snd_ctl_elem_value *ucontrol)
1115 {
1116 	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
1117 	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(cmpnt);
1118 
1119 	if (!bt->tx)
1120 		return 0;
1121 
1122 	bt->tx->mute = ucontrol->value.integer.value[0];
1123 	return 0;
1124 }
1125 
1126 static int btcvsd_rx_irq_received_get(struct snd_kcontrol *kcontrol,
1127 				      struct snd_ctl_elem_value *ucontrol)
1128 {
1129 	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
1130 	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(cmpnt);
1131 
1132 	if (!bt->rx)
1133 		return 0;
1134 
1135 	ucontrol->value.integer.value[0] = bt->rx->rw_cnt ? 1 : 0;
1136 	return 0;
1137 }
1138 
1139 static int btcvsd_rx_timeout_get(struct snd_kcontrol *kcontrol,
1140 				 struct snd_ctl_elem_value *ucontrol)
1141 {
1142 	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
1143 	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(cmpnt);
1144 
1145 	if (!bt->rx)
1146 		return 0;
1147 
1148 	ucontrol->value.integer.value[0] = bt->rx->timeout;
1149 	bt->rx->timeout = 0;
1150 	return 0;
1151 }
1152 
1153 static int btcvsd_rx_timestamp_get(struct snd_kcontrol *kcontrol,
1154 				   unsigned int __user *data, unsigned int size)
1155 {
1156 	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
1157 	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(cmpnt);
1158 	int ret = 0;
1159 	struct mtk_btcvsd_snd_time_buffer_info time_buffer_info_rx;
1160 
1161 	if (size > sizeof(struct mtk_btcvsd_snd_time_buffer_info))
1162 		return -EINVAL;
1163 
1164 	get_rx_time_stamp(bt, &time_buffer_info_rx);
1165 
1166 	dev_dbg(bt->dev, "%s(), time_stamp_us %llu, data_count_equi_time %llu",
1167 		__func__,
1168 		time_buffer_info_rx.time_stamp_us,
1169 		time_buffer_info_rx.data_count_equi_time);
1170 
1171 	if (copy_to_user(data, &time_buffer_info_rx,
1172 			 sizeof(struct mtk_btcvsd_snd_time_buffer_info))) {
1173 		dev_warn(bt->dev, "%s(), copy_to_user fail", __func__);
1174 		ret = -EFAULT;
1175 	}
1176 
1177 	return ret;
1178 }
1179 
1180 static int btcvsd_tx_irq_received_get(struct snd_kcontrol *kcontrol,
1181 				      struct snd_ctl_elem_value *ucontrol)
1182 {
1183 	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
1184 	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(cmpnt);
1185 
1186 	if (!bt->tx)
1187 		return 0;
1188 
1189 	ucontrol->value.integer.value[0] = bt->tx->rw_cnt ? 1 : 0;
1190 	return 0;
1191 }
1192 
1193 static int btcvsd_tx_timeout_get(struct snd_kcontrol *kcontrol,
1194 				 struct snd_ctl_elem_value *ucontrol)
1195 {
1196 	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
1197 	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(cmpnt);
1198 
1199 	ucontrol->value.integer.value[0] = bt->tx->timeout;
1200 	return 0;
1201 }
1202 
1203 static int btcvsd_tx_timestamp_get(struct snd_kcontrol *kcontrol,
1204 				   unsigned int __user *data, unsigned int size)
1205 {
1206 	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
1207 	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(cmpnt);
1208 	int ret = 0;
1209 	struct mtk_btcvsd_snd_time_buffer_info time_buffer_info_tx;
1210 
1211 	if (size > sizeof(struct mtk_btcvsd_snd_time_buffer_info))
1212 		return -EINVAL;
1213 
1214 	get_tx_time_stamp(bt, &time_buffer_info_tx);
1215 
1216 	dev_dbg(bt->dev, "%s(), time_stamp_us %llu, data_count_equi_time %llu",
1217 		__func__,
1218 		time_buffer_info_tx.time_stamp_us,
1219 		time_buffer_info_tx.data_count_equi_time);
1220 
1221 	if (copy_to_user(data, &time_buffer_info_tx,
1222 			 sizeof(struct mtk_btcvsd_snd_time_buffer_info))) {
1223 		dev_warn(bt->dev, "%s(), copy_to_user fail", __func__);
1224 		ret = -EFAULT;
1225 	}
1226 
1227 	return ret;
1228 }
1229 
1230 static const struct snd_kcontrol_new mtk_btcvsd_snd_controls[] = {
1231 	SOC_ENUM_EXT("BTCVSD Band", btcvsd_enum[0],
1232 		     btcvsd_band_get, btcvsd_band_set),
1233 	SOC_SINGLE_BOOL_EXT("BTCVSD Loopback Switch", 0,
1234 			    btcvsd_loopback_get, btcvsd_loopback_set),
1235 	SOC_SINGLE_BOOL_EXT("BTCVSD Tx Mute Switch", 0,
1236 			    btcvsd_tx_mute_get, btcvsd_tx_mute_set),
1237 	SOC_SINGLE_BOOL_EXT("BTCVSD Tx Irq Received Switch", 0,
1238 			    btcvsd_tx_irq_received_get, NULL),
1239 	SOC_SINGLE_BOOL_EXT("BTCVSD Tx Timeout Switch", 0,
1240 			    btcvsd_tx_timeout_get, NULL),
1241 	SOC_SINGLE_BOOL_EXT("BTCVSD Rx Irq Received Switch", 0,
1242 			    btcvsd_rx_irq_received_get, NULL),
1243 	SOC_SINGLE_BOOL_EXT("BTCVSD Rx Timeout Switch", 0,
1244 			    btcvsd_rx_timeout_get, NULL),
1245 	SND_SOC_BYTES_TLV("BTCVSD Rx Timestamp",
1246 			  sizeof(struct mtk_btcvsd_snd_time_buffer_info),
1247 			  btcvsd_rx_timestamp_get, NULL),
1248 	SND_SOC_BYTES_TLV("BTCVSD Tx Timestamp",
1249 			  sizeof(struct mtk_btcvsd_snd_time_buffer_info),
1250 			  btcvsd_tx_timestamp_get, NULL),
1251 };
1252 
1253 static int mtk_btcvsd_snd_component_probe(struct snd_soc_component *component)
1254 {
1255 	return snd_soc_add_component_controls(component,
1256 		mtk_btcvsd_snd_controls,
1257 		ARRAY_SIZE(mtk_btcvsd_snd_controls));
1258 }
1259 
1260 static const struct snd_soc_component_driver mtk_btcvsd_snd_platform = {
1261 	.name		= BTCVSD_SND_NAME,
1262 	.probe		= mtk_btcvsd_snd_component_probe,
1263 	.open		= mtk_pcm_btcvsd_open,
1264 	.close		= mtk_pcm_btcvsd_close,
1265 	.hw_params	= mtk_pcm_btcvsd_hw_params,
1266 	.hw_free	= mtk_pcm_btcvsd_hw_free,
1267 	.prepare	= mtk_pcm_btcvsd_prepare,
1268 	.trigger	= mtk_pcm_btcvsd_trigger,
1269 	.pointer	= mtk_pcm_btcvsd_pointer,
1270 	.copy		= mtk_pcm_btcvsd_copy,
1271 };
1272 
1273 static int mtk_btcvsd_snd_probe(struct platform_device *pdev)
1274 {
1275 	int ret;
1276 	int irq_id;
1277 	u32 offset[5] = {0, 0, 0, 0, 0};
1278 	struct mtk_btcvsd_snd *btcvsd;
1279 	struct device *dev = &pdev->dev;
1280 
1281 	/* init btcvsd private data */
1282 	btcvsd = devm_kzalloc(dev, sizeof(*btcvsd), GFP_KERNEL);
1283 	if (!btcvsd)
1284 		return -ENOMEM;
1285 	platform_set_drvdata(pdev, btcvsd);
1286 	btcvsd->dev = dev;
1287 
1288 	/* init tx/rx */
1289 	btcvsd->rx = devm_kzalloc(btcvsd->dev, sizeof(*btcvsd->rx), GFP_KERNEL);
1290 	if (!btcvsd->rx)
1291 		return -ENOMEM;
1292 
1293 	btcvsd->tx = devm_kzalloc(btcvsd->dev, sizeof(*btcvsd->tx), GFP_KERNEL);
1294 	if (!btcvsd->tx)
1295 		return -ENOMEM;
1296 
1297 	spin_lock_init(&btcvsd->tx_lock);
1298 	spin_lock_init(&btcvsd->rx_lock);
1299 
1300 	init_waitqueue_head(&btcvsd->tx_wait);
1301 	init_waitqueue_head(&btcvsd->rx_wait);
1302 
1303 	mtk_btcvsd_snd_tx_init(btcvsd);
1304 	mtk_btcvsd_snd_rx_init(btcvsd);
1305 
1306 	/* irq */
1307 	irq_id = platform_get_irq(pdev, 0);
1308 	if (irq_id <= 0)
1309 		return irq_id < 0 ? irq_id : -ENXIO;
1310 
1311 	ret = devm_request_irq(dev, irq_id, mtk_btcvsd_snd_irq_handler,
1312 			       IRQF_TRIGGER_LOW, "BTCVSD_ISR_Handle",
1313 			       (void *)btcvsd);
1314 	if (ret) {
1315 		dev_err(dev, "could not request_irq for BTCVSD_ISR_Handle\n");
1316 		return ret;
1317 	}
1318 
1319 	btcvsd->irq_id = irq_id;
1320 
1321 	/* iomap */
1322 	btcvsd->bt_pkv_base = of_iomap(dev->of_node, 0);
1323 	if (!btcvsd->bt_pkv_base) {
1324 		dev_err(dev, "iomap bt_pkv_base fail\n");
1325 		return -EIO;
1326 	}
1327 
1328 	btcvsd->bt_sram_bank2_base = of_iomap(dev->of_node, 1);
1329 	if (!btcvsd->bt_sram_bank2_base) {
1330 		dev_err(dev, "iomap bt_sram_bank2_base fail\n");
1331 		ret = -EIO;
1332 		goto unmap_pkv_err;
1333 	}
1334 
1335 	btcvsd->infra = syscon_regmap_lookup_by_phandle(dev->of_node,
1336 							"mediatek,infracfg");
1337 	if (IS_ERR(btcvsd->infra)) {
1338 		dev_err(dev, "cannot find infra controller: %ld\n",
1339 			PTR_ERR(btcvsd->infra));
1340 		ret = PTR_ERR(btcvsd->infra);
1341 		goto unmap_bank2_err;
1342 	}
1343 
1344 	/* get offset */
1345 	ret = of_property_read_u32_array(dev->of_node, "mediatek,offset",
1346 					 offset,
1347 					 ARRAY_SIZE(offset));
1348 	if (ret) {
1349 		dev_warn(dev, "%s(), get offset fail, ret %d\n", __func__, ret);
1350 		goto unmap_bank2_err;
1351 	}
1352 	btcvsd->infra_misc_offset = offset[0];
1353 	btcvsd->conn_bt_cvsd_mask = offset[1];
1354 	btcvsd->cvsd_mcu_read_offset = offset[2];
1355 	btcvsd->cvsd_mcu_write_offset = offset[3];
1356 	btcvsd->cvsd_packet_indicator = offset[4];
1357 
1358 	btcvsd->bt_reg_pkt_r = btcvsd->bt_pkv_base +
1359 			       btcvsd->cvsd_mcu_read_offset;
1360 	btcvsd->bt_reg_pkt_w = btcvsd->bt_pkv_base +
1361 			       btcvsd->cvsd_mcu_write_offset;
1362 	btcvsd->bt_reg_ctl = btcvsd->bt_pkv_base +
1363 			     btcvsd->cvsd_packet_indicator;
1364 
1365 	/* init state */
1366 	mtk_btcvsd_snd_set_state(btcvsd, btcvsd->tx, BT_SCO_STATE_IDLE);
1367 	mtk_btcvsd_snd_set_state(btcvsd, btcvsd->rx, BT_SCO_STATE_IDLE);
1368 
1369 	ret = devm_snd_soc_register_component(dev, &mtk_btcvsd_snd_platform,
1370 					      NULL, 0);
1371 	if (ret)
1372 		goto unmap_bank2_err;
1373 
1374 	return 0;
1375 
1376 unmap_bank2_err:
1377 	iounmap(btcvsd->bt_sram_bank2_base);
1378 unmap_pkv_err:
1379 	iounmap(btcvsd->bt_pkv_base);
1380 	return ret;
1381 }
1382 
1383 static void mtk_btcvsd_snd_remove(struct platform_device *pdev)
1384 {
1385 	struct mtk_btcvsd_snd *btcvsd = dev_get_drvdata(&pdev->dev);
1386 
1387 	iounmap(btcvsd->bt_pkv_base);
1388 	iounmap(btcvsd->bt_sram_bank2_base);
1389 }
1390 
1391 static const struct of_device_id mtk_btcvsd_snd_dt_match[] = {
1392 	{ .compatible = "mediatek,mtk-btcvsd-snd", },
1393 	{},
1394 };
1395 MODULE_DEVICE_TABLE(of, mtk_btcvsd_snd_dt_match);
1396 
1397 static struct platform_driver mtk_btcvsd_snd_driver = {
1398 	.driver = {
1399 		.name = "mtk-btcvsd-snd",
1400 		.of_match_table = mtk_btcvsd_snd_dt_match,
1401 	},
1402 	.probe = mtk_btcvsd_snd_probe,
1403 	.remove = mtk_btcvsd_snd_remove,
1404 };
1405 
1406 module_platform_driver(mtk_btcvsd_snd_driver);
1407 
1408 MODULE_DESCRIPTION("Mediatek ALSA BT SCO CVSD/MSBC Driver");
1409 MODULE_AUTHOR("KaiChieh Chuang <kaichieh.chuang@mediatek.com>");
1410 MODULE_LICENSE("GPL v2");
1411