cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

mtk-btcvsd.c (39521B)


      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, 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->tx);
    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		mtk_btcvsd_snd_write(bt, buf, count);
   1042	else
   1043		mtk_btcvsd_snd_read(bt, buf, count);
   1044
   1045	return 0;
   1046}
   1047
   1048/* kcontrol */
   1049static const char *const btsco_band_str[] = {"NB", "WB"};
   1050
   1051static const struct soc_enum btcvsd_enum[] = {
   1052	SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(btsco_band_str), btsco_band_str),
   1053};
   1054
   1055static int btcvsd_band_get(struct snd_kcontrol *kcontrol,
   1056			   struct snd_ctl_elem_value *ucontrol)
   1057{
   1058	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
   1059	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(cmpnt);
   1060
   1061	ucontrol->value.integer.value[0] = bt->band;
   1062	return 0;
   1063}
   1064
   1065static int btcvsd_band_set(struct snd_kcontrol *kcontrol,
   1066			   struct snd_ctl_elem_value *ucontrol)
   1067{
   1068	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
   1069	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(cmpnt);
   1070	struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
   1071
   1072	if (ucontrol->value.enumerated.item[0] >= e->items)
   1073		return -EINVAL;
   1074
   1075	bt->band = ucontrol->value.integer.value[0];
   1076	dev_dbg(bt->dev, "%s(), band %d\n", __func__, bt->band);
   1077	return 0;
   1078}
   1079
   1080static int btcvsd_loopback_get(struct snd_kcontrol *kcontrol,
   1081			       struct snd_ctl_elem_value *ucontrol)
   1082{
   1083	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
   1084	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(cmpnt);
   1085	bool lpbk_en = bt->tx->state == BT_SCO_STATE_LOOPBACK;
   1086
   1087	ucontrol->value.integer.value[0] = lpbk_en;
   1088	return 0;
   1089}
   1090
   1091static int btcvsd_loopback_set(struct snd_kcontrol *kcontrol,
   1092			       struct snd_ctl_elem_value *ucontrol)
   1093{
   1094	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
   1095	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(cmpnt);
   1096
   1097	if (ucontrol->value.integer.value[0]) {
   1098		mtk_btcvsd_snd_set_state(bt, bt->tx, BT_SCO_STATE_LOOPBACK);
   1099		mtk_btcvsd_snd_set_state(bt, bt->rx, BT_SCO_STATE_LOOPBACK);
   1100	} else {
   1101		mtk_btcvsd_snd_set_state(bt, bt->tx, BT_SCO_STATE_RUNNING);
   1102		mtk_btcvsd_snd_set_state(bt, bt->rx, BT_SCO_STATE_RUNNING);
   1103	}
   1104	return 0;
   1105}
   1106
   1107static int btcvsd_tx_mute_get(struct snd_kcontrol *kcontrol,
   1108			      struct snd_ctl_elem_value *ucontrol)
   1109{
   1110	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
   1111	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(cmpnt);
   1112
   1113	if (!bt->tx) {
   1114		ucontrol->value.integer.value[0] = 0;
   1115		return 0;
   1116	}
   1117
   1118	ucontrol->value.integer.value[0] = bt->tx->mute;
   1119	return 0;
   1120}
   1121
   1122static int btcvsd_tx_mute_set(struct snd_kcontrol *kcontrol,
   1123			      struct snd_ctl_elem_value *ucontrol)
   1124{
   1125	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
   1126	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(cmpnt);
   1127
   1128	if (!bt->tx)
   1129		return 0;
   1130
   1131	bt->tx->mute = ucontrol->value.integer.value[0];
   1132	return 0;
   1133}
   1134
   1135static int btcvsd_rx_irq_received_get(struct snd_kcontrol *kcontrol,
   1136				      struct snd_ctl_elem_value *ucontrol)
   1137{
   1138	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
   1139	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(cmpnt);
   1140
   1141	if (!bt->rx)
   1142		return 0;
   1143
   1144	ucontrol->value.integer.value[0] = bt->rx->rw_cnt ? 1 : 0;
   1145	return 0;
   1146}
   1147
   1148static int btcvsd_rx_timeout_get(struct snd_kcontrol *kcontrol,
   1149				 struct snd_ctl_elem_value *ucontrol)
   1150{
   1151	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
   1152	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(cmpnt);
   1153
   1154	if (!bt->rx)
   1155		return 0;
   1156
   1157	ucontrol->value.integer.value[0] = bt->rx->timeout;
   1158	bt->rx->timeout = 0;
   1159	return 0;
   1160}
   1161
   1162static int btcvsd_rx_timestamp_get(struct snd_kcontrol *kcontrol,
   1163				   unsigned int __user *data, unsigned int size)
   1164{
   1165	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
   1166	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(cmpnt);
   1167	int ret = 0;
   1168	struct mtk_btcvsd_snd_time_buffer_info time_buffer_info_rx;
   1169
   1170	if (size > sizeof(struct mtk_btcvsd_snd_time_buffer_info))
   1171		return -EINVAL;
   1172
   1173	get_rx_time_stamp(bt, &time_buffer_info_rx);
   1174
   1175	dev_dbg(bt->dev, "%s(), time_stamp_us %llu, data_count_equi_time %llu",
   1176		__func__,
   1177		time_buffer_info_rx.time_stamp_us,
   1178		time_buffer_info_rx.data_count_equi_time);
   1179
   1180	if (copy_to_user(data, &time_buffer_info_rx,
   1181			 sizeof(struct mtk_btcvsd_snd_time_buffer_info))) {
   1182		dev_warn(bt->dev, "%s(), copy_to_user fail", __func__);
   1183		ret = -EFAULT;
   1184	}
   1185
   1186	return ret;
   1187}
   1188
   1189static int btcvsd_tx_irq_received_get(struct snd_kcontrol *kcontrol,
   1190				      struct snd_ctl_elem_value *ucontrol)
   1191{
   1192	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
   1193	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(cmpnt);
   1194
   1195	if (!bt->tx)
   1196		return 0;
   1197
   1198	ucontrol->value.integer.value[0] = bt->tx->rw_cnt ? 1 : 0;
   1199	return 0;
   1200}
   1201
   1202static int btcvsd_tx_timeout_get(struct snd_kcontrol *kcontrol,
   1203				 struct snd_ctl_elem_value *ucontrol)
   1204{
   1205	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
   1206	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(cmpnt);
   1207
   1208	ucontrol->value.integer.value[0] = bt->tx->timeout;
   1209	return 0;
   1210}
   1211
   1212static int btcvsd_tx_timestamp_get(struct snd_kcontrol *kcontrol,
   1213				   unsigned int __user *data, unsigned int size)
   1214{
   1215	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
   1216	struct mtk_btcvsd_snd *bt = snd_soc_component_get_drvdata(cmpnt);
   1217	int ret = 0;
   1218	struct mtk_btcvsd_snd_time_buffer_info time_buffer_info_tx;
   1219
   1220	if (size > sizeof(struct mtk_btcvsd_snd_time_buffer_info))
   1221		return -EINVAL;
   1222
   1223	get_tx_time_stamp(bt, &time_buffer_info_tx);
   1224
   1225	dev_dbg(bt->dev, "%s(), time_stamp_us %llu, data_count_equi_time %llu",
   1226		__func__,
   1227		time_buffer_info_tx.time_stamp_us,
   1228		time_buffer_info_tx.data_count_equi_time);
   1229
   1230	if (copy_to_user(data, &time_buffer_info_tx,
   1231			 sizeof(struct mtk_btcvsd_snd_time_buffer_info))) {
   1232		dev_warn(bt->dev, "%s(), copy_to_user fail", __func__);
   1233		ret = -EFAULT;
   1234	}
   1235
   1236	return ret;
   1237}
   1238
   1239static const struct snd_kcontrol_new mtk_btcvsd_snd_controls[] = {
   1240	SOC_ENUM_EXT("BTCVSD Band", btcvsd_enum[0],
   1241		     btcvsd_band_get, btcvsd_band_set),
   1242	SOC_SINGLE_BOOL_EXT("BTCVSD Loopback Switch", 0,
   1243			    btcvsd_loopback_get, btcvsd_loopback_set),
   1244	SOC_SINGLE_BOOL_EXT("BTCVSD Tx Mute Switch", 0,
   1245			    btcvsd_tx_mute_get, btcvsd_tx_mute_set),
   1246	SOC_SINGLE_BOOL_EXT("BTCVSD Tx Irq Received Switch", 0,
   1247			    btcvsd_tx_irq_received_get, NULL),
   1248	SOC_SINGLE_BOOL_EXT("BTCVSD Tx Timeout Switch", 0,
   1249			    btcvsd_tx_timeout_get, NULL),
   1250	SOC_SINGLE_BOOL_EXT("BTCVSD Rx Irq Received Switch", 0,
   1251			    btcvsd_rx_irq_received_get, NULL),
   1252	SOC_SINGLE_BOOL_EXT("BTCVSD Rx Timeout Switch", 0,
   1253			    btcvsd_rx_timeout_get, NULL),
   1254	SND_SOC_BYTES_TLV("BTCVSD Rx Timestamp",
   1255			  sizeof(struct mtk_btcvsd_snd_time_buffer_info),
   1256			  btcvsd_rx_timestamp_get, NULL),
   1257	SND_SOC_BYTES_TLV("BTCVSD Tx Timestamp",
   1258			  sizeof(struct mtk_btcvsd_snd_time_buffer_info),
   1259			  btcvsd_tx_timestamp_get, NULL),
   1260};
   1261
   1262static int mtk_btcvsd_snd_component_probe(struct snd_soc_component *component)
   1263{
   1264	return snd_soc_add_component_controls(component,
   1265		mtk_btcvsd_snd_controls,
   1266		ARRAY_SIZE(mtk_btcvsd_snd_controls));
   1267}
   1268
   1269static const struct snd_soc_component_driver mtk_btcvsd_snd_platform = {
   1270	.name		= BTCVSD_SND_NAME,
   1271	.probe		= mtk_btcvsd_snd_component_probe,
   1272	.open		= mtk_pcm_btcvsd_open,
   1273	.close		= mtk_pcm_btcvsd_close,
   1274	.hw_params	= mtk_pcm_btcvsd_hw_params,
   1275	.hw_free	= mtk_pcm_btcvsd_hw_free,
   1276	.prepare	= mtk_pcm_btcvsd_prepare,
   1277	.trigger	= mtk_pcm_btcvsd_trigger,
   1278	.pointer	= mtk_pcm_btcvsd_pointer,
   1279	.copy_user	= mtk_pcm_btcvsd_copy,
   1280};
   1281
   1282static int mtk_btcvsd_snd_probe(struct platform_device *pdev)
   1283{
   1284	int ret;
   1285	int irq_id;
   1286	u32 offset[5] = {0, 0, 0, 0, 0};
   1287	struct mtk_btcvsd_snd *btcvsd;
   1288	struct device *dev = &pdev->dev;
   1289
   1290	/* init btcvsd private data */
   1291	btcvsd = devm_kzalloc(dev, sizeof(*btcvsd), GFP_KERNEL);
   1292	if (!btcvsd)
   1293		return -ENOMEM;
   1294	platform_set_drvdata(pdev, btcvsd);
   1295	btcvsd->dev = dev;
   1296
   1297	/* init tx/rx */
   1298	btcvsd->rx = devm_kzalloc(btcvsd->dev, sizeof(*btcvsd->rx), GFP_KERNEL);
   1299	if (!btcvsd->rx)
   1300		return -ENOMEM;
   1301
   1302	btcvsd->tx = devm_kzalloc(btcvsd->dev, sizeof(*btcvsd->tx), GFP_KERNEL);
   1303	if (!btcvsd->tx)
   1304		return -ENOMEM;
   1305
   1306	spin_lock_init(&btcvsd->tx_lock);
   1307	spin_lock_init(&btcvsd->rx_lock);
   1308
   1309	init_waitqueue_head(&btcvsd->tx_wait);
   1310	init_waitqueue_head(&btcvsd->rx_wait);
   1311
   1312	mtk_btcvsd_snd_tx_init(btcvsd);
   1313	mtk_btcvsd_snd_rx_init(btcvsd);
   1314
   1315	/* irq */
   1316	irq_id = platform_get_irq(pdev, 0);
   1317	if (irq_id <= 0)
   1318		return irq_id < 0 ? irq_id : -ENXIO;
   1319
   1320	ret = devm_request_irq(dev, irq_id, mtk_btcvsd_snd_irq_handler,
   1321			       IRQF_TRIGGER_LOW, "BTCVSD_ISR_Handle",
   1322			       (void *)btcvsd);
   1323	if (ret) {
   1324		dev_err(dev, "could not request_irq for BTCVSD_ISR_Handle\n");
   1325		return ret;
   1326	}
   1327
   1328	btcvsd->irq_id = irq_id;
   1329
   1330	/* iomap */
   1331	btcvsd->bt_pkv_base = of_iomap(dev->of_node, 0);
   1332	if (!btcvsd->bt_pkv_base) {
   1333		dev_err(dev, "iomap bt_pkv_base fail\n");
   1334		return -EIO;
   1335	}
   1336
   1337	btcvsd->bt_sram_bank2_base = of_iomap(dev->of_node, 1);
   1338	if (!btcvsd->bt_sram_bank2_base) {
   1339		dev_err(dev, "iomap bt_sram_bank2_base fail\n");
   1340		ret = -EIO;
   1341		goto unmap_pkv_err;
   1342	}
   1343
   1344	btcvsd->infra = syscon_regmap_lookup_by_phandle(dev->of_node,
   1345							"mediatek,infracfg");
   1346	if (IS_ERR(btcvsd->infra)) {
   1347		dev_err(dev, "cannot find infra controller: %ld\n",
   1348			PTR_ERR(btcvsd->infra));
   1349		ret = PTR_ERR(btcvsd->infra);
   1350		goto unmap_bank2_err;
   1351	}
   1352
   1353	/* get offset */
   1354	ret = of_property_read_u32_array(dev->of_node, "mediatek,offset",
   1355					 offset,
   1356					 ARRAY_SIZE(offset));
   1357	if (ret) {
   1358		dev_warn(dev, "%s(), get offset fail, ret %d\n", __func__, ret);
   1359		goto unmap_bank2_err;
   1360	}
   1361	btcvsd->infra_misc_offset = offset[0];
   1362	btcvsd->conn_bt_cvsd_mask = offset[1];
   1363	btcvsd->cvsd_mcu_read_offset = offset[2];
   1364	btcvsd->cvsd_mcu_write_offset = offset[3];
   1365	btcvsd->cvsd_packet_indicator = offset[4];
   1366
   1367	btcvsd->bt_reg_pkt_r = btcvsd->bt_pkv_base +
   1368			       btcvsd->cvsd_mcu_read_offset;
   1369	btcvsd->bt_reg_pkt_w = btcvsd->bt_pkv_base +
   1370			       btcvsd->cvsd_mcu_write_offset;
   1371	btcvsd->bt_reg_ctl = btcvsd->bt_pkv_base +
   1372			     btcvsd->cvsd_packet_indicator;
   1373
   1374	/* init state */
   1375	mtk_btcvsd_snd_set_state(btcvsd, btcvsd->tx, BT_SCO_STATE_IDLE);
   1376	mtk_btcvsd_snd_set_state(btcvsd, btcvsd->rx, BT_SCO_STATE_IDLE);
   1377
   1378	ret = devm_snd_soc_register_component(dev, &mtk_btcvsd_snd_platform,
   1379					      NULL, 0);
   1380	if (ret)
   1381		goto unmap_bank2_err;
   1382
   1383	return 0;
   1384
   1385unmap_bank2_err:
   1386	iounmap(btcvsd->bt_sram_bank2_base);
   1387unmap_pkv_err:
   1388	iounmap(btcvsd->bt_pkv_base);
   1389	return ret;
   1390}
   1391
   1392static int mtk_btcvsd_snd_remove(struct platform_device *pdev)
   1393{
   1394	struct mtk_btcvsd_snd *btcvsd = dev_get_drvdata(&pdev->dev);
   1395
   1396	iounmap(btcvsd->bt_pkv_base);
   1397	iounmap(btcvsd->bt_sram_bank2_base);
   1398	return 0;
   1399}
   1400
   1401static const struct of_device_id mtk_btcvsd_snd_dt_match[] = {
   1402	{ .compatible = "mediatek,mtk-btcvsd-snd", },
   1403	{},
   1404};
   1405MODULE_DEVICE_TABLE(of, mtk_btcvsd_snd_dt_match);
   1406
   1407static struct platform_driver mtk_btcvsd_snd_driver = {
   1408	.driver = {
   1409		.name = "mtk-btcvsd-snd",
   1410		.of_match_table = mtk_btcvsd_snd_dt_match,
   1411	},
   1412	.probe = mtk_btcvsd_snd_probe,
   1413	.remove = mtk_btcvsd_snd_remove,
   1414};
   1415
   1416module_platform_driver(mtk_btcvsd_snd_driver);
   1417
   1418MODULE_DESCRIPTION("Mediatek ALSA BT SCO CVSD/MSBC Driver");
   1419MODULE_AUTHOR("KaiChieh Chuang <kaichieh.chuang@mediatek.com>");
   1420MODULE_LICENSE("GPL v2");