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				   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
776static 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
850static 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 */
860static 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
871static 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
893static 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
906static 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
924static 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
935static 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
947static 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
977static 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
1026static 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 */
1040static const char *const btsco_band_str[] = {"NB", "WB"};
1041
1042static const struct soc_enum btcvsd_enum[] = {
1043	SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(btsco_band_str), btsco_band_str),
1044};
1045
1046static 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
1056static 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
1071static 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
1082static 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
1098static 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
1113static 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
1126static 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
1139static 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
1153static 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
1180static 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
1193static 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
1203static 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
1230static 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
1253static 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
1260static 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
1273static 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
1376unmap_bank2_err:
1377	iounmap(btcvsd->bt_sram_bank2_base);
1378unmap_pkv_err:
1379	iounmap(btcvsd->bt_pkv_base);
1380	return ret;
1381}
1382
1383static 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
1391static const struct of_device_id mtk_btcvsd_snd_dt_match[] = {
1392	{ .compatible = "mediatek,mtk-btcvsd-snd", },
1393	{},
1394};
1395MODULE_DEVICE_TABLE(of, mtk_btcvsd_snd_dt_match);
1396
1397static 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_new = mtk_btcvsd_snd_remove,
1404};
1405
1406module_platform_driver(mtk_btcvsd_snd_driver);
1407
1408MODULE_DESCRIPTION("Mediatek ALSA BT SCO CVSD/MSBC Driver");
1409MODULE_AUTHOR("KaiChieh Chuang <kaichieh.chuang@mediatek.com>");
1410MODULE_LICENSE("GPL v2");
1411