diff --git a/asoc/codecs/bolero/wsa-macro.c b/asoc/codecs/bolero/wsa-macro.c index 24729603ff..a01a64a0e3 100644 --- a/asoc/codecs/bolero/wsa-macro.c +++ b/asoc/codecs/bolero/wsa-macro.c @@ -1714,6 +1714,8 @@ static int wsa_macro_config_ear_spkr_gain(struct snd_soc_component *component, BOLERO_CDC_WSA_COMPANDER0_CTL7, 0x01, 0x00); snd_soc_component_update_bits(component, BOLERO_CDC_WSA_COMPANDER0_CTL3, 0x80, 0x80); + snd_soc_component_update_bits(component, + BOLERO_CDC_WSA_RX0_RX_PATH_CFG1, 0x08, 0x00); } break; case SND_SOC_DAPM_POST_PMD: @@ -1729,6 +1731,8 @@ static int wsa_macro_config_ear_spkr_gain(struct snd_soc_component *component, dev_dbg(wsa_priv->dev, "%s: Reset RX0 Volume to 0 dB\n", __func__); } + snd_soc_component_update_bits(component, + BOLERO_CDC_WSA_RX0_RX_PATH_CFG1, 0x08, 0x08); snd_soc_component_update_bits(component, BOLERO_CDC_WSA_COMPANDER0_CTL7, 0x01, 0x01); snd_soc_component_update_bits(component, diff --git a/asoc/codecs/lpass-cdc/lpass-cdc-wsa-macro.c b/asoc/codecs/lpass-cdc/lpass-cdc-wsa-macro.c index 0356b39276..d9cd5dc732 100644 --- a/asoc/codecs/lpass-cdc/lpass-cdc-wsa-macro.c +++ b/asoc/codecs/lpass-cdc/lpass-cdc-wsa-macro.c @@ -1587,8 +1587,14 @@ static int lpass_cdc_wsa_macro_enable_interpolator(struct snd_soc_dapm_widget *w lpass_cdc_wsa_macro_config_compander(component, w->shift, event); lpass_cdc_wsa_macro_config_softclip(component, w->shift, event); + if(wsa_priv->wsa_spkrrecv) + snd_soc_component_update_bits(component, + LPASS_CDC_WSA_RX0_RX_PATH_CFG1, + 0x08, 0x00); break; case SND_SOC_DAPM_POST_PMD: + snd_soc_component_update_bits(component, + LPASS_CDC_WSA_RX0_RX_PATH_CFG1, 0x08, 0x08); lpass_cdc_wsa_macro_config_compander(component, w->shift, event); lpass_cdc_wsa_macro_config_softclip(component, w->shift, event); lpass_cdc_wsa_macro_enable_prim_interpolator(component, reg, event); diff --git a/asoc/codecs/lpass-cdc/lpass-cdc-wsa2-macro.c b/asoc/codecs/lpass-cdc/lpass-cdc-wsa2-macro.c index 884c24e1d6..7095154785 100644 --- a/asoc/codecs/lpass-cdc/lpass-cdc-wsa2-macro.c +++ b/asoc/codecs/lpass-cdc/lpass-cdc-wsa2-macro.c @@ -1587,8 +1587,14 @@ static int lpass_cdc_wsa2_macro_enable_interpolator(struct snd_soc_dapm_widget * lpass_cdc_wsa2_macro_config_compander(component, w->shift, event); lpass_cdc_wsa2_macro_config_softclip(component, w->shift, event); + if(wsa2_priv->wsa_spkrrecv) + snd_soc_component_update_bits(component, + LPASS_CDC_WSA2_RX0_RX_PATH_CFG1, + 0x08, 0x00); break; case SND_SOC_DAPM_POST_PMD: + snd_soc_component_update_bits(component, + LPASS_CDC_WSA2_RX0_RX_PATH_CFG1, 0x08, 0x08); lpass_cdc_wsa2_macro_config_compander(component, w->shift, event); lpass_cdc_wsa2_macro_config_softclip(component, w->shift, event); lpass_cdc_wsa2_macro_enable_prim_interpolator(component, reg, event); diff --git a/asoc/codecs/wsa883x/wsa883x.c b/asoc/codecs/wsa883x/wsa883x.c index 5037dfdd41..551807312a 100644 --- a/asoc/codecs/wsa883x/wsa883x.c +++ b/asoc/codecs/wsa883x/wsa883x.c @@ -1041,6 +1041,8 @@ static int wsa883x_enable_swr_dac_port(struct snd_soc_dapm_widget *w, &port_id[num_port], &num_ch[num_port], &ch_mask[num_port], &ch_rate[num_port], &port_type[num_port]); + if (wsa883x->dev_mode == RECEIVER) + ch_rate[num_port] = SWR_CLK_RATE_4P8MHZ; ++num_port; if (wsa883x->comp_enable) { @@ -1113,20 +1115,32 @@ static int wsa883x_spkr_event(struct snd_soc_dapm_widget *w, dev_dbg(component->dev, "%s: %s %d\n", __func__, w->name, event); switch (event) { case SND_SOC_DAPM_POST_PMU: - swr_slvdev_datapath_control(wsa883x->swr_slave, - wsa883x->swr_slave->dev_num, - true); - /* Added delay as per HW sequence */ - usleep_range(250, 300); if (wsa883x->dev_mode == RECEIVER) { + snd_soc_component_update_bits(component, + WSA883X_CDC_PATH_MODE, + 0x02, 0x02); + snd_soc_component_update_bits(component, + WSA883X_SPKR_PWM_CLK_CTL, + 0x08, 0x08); snd_soc_component_update_bits(component, WSA883X_DRE_CTL_0, 0xF0, 0x00); } else if (wsa883x->dev_mode == SPEAKER) { + snd_soc_component_update_bits(component, + WSA883X_CDC_PATH_MODE, + 0x02, 0x00); + snd_soc_component_update_bits(component, + WSA883X_SPKR_PWM_CLK_CTL, + 0x08, 0x00); snd_soc_component_update_bits(component, WSA883X_DRE_CTL_0, 0xF0, 0x90); } + swr_slvdev_datapath_control(wsa883x->swr_slave, + wsa883x->swr_slave->dev_num, + true); + /* Added delay as per HW sequence */ + usleep_range(250, 300); snd_soc_component_update_bits(component, WSA883X_DRE_CTL_1, 0x01, 0x01); diff --git a/asoc/lahaina-port-config.h b/asoc/lahaina-port-config.h index 4ce2f25a8b..6c46afe474 100755 --- a/asoc/lahaina-port-config.h +++ b/asoc/lahaina-port-config.h @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* - * Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. + * Copyright (c) 2018-2021, The Linux Foundation. All rights reserved. */ #ifndef _LAHAINA_PORT_CONFIG @@ -27,6 +27,17 @@ static struct port_params wsa_frame_params_default[SWR_MSTR_PORT_LEN] = { {15, 10, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00}, }; +static struct port_params wsa_frame_params_receiver[SWR_MSTR_PORT_LEN] = { + {3, 1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00}, + {31, 2, 3, 0xFF, 0xFF, 0xFF, 0x1, 0xFF, 0xFF, 0x00, 0x00}, + {63, 7, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00}, + {3, 6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00}, + {31, 18, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00}, + {63, 13, 31, 0xFF, 0xFF, 0xFF, 0x1, 0xFF, 0xFF, 0x00, 0x00}, + {15, 3, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00}, + {15, 10, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00}, +}; + static struct port_params rx_frame_params_dsd[SWR_MSTR_PORT_LEN] = { {3, 0, 0, 0xFF, 0xFF, 1, 0xFF, 0xFF, 1, 0x00, 0x00}, {31, 0, 0, 3, 6, 7, 0, 0xFF, 0, 0x00, 0x00}, @@ -60,6 +71,7 @@ static struct swr_mstr_port_map sm_port_map[] = { {RX_MACRO, SWR_UC1, rx_frame_params_dsd}, {RX_MACRO, SWR_UC2, rx_frame_params_44p1KHz}, {WSA_MACRO, SWR_UC0, wsa_frame_params_default}, + {WSA_MACRO, SWR_UC1, wsa_frame_params_receiver}, }; static struct swr_mstr_port_map sm_port_map_shima[] = { @@ -67,6 +79,7 @@ static struct swr_mstr_port_map sm_port_map_shima[] = { {RX_MACRO, SWR_UC1, rx_frame_params_dsd}, {RX_MACRO, SWR_UC2, rx_frame_params_44p1KHz}, {WSA_MACRO, SWR_UC0, wsa_frame_params_default}, + {WSA_MACRO, SWR_UC1, wsa_frame_params_receiver}, }; #endif /* _LAHAINA_PORT_CONFIG */ diff --git a/asoc/waipio-port-config.h b/asoc/waipio-port-config.h index 6e4798ea22..61fc1719ea 100644 --- a/asoc/waipio-port-config.h +++ b/asoc/waipio-port-config.h @@ -26,6 +26,17 @@ static struct port_params wsa_frame_params_default[SWR_MSTR_PORT_LEN] = { {15, 10, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00}, }; +static struct port_params wsa_frame_params_receiver[SWR_MSTR_PORT_LEN] = { + {3, 1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00}, + {31, 2, 3, 0xFF, 0xFF, 0xFF, 0x1, 0xFF, 0xFF, 0x00, 0x00}, + {63, 7, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00}, + {3, 6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00}, + {31, 18, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00}, + {63, 13, 31, 0xFF, 0xFF, 0xFF, 0x1, 0xFF, 0xFF, 0x00, 0x00}, + {15, 3, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00}, + {15, 10, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00}, +}; + static struct port_params rx_frame_params_dsd[SWR_MSTR_PORT_LEN] = { {3, 0, 0, 0xFF, 0xFF, 1, 0xFF, 0xFF, 1, 0x00, 0x00}, {31, 0, 0, 3, 6, 7, 0, 0xFF, 0, 0x00, 0x02}, @@ -59,7 +70,9 @@ static struct swr_mstr_port_map sm_port_map[] = { {RX_MACRO, SWR_UC1, rx_frame_params_dsd}, {RX_MACRO, SWR_UC2, rx_frame_params_44p1KHz}, {WSA_MACRO, SWR_UC0, wsa_frame_params_default}, + {WSA_MACRO, SWR_UC1, wsa_frame_params_receiver}, {WSA2_MACRO, SWR_UC0, wsa_frame_params_default}, + {WSA2_MACRO, SWR_UC1, wsa_frame_params_receiver}, }; #endif /* _WAIPIO_PORT_CONFIG */ diff --git a/soc/swr-mstr-ctrl.c b/soc/swr-mstr-ctrl.c index 0a0963ea58..1d68428f60 100644 --- a/soc/swr-mstr-ctrl.c +++ b/soc/swr-mstr-ctrl.c @@ -40,6 +40,8 @@ #define SWRM_DSD_PARAMS_PORT 4 +#define SWRM_SPK_DAC_PORT_RECEIVER 0 + #define SWR_BROADCAST_CMD_ID 0x0F #define SWR_DEV_ID_MASK 0xFFFFFFFFFFFF #define SWR_REG_VAL_PACK(data, dev, id, reg) \ @@ -748,6 +750,12 @@ static int swrm_get_port_config(struct swr_mstr_ctrl *swrm) (swrm->bus_clk == SWR_CLK_RATE_11P2896MHZ)) usecase = 2; + if ((swrm->master_id == MASTER_ID_WSA) && + swrm->mport_cfg[SWRM_SPK_DAC_PORT_RECEIVER].port_en && + swrm->mport_cfg[SWRM_SPK_DAC_PORT_RECEIVER].ch_rate == + SWR_CLK_RATE_4P8MHZ) + usecase = 1; + params = swrm->port_param[usecase]; copy_port_tables(swrm, params); @@ -1522,8 +1530,7 @@ static void swrm_copy_data_port_config(struct swr_master *master, u8 bank) port_req->dev_num, 0x00, SWRS_DP_BLOCK_CONTROL_1(slv_id)); } - if (port_req->blk_pack_mode != SWR_INVALID_PARAM - && swrm->master_id != MASTER_ID_WSA) { + if (port_req->blk_pack_mode != SWR_INVALID_PARAM) { reg[len] = SWRM_CMD_FIFO_WR_CMD; val[len++] = SWR_REG_VAL_PACK( @@ -1858,6 +1865,15 @@ static int swrm_connect_port(struct swr_master *master, swrm->dynamic_port_map_supported) { mport->ch_rate += portinfo->ch_rate[i]; swrm_update_bus_clk(swrm); + } else { + /* + * Fallback to assign slave port ch_rate + * as master port uses same ch_rate as slave + * unlike soundwire TX master ports where + * unified ports and multiple slave port + * channels can attach to same master port + */ + mport->ch_rate = portinfo->ch_rate[i]; } } master->num_port += portinfo->num_port;