mirror of
https://github.com/edk2-porting/linux-next.git
synced 2025-01-08 05:34:29 +08:00
ASoC/SoundWire: improve suspend flows and use set_stream() instead of set_tdm_slots() for HDAudio
Merge series from Bard Liao <yung-chuan.liao@linux.intel.com>: This series contains three topics. 1. SoundWire: Intel: remove pdm support 2. ASoC/SoundWire: dai: expand 'stream' concept beyond SoundWire 3. ASoC/SOF/SoundWire: fix suspend-resume on pause with dynamic pipelines The topics are independent but the changes are dependent. So please allow me to send them in one series.
This commit is contained in:
commit
10674ca9ea
@ -1178,9 +1178,6 @@ int sdw_cdns_pdi_init(struct sdw_cdns *cdns,
|
||||
cdns->pcm.num_bd = config.pcm_bd;
|
||||
cdns->pcm.num_in = config.pcm_in;
|
||||
cdns->pcm.num_out = config.pcm_out;
|
||||
cdns->pdm.num_bd = config.pdm_bd;
|
||||
cdns->pdm.num_in = config.pdm_in;
|
||||
cdns->pdm.num_out = config.pdm_out;
|
||||
|
||||
/* Allocate PDIs for PCMs */
|
||||
stream = &cdns->pcm;
|
||||
@ -1211,32 +1208,6 @@ int sdw_cdns_pdi_init(struct sdw_cdns *cdns,
|
||||
stream->num_pdi = stream->num_bd + stream->num_in + stream->num_out;
|
||||
cdns->num_ports = stream->num_pdi;
|
||||
|
||||
/* Allocate PDIs for PDMs */
|
||||
stream = &cdns->pdm;
|
||||
ret = cdns_allocate_pdi(cdns, &stream->bd,
|
||||
stream->num_bd, offset);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
offset += stream->num_bd;
|
||||
|
||||
ret = cdns_allocate_pdi(cdns, &stream->in,
|
||||
stream->num_in, offset);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
offset += stream->num_in;
|
||||
|
||||
ret = cdns_allocate_pdi(cdns, &stream->out,
|
||||
stream->num_out, offset);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Update total number of PDM PDIs */
|
||||
stream->num_pdi = stream->num_bd + stream->num_in + stream->num_out;
|
||||
cdns->num_ports += stream->num_pdi;
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(sdw_cdns_pdi_init);
|
||||
@ -1681,7 +1652,7 @@ int sdw_cdns_probe(struct sdw_cdns *cdns)
|
||||
EXPORT_SYMBOL(sdw_cdns_probe);
|
||||
|
||||
int cdns_set_sdw_stream(struct snd_soc_dai *dai,
|
||||
void *stream, bool pcm, int direction)
|
||||
void *stream, int direction)
|
||||
{
|
||||
struct sdw_cdns *cdns = snd_soc_dai_get_drvdata(dai);
|
||||
struct sdw_cdns_dma_data *dma;
|
||||
@ -1705,10 +1676,7 @@ int cdns_set_sdw_stream(struct snd_soc_dai *dai,
|
||||
if (!dma)
|
||||
return -ENOMEM;
|
||||
|
||||
if (pcm)
|
||||
dma->stream_type = SDW_STREAM_PCM;
|
||||
else
|
||||
dma->stream_type = SDW_STREAM_PDM;
|
||||
dma->stream_type = SDW_STREAM_PCM;
|
||||
|
||||
dma->bus = &cdns->bus;
|
||||
dma->link_id = cdns->instance;
|
||||
|
@ -17,7 +17,7 @@
|
||||
* @h_ch_num: high channel for PDI
|
||||
* @ch_count: total channel count for PDI
|
||||
* @dir: data direction
|
||||
* @type: stream type, PDM or PCM
|
||||
* @type: stream type, (only PCM supported)
|
||||
*/
|
||||
struct sdw_cdns_pdi {
|
||||
int num;
|
||||
@ -62,17 +62,11 @@ struct sdw_cdns_streams {
|
||||
* @pcm_bd: number of bidirectional PCM streams supported
|
||||
* @pcm_in: number of input PCM streams supported
|
||||
* @pcm_out: number of output PCM streams supported
|
||||
* @pdm_bd: number of bidirectional PDM streams supported
|
||||
* @pdm_in: number of input PDM streams supported
|
||||
* @pdm_out: number of output PDM streams supported
|
||||
*/
|
||||
struct sdw_cdns_stream_config {
|
||||
unsigned int pcm_bd;
|
||||
unsigned int pcm_in;
|
||||
unsigned int pcm_out;
|
||||
unsigned int pdm_bd;
|
||||
unsigned int pdm_in;
|
||||
unsigned int pdm_out;
|
||||
};
|
||||
|
||||
/**
|
||||
@ -86,6 +80,7 @@ struct sdw_cdns_stream_config {
|
||||
* @link_id: Master link id
|
||||
* @hw_params: hw_params to be applied in .prepare step
|
||||
* @suspended: status set when suspended, to be used in .prepare
|
||||
* @paused: status set in .trigger, to be used in suspend
|
||||
*/
|
||||
struct sdw_cdns_dma_data {
|
||||
char *name;
|
||||
@ -96,6 +91,7 @@ struct sdw_cdns_dma_data {
|
||||
int link_id;
|
||||
struct snd_pcm_hw_params *hw_params;
|
||||
bool suspended;
|
||||
bool paused;
|
||||
};
|
||||
|
||||
/**
|
||||
@ -109,7 +105,6 @@ struct sdw_cdns_dma_data {
|
||||
* @ports: Data ports
|
||||
* @num_ports: Total number of data ports
|
||||
* @pcm: PCM streams
|
||||
* @pdm: PDM streams
|
||||
* @registers: Cadence registers
|
||||
* @link_up: Link status
|
||||
* @msg_count: Messages sent on bus
|
||||
@ -127,7 +122,6 @@ struct sdw_cdns {
|
||||
int num_ports;
|
||||
|
||||
struct sdw_cdns_streams pcm;
|
||||
struct sdw_cdns_streams pdm;
|
||||
|
||||
int pdi_loopback_source;
|
||||
int pdi_loopback_target;
|
||||
@ -186,7 +180,7 @@ cdns_xfer_msg_defer(struct sdw_bus *bus,
|
||||
int cdns_bus_conf(struct sdw_bus *bus, struct sdw_bus_params *params);
|
||||
|
||||
int cdns_set_sdw_stream(struct snd_soc_dai *dai,
|
||||
void *stream, bool pcm, int direction);
|
||||
void *stream, int direction);
|
||||
|
||||
void sdw_cdns_check_self_clearing_bits(struct sdw_cdns *cdns, const char *string,
|
||||
bool initial_delay, int reset_iterations);
|
||||
|
@ -564,7 +564,7 @@ static void intel_pdi_init(struct sdw_intel *sdw,
|
||||
{
|
||||
void __iomem *shim = sdw->link_res->shim;
|
||||
unsigned int link_id = sdw->instance;
|
||||
int pcm_cap, pdm_cap;
|
||||
int pcm_cap;
|
||||
|
||||
/* PCM Stream Capability */
|
||||
pcm_cap = intel_readw(shim, SDW_SHIM_PCMSCAP(link_id));
|
||||
@ -575,41 +575,25 @@ static void intel_pdi_init(struct sdw_intel *sdw,
|
||||
|
||||
dev_dbg(sdw->cdns.dev, "PCM cap bd:%d in:%d out:%d\n",
|
||||
config->pcm_bd, config->pcm_in, config->pcm_out);
|
||||
|
||||
/* PDM Stream Capability */
|
||||
pdm_cap = intel_readw(shim, SDW_SHIM_PDMSCAP(link_id));
|
||||
|
||||
config->pdm_bd = FIELD_GET(SDW_SHIM_PDMSCAP_BSS, pdm_cap);
|
||||
config->pdm_in = FIELD_GET(SDW_SHIM_PDMSCAP_ISS, pdm_cap);
|
||||
config->pdm_out = FIELD_GET(SDW_SHIM_PDMSCAP_OSS, pdm_cap);
|
||||
|
||||
dev_dbg(sdw->cdns.dev, "PDM cap bd:%d in:%d out:%d\n",
|
||||
config->pdm_bd, config->pdm_in, config->pdm_out);
|
||||
}
|
||||
|
||||
static int
|
||||
intel_pdi_get_ch_cap(struct sdw_intel *sdw, unsigned int pdi_num, bool pcm)
|
||||
intel_pdi_get_ch_cap(struct sdw_intel *sdw, unsigned int pdi_num)
|
||||
{
|
||||
void __iomem *shim = sdw->link_res->shim;
|
||||
unsigned int link_id = sdw->instance;
|
||||
int count;
|
||||
|
||||
if (pcm) {
|
||||
count = intel_readw(shim, SDW_SHIM_PCMSYCHC(link_id, pdi_num));
|
||||
count = intel_readw(shim, SDW_SHIM_PCMSYCHC(link_id, pdi_num));
|
||||
|
||||
/*
|
||||
* WORKAROUND: on all existing Intel controllers, pdi
|
||||
* number 2 reports channel count as 1 even though it
|
||||
* supports 8 channels. Performing hardcoding for pdi
|
||||
* number 2.
|
||||
*/
|
||||
if (pdi_num == 2)
|
||||
count = 7;
|
||||
|
||||
} else {
|
||||
count = intel_readw(shim, SDW_SHIM_PDMSCAP(link_id));
|
||||
count = FIELD_GET(SDW_SHIM_PDMSCAP_CPSS, count);
|
||||
}
|
||||
/*
|
||||
* WORKAROUND: on all existing Intel controllers, pdi
|
||||
* number 2 reports channel count as 1 even though it
|
||||
* supports 8 channels. Performing hardcoding for pdi
|
||||
* number 2.
|
||||
*/
|
||||
if (pdi_num == 2)
|
||||
count = 7;
|
||||
|
||||
/* zero based values for channel count in register */
|
||||
count++;
|
||||
@ -620,12 +604,12 @@ intel_pdi_get_ch_cap(struct sdw_intel *sdw, unsigned int pdi_num, bool pcm)
|
||||
static int intel_pdi_get_ch_update(struct sdw_intel *sdw,
|
||||
struct sdw_cdns_pdi *pdi,
|
||||
unsigned int num_pdi,
|
||||
unsigned int *num_ch, bool pcm)
|
||||
unsigned int *num_ch)
|
||||
{
|
||||
int i, ch_count = 0;
|
||||
|
||||
for (i = 0; i < num_pdi; i++) {
|
||||
pdi->ch_count = intel_pdi_get_ch_cap(sdw, pdi->num, pcm);
|
||||
pdi->ch_count = intel_pdi_get_ch_cap(sdw, pdi->num);
|
||||
ch_count += pdi->ch_count;
|
||||
pdi++;
|
||||
}
|
||||
@ -635,25 +619,23 @@ static int intel_pdi_get_ch_update(struct sdw_intel *sdw,
|
||||
}
|
||||
|
||||
static int intel_pdi_stream_ch_update(struct sdw_intel *sdw,
|
||||
struct sdw_cdns_streams *stream, bool pcm)
|
||||
struct sdw_cdns_streams *stream)
|
||||
{
|
||||
intel_pdi_get_ch_update(sdw, stream->bd, stream->num_bd,
|
||||
&stream->num_ch_bd, pcm);
|
||||
&stream->num_ch_bd);
|
||||
|
||||
intel_pdi_get_ch_update(sdw, stream->in, stream->num_in,
|
||||
&stream->num_ch_in, pcm);
|
||||
&stream->num_ch_in);
|
||||
|
||||
intel_pdi_get_ch_update(sdw, stream->out, stream->num_out,
|
||||
&stream->num_ch_out, pcm);
|
||||
&stream->num_ch_out);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int intel_pdi_ch_update(struct sdw_intel *sdw)
|
||||
{
|
||||
/* First update PCM streams followed by PDM streams */
|
||||
intel_pdi_stream_ch_update(sdw, &sdw->cdns.pcm, true);
|
||||
intel_pdi_stream_ch_update(sdw, &sdw->cdns.pdm, false);
|
||||
intel_pdi_stream_ch_update(sdw, &sdw->cdns.pcm);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -711,7 +693,7 @@ intel_pdi_alh_configure(struct sdw_intel *sdw, struct sdw_cdns_pdi *pdi)
|
||||
}
|
||||
|
||||
static int intel_params_stream(struct sdw_intel *sdw,
|
||||
struct snd_pcm_substream *substream,
|
||||
int stream,
|
||||
struct snd_soc_dai *dai,
|
||||
struct snd_pcm_hw_params *hw_params,
|
||||
int link_id, int alh_stream_id)
|
||||
@ -719,7 +701,7 @@ static int intel_params_stream(struct sdw_intel *sdw,
|
||||
struct sdw_intel_link_res *res = sdw->link_res;
|
||||
struct sdw_intel_stream_params_data params_data;
|
||||
|
||||
params_data.substream = substream;
|
||||
params_data.stream = stream; /* direction */
|
||||
params_data.dai = dai;
|
||||
params_data.hw_params = hw_params;
|
||||
params_data.link_id = link_id;
|
||||
@ -732,14 +714,14 @@ static int intel_params_stream(struct sdw_intel *sdw,
|
||||
}
|
||||
|
||||
static int intel_free_stream(struct sdw_intel *sdw,
|
||||
struct snd_pcm_substream *substream,
|
||||
int stream,
|
||||
struct snd_soc_dai *dai,
|
||||
int link_id)
|
||||
{
|
||||
struct sdw_intel_link_res *res = sdw->link_res;
|
||||
struct sdw_intel_stream_free_data free_data;
|
||||
|
||||
free_data.substream = substream;
|
||||
free_data.stream = stream; /* direction */
|
||||
free_data.dai = dai;
|
||||
free_data.link_id = link_id;
|
||||
|
||||
@ -840,7 +822,6 @@ static int intel_hw_params(struct snd_pcm_substream *substream,
|
||||
struct sdw_port_config *pconfig;
|
||||
int ch, dir;
|
||||
int ret;
|
||||
bool pcm = true;
|
||||
|
||||
dma = snd_soc_dai_get_dma_data(dai, substream);
|
||||
if (!dma)
|
||||
@ -852,13 +833,7 @@ static int intel_hw_params(struct snd_pcm_substream *substream,
|
||||
else
|
||||
dir = SDW_DATA_DIR_TX;
|
||||
|
||||
if (dma->stream_type == SDW_STREAM_PDM)
|
||||
pcm = false;
|
||||
|
||||
if (pcm)
|
||||
pdi = sdw_cdns_alloc_pdi(cdns, &cdns->pcm, ch, dir, dai->id);
|
||||
else
|
||||
pdi = sdw_cdns_alloc_pdi(cdns, &cdns->pdm, ch, dir, dai->id);
|
||||
pdi = sdw_cdns_alloc_pdi(cdns, &cdns->pcm, ch, dir, dai->id);
|
||||
|
||||
if (!pdi) {
|
||||
ret = -EINVAL;
|
||||
@ -871,12 +846,13 @@ static int intel_hw_params(struct snd_pcm_substream *substream,
|
||||
sdw_cdns_config_stream(cdns, ch, dir, pdi);
|
||||
|
||||
/* store pdi and hw_params, may be needed in prepare step */
|
||||
dma->paused = false;
|
||||
dma->suspended = false;
|
||||
dma->pdi = pdi;
|
||||
dma->hw_params = params;
|
||||
|
||||
/* Inform DSP about PDI stream number */
|
||||
ret = intel_params_stream(sdw, substream, dai, params,
|
||||
ret = intel_params_stream(sdw, substream->stream, dai, params,
|
||||
sdw->instance,
|
||||
pdi->intel_alh_id);
|
||||
if (ret)
|
||||
@ -887,12 +863,7 @@ static int intel_hw_params(struct snd_pcm_substream *substream,
|
||||
sconfig.frame_rate = params_rate(params);
|
||||
sconfig.type = dma->stream_type;
|
||||
|
||||
if (dma->stream_type == SDW_STREAM_PDM) {
|
||||
sconfig.frame_rate *= 50;
|
||||
sconfig.bps = 1;
|
||||
} else {
|
||||
sconfig.bps = snd_pcm_format_width(params_format(params));
|
||||
}
|
||||
sconfig.bps = snd_pcm_format_width(params_format(params));
|
||||
|
||||
/* Port configuration */
|
||||
pconfig = kzalloc(sizeof(*pconfig), GFP_KERNEL);
|
||||
@ -953,7 +924,7 @@ static int intel_prepare(struct snd_pcm_substream *substream,
|
||||
sdw_cdns_config_stream(cdns, ch, dir, dma->pdi);
|
||||
|
||||
/* Inform DSP about PDI stream number */
|
||||
ret = intel_params_stream(sdw, substream, dai,
|
||||
ret = intel_params_stream(sdw, substream->stream, dai,
|
||||
dma->hw_params,
|
||||
sdw->instance,
|
||||
dma->pdi->intel_alh_id);
|
||||
@ -987,7 +958,7 @@ intel_hw_free(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = intel_free_stream(sdw, substream, dai, sdw->instance);
|
||||
ret = intel_free_stream(sdw, substream->stream, dai, sdw->instance);
|
||||
if (ret < 0) {
|
||||
dev_err(dai->dev, "intel_free_stream: failed %d\n", ret);
|
||||
return ret;
|
||||
@ -1008,39 +979,10 @@ static void intel_shutdown(struct snd_pcm_substream *substream,
|
||||
pm_runtime_put_autosuspend(cdns->dev);
|
||||
}
|
||||
|
||||
static int intel_component_dais_suspend(struct snd_soc_component *component)
|
||||
{
|
||||
struct sdw_cdns_dma_data *dma;
|
||||
struct snd_soc_dai *dai;
|
||||
|
||||
for_each_component_dais(component, dai) {
|
||||
/*
|
||||
* we don't have a .suspend dai_ops, and we don't have access
|
||||
* to the substream, so let's mark both capture and playback
|
||||
* DMA contexts as suspended
|
||||
*/
|
||||
dma = dai->playback_dma_data;
|
||||
if (dma)
|
||||
dma->suspended = true;
|
||||
|
||||
dma = dai->capture_dma_data;
|
||||
if (dma)
|
||||
dma->suspended = true;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int intel_pcm_set_sdw_stream(struct snd_soc_dai *dai,
|
||||
void *stream, int direction)
|
||||
{
|
||||
return cdns_set_sdw_stream(dai, stream, true, direction);
|
||||
}
|
||||
|
||||
static int intel_pdm_set_sdw_stream(struct snd_soc_dai *dai,
|
||||
void *stream, int direction)
|
||||
{
|
||||
return cdns_set_sdw_stream(dai, stream, false, direction);
|
||||
return cdns_set_sdw_stream(dai, stream, direction);
|
||||
}
|
||||
|
||||
static void *intel_get_sdw_stream(struct snd_soc_dai *dai,
|
||||
@ -1059,24 +1001,100 @@ static void *intel_get_sdw_stream(struct snd_soc_dai *dai,
|
||||
return dma->stream;
|
||||
}
|
||||
|
||||
static int intel_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai)
|
||||
{
|
||||
struct sdw_cdns *cdns = snd_soc_dai_get_drvdata(dai);
|
||||
struct sdw_intel *sdw = cdns_to_intel(cdns);
|
||||
struct sdw_cdns_dma_data *dma;
|
||||
int ret = 0;
|
||||
|
||||
dma = snd_soc_dai_get_dma_data(dai, substream);
|
||||
if (!dma) {
|
||||
dev_err(dai->dev, "failed to get dma data in %s\n",
|
||||
__func__);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
switch (cmd) {
|
||||
case SNDRV_PCM_TRIGGER_SUSPEND:
|
||||
|
||||
/*
|
||||
* The .prepare callback is used to deal with xruns and resume operations.
|
||||
* In the case of xruns, the DMAs and SHIM registers cannot be touched,
|
||||
* but for resume operations the DMAs and SHIM registers need to be initialized.
|
||||
* the .trigger callback is used to track the suspend case only.
|
||||
*/
|
||||
|
||||
dma->suspended = true;
|
||||
|
||||
ret = intel_free_stream(sdw, substream->stream, dai, sdw->instance);
|
||||
break;
|
||||
|
||||
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
|
||||
dma->paused = true;
|
||||
break;
|
||||
case SNDRV_PCM_TRIGGER_STOP:
|
||||
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
|
||||
dma->paused = false;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int intel_component_dais_suspend(struct snd_soc_component *component)
|
||||
{
|
||||
struct snd_soc_dai *dai;
|
||||
|
||||
/*
|
||||
* In the corner case where a SUSPEND happens during a PAUSE, the ALSA core
|
||||
* does not throw the TRIGGER_SUSPEND. This leaves the DAIs in an unbalanced state.
|
||||
* Since the component suspend is called last, we can trap this corner case
|
||||
* and force the DAIs to release their resources.
|
||||
*/
|
||||
for_each_component_dais(component, dai) {
|
||||
struct sdw_cdns *cdns = snd_soc_dai_get_drvdata(dai);
|
||||
struct sdw_intel *sdw = cdns_to_intel(cdns);
|
||||
struct sdw_cdns_dma_data *dma;
|
||||
int stream;
|
||||
int ret;
|
||||
|
||||
dma = dai->playback_dma_data;
|
||||
stream = SNDRV_PCM_STREAM_PLAYBACK;
|
||||
if (!dma) {
|
||||
dma = dai->capture_dma_data;
|
||||
stream = SNDRV_PCM_STREAM_CAPTURE;
|
||||
}
|
||||
|
||||
if (!dma)
|
||||
continue;
|
||||
|
||||
if (dma->suspended)
|
||||
continue;
|
||||
|
||||
if (dma->paused) {
|
||||
dma->suspended = true;
|
||||
|
||||
ret = intel_free_stream(sdw, stream, dai, sdw->instance);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct snd_soc_dai_ops intel_pcm_dai_ops = {
|
||||
.startup = intel_startup,
|
||||
.hw_params = intel_hw_params,
|
||||
.prepare = intel_prepare,
|
||||
.hw_free = intel_hw_free,
|
||||
.trigger = intel_trigger,
|
||||
.shutdown = intel_shutdown,
|
||||
.set_sdw_stream = intel_pcm_set_sdw_stream,
|
||||
.get_sdw_stream = intel_get_sdw_stream,
|
||||
};
|
||||
|
||||
static const struct snd_soc_dai_ops intel_pdm_dai_ops = {
|
||||
.startup = intel_startup,
|
||||
.hw_params = intel_hw_params,
|
||||
.prepare = intel_prepare,
|
||||
.hw_free = intel_hw_free,
|
||||
.shutdown = intel_shutdown,
|
||||
.set_sdw_stream = intel_pdm_set_sdw_stream,
|
||||
.get_sdw_stream = intel_get_sdw_stream,
|
||||
.set_stream = intel_pcm_set_sdw_stream,
|
||||
.get_stream = intel_get_sdw_stream,
|
||||
};
|
||||
|
||||
static const struct snd_soc_component_driver dai_component = {
|
||||
@ -1087,7 +1105,7 @@ static const struct snd_soc_component_driver dai_component = {
|
||||
static int intel_create_dai(struct sdw_cdns *cdns,
|
||||
struct snd_soc_dai_driver *dais,
|
||||
enum intel_pdi_type type,
|
||||
u32 num, u32 off, u32 max_ch, bool pcm)
|
||||
u32 num, u32 off, u32 max_ch)
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -1116,10 +1134,7 @@ static int intel_create_dai(struct sdw_cdns *cdns,
|
||||
dais[i].capture.formats = SNDRV_PCM_FMTBIT_S16_LE;
|
||||
}
|
||||
|
||||
if (pcm)
|
||||
dais[i].ops = &intel_pcm_dai_ops;
|
||||
else
|
||||
dais[i].ops = &intel_pdm_dai_ops;
|
||||
dais[i].ops = &intel_pcm_dai_ops;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -1133,7 +1148,7 @@ static int intel_register_dai(struct sdw_intel *sdw)
|
||||
int num_dai, ret, off = 0;
|
||||
|
||||
/* DAIs are created based on total number of PDIs supported */
|
||||
num_dai = cdns->pcm.num_pdi + cdns->pdm.num_pdi;
|
||||
num_dai = cdns->pcm.num_pdi;
|
||||
|
||||
dais = devm_kcalloc(cdns->dev, num_dai, sizeof(*dais), GFP_KERNEL);
|
||||
if (!dais)
|
||||
@ -1143,39 +1158,19 @@ static int intel_register_dai(struct sdw_intel *sdw)
|
||||
stream = &cdns->pcm;
|
||||
|
||||
ret = intel_create_dai(cdns, dais, INTEL_PDI_IN, cdns->pcm.num_in,
|
||||
off, stream->num_ch_in, true);
|
||||
off, stream->num_ch_in);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
off += cdns->pcm.num_in;
|
||||
ret = intel_create_dai(cdns, dais, INTEL_PDI_OUT, cdns->pcm.num_out,
|
||||
off, stream->num_ch_out, true);
|
||||
off, stream->num_ch_out);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
off += cdns->pcm.num_out;
|
||||
ret = intel_create_dai(cdns, dais, INTEL_PDI_BD, cdns->pcm.num_bd,
|
||||
off, stream->num_ch_bd, true);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Create PDM DAIs */
|
||||
stream = &cdns->pdm;
|
||||
off += cdns->pcm.num_bd;
|
||||
ret = intel_create_dai(cdns, dais, INTEL_PDI_IN, cdns->pdm.num_in,
|
||||
off, stream->num_ch_in, false);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
off += cdns->pdm.num_in;
|
||||
ret = intel_create_dai(cdns, dais, INTEL_PDI_OUT, cdns->pdm.num_out,
|
||||
off, stream->num_ch_out, false);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
off += cdns->pdm.num_out;
|
||||
ret = intel_create_dai(cdns, dais, INTEL_PDI_BD, cdns->pdm.num_bd,
|
||||
off, stream->num_ch_bd, false);
|
||||
off, stream->num_ch_bd);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@ -1549,7 +1544,7 @@ static int __maybe_unused intel_pm_prepare(struct device *dev)
|
||||
struct sdw_intel *sdw = cdns_to_intel(cdns);
|
||||
struct sdw_bus *bus = &cdns->bus;
|
||||
u32 clock_stop_quirks;
|
||||
int ret = 0;
|
||||
int ret;
|
||||
|
||||
if (bus->prop.hw_disabled || !sdw->startup_done) {
|
||||
dev_dbg(dev, "SoundWire master %d is disabled or not-started, ignoring\n",
|
||||
|
@ -1024,8 +1024,8 @@ static int qcom_swrm_startup(struct snd_pcm_substream *substream,
|
||||
ctrl->sruntime[dai->id] = sruntime;
|
||||
|
||||
for_each_rtd_codec_dais(rtd, i, codec_dai) {
|
||||
ret = snd_soc_dai_set_sdw_stream(codec_dai, sruntime,
|
||||
substream->stream);
|
||||
ret = snd_soc_dai_set_stream(codec_dai, sruntime,
|
||||
substream->stream);
|
||||
if (ret < 0 && ret != -ENOTSUPP) {
|
||||
dev_err(dai->dev, "Failed to set sdw stream on %s\n",
|
||||
codec_dai->name);
|
||||
@ -1051,8 +1051,8 @@ static const struct snd_soc_dai_ops qcom_swrm_pdm_dai_ops = {
|
||||
.hw_free = qcom_swrm_hw_free,
|
||||
.startup = qcom_swrm_startup,
|
||||
.shutdown = qcom_swrm_shutdown,
|
||||
.set_sdw_stream = qcom_swrm_set_sdw_stream,
|
||||
.get_sdw_stream = qcom_swrm_get_sdw_stream,
|
||||
.set_stream = qcom_swrm_set_sdw_stream,
|
||||
.get_stream = qcom_swrm_get_sdw_stream,
|
||||
};
|
||||
|
||||
static const struct snd_soc_component_driver qcom_swrm_dai_component = {
|
||||
|
@ -1863,7 +1863,7 @@ static int set_stream(struct snd_pcm_substream *substream,
|
||||
|
||||
/* Set stream pointer on all DAIs */
|
||||
for_each_rtd_dais(rtd, i, dai) {
|
||||
ret = snd_soc_dai_set_sdw_stream(dai, sdw_stream, substream->stream);
|
||||
ret = snd_soc_dai_set_stream(dai, sdw_stream, substream->stream);
|
||||
if (ret < 0) {
|
||||
dev_err(rtd->dev, "failed to set stream pointer on dai %s\n", dai->name);
|
||||
break;
|
||||
@ -1934,7 +1934,7 @@ void sdw_shutdown_stream(void *sdw_substream)
|
||||
/* Find stream from first CPU DAI */
|
||||
dai = asoc_rtd_to_cpu(rtd, 0);
|
||||
|
||||
sdw_stream = snd_soc_dai_get_sdw_stream(dai, substream->stream);
|
||||
sdw_stream = snd_soc_dai_get_stream(dai, substream->stream);
|
||||
|
||||
if (IS_ERR(sdw_stream)) {
|
||||
dev_err(rtd->dev, "no stream found for DAI %s\n", dai->name);
|
||||
|
@ -92,7 +92,7 @@
|
||||
* firmware.
|
||||
*/
|
||||
struct sdw_intel_stream_params_data {
|
||||
struct snd_pcm_substream *substream;
|
||||
int stream;
|
||||
struct snd_soc_dai *dai;
|
||||
struct snd_pcm_hw_params *hw_params;
|
||||
int link_id;
|
||||
@ -105,7 +105,7 @@ struct sdw_intel_stream_params_data {
|
||||
* firmware.
|
||||
*/
|
||||
struct sdw_intel_stream_free_data {
|
||||
struct snd_pcm_substream *substream;
|
||||
int stream;
|
||||
struct snd_soc_dai *dai;
|
||||
int link_id;
|
||||
};
|
||||
|
@ -295,9 +295,9 @@ struct snd_soc_dai_ops {
|
||||
unsigned int *rx_num, unsigned int *rx_slot);
|
||||
int (*set_tristate)(struct snd_soc_dai *dai, int tristate);
|
||||
|
||||
int (*set_sdw_stream)(struct snd_soc_dai *dai,
|
||||
void *stream, int direction);
|
||||
void *(*get_sdw_stream)(struct snd_soc_dai *dai, int direction);
|
||||
int (*set_stream)(struct snd_soc_dai *dai,
|
||||
void *stream, int direction);
|
||||
void *(*get_stream)(struct snd_soc_dai *dai, int direction);
|
||||
|
||||
/*
|
||||
* DAI digital mute - optional.
|
||||
@ -515,42 +515,42 @@ static inline void *snd_soc_dai_get_drvdata(struct snd_soc_dai *dai)
|
||||
}
|
||||
|
||||
/**
|
||||
* snd_soc_dai_set_sdw_stream() - Configures a DAI for SDW stream operation
|
||||
* snd_soc_dai_set_stream() - Configures a DAI for stream operation
|
||||
* @dai: DAI
|
||||
* @stream: STREAM
|
||||
* @stream: STREAM (opaque structure depending on DAI type)
|
||||
* @direction: Stream direction(Playback/Capture)
|
||||
* SoundWire subsystem doesn't have a notion of direction and we reuse
|
||||
* Some subsystems, such as SoundWire, don't have a notion of direction and we reuse
|
||||
* the ASoC stream direction to configure sink/source ports.
|
||||
* Playback maps to source ports and Capture for sink ports.
|
||||
*
|
||||
* This should be invoked with NULL to clear the stream set previously.
|
||||
* Returns 0 on success, a negative error code otherwise.
|
||||
*/
|
||||
static inline int snd_soc_dai_set_sdw_stream(struct snd_soc_dai *dai,
|
||||
void *stream, int direction)
|
||||
static inline int snd_soc_dai_set_stream(struct snd_soc_dai *dai,
|
||||
void *stream, int direction)
|
||||
{
|
||||
if (dai->driver->ops->set_sdw_stream)
|
||||
return dai->driver->ops->set_sdw_stream(dai, stream, direction);
|
||||
if (dai->driver->ops->set_stream)
|
||||
return dai->driver->ops->set_stream(dai, stream, direction);
|
||||
else
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
/**
|
||||
* snd_soc_dai_get_sdw_stream() - Retrieves SDW stream from DAI
|
||||
* snd_soc_dai_get_stream() - Retrieves stream from DAI
|
||||
* @dai: DAI
|
||||
* @direction: Stream direction(Playback/Capture)
|
||||
*
|
||||
* This routine only retrieves that was previously configured
|
||||
* with snd_soc_dai_get_sdw_stream()
|
||||
* with snd_soc_dai_get_stream()
|
||||
*
|
||||
* Returns pointer to stream or an ERR_PTR value, e.g.
|
||||
* ERR_PTR(-ENOTSUPP) if callback is not supported;
|
||||
*/
|
||||
static inline void *snd_soc_dai_get_sdw_stream(struct snd_soc_dai *dai,
|
||||
int direction)
|
||||
static inline void *snd_soc_dai_get_stream(struct snd_soc_dai *dai,
|
||||
int direction)
|
||||
{
|
||||
if (dai->driver->ops->get_sdw_stream)
|
||||
return dai->driver->ops->get_sdw_stream(dai, direction);
|
||||
if (dai->driver->ops->get_stream)
|
||||
return dai->driver->ops->get_stream(dai, direction);
|
||||
else
|
||||
return ERR_PTR(-ENOTSUPP);
|
||||
}
|
||||
|
@ -46,9 +46,8 @@ static int hdac_hda_dai_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_soc_dai *dai);
|
||||
static int hdac_hda_dai_hw_free(struct snd_pcm_substream *substream,
|
||||
struct snd_soc_dai *dai);
|
||||
static int hdac_hda_dai_set_tdm_slot(struct snd_soc_dai *dai,
|
||||
unsigned int tx_mask, unsigned int rx_mask,
|
||||
int slots, int slot_width);
|
||||
static int hdac_hda_dai_set_stream(struct snd_soc_dai *dai, void *stream,
|
||||
int direction);
|
||||
static struct hda_pcm *snd_soc_find_pcm_from_dai(struct hdac_hda_priv *hda_pvt,
|
||||
struct snd_soc_dai *dai);
|
||||
|
||||
@ -58,7 +57,7 @@ static const struct snd_soc_dai_ops hdac_hda_dai_ops = {
|
||||
.prepare = hdac_hda_dai_prepare,
|
||||
.hw_params = hdac_hda_dai_hw_params,
|
||||
.hw_free = hdac_hda_dai_hw_free,
|
||||
.set_tdm_slot = hdac_hda_dai_set_tdm_slot,
|
||||
.set_stream = hdac_hda_dai_set_stream,
|
||||
};
|
||||
|
||||
static struct snd_soc_dai_driver hdac_hda_dais[] = {
|
||||
@ -180,21 +179,22 @@ static struct snd_soc_dai_driver hdac_hda_dais[] = {
|
||||
|
||||
};
|
||||
|
||||
static int hdac_hda_dai_set_tdm_slot(struct snd_soc_dai *dai,
|
||||
unsigned int tx_mask, unsigned int rx_mask,
|
||||
int slots, int slot_width)
|
||||
static int hdac_hda_dai_set_stream(struct snd_soc_dai *dai,
|
||||
void *stream, int direction)
|
||||
{
|
||||
struct snd_soc_component *component = dai->component;
|
||||
struct hdac_hda_priv *hda_pvt;
|
||||
struct hdac_hda_pcm *pcm;
|
||||
struct hdac_stream *hstream;
|
||||
|
||||
if (!stream)
|
||||
return -EINVAL;
|
||||
|
||||
hda_pvt = snd_soc_component_get_drvdata(component);
|
||||
pcm = &hda_pvt->pcm[dai->id];
|
||||
hstream = (struct hdac_stream *)stream;
|
||||
|
||||
if (tx_mask)
|
||||
pcm->stream_tag[SNDRV_PCM_STREAM_PLAYBACK] = tx_mask;
|
||||
else
|
||||
pcm->stream_tag[SNDRV_PCM_STREAM_CAPTURE] = rx_mask;
|
||||
pcm->stream_tag[direction] = hstream->stream_tag;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -741,7 +741,7 @@ static int max98373_sdw_set_tdm_slot(struct snd_soc_dai *dai,
|
||||
static const struct snd_soc_dai_ops max98373_dai_sdw_ops = {
|
||||
.hw_params = max98373_sdw_dai_hw_params,
|
||||
.hw_free = max98373_pcm_hw_free,
|
||||
.set_sdw_stream = max98373_set_sdw_stream,
|
||||
.set_stream = max98373_set_sdw_stream,
|
||||
.shutdown = max98373_shutdown,
|
||||
.set_tdm_slot = max98373_sdw_set_tdm_slot,
|
||||
};
|
||||
|
@ -613,7 +613,7 @@ static const struct snd_soc_component_driver soc_component_sdw_rt1308 = {
|
||||
static const struct snd_soc_dai_ops rt1308_aif_dai_ops = {
|
||||
.hw_params = rt1308_sdw_hw_params,
|
||||
.hw_free = rt1308_sdw_pcm_hw_free,
|
||||
.set_sdw_stream = rt1308_set_sdw_stream,
|
||||
.set_stream = rt1308_set_sdw_stream,
|
||||
.shutdown = rt1308_sdw_shutdown,
|
||||
.set_tdm_slot = rt1308_sdw_set_tdm_slot,
|
||||
};
|
||||
|
@ -602,7 +602,7 @@ static const struct snd_soc_component_driver soc_component_sdw_rt1316 = {
|
||||
static const struct snd_soc_dai_ops rt1316_aif_dai_ops = {
|
||||
.hw_params = rt1316_sdw_hw_params,
|
||||
.hw_free = rt1316_sdw_pcm_hw_free,
|
||||
.set_sdw_stream = rt1316_set_sdw_stream,
|
||||
.set_stream = rt1316_set_sdw_stream,
|
||||
.shutdown = rt1316_sdw_shutdown,
|
||||
};
|
||||
|
||||
|
@ -272,7 +272,7 @@ static int rt5682_sdw_hw_free(struct snd_pcm_substream *substream,
|
||||
static const struct snd_soc_dai_ops rt5682_sdw_ops = {
|
||||
.hw_params = rt5682_sdw_hw_params,
|
||||
.hw_free = rt5682_sdw_hw_free,
|
||||
.set_sdw_stream = rt5682_set_sdw_stream,
|
||||
.set_stream = rt5682_set_sdw_stream,
|
||||
.shutdown = rt5682_sdw_shutdown,
|
||||
};
|
||||
|
||||
|
@ -1005,7 +1005,7 @@ static int rt700_pcm_hw_free(struct snd_pcm_substream *substream,
|
||||
static const struct snd_soc_dai_ops rt700_ops = {
|
||||
.hw_params = rt700_pcm_hw_params,
|
||||
.hw_free = rt700_pcm_hw_free,
|
||||
.set_sdw_stream = rt700_set_sdw_stream,
|
||||
.set_stream = rt700_set_sdw_stream,
|
||||
.shutdown = rt700_shutdown,
|
||||
};
|
||||
|
||||
|
@ -1358,7 +1358,7 @@ static int rt711_sdca_pcm_hw_free(struct snd_pcm_substream *substream,
|
||||
static const struct snd_soc_dai_ops rt711_sdca_ops = {
|
||||
.hw_params = rt711_sdca_pcm_hw_params,
|
||||
.hw_free = rt711_sdca_pcm_hw_free,
|
||||
.set_sdw_stream = rt711_sdca_set_sdw_stream,
|
||||
.set_stream = rt711_sdca_set_sdw_stream,
|
||||
.shutdown = rt711_sdca_shutdown,
|
||||
};
|
||||
|
||||
|
@ -1089,7 +1089,7 @@ static int rt711_pcm_hw_free(struct snd_pcm_substream *substream,
|
||||
static const struct snd_soc_dai_ops rt711_ops = {
|
||||
.hw_params = rt711_pcm_hw_params,
|
||||
.hw_free = rt711_pcm_hw_free,
|
||||
.set_sdw_stream = rt711_set_sdw_stream,
|
||||
.set_stream = rt711_set_sdw_stream,
|
||||
.shutdown = rt711_shutdown,
|
||||
};
|
||||
|
||||
|
@ -938,7 +938,7 @@ static int rt715_sdca_pcm_hw_free(struct snd_pcm_substream *substream,
|
||||
static const struct snd_soc_dai_ops rt715_sdca_ops = {
|
||||
.hw_params = rt715_sdca_pcm_hw_params,
|
||||
.hw_free = rt715_sdca_pcm_hw_free,
|
||||
.set_sdw_stream = rt715_sdca_set_sdw_stream,
|
||||
.set_stream = rt715_sdca_set_sdw_stream,
|
||||
.shutdown = rt715_sdca_shutdown,
|
||||
};
|
||||
|
||||
|
@ -909,7 +909,7 @@ static int rt715_pcm_hw_free(struct snd_pcm_substream *substream,
|
||||
static const struct snd_soc_dai_ops rt715_ops = {
|
||||
.hw_params = rt715_pcm_hw_params,
|
||||
.hw_free = rt715_pcm_hw_free,
|
||||
.set_sdw_stream = rt715_set_sdw_stream,
|
||||
.set_stream = rt715_set_sdw_stream,
|
||||
.shutdown = rt715_shutdown,
|
||||
};
|
||||
|
||||
|
@ -138,7 +138,7 @@ static int sdw_mockup_pcm_hw_free(struct snd_pcm_substream *substream,
|
||||
static const struct snd_soc_dai_ops sdw_mockup_ops = {
|
||||
.hw_params = sdw_mockup_pcm_hw_params,
|
||||
.hw_free = sdw_mockup_pcm_hw_free,
|
||||
.set_sdw_stream = sdw_mockup_set_sdw_stream,
|
||||
.set_stream = sdw_mockup_set_sdw_stream,
|
||||
.shutdown = sdw_mockup_shutdown,
|
||||
};
|
||||
|
||||
|
@ -4285,7 +4285,7 @@ static int wcd938x_codec_set_sdw_stream(struct snd_soc_dai *dai,
|
||||
static const struct snd_soc_dai_ops wcd938x_sdw_dai_ops = {
|
||||
.hw_params = wcd938x_codec_hw_params,
|
||||
.hw_free = wcd938x_codec_free,
|
||||
.set_sdw_stream = wcd938x_codec_set_sdw_stream,
|
||||
.set_stream = wcd938x_codec_set_sdw_stream,
|
||||
};
|
||||
|
||||
static struct snd_soc_dai_driver wcd938x_dais[] = {
|
||||
|
@ -1018,7 +1018,7 @@ static const struct snd_soc_dai_ops wsa881x_dai_ops = {
|
||||
.hw_params = wsa881x_hw_params,
|
||||
.hw_free = wsa881x_hw_free,
|
||||
.mute_stream = wsa881x_digital_mute,
|
||||
.set_sdw_stream = wsa881x_set_sdw_stream,
|
||||
.set_stream = wsa881x_set_sdw_stream,
|
||||
};
|
||||
|
||||
static struct snd_soc_dai_driver wsa881x_dais[] = {
|
||||
|
@ -347,7 +347,7 @@ int sdw_prepare(struct snd_pcm_substream *substream)
|
||||
/* Find stream from first CPU DAI */
|
||||
dai = asoc_rtd_to_cpu(rtd, 0);
|
||||
|
||||
sdw_stream = snd_soc_dai_get_sdw_stream(dai, substream->stream);
|
||||
sdw_stream = snd_soc_dai_get_stream(dai, substream->stream);
|
||||
|
||||
if (IS_ERR(sdw_stream)) {
|
||||
dev_err(rtd->dev, "no stream found for DAI %s", dai->name);
|
||||
@ -367,7 +367,7 @@ int sdw_trigger(struct snd_pcm_substream *substream, int cmd)
|
||||
/* Find stream from first CPU DAI */
|
||||
dai = asoc_rtd_to_cpu(rtd, 0);
|
||||
|
||||
sdw_stream = snd_soc_dai_get_sdw_stream(dai, substream->stream);
|
||||
sdw_stream = snd_soc_dai_get_stream(dai, substream->stream);
|
||||
|
||||
if (IS_ERR(sdw_stream)) {
|
||||
dev_err(rtd->dev, "no stream found for DAI %s", dai->name);
|
||||
@ -406,7 +406,7 @@ int sdw_hw_free(struct snd_pcm_substream *substream)
|
||||
/* Find stream from first CPU DAI */
|
||||
dai = asoc_rtd_to_cpu(rtd, 0);
|
||||
|
||||
sdw_stream = snd_soc_dai_get_sdw_stream(dai, substream->stream);
|
||||
sdw_stream = snd_soc_dai_get_stream(dai, substream->stream);
|
||||
|
||||
if (IS_ERR(sdw_stream)) {
|
||||
dev_err(rtd->dev, "no stream found for DAI %s", dai->name);
|
||||
|
@ -562,11 +562,8 @@ static int skl_link_hw_params(struct snd_pcm_substream *substream,
|
||||
|
||||
stream_tag = hdac_stream(link_dev)->stream_tag;
|
||||
|
||||
/* set the stream tag in the codec dai dma params */
|
||||
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
|
||||
snd_soc_dai_set_tdm_slot(codec_dai, stream_tag, 0, 0, 0);
|
||||
else
|
||||
snd_soc_dai_set_tdm_slot(codec_dai, 0, stream_tag, 0, 0);
|
||||
/* set the hdac_stream in the codec dai */
|
||||
snd_soc_dai_set_stream(codec_dai, hdac_stream(link_dev), substream->stream);
|
||||
|
||||
p_params.s_fmt = snd_pcm_format_width(params_format(params));
|
||||
p_params.ch = params_channels(params);
|
||||
|
@ -57,8 +57,8 @@ static int sdm845_slim_snd_hw_params(struct snd_pcm_substream *substream,
|
||||
int ret = 0, i;
|
||||
|
||||
for_each_rtd_codec_dais(rtd, i, codec_dai) {
|
||||
sruntime = snd_soc_dai_get_sdw_stream(codec_dai,
|
||||
substream->stream);
|
||||
sruntime = snd_soc_dai_get_stream(codec_dai,
|
||||
substream->stream);
|
||||
if (sruntime != ERR_PTR(-ENOTSUPP))
|
||||
pdata->sruntime[cpu_dai->id] = sruntime;
|
||||
|
||||
|
@ -136,8 +136,8 @@ static int sm8250_snd_hw_params(struct snd_pcm_substream *substream,
|
||||
case TX_CODEC_DMA_TX_2:
|
||||
case TX_CODEC_DMA_TX_3:
|
||||
for_each_rtd_codec_dais(rtd, i, codec_dai) {
|
||||
sruntime = snd_soc_dai_get_sdw_stream(codec_dai,
|
||||
substream->stream);
|
||||
sruntime = snd_soc_dai_get_stream(codec_dai,
|
||||
substream->stream);
|
||||
if (sruntime != ERR_PTR(-ENOTSUPP))
|
||||
pdata->sruntime[cpu_dai->id] = sruntime;
|
||||
}
|
||||
|
@ -243,11 +243,8 @@ static int hda_link_hw_params(struct snd_pcm_substream *substream,
|
||||
if (!link)
|
||||
return -EINVAL;
|
||||
|
||||
/* set the stream tag in the codec dai dma params */
|
||||
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
|
||||
snd_soc_dai_set_tdm_slot(codec_dai, stream_tag, 0, 0, 0);
|
||||
else
|
||||
snd_soc_dai_set_tdm_slot(codec_dai, 0, stream_tag, 0, 0);
|
||||
/* set the hdac_stream in the codec dai */
|
||||
snd_soc_dai_set_stream(codec_dai, hdac_stream(link_dev), substream->stream);
|
||||
|
||||
p_params.s_fmt = snd_pcm_format_width(params_format(params));
|
||||
p_params.ch = params_channels(params);
|
||||
|
@ -184,15 +184,11 @@ static int sdw_dai_config_ipc(struct snd_sof_dev *sdev,
|
||||
static int sdw_params_stream(struct device *dev,
|
||||
struct sdw_intel_stream_params_data *params_data)
|
||||
{
|
||||
struct snd_pcm_substream *substream = params_data->substream;
|
||||
struct snd_sof_dev *sdev = dev_get_drvdata(dev);
|
||||
struct snd_soc_dai *d = params_data->dai;
|
||||
struct snd_soc_dapm_widget *w;
|
||||
|
||||
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
|
||||
w = d->playback_widget;
|
||||
else
|
||||
w = d->capture_widget;
|
||||
w = snd_soc_dai_get_widget(d, params_data->stream);
|
||||
|
||||
return sdw_dai_config_ipc(sdev, w, params_data->link_id, params_data->alh_stream_id,
|
||||
d->id, true);
|
||||
@ -201,15 +197,11 @@ static int sdw_params_stream(struct device *dev,
|
||||
static int sdw_free_stream(struct device *dev,
|
||||
struct sdw_intel_stream_free_data *free_data)
|
||||
{
|
||||
struct snd_pcm_substream *substream = free_data->substream;
|
||||
struct snd_sof_dev *sdev = dev_get_drvdata(dev);
|
||||
struct snd_soc_dai *d = free_data->dai;
|
||||
struct snd_soc_dapm_widget *w;
|
||||
|
||||
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
|
||||
w = d->playback_widget;
|
||||
else
|
||||
w = d->capture_widget;
|
||||
w = snd_soc_dai_get_widget(d, free_data->stream);
|
||||
|
||||
/* send invalid stream_id */
|
||||
return sdw_dai_config_ipc(sdev, w, free_data->link_id, 0xFFFF, d->id, false);
|
||||
|
Loading…
Reference in New Issue
Block a user