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
48enum 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
55enum bt_sco_direct {
56	BT_SCO_DIRECT_BT2ARM,
57	BT_SCO_DIRECT_ARM2BT,
58};
59
60enum 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
70enum BT_SCO_BAND {
71	BT_SCO_NB,
72	BT_SCO_WB,
73};
74
75struct 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
82struct 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
110struct 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
143struct mtk_btcvsd_snd_time_buffer_info {
144	unsigned long long data_count_equi_time;
145	unsigned long long time_stamp_us;
146};
147
148static 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
157static 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
172static 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
193static 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
199static 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
205static 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
232static 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
245static 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
258static 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
265static 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
272static 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
288static 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 */
318static 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
357static 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
410static 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
481static 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;
632irq_handler_exit:
633	*bt->bt_reg_ctl &= ~BT_CVSD_CLEAR;
634	return IRQ_HANDLED;
635}
636
637static 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
698static ssize_t mtk_btcvsd_snd_read(struct mtk_btcvsd_snd *bt,
699				   char __user *buf,
700				   size_t count)
701{
702	ssize_t read_size = 0, read_count = 0, cur_read_idx, cont;
703	unsigned int cur_buf_ofs = 0;
704	unsigned long avail;
705	unsigned long flags;
706	unsigned int packet_size = bt->rx->packet_size;
707
708	while (count) {
709		spin_lock_irqsave(&bt->rx_lock, flags);
710		/* available data in RX packet buffer */
711		avail = (bt->rx->packet_w - bt->rx->packet_r) * packet_size;
712
713		cur_read_idx = (bt->rx->packet_r & SCO_RX_PACKET_MASK) *
714			       packet_size;
715		spin_unlock_irqrestore(&bt->rx_lock, flags);
716
717		if (!avail) {
718			int ret = wait_for_bt_irq(bt, bt->rx);
719
720			if (ret)
721				return read_count;
722
723			continue;
724		}
725
726		/* count must be multiple of packet_size */
727		if (count % packet_size != 0 ||
728		    avail % packet_size != 0) {
729			dev_warn(bt->dev, "%s(), count %zu or d %lu is not multiple of packet_size %dd\n",
730				 __func__, count, avail, packet_size);
731
732			count -= count % packet_size;
733			avail -= avail % packet_size;
734		}
735
736		if (count > avail)
737			read_size = avail;
738		else
739			read_size = count;
740
741		/* calculate continue space */
742		cont = bt->rx->buf_size - cur_read_idx;
743		if (read_size > cont)
744			read_size = cont;
745
746		if (copy_to_user(buf + cur_buf_ofs,
747				 bt->rx_packet_buf + cur_read_idx,
748				 read_size)) {
749			dev_warn(bt->dev, "%s(), copy_to_user fail\n",
750				 __func__);
751			return -EFAULT;
752		}
753
754		spin_lock_irqsave(&bt->rx_lock, flags);
755		bt->rx->packet_r += read_size / packet_size;
756		spin_unlock_irqrestore(&bt->rx_lock, flags);
757
758		read_count += read_size;
759		cur_buf_ofs += read_size;
760		count -= read_size;
761	}
762
763	/*
764	 * save current timestamp & buffer time in times_tamp and
765	 * buf_data_equivalent_time
766	 */
767	bt->rx->time_stamp = sched_clock();
768	bt->rx->buf_data_equivalent_time =
769		(unsigned long long)(bt->rx->packet_w - bt->rx->packet_r) *
770		SCO_RX_PLC_SIZE * 16 * 1000 / 2 / 64;
771	bt->rx->buf_data_equivalent_time += read_count * SCO_RX_PLC_SIZE *
772					    16 * 1000 / packet_size / 2 / 64;
773	/* return equivalent time(us) to data count */
774	bt->rx->buf_data_equivalent_time *= 1000;
775
776	return read_count;
777}
778
779static ssize_t mtk_btcvsd_snd_write(struct mtk_btcvsd_snd *bt,
780				    char __user *buf,
781				    size_t count)
782{
783	int written_size = count, avail = 0, cur_write_idx, write_size, cont;
784	unsigned int cur_buf_ofs = 0;
785	unsigned long flags;
786	unsigned int packet_size = bt->tx->packet_size;
787
788	/*
789	 * save current timestamp & buffer time in time_stamp and
790	 * buf_data_equivalent_time
791	 */
792	bt->tx->time_stamp = sched_clock();
793	bt->tx->buf_data_equivalent_time =
794		(unsigned long long)(bt->tx->packet_w - bt->tx->packet_r) *
795		packet_size * 16 * 1000 / 2 / 64;
796
797	/* return equivalent time(us) to data count */
798	bt->tx->buf_data_equivalent_time *= 1000;
799
800	while (count) {
801		spin_lock_irqsave(&bt->tx_lock, flags);
802		/* free space of TX packet buffer */
803		avail = bt->tx->buf_size -
804			(bt->tx->packet_w - bt->tx->packet_r) * packet_size;
805
806		cur_write_idx = (bt->tx->packet_w % SCO_TX_PACKER_BUF_NUM) *
807				packet_size;
808		spin_unlock_irqrestore(&bt->tx_lock, flags);
809
810		if (!avail) {
811			int ret = wait_for_bt_irq(bt, bt->rx);
812
813			if (ret)
814				return written_size;
815
816			continue;
817		}
818
819		/* count must be multiple of bt->tx->packet_size */
820		if (count % packet_size != 0 ||
821		    avail % packet_size != 0) {
822			dev_warn(bt->dev, "%s(), count %zu or avail %d is not multiple of packet_size %d\n",
823				 __func__, count, avail, packet_size);
824			count -= count % packet_size;
825			avail -= avail % packet_size;
826		}
827
828		if (count > avail)
829			write_size = avail;
830		else
831			write_size = count;
832
833		/* calculate continue space */
834		cont = bt->tx->buf_size - cur_write_idx;
835		if (write_size > cont)
836			write_size = cont;
837
838		if (copy_from_user(bt->tx_packet_buf +
839				   cur_write_idx,
840				   buf + cur_buf_ofs,
841				   write_size)) {
842			dev_warn(bt->dev, "%s(), copy_from_user fail\n",
843				 __func__);
844			return -EFAULT;
845		}
846
847		spin_lock_irqsave(&bt->tx_lock, flags);
848		bt->tx->packet_w += write_size / packet_size;
849		spin_unlock_irqrestore(&bt->tx_lock, flags);
850		cur_buf_ofs += write_size;
851		count -= write_size;
852	}
853
854	return written_size;
855}
856
857static struct mtk_btcvsd_snd_stream *get_bt_stream
858	(struct mtk_btcvsd_snd *bt, struct snd_pcm_substream *substream)
859{
860	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
861		return bt->tx;
862	else
863		return bt->rx;
864}
865
866/* pcm ops */
867static const struct snd_pcm_hardware mtk_btcvsd_hardware = {
868	.info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
869		 SNDRV_PCM_INFO_RESUME),
870	.formats = SNDRV_PCM_FMTBIT_S16_LE,
871	.buffer_bytes_max = 24 * 1024,
872	.period_bytes_max = 24 * 1024,
873	.periods_min = 2,
874	.periods_max = 16,
875	.fifo_size = 0,
876};
877
878static int mtk_pcm_btcvsd_open(struct snd_soc_component *component,
879			       struct snd_pcm_substream *substream)
880{
881	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(component);
882	int ret;
883
884	dev_dbg(bt->dev, "%s(), stream %d, substream %p\n",
885		__func__, substream->stream, substream);
886
887	snd_soc_set_runtime_hwparams(substream, &mtk_btcvsd_hardware);
888
889	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
890		ret = mtk_btcvsd_snd_tx_init(bt);
891		bt->tx->substream = substream;
892	} else {
893		ret = mtk_btcvsd_snd_rx_init(bt);
894		bt->rx->substream = substream;
895	}
896
897	return ret;
898}
899
900static int mtk_pcm_btcvsd_close(struct snd_soc_component *component,
901				struct snd_pcm_substream *substream)
902{
903	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(component);
904	struct mtk_btcvsd_snd_stream *bt_stream = get_bt_stream(bt, substream);
905
906	dev_dbg(bt->dev, "%s(), stream %d\n", __func__, substream->stream);
907
908	mtk_btcvsd_snd_set_state(bt, bt_stream, BT_SCO_STATE_IDLE);
909	bt_stream->substream = NULL;
910	return 0;
911}
912
913static int mtk_pcm_btcvsd_hw_params(struct snd_soc_component *component,
914				    struct snd_pcm_substream *substream,
915				    struct snd_pcm_hw_params *hw_params)
916{
917	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(component);
918
919	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK &&
920	    params_buffer_bytes(hw_params) % bt->tx->packet_size != 0) {
921		dev_warn(bt->dev, "%s(), error, buffer size %d not valid\n",
922			 __func__,
923			 params_buffer_bytes(hw_params));
924		return -EINVAL;
925	}
926
927	substream->runtime->dma_bytes = params_buffer_bytes(hw_params);
928	return 0;
929}
930
931static int mtk_pcm_btcvsd_hw_free(struct snd_soc_component *component,
932				  struct snd_pcm_substream *substream)
933{
934	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(component);
935
936	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
937		btcvsd_tx_clean_buffer(bt);
938
939	return 0;
940}
941
942static int mtk_pcm_btcvsd_prepare(struct snd_soc_component *component,
943				  struct snd_pcm_substream *substream)
944{
945	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(component);
946	struct mtk_btcvsd_snd_stream *bt_stream = get_bt_stream(bt, substream);
947
948	dev_dbg(bt->dev, "%s(), stream %d\n", __func__, substream->stream);
949
950	mtk_btcvsd_snd_set_state(bt, bt_stream, BT_SCO_STATE_RUNNING);
951	return 0;
952}
953
954static int mtk_pcm_btcvsd_trigger(struct snd_soc_component *component,
955				  struct snd_pcm_substream *substream, int cmd)
956{
957	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(component);
958	struct mtk_btcvsd_snd_stream *bt_stream = get_bt_stream(bt, substream);
959	int stream = substream->stream;
960	int hw_packet_ptr;
961
962	dev_dbg(bt->dev, "%s(), stream %d, cmd %d\n",
963		__func__, substream->stream, cmd);
964
965	switch (cmd) {
966	case SNDRV_PCM_TRIGGER_START:
967	case SNDRV_PCM_TRIGGER_RESUME:
968		hw_packet_ptr = stream == SNDRV_PCM_STREAM_PLAYBACK ?
969				bt_stream->packet_r : bt_stream->packet_w;
970		bt_stream->prev_packet_idx = hw_packet_ptr;
971		bt_stream->prev_frame = 0;
972		bt_stream->trigger_start = 1;
973		return 0;
974	case SNDRV_PCM_TRIGGER_STOP:
975	case SNDRV_PCM_TRIGGER_SUSPEND:
976		bt_stream->trigger_start = 0;
977		mtk_btcvsd_snd_set_state(bt, bt_stream, BT_SCO_STATE_ENDING);
978		return 0;
979	default:
980		return -EINVAL;
981	}
982}
983
984static snd_pcm_uframes_t mtk_pcm_btcvsd_pointer(
985	struct snd_soc_component *component,
986	struct snd_pcm_substream *substream)
987{
988	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(component);
989	struct mtk_btcvsd_snd_stream *bt_stream;
990	snd_pcm_uframes_t frame = 0;
991	int byte = 0;
992	int hw_packet_ptr;
993	int packet_diff;
994	spinlock_t *lock;	/* spinlock for bt stream control */
995	unsigned long flags;
996
997	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
998		lock = &bt->tx_lock;
999		bt_stream = bt->tx;
1000	} else {
1001		lock = &bt->rx_lock;
1002		bt_stream = bt->rx;
1003	}
1004
1005	spin_lock_irqsave(lock, flags);
1006	hw_packet_ptr = substream->stream == SNDRV_PCM_STREAM_PLAYBACK ?
1007			bt->tx->packet_r : bt->rx->packet_w;
1008
1009	/* get packet diff from last time */
1010	if (hw_packet_ptr >= bt_stream->prev_packet_idx) {
1011		packet_diff = hw_packet_ptr - bt_stream->prev_packet_idx;
1012	} else {
1013		/* integer overflow */
1014		packet_diff = (INT_MAX - bt_stream->prev_packet_idx) +
1015			      (hw_packet_ptr - INT_MIN) + 1;
1016	}
1017	bt_stream->prev_packet_idx = hw_packet_ptr;
1018
1019	/* increased bytes */
1020	byte = packet_diff * bt_stream->packet_size;
1021
1022	frame = btcvsd_bytes_to_frame(substream, byte);
1023	frame += bt_stream->prev_frame;
1024	frame %= substream->runtime->buffer_size;
1025
1026	bt_stream->prev_frame = frame;
1027
1028	spin_unlock_irqrestore(lock, flags);
1029
1030	return frame;
1031}
1032
1033static int mtk_pcm_btcvsd_copy(struct snd_soc_component *component,
1034			       struct snd_pcm_substream *substream,
1035			       int channel, unsigned long pos,
1036			       void __user *buf, unsigned long count)
1037{
1038	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(component);
1039
1040	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
1041		return mtk_btcvsd_snd_write(bt, buf, count);
1042	else
1043		return mtk_btcvsd_snd_read(bt, buf, count);
1044}
1045
1046/* kcontrol */
1047static const char *const btsco_band_str[] = {"NB", "WB"};
1048
1049static const struct soc_enum btcvsd_enum[] = {
1050	SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(btsco_band_str), btsco_band_str),
1051};
1052
1053static int btcvsd_band_get(struct snd_kcontrol *kcontrol,
1054			   struct snd_ctl_elem_value *ucontrol)
1055{
1056	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
1057	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(cmpnt);
1058
1059	ucontrol->value.integer.value[0] = bt->band;
1060	return 0;
1061}
1062
1063static int btcvsd_band_set(struct snd_kcontrol *kcontrol,
1064			   struct snd_ctl_elem_value *ucontrol)
1065{
1066	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
1067	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(cmpnt);
1068	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
1069
1070	if (ucontrol->value.enumerated.item[0] >= e->items)
1071		return -EINVAL;
1072
1073	bt->band = ucontrol->value.integer.value[0];
1074	dev_dbg(bt->dev, "%s(), band %d\n", __func__, bt->band);
1075	return 0;
1076}
1077
1078static int btcvsd_loopback_get(struct snd_kcontrol *kcontrol,
1079			       struct snd_ctl_elem_value *ucontrol)
1080{
1081	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
1082	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(cmpnt);
1083	bool lpbk_en = bt->tx->state == BT_SCO_STATE_LOOPBACK;
1084
1085	ucontrol->value.integer.value[0] = lpbk_en;
1086	return 0;
1087}
1088
1089static int btcvsd_loopback_set(struct snd_kcontrol *kcontrol,
1090			       struct snd_ctl_elem_value *ucontrol)
1091{
1092	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
1093	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(cmpnt);
1094
1095	if (ucontrol->value.integer.value[0]) {
1096		mtk_btcvsd_snd_set_state(bt, bt->tx, BT_SCO_STATE_LOOPBACK);
1097		mtk_btcvsd_snd_set_state(bt, bt->rx, BT_SCO_STATE_LOOPBACK);
1098	} else {
1099		mtk_btcvsd_snd_set_state(bt, bt->tx, BT_SCO_STATE_RUNNING);
1100		mtk_btcvsd_snd_set_state(bt, bt->rx, BT_SCO_STATE_RUNNING);
1101	}
1102	return 0;
1103}
1104
1105static int btcvsd_tx_mute_get(struct snd_kcontrol *kcontrol,
1106			      struct snd_ctl_elem_value *ucontrol)
1107{
1108	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
1109	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(cmpnt);
1110
1111	if (!bt->tx) {
1112		ucontrol->value.integer.value[0] = 0;
1113		return 0;
1114	}
1115
1116	ucontrol->value.integer.value[0] = bt->tx->mute;
1117	return 0;
1118}
1119
1120static int btcvsd_tx_mute_set(struct snd_kcontrol *kcontrol,
1121			      struct snd_ctl_elem_value *ucontrol)
1122{
1123	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
1124	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(cmpnt);
1125
1126	if (!bt->tx)
1127		return 0;
1128
1129	bt->tx->mute = ucontrol->value.integer.value[0];
1130	return 0;
1131}
1132
1133static int btcvsd_rx_irq_received_get(struct snd_kcontrol *kcontrol,
1134				      struct snd_ctl_elem_value *ucontrol)
1135{
1136	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
1137	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(cmpnt);
1138
1139	if (!bt->rx)
1140		return 0;
1141
1142	ucontrol->value.integer.value[0] = bt->rx->rw_cnt ? 1 : 0;
1143	return 0;
1144}
1145
1146static int btcvsd_rx_timeout_get(struct snd_kcontrol *kcontrol,
1147				 struct snd_ctl_elem_value *ucontrol)
1148{
1149	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
1150	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(cmpnt);
1151
1152	if (!bt->rx)
1153		return 0;
1154
1155	ucontrol->value.integer.value[0] = bt->rx->timeout;
1156	bt->rx->timeout = 0;
1157	return 0;
1158}
1159
1160static int btcvsd_rx_timestamp_get(struct snd_kcontrol *kcontrol,
1161				   unsigned int __user *data, unsigned int size)
1162{
1163	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
1164	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(cmpnt);
1165	int ret = 0;
1166	struct mtk_btcvsd_snd_time_buffer_info time_buffer_info_rx;
1167
1168	if (size > sizeof(struct mtk_btcvsd_snd_time_buffer_info))
1169		return -EINVAL;
1170
1171	get_rx_time_stamp(bt, &time_buffer_info_rx);
1172
1173	dev_dbg(bt->dev, "%s(), time_stamp_us %llu, data_count_equi_time %llu",
1174		__func__,
1175		time_buffer_info_rx.time_stamp_us,
1176		time_buffer_info_rx.data_count_equi_time);
1177
1178	if (copy_to_user(data, &time_buffer_info_rx,
1179			 sizeof(struct mtk_btcvsd_snd_time_buffer_info))) {
1180		dev_warn(bt->dev, "%s(), copy_to_user fail", __func__);
1181		ret = -EFAULT;
1182	}
1183
1184	return ret;
1185}
1186
1187static int btcvsd_tx_irq_received_get(struct snd_kcontrol *kcontrol,
1188				      struct snd_ctl_elem_value *ucontrol)
1189{
1190	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
1191	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(cmpnt);
1192
1193	if (!bt->tx)
1194		return 0;
1195
1196	ucontrol->value.integer.value[0] = bt->tx->rw_cnt ? 1 : 0;
1197	return 0;
1198}
1199
1200static int btcvsd_tx_timeout_get(struct snd_kcontrol *kcontrol,
1201				 struct snd_ctl_elem_value *ucontrol)
1202{
1203	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
1204	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(cmpnt);
1205
1206	ucontrol->value.integer.value[0] = bt->tx->timeout;
1207	return 0;
1208}
1209
1210static int btcvsd_tx_timestamp_get(struct snd_kcontrol *kcontrol,
1211				   unsigned int __user *data, unsigned int size)
1212{
1213	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
1214	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(cmpnt);
1215	int ret = 0;
1216	struct mtk_btcvsd_snd_time_buffer_info time_buffer_info_tx;
1217
1218	if (size > sizeof(struct mtk_btcvsd_snd_time_buffer_info))
1219		return -EINVAL;
1220
1221	get_tx_time_stamp(bt, &time_buffer_info_tx);
1222
1223	dev_dbg(bt->dev, "%s(), time_stamp_us %llu, data_count_equi_time %llu",
1224		__func__,
1225		time_buffer_info_tx.time_stamp_us,
1226		time_buffer_info_tx.data_count_equi_time);
1227
1228	if (copy_to_user(data, &time_buffer_info_tx,
1229			 sizeof(struct mtk_btcvsd_snd_time_buffer_info))) {
1230		dev_warn(bt->dev, "%s(), copy_to_user fail", __func__);
1231		ret = -EFAULT;
1232	}
1233
1234	return ret;
1235}
1236
1237static const struct snd_kcontrol_new mtk_btcvsd_snd_controls[] = {
1238	SOC_ENUM_EXT("BTCVSD Band", btcvsd_enum[0],
1239		     btcvsd_band_get, btcvsd_band_set),
1240	SOC_SINGLE_BOOL_EXT("BTCVSD Loopback Switch", 0,
1241			    btcvsd_loopback_get, btcvsd_loopback_set),
1242	SOC_SINGLE_BOOL_EXT("BTCVSD Tx Mute Switch", 0,
1243			    btcvsd_tx_mute_get, btcvsd_tx_mute_set),
1244	SOC_SINGLE_BOOL_EXT("BTCVSD Tx Irq Received Switch", 0,
1245			    btcvsd_tx_irq_received_get, NULL),
1246	SOC_SINGLE_BOOL_EXT("BTCVSD Tx Timeout Switch", 0,
1247			    btcvsd_tx_timeout_get, NULL),
1248	SOC_SINGLE_BOOL_EXT("BTCVSD Rx Irq Received Switch", 0,
1249			    btcvsd_rx_irq_received_get, NULL),
1250	SOC_SINGLE_BOOL_EXT("BTCVSD Rx Timeout Switch", 0,
1251			    btcvsd_rx_timeout_get, NULL),
1252	SND_SOC_BYTES_TLV("BTCVSD Rx Timestamp",
1253			  sizeof(struct mtk_btcvsd_snd_time_buffer_info),
1254			  btcvsd_rx_timestamp_get, NULL),
1255	SND_SOC_BYTES_TLV("BTCVSD Tx Timestamp",
1256			  sizeof(struct mtk_btcvsd_snd_time_buffer_info),
1257			  btcvsd_tx_timestamp_get, NULL),
1258};
1259
1260static int mtk_btcvsd_snd_component_probe(struct snd_soc_component *component)
1261{
1262	return snd_soc_add_component_controls(component,
1263		mtk_btcvsd_snd_controls,
1264		ARRAY_SIZE(mtk_btcvsd_snd_controls));
1265}
1266
1267static const struct snd_soc_component_driver mtk_btcvsd_snd_platform = {
1268	.name		= BTCVSD_SND_NAME,
1269	.probe		= mtk_btcvsd_snd_component_probe,
1270	.open		= mtk_pcm_btcvsd_open,
1271	.close		= mtk_pcm_btcvsd_close,
1272	.hw_params	= mtk_pcm_btcvsd_hw_params,
1273	.hw_free	= mtk_pcm_btcvsd_hw_free,
1274	.prepare	= mtk_pcm_btcvsd_prepare,
1275	.trigger	= mtk_pcm_btcvsd_trigger,
1276	.pointer	= mtk_pcm_btcvsd_pointer,
1277	.copy_user	= mtk_pcm_btcvsd_copy,
1278};
1279
1280static int mtk_btcvsd_snd_probe(struct platform_device *pdev)
1281{
1282	int ret;
1283	int irq_id;
1284	u32 offset[5] = {0, 0, 0, 0, 0};
1285	struct mtk_btcvsd_snd *btcvsd;
1286	struct device *dev = &pdev->dev;
1287
1288	/* init btcvsd private data */
1289	btcvsd = devm_kzalloc(dev, sizeof(*btcvsd), GFP_KERNEL);
1290	if (!btcvsd)
1291		return -ENOMEM;
1292	platform_set_drvdata(pdev, btcvsd);
1293	btcvsd->dev = dev;
1294
1295	/* init tx/rx */
1296	btcvsd->rx = devm_kzalloc(btcvsd->dev, sizeof(*btcvsd->rx), GFP_KERNEL);
1297	if (!btcvsd->rx)
1298		return -ENOMEM;
1299
1300	btcvsd->tx = devm_kzalloc(btcvsd->dev, sizeof(*btcvsd->tx), GFP_KERNEL);
1301	if (!btcvsd->tx)
1302		return -ENOMEM;
1303
1304	spin_lock_init(&btcvsd->tx_lock);
1305	spin_lock_init(&btcvsd->rx_lock);
1306
1307	init_waitqueue_head(&btcvsd->tx_wait);
1308	init_waitqueue_head(&btcvsd->rx_wait);
1309
1310	mtk_btcvsd_snd_tx_init(btcvsd);
1311	mtk_btcvsd_snd_rx_init(btcvsd);
1312
1313	/* irq */
1314	irq_id = platform_get_irq(pdev, 0);
1315	if (irq_id <= 0)
1316		return irq_id < 0 ? irq_id : -ENXIO;
1317
1318	ret = devm_request_irq(dev, irq_id, mtk_btcvsd_snd_irq_handler,
1319			       IRQF_TRIGGER_LOW, "BTCVSD_ISR_Handle",
1320			       (void *)btcvsd);
1321	if (ret) {
1322		dev_err(dev, "could not request_irq for BTCVSD_ISR_Handle\n");
1323		return ret;
1324	}
1325
1326	btcvsd->irq_id = irq_id;
1327
1328	/* iomap */
1329	btcvsd->bt_pkv_base = of_iomap(dev->of_node, 0);
1330	if (!btcvsd->bt_pkv_base) {
1331		dev_err(dev, "iomap bt_pkv_base fail\n");
1332		return -EIO;
1333	}
1334
1335	btcvsd->bt_sram_bank2_base = of_iomap(dev->of_node, 1);
1336	if (!btcvsd->bt_sram_bank2_base) {
1337		dev_err(dev, "iomap bt_sram_bank2_base fail\n");
1338		ret = -EIO;
1339		goto unmap_pkv_err;
1340	}
1341
1342	btcvsd->infra = syscon_regmap_lookup_by_phandle(dev->of_node,
1343							"mediatek,infracfg");
1344	if (IS_ERR(btcvsd->infra)) {
1345		dev_err(dev, "cannot find infra controller: %ld\n",
1346			PTR_ERR(btcvsd->infra));
1347		ret = PTR_ERR(btcvsd->infra);
1348		goto unmap_bank2_err;
1349	}
1350
1351	/* get offset */
1352	ret = of_property_read_u32_array(dev->of_node, "mediatek,offset",
1353					 offset,
1354					 ARRAY_SIZE(offset));
1355	if (ret) {
1356		dev_warn(dev, "%s(), get offset fail, ret %d\n", __func__, ret);
1357		goto unmap_bank2_err;
1358	}
1359	btcvsd->infra_misc_offset = offset[0];
1360	btcvsd->conn_bt_cvsd_mask = offset[1];
1361	btcvsd->cvsd_mcu_read_offset = offset[2];
1362	btcvsd->cvsd_mcu_write_offset = offset[3];
1363	btcvsd->cvsd_packet_indicator = offset[4];
1364
1365	btcvsd->bt_reg_pkt_r = btcvsd->bt_pkv_base +
1366			       btcvsd->cvsd_mcu_read_offset;
1367	btcvsd->bt_reg_pkt_w = btcvsd->bt_pkv_base +
1368			       btcvsd->cvsd_mcu_write_offset;
1369	btcvsd->bt_reg_ctl = btcvsd->bt_pkv_base +
1370			     btcvsd->cvsd_packet_indicator;
1371
1372	/* init state */
1373	mtk_btcvsd_snd_set_state(btcvsd, btcvsd->tx, BT_SCO_STATE_IDLE);
1374	mtk_btcvsd_snd_set_state(btcvsd, btcvsd->rx, BT_SCO_STATE_IDLE);
1375
1376	ret = devm_snd_soc_register_component(dev, &mtk_btcvsd_snd_platform,
1377					      NULL, 0);
1378	if (ret)
1379		goto unmap_bank2_err;
1380
1381	return 0;
1382
1383unmap_bank2_err:
1384	iounmap(btcvsd->bt_sram_bank2_base);
1385unmap_pkv_err:
1386	iounmap(btcvsd->bt_pkv_base);
1387	return ret;
1388}
1389
1390static int mtk_btcvsd_snd_remove(struct platform_device *pdev)
1391{
1392	struct mtk_btcvsd_snd *btcvsd = dev_get_drvdata(&pdev->dev);
1393
1394	iounmap(btcvsd->bt_pkv_base);
1395	iounmap(btcvsd->bt_sram_bank2_base);
1396	return 0;
1397}
1398
1399static const struct of_device_id mtk_btcvsd_snd_dt_match[] = {
1400	{ .compatible = "mediatek,mtk-btcvsd-snd", },
1401	{},
1402};
1403MODULE_DEVICE_TABLE(of, mtk_btcvsd_snd_dt_match);
1404
1405static struct platform_driver mtk_btcvsd_snd_driver = {
1406	.driver = {
1407		.name = "mtk-btcvsd-snd",
1408		.of_match_table = mtk_btcvsd_snd_dt_match,
1409	},
1410	.probe = mtk_btcvsd_snd_probe,
1411	.remove = mtk_btcvsd_snd_remove,
1412};
1413
1414module_platform_driver(mtk_btcvsd_snd_driver);
1415
1416MODULE_DESCRIPTION("Mediatek ALSA BT SCO CVSD/MSBC Driver");
1417MODULE_AUTHOR("KaiChieh Chuang <kaichieh.chuang@mediatek.com>");
1418MODULE_LICENSE("GPL v2");
1419