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