From ce3ab0ecaea52cef334979481360401707d2b349 Mon Sep 17 00:00:00 2001 From: gaoxiang Date: Wed, 27 Sep 2023 18:52:29 +0800 Subject: [PATCH] bt: Unset multi channel bit for 44.1/88.2Khz A2DP Rx When opening port for 44.1/88.2KHz A2DP Rx, explicitly unset multi channel bit. This is required because for SCO/A2DP with other sample rates, we set the multi channel bit. The bit remains set even after the channel is removed and until we expliciltly unset again. Change-Id: I76d7a46b107baf811657b7ade307a7dd60a21c4a Signed-off-by: gaoxiang --- drivers/bluetooth/btfm_slim_slave.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/drivers/bluetooth/btfm_slim_slave.c b/drivers/bluetooth/btfm_slim_slave.c index f02e31950093..25f2774b65b7 100644 --- a/drivers/bluetooth/btfm_slim_slave.c +++ b/drivers/bluetooth/btfm_slim_slave.c @@ -81,14 +81,12 @@ int btfm_slim_slave_enable_port(struct btfmslim *btfmslim, uint8_t port_num, uint8_t reg_val = 0, en; uint8_t rxport_num = 0; uint16_t reg; + uint8_t prev_reg_val = 0; BTFMSLIM_DBG("port(%d) enable(%d)", port_num, enable); if (rxport) { BTFMSLIM_DBG("sample rate is %d", btfmslim->sample_rate); - if (enable && - btfmslim->sample_rate != 44100 && - btfmslim->sample_rate != 88200) { - BTFMSLIM_DBG("setting multichannel bit"); + if (enable) { /* For SCO Rx, A2DP Rx other than 44.1 and 88.2Khz */ if (port_num < 24) { rxport_num = port_num - 16; @@ -102,6 +100,21 @@ int btfm_slim_slave_enable_port(struct btfmslim *btfmslim, uint8_t port_num, rxport_num); } + if (btfmslim->sample_rate == 44100 || + btfmslim->sample_rate == 88200) { + BTFMSLIM_DBG("unsetting multichannel bit"); + ret = btfm_slim_read(btfmslim, reg, 1, + &prev_reg_val, IFD); + if (ret < 0) { + BTFMSLIM_ERR("error %d reading", ret); + prev_reg_val = 0; + } + BTFMSLIM_DBG("prev_reg_val (%d) from reg(%x)", + prev_reg_val, reg); + reg_val = prev_reg_val & ~reg_val; + } else + BTFMSLIM_DBG("setting multichannel bit"); + BTFMSLIM_DBG("writing reg_val (%d) to reg(%x)", reg_val, reg); ret = btfm_slim_write(btfmslim, reg, 1, ®_val, IFD);