On 7/25/23 04:34, Wesley Cheng wrote: > Currently, only the index to the USB SND card array is passed to the USB > backend. Pass through more information, specifically the USB SND card > number and the number of PCM devices available. The USB backend should > know about which sound resources are being shared between the ASoC and USB > SND paths. This can be utilized to properly select and maintain the > offloading devices. > > Signed-off-by: Wesley Cheng <quic_wcheng@xxxxxxxxxxx> > --- > include/sound/soc-usb.h | 9 +++++---- > sound/soc/qcom/qdsp6/q6usb.c | 20 ++++++++++++++++++-- > sound/soc/soc-usb.c | 12 +++++++----- > sound/usb/qcom/qc_audio_offload.c | 9 +++++---- > 4 files changed, 35 insertions(+), 15 deletions(-) > > diff --git a/include/sound/soc-usb.h b/include/sound/soc-usb.h > index 71e6e75e600a..606128332044 100644 > --- a/include/sound/soc-usb.h > +++ b/include/sound/soc-usb.h > @@ -19,20 +19,21 @@ struct snd_soc_usb { > struct device *dev; > struct snd_soc_component *component; > int (*connection_status_cb)(struct snd_soc_usb *usb, int card_idx, > - int connected); > + int chip_idx, int num_pcm, int connected); I don't know what 'chip_idx' is. The 'num_pcm' sounds problematic if there are different devices for playback and capture. I would guess this is for playback only, but this doesn't scale. > void *priv_data; > }; > +struct q6usb_status { > + unsigned int num_pcm; > + unsigned int chip_index; > + unsigned int pcm_index; > +}; > + > struct q6usb_port_data { > struct q6afe_usb_cfg usb_cfg; > struct snd_soc_usb *usb; > struct q6usb_offload priv; > + unsigned long available_card_slot; what is a card slot? > + struct q6usb_status status[SNDRV_CARDS]; > int active_idx; > }; > > @@ -97,7 +105,7 @@ static int q6usb_audio_ports_of_xlate_dai_name(struct snd_soc_component *compone > } > > static int q6usb_alsa_connection_cb(struct snd_soc_usb *usb, int card_idx, > - int connected) > + int chip_idx, int num_pcm, int connected) > { > struct snd_soc_dapm_context *dapm; > struct q6usb_port_data *data; > @@ -109,8 +117,16 @@ static int q6usb_alsa_connection_cb(struct snd_soc_usb *usb, int card_idx, > snd_soc_dapm_enable_pin(dapm, "USB_RX_BE"); > /* We only track the latest USB headset plugged in */ > data->active_idx = card_idx; > + > + set_bit(card_idx, &data->available_card_slot); > + data->status[card_idx].num_pcm = num_pcm; > + data->status[card_idx].chip_index = chip_idx; > } else { > - snd_soc_dapm_disable_pin(dapm, "USB_RX_BE"); > + clear_bit(card_idx, &data->available_card_slot); > + data->status[card_idx].num_pcm = 0; > + data->status[card_idx].chip_index = 0; > + if (!data->available_card_slot) > + snd_soc_dapm_disable_pin(dapm, "USB_RX_BE"); not able to follow what this does, this patch is rather unclear and lacks comments. > } > snd_soc_dapm_sync(dapm);