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