ASoC: Merge up fixes

We need some of the AMD fixes as a base for new work.
This commit is contained in:
Mark Brown 2024-06-21 13:17:21 +01:00
commit de7a09dec4
No known key found for this signature in database
GPG Key ID: 24D68B725D5487D0
26 changed files with 145 additions and 75 deletions

View File

@ -18210,6 +18210,7 @@ QCOM AUDIO (ASoC) DRIVERS
M: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> M: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
M: Banajit Goswami <bgoswami@quicinc.com> M: Banajit Goswami <bgoswami@quicinc.com>
L: alsa-devel@alsa-project.org (moderated for non-subscribers) L: alsa-devel@alsa-project.org (moderated for non-subscribers)
L: linux-arm-msm@vger.kernel.org
S: Supported S: Supported
F: Documentation/devicetree/bindings/soc/qcom/qcom,apr* F: Documentation/devicetree/bindings/soc/qcom/qcom,apr*
F: Documentation/devicetree/bindings/sound/qcom,* F: Documentation/devicetree/bindings/sound/qcom,*

View File

@ -36,6 +36,7 @@ snd_pcm_uframes_t snd_dmaengine_pcm_pointer_no_residue(struct snd_pcm_substream
int snd_dmaengine_pcm_open(struct snd_pcm_substream *substream, int snd_dmaengine_pcm_open(struct snd_pcm_substream *substream,
struct dma_chan *chan); struct dma_chan *chan);
int snd_dmaengine_pcm_close(struct snd_pcm_substream *substream); int snd_dmaengine_pcm_close(struct snd_pcm_substream *substream);
int snd_dmaengine_pcm_sync_stop(struct snd_pcm_substream *substream);
int snd_dmaengine_pcm_open_request_chan(struct snd_pcm_substream *substream, int snd_dmaengine_pcm_open_request_chan(struct snd_pcm_substream *substream,
dma_filter_fn filter_fn, void *filter_data); dma_filter_fn filter_fn, void *filter_data);

View File

@ -349,6 +349,16 @@ int snd_dmaengine_pcm_open_request_chan(struct snd_pcm_substream *substream,
} }
EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_open_request_chan); EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_open_request_chan);
int snd_dmaengine_pcm_sync_stop(struct snd_pcm_substream *substream)
{
struct dmaengine_pcm_runtime_data *prtd = substream_to_prtd(substream);
dmaengine_synchronize(prtd->dma_chan);
return 0;
}
EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_sync_stop);
/** /**
* snd_dmaengine_pcm_close - Close a dmaengine based PCM substream * snd_dmaengine_pcm_close - Close a dmaengine based PCM substream
* @substream: PCM substream * @substream: PCM substream

View File

@ -588,20 +588,12 @@ static int acp_i2s_probe(struct snd_soc_dai *dai)
{ {
struct device *dev = dai->component->dev; struct device *dev = dai->component->dev;
struct acp_dev_data *adata = dev_get_drvdata(dev); struct acp_dev_data *adata = dev_get_drvdata(dev);
struct acp_resource *rsrc = adata->rsrc;
unsigned int val;
if (!adata->acp_base) { if (!adata->acp_base) {
dev_err(dev, "I2S base is NULL\n"); dev_err(dev, "I2S base is NULL\n");
return -EINVAL; return -EINVAL;
} }
val = readl(adata->acp_base + rsrc->i2s_pin_cfg_offset);
if (val != rsrc->i2s_mode) {
dev_err(dev, "I2S Mode not supported val %x\n", val);
return -EINVAL;
}
return 0; return 0;
} }

View File

@ -100,6 +100,7 @@ static int acp_pci_probe(struct pci_dev *pci, const struct pci_device_id *pci_id
ret = -EINVAL; ret = -EINVAL;
goto release_regions; goto release_regions;
} }
chip->flag = flag;
dmic_dev = platform_device_register_data(dev, "dmic-codec", PLATFORM_DEVID_NONE, NULL, 0); dmic_dev = platform_device_register_data(dev, "dmic-codec", PLATFORM_DEVID_NONE, NULL, 0);
if (IS_ERR(dmic_dev)) { if (IS_ERR(dmic_dev)) {
dev_err(dev, "failed to create DMIC device\n"); dev_err(dev, "failed to create DMIC device\n");
@ -139,7 +140,6 @@ static int acp_pci_probe(struct pci_dev *pci, const struct pci_device_id *pci_id
} }
} }
chip->flag = flag;
memset(&pdevinfo, 0, sizeof(pdevinfo)); memset(&pdevinfo, 0, sizeof(pdevinfo));
pdevinfo.name = chip->name; pdevinfo.name = chip->name;
@ -199,10 +199,12 @@ static int __maybe_unused snd_acp_resume(struct device *dev)
ret = acp_init(chip); ret = acp_init(chip);
if (ret) if (ret)
dev_err(dev, "ACP init failed\n"); dev_err(dev, "ACP init failed\n");
child = chip->chip_pdev->dev; if (chip->chip_pdev) {
adata = dev_get_drvdata(&child); child = chip->chip_pdev->dev;
if (adata) adata = dev_get_drvdata(&child);
acp_enable_interrupts(adata); if (adata)
acp_enable_interrupts(adata);
}
return ret; return ret;
} }

View File

@ -473,19 +473,22 @@ static int atmel_classd_asoc_card_init(struct device *dev,
if (!dai_link) if (!dai_link)
return -ENOMEM; return -ENOMEM;
comp = devm_kzalloc(dev, sizeof(*comp), GFP_KERNEL); comp = devm_kzalloc(dev, 2 * sizeof(*comp), GFP_KERNEL);
if (!comp) if (!comp)
return -ENOMEM; return -ENOMEM;
dai_link->cpus = comp; dai_link->cpus = &comp[0];
dai_link->codecs = &snd_soc_dummy_dlc; dai_link->codecs = &snd_soc_dummy_dlc;
dai_link->platforms = &comp[1];
dai_link->num_cpus = 1; dai_link->num_cpus = 1;
dai_link->num_codecs = 1; dai_link->num_codecs = 1;
dai_link->num_platforms = 1;
dai_link->name = "CLASSD"; dai_link->name = "CLASSD";
dai_link->stream_name = "CLASSD PCM"; dai_link->stream_name = "CLASSD PCM";
dai_link->cpus->dai_name = dev_name(dev); dai_link->cpus->dai_name = dev_name(dev);
dai_link->platforms->name = dev_name(dev);
card->dai_link = dai_link; card->dai_link = dai_link;
card->num_links = 1; card->num_links = 1;

View File

@ -215,6 +215,10 @@ static const struct reg_sequence cs35l56_asp1_defaults[] = {
REG_SEQ0(CS35L56_ASP1_FRAME_CONTROL5, 0x00020100), REG_SEQ0(CS35L56_ASP1_FRAME_CONTROL5, 0x00020100),
REG_SEQ0(CS35L56_ASP1_DATA_CONTROL1, 0x00000018), REG_SEQ0(CS35L56_ASP1_DATA_CONTROL1, 0x00000018),
REG_SEQ0(CS35L56_ASP1_DATA_CONTROL5, 0x00000018), REG_SEQ0(CS35L56_ASP1_DATA_CONTROL5, 0x00000018),
REG_SEQ0(CS35L56_ASP1TX1_INPUT, 0x00000000),
REG_SEQ0(CS35L56_ASP1TX2_INPUT, 0x00000000),
REG_SEQ0(CS35L56_ASP1TX3_INPUT, 0x00000000),
REG_SEQ0(CS35L56_ASP1TX4_INPUT, 0x00000000),
}; };
/* /*

View File

@ -121,7 +121,7 @@ int cs42l43_set_jack(struct snd_soc_component *component,
priv->buttons[3] = 735; priv->buttons[3] = 735;
} }
ret = cs42l43_find_index(priv, "cirrus,detect-us", 1000, &priv->detect_us, ret = cs42l43_find_index(priv, "cirrus,detect-us", 50000, &priv->detect_us,
cs42l43_accdet_us, ARRAY_SIZE(cs42l43_accdet_us)); cs42l43_accdet_us, ARRAY_SIZE(cs42l43_accdet_us));
if (ret < 0) if (ret < 0)
goto error; goto error;
@ -433,7 +433,7 @@ irqreturn_t cs42l43_button_press(int irq, void *data)
// Wait for 2 full cycles of comb filter to ensure good reading // Wait for 2 full cycles of comb filter to ensure good reading
queue_delayed_work(system_wq, &priv->button_press_work, queue_delayed_work(system_wq, &priv->button_press_work,
msecs_to_jiffies(10)); msecs_to_jiffies(20));
return IRQ_HANDLED; return IRQ_HANDLED;
} }

View File

@ -857,12 +857,16 @@ static void es8326_jack_detect_handler(struct work_struct *work)
* set auto-check mode, then restart jack_detect_work after 400ms. * set auto-check mode, then restart jack_detect_work after 400ms.
* Don't report jack status. * Don't report jack status.
*/ */
regmap_write(es8326->regmap, ES8326_INT_SOURCE, regmap_write(es8326->regmap, ES8326_INT_SOURCE, 0x00);
(ES8326_INT_SRC_PIN9 | ES8326_INT_SRC_BUTTON));
regmap_update_bits(es8326->regmap, ES8326_HPDET_TYPE, 0x03, 0x01); regmap_update_bits(es8326->regmap, ES8326_HPDET_TYPE, 0x03, 0x01);
regmap_update_bits(es8326->regmap, ES8326_HPDET_TYPE, 0x10, 0x00);
es8326_enable_micbias(es8326->component); es8326_enable_micbias(es8326->component);
usleep_range(50000, 70000); usleep_range(50000, 70000);
regmap_update_bits(es8326->regmap, ES8326_HPDET_TYPE, 0x03, 0x00); regmap_update_bits(es8326->regmap, ES8326_HPDET_TYPE, 0x03, 0x00);
regmap_update_bits(es8326->regmap, ES8326_HPDET_TYPE, 0x10, 0x10);
usleep_range(50000, 70000);
regmap_write(es8326->regmap, ES8326_INT_SOURCE,
(ES8326_INT_SRC_PIN9 | ES8326_INT_SRC_BUTTON));
regmap_write(es8326->regmap, ES8326_SYS_BIAS, 0x1f); regmap_write(es8326->regmap, ES8326_SYS_BIAS, 0x1f);
regmap_update_bits(es8326->regmap, ES8326_HP_DRIVER_REF, 0x0f, 0x08); regmap_update_bits(es8326->regmap, ES8326_HP_DRIVER_REF, 0x0f, 0x08);
queue_delayed_work(system_wq, &es8326->jack_detect_work, queue_delayed_work(system_wq, &es8326->jack_detect_work,

View File

@ -68,6 +68,7 @@ static bool rt722_sdca_mbq_readable_register(struct device *dev, unsigned int re
case 0x200007f: case 0x200007f:
case 0x2000082 ... 0x200008e: case 0x2000082 ... 0x200008e:
case 0x2000090 ... 0x2000094: case 0x2000090 ... 0x2000094:
case 0x3110000:
case 0x5300000 ... 0x5300002: case 0x5300000 ... 0x5300002:
case 0x5400002: case 0x5400002:
case 0x5600000 ... 0x5600007: case 0x5600000 ... 0x5600007:
@ -125,6 +126,7 @@ static bool rt722_sdca_mbq_volatile_register(struct device *dev, unsigned int re
case 0x2000067: case 0x2000067:
case 0x2000084: case 0x2000084:
case 0x2000086: case 0x2000086:
case 0x3110000:
return true; return true;
default: default:
return false; return false;
@ -350,7 +352,7 @@ static int rt722_sdca_interrupt_callback(struct sdw_slave *slave,
if (status->sdca_cascade && !rt722->disable_irq) if (status->sdca_cascade && !rt722->disable_irq)
mod_delayed_work(system_power_efficient_wq, mod_delayed_work(system_power_efficient_wq,
&rt722->jack_detect_work, msecs_to_jiffies(30)); &rt722->jack_detect_work, msecs_to_jiffies(280));
mutex_unlock(&rt722->disable_irq_lock); mutex_unlock(&rt722->disable_irq_lock);

View File

@ -559,6 +559,8 @@ static int fsl_asoc_card_probe(struct platform_device *pdev)
if (!priv) if (!priv)
return -ENOMEM; return -ENOMEM;
priv->pdev = pdev;
cpu_np = of_parse_phandle(np, "audio-cpu", 0); cpu_np = of_parse_phandle(np, "audio-cpu", 0);
/* Give a chance to old DT binding */ /* Give a chance to old DT binding */
if (!cpu_np) if (!cpu_np)
@ -787,7 +789,6 @@ static int fsl_asoc_card_probe(struct platform_device *pdev)
} }
/* Initialize sound card */ /* Initialize sound card */
priv->pdev = pdev;
priv->card.dev = &pdev->dev; priv->card.dev = &pdev->dev;
priv->card.owner = THIS_MODULE; priv->card.owner = THIS_MODULE;
ret = snd_soc_of_parse_card_name(&priv->card, "model"); ret = snd_soc_of_parse_card_name(&priv->card, "model");

View File

@ -50,4 +50,5 @@ int imx_pcm_dma_init(struct platform_device *pdev)
} }
EXPORT_SYMBOL_GPL(imx_pcm_dma_init); EXPORT_SYMBOL_GPL(imx_pcm_dma_init);
MODULE_DESCRIPTION("Freescale i.MX PCM DMA interface");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");

View File

@ -1545,8 +1545,8 @@ static int avs_route_load(struct snd_soc_component *comp, int index,
{ {
struct snd_soc_acpi_mach *mach = dev_get_platdata(comp->card->dev); struct snd_soc_acpi_mach *mach = dev_get_platdata(comp->card->dev);
size_t len = SNDRV_CTL_ELEM_ID_NAME_MAXLEN; size_t len = SNDRV_CTL_ELEM_ID_NAME_MAXLEN;
char buf[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
int ssp_port, tdm_slot; int ssp_port, tdm_slot;
char *buf;
/* See parse_link_formatted_string() for dynamic naming when(s). */ /* See parse_link_formatted_string() for dynamic naming when(s). */
if (!avs_mach_singular_ssp(mach)) if (!avs_mach_singular_ssp(mach))
@ -1557,13 +1557,24 @@ static int avs_route_load(struct snd_soc_component *comp, int index,
return 0; return 0;
tdm_slot = avs_mach_ssp_tdm(mach, ssp_port); tdm_slot = avs_mach_ssp_tdm(mach, ssp_port);
buf = devm_kzalloc(comp->card->dev, len, GFP_KERNEL);
if (!buf)
return -ENOMEM;
avs_ssp_sprint(buf, len, route->source, ssp_port, tdm_slot); avs_ssp_sprint(buf, len, route->source, ssp_port, tdm_slot);
strscpy((char *)route->source, buf, len); route->source = buf;
buf = devm_kzalloc(comp->card->dev, len, GFP_KERNEL);
if (!buf)
return -ENOMEM;
avs_ssp_sprint(buf, len, route->sink, ssp_port, tdm_slot); avs_ssp_sprint(buf, len, route->sink, ssp_port, tdm_slot);
strscpy((char *)route->sink, buf, len); route->sink = buf;
if (route->control) { if (route->control) {
buf = devm_kzalloc(comp->card->dev, len, GFP_KERNEL);
if (!buf)
return -ENOMEM;
avs_ssp_sprint(buf, len, route->control, ssp_port, tdm_slot); avs_ssp_sprint(buf, len, route->control, ssp_port, tdm_slot);
strscpy((char *)route->control, buf, len); route->control = buf;
} }
return 0; return 0;

View File

@ -610,6 +610,17 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = {
BYT_RT5640_SSP0_AIF1 | BYT_RT5640_SSP0_AIF1 |
BYT_RT5640_MCLK_EN), BYT_RT5640_MCLK_EN),
}, },
{
.matches = {
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "ARCHOS"),
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "ARCHOS 101 CESIUM"),
},
.driver_data = (void *)(BYTCR_INPUT_DEFAULTS |
BYT_RT5640_JD_NOT_INV |
BYT_RT5640_DIFF_MIC |
BYT_RT5640_SSP0_AIF1 |
BYT_RT5640_MCLK_EN),
},
{ {
.matches = { .matches = {
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "ARCHOS"), DMI_EXACT_MATCH(DMI_SYS_VENDOR, "ARCHOS"),

View File

@ -293,7 +293,7 @@ static const struct snd_soc_acpi_adr_device rt1318_1_single_adr[] = {
.adr = 0x000130025D131801, .adr = 0x000130025D131801,
.num_endpoints = 1, .num_endpoints = 1,
.endpoints = &single_endpoint, .endpoints = &single_endpoint,
.name_prefix = "rt1318" .name_prefix = "rt1318-1"
} }
}; };

View File

@ -31,7 +31,7 @@ struct mt8183_da7219_max98357_priv {
static struct snd_soc_jack_pin mt8183_da7219_max98357_jack_pins[] = { static struct snd_soc_jack_pin mt8183_da7219_max98357_jack_pins[] = {
{ {
.pin = "Headphone", .pin = "Headphones",
.mask = SND_JACK_HEADPHONE, .mask = SND_JACK_HEADPHONE,
}, },
{ {
@ -626,7 +626,7 @@ static struct snd_soc_codec_conf mt6358_codec_conf[] = {
}; };
static const struct snd_kcontrol_new mt8183_da7219_max98357_snd_controls[] = { static const struct snd_kcontrol_new mt8183_da7219_max98357_snd_controls[] = {
SOC_DAPM_PIN_SWITCH("Headphone"), SOC_DAPM_PIN_SWITCH("Headphones"),
SOC_DAPM_PIN_SWITCH("Headset Mic"), SOC_DAPM_PIN_SWITCH("Headset Mic"),
SOC_DAPM_PIN_SWITCH("Speakers"), SOC_DAPM_PIN_SWITCH("Speakers"),
SOC_DAPM_PIN_SWITCH("Line Out"), SOC_DAPM_PIN_SWITCH("Line Out"),
@ -634,7 +634,7 @@ static const struct snd_kcontrol_new mt8183_da7219_max98357_snd_controls[] = {
static const static const
struct snd_soc_dapm_widget mt8183_da7219_max98357_dapm_widgets[] = { struct snd_soc_dapm_widget mt8183_da7219_max98357_dapm_widgets[] = {
SND_SOC_DAPM_HP("Headphone", NULL), SND_SOC_DAPM_HP("Headphones", NULL),
SND_SOC_DAPM_MIC("Headset Mic", NULL), SND_SOC_DAPM_MIC("Headset Mic", NULL),
SND_SOC_DAPM_SPK("Speakers", NULL), SND_SOC_DAPM_SPK("Speakers", NULL),
SND_SOC_DAPM_SPK("Line Out", NULL), SND_SOC_DAPM_SPK("Line Out", NULL),
@ -680,7 +680,7 @@ static struct snd_soc_codec_conf mt8183_da7219_rt1015_codec_conf[] = {
}; };
static const struct snd_kcontrol_new mt8183_da7219_rt1015_snd_controls[] = { static const struct snd_kcontrol_new mt8183_da7219_rt1015_snd_controls[] = {
SOC_DAPM_PIN_SWITCH("Headphone"), SOC_DAPM_PIN_SWITCH("Headphones"),
SOC_DAPM_PIN_SWITCH("Headset Mic"), SOC_DAPM_PIN_SWITCH("Headset Mic"),
SOC_DAPM_PIN_SWITCH("Left Spk"), SOC_DAPM_PIN_SWITCH("Left Spk"),
SOC_DAPM_PIN_SWITCH("Right Spk"), SOC_DAPM_PIN_SWITCH("Right Spk"),
@ -689,7 +689,7 @@ static const struct snd_kcontrol_new mt8183_da7219_rt1015_snd_controls[] = {
static const static const
struct snd_soc_dapm_widget mt8183_da7219_rt1015_dapm_widgets[] = { struct snd_soc_dapm_widget mt8183_da7219_rt1015_dapm_widgets[] = {
SND_SOC_DAPM_HP("Headphone", NULL), SND_SOC_DAPM_HP("Headphones", NULL),
SND_SOC_DAPM_MIC("Headset Mic", NULL), SND_SOC_DAPM_MIC("Headset Mic", NULL),
SND_SOC_DAPM_SPK("Left Spk", NULL), SND_SOC_DAPM_SPK("Left Spk", NULL),
SND_SOC_DAPM_SPK("Right Spk", NULL), SND_SOC_DAPM_SPK("Right Spk", NULL),

View File

@ -43,4 +43,5 @@ int mxs_pcm_platform_register(struct device *dev)
} }
EXPORT_SYMBOL_GPL(mxs_pcm_platform_register); EXPORT_SYMBOL_GPL(mxs_pcm_platform_register);
MODULE_DESCRIPTION("MXS ASoC PCM driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");

View File

@ -146,14 +146,17 @@ static void q6apm_lpass_dai_shutdown(struct snd_pcm_substream *substream, struct
struct q6apm_lpass_dai_data *dai_data = dev_get_drvdata(dai->dev); struct q6apm_lpass_dai_data *dai_data = dev_get_drvdata(dai->dev);
int rc; int rc;
if (!dai_data->is_port_started[dai->id]) if (dai_data->is_port_started[dai->id]) {
return; rc = q6apm_graph_stop(dai_data->graph[dai->id]);
rc = q6apm_graph_stop(dai_data->graph[dai->id]); dai_data->is_port_started[dai->id] = false;
if (rc < 0) if (rc < 0)
dev_err(dai->dev, "fail to close APM port (%d)\n", rc); dev_err(dai->dev, "fail to close APM port (%d)\n", rc);
}
q6apm_graph_close(dai_data->graph[dai->id]); if (dai_data->graph[dai->id]) {
dai_data->is_port_started[dai->id] = false; q6apm_graph_close(dai_data->graph[dai->id]);
dai_data->graph[dai->id] = NULL;
}
} }
static int q6apm_lpass_dai_prepare(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) static int q6apm_lpass_dai_prepare(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
@ -168,8 +171,10 @@ static int q6apm_lpass_dai_prepare(struct snd_pcm_substream *substream, struct s
q6apm_graph_stop(dai_data->graph[dai->id]); q6apm_graph_stop(dai_data->graph[dai->id]);
dai_data->is_port_started[dai->id] = false; dai_data->is_port_started[dai->id] = false;
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
q6apm_graph_close(dai_data->graph[dai->id]); q6apm_graph_close(dai_data->graph[dai->id]);
dai_data->graph[dai->id] = NULL;
}
} }
/** /**
@ -188,26 +193,29 @@ static int q6apm_lpass_dai_prepare(struct snd_pcm_substream *substream, struct s
cfg->direction = substream->stream; cfg->direction = substream->stream;
rc = q6apm_graph_media_format_pcm(dai_data->graph[dai->id], cfg); rc = q6apm_graph_media_format_pcm(dai_data->graph[dai->id], cfg);
if (rc) { if (rc) {
dev_err(dai->dev, "Failed to set media format %d\n", rc); dev_err(dai->dev, "Failed to set media format %d\n", rc);
return rc; goto err;
} }
rc = q6apm_graph_prepare(dai_data->graph[dai->id]); rc = q6apm_graph_prepare(dai_data->graph[dai->id]);
if (rc) { if (rc) {
dev_err(dai->dev, "Failed to prepare Graph %d\n", rc); dev_err(dai->dev, "Failed to prepare Graph %d\n", rc);
return rc; goto err;
} }
rc = q6apm_graph_start(dai_data->graph[dai->id]); rc = q6apm_graph_start(dai_data->graph[dai->id]);
if (rc < 0) { if (rc < 0) {
dev_err(dai->dev, "fail to start APM port %x\n", dai->id); dev_err(dai->dev, "fail to start APM port %x\n", dai->id);
return rc; goto err;
} }
dai_data->is_port_started[dai->id] = true; dai_data->is_port_started[dai->id] = true;
return 0; return 0;
err:
q6apm_graph_close(dai_data->graph[dai->id]);
dai_data->graph[dai->id] = NULL;
return rc;
} }
static int q6apm_lpass_dai_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) static int q6apm_lpass_dai_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)

View File

@ -160,4 +160,5 @@ int qcom_snd_sdw_hw_free(struct snd_pcm_substream *substream,
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(qcom_snd_sdw_hw_free); EXPORT_SYMBOL_GPL(qcom_snd_sdw_hw_free);
MODULE_DESCRIPTION("Qualcomm ASoC SoundWire helper functions");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");

View File

@ -655,8 +655,17 @@ static int rockchip_i2s_tdm_hw_params(struct snd_pcm_substream *substream,
int err; int err;
if (i2s_tdm->is_master_mode) { if (i2s_tdm->is_master_mode) {
struct clk *mclk = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ? struct clk *mclk;
i2s_tdm->mclk_tx : i2s_tdm->mclk_rx;
if (i2s_tdm->clk_trcm == TRCM_TX) {
mclk = i2s_tdm->mclk_tx;
} else if (i2s_tdm->clk_trcm == TRCM_RX) {
mclk = i2s_tdm->mclk_rx;
} else if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
mclk = i2s_tdm->mclk_tx;
} else {
mclk = i2s_tdm->mclk_rx;
}
err = clk_set_rate(mclk, DEFAULT_MCLK_FS * params_rate(params)); err = clk_set_rate(mclk, DEFAULT_MCLK_FS * params_rate(params));
if (err) if (err)

View File

@ -318,6 +318,12 @@ static int dmaengine_copy(struct snd_soc_component *component,
return 0; return 0;
} }
static int dmaengine_pcm_sync_stop(struct snd_soc_component *component,
struct snd_pcm_substream *substream)
{
return snd_dmaengine_pcm_sync_stop(substream);
}
static const struct snd_soc_component_driver dmaengine_pcm_component = { static const struct snd_soc_component_driver dmaengine_pcm_component = {
.name = SND_DMAENGINE_PCM_DRV_NAME, .name = SND_DMAENGINE_PCM_DRV_NAME,
.probe_order = SND_SOC_COMP_ORDER_LATE, .probe_order = SND_SOC_COMP_ORDER_LATE,
@ -327,6 +333,7 @@ static const struct snd_soc_component_driver dmaengine_pcm_component = {
.trigger = dmaengine_pcm_trigger, .trigger = dmaengine_pcm_trigger,
.pointer = dmaengine_pcm_pointer, .pointer = dmaengine_pcm_pointer,
.pcm_construct = dmaengine_pcm_new, .pcm_construct = dmaengine_pcm_new,
.sync_stop = dmaengine_pcm_sync_stop,
}; };
static const struct snd_soc_component_driver dmaengine_pcm_component_process = { static const struct snd_soc_component_driver dmaengine_pcm_component_process = {
@ -339,6 +346,7 @@ static const struct snd_soc_component_driver dmaengine_pcm_component_process = {
.pointer = dmaengine_pcm_pointer, .pointer = dmaengine_pcm_pointer,
.copy = dmaengine_copy, .copy = dmaengine_copy,
.pcm_construct = dmaengine_pcm_new, .pcm_construct = dmaengine_pcm_new,
.sync_stop = dmaengine_pcm_sync_stop,
}; };
static const char * const dmaengine_pcm_dma_channel_names[] = { static const char * const dmaengine_pcm_dma_channel_names[] = {

View File

@ -1021,6 +1021,7 @@ static int soc_tplg_dapm_graph_elems_load(struct soc_tplg *tplg,
struct snd_soc_tplg_hdr *hdr) struct snd_soc_tplg_hdr *hdr)
{ {
struct snd_soc_dapm_context *dapm = &tplg->comp->dapm; struct snd_soc_dapm_context *dapm = &tplg->comp->dapm;
const size_t maxlen = SNDRV_CTL_ELEM_ID_NAME_MAXLEN;
struct snd_soc_tplg_dapm_graph_elem *elem; struct snd_soc_tplg_dapm_graph_elem *elem;
struct snd_soc_dapm_route *route; struct snd_soc_dapm_route *route;
int count, i; int count, i;
@ -1044,31 +1045,27 @@ static int soc_tplg_dapm_graph_elems_load(struct soc_tplg *tplg,
tplg->pos += sizeof(struct snd_soc_tplg_dapm_graph_elem); tplg->pos += sizeof(struct snd_soc_tplg_dapm_graph_elem);
/* validate routes */ /* validate routes */
if (strnlen(elem->source, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) == if ((strnlen(elem->source, maxlen) == maxlen) ||
SNDRV_CTL_ELEM_ID_NAME_MAXLEN) { (strnlen(elem->sink, maxlen) == maxlen) ||
ret = -EINVAL; (strnlen(elem->control, maxlen) == maxlen)) {
break;
}
if (strnlen(elem->sink, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) ==
SNDRV_CTL_ELEM_ID_NAME_MAXLEN) {
ret = -EINVAL;
break;
}
if (strnlen(elem->control, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) ==
SNDRV_CTL_ELEM_ID_NAME_MAXLEN) {
ret = -EINVAL; ret = -EINVAL;
break; break;
} }
route->source = elem->source; route->source = devm_kstrdup(tplg->dev, elem->source, GFP_KERNEL);
route->sink = elem->sink; route->sink = devm_kstrdup(tplg->dev, elem->sink, GFP_KERNEL);
if (!route->source || !route->sink) {
ret = -ENOMEM;
break;
}
/* set to NULL atm for tplg users */ if (strnlen(elem->control, maxlen) != 0) {
route->connected = NULL; route->control = devm_kstrdup(tplg->dev, elem->control, GFP_KERNEL);
if (strnlen(elem->control, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) == 0) if (!route->control) {
route->control = NULL; ret = -ENOMEM;
else break;
route->control = elem->control; }
}
/* add route dobj to dobj_list */ /* add route dobj to dobj_list */
route->dobj.type = SND_SOC_DOBJ_GRAPH; route->dobj.type = SND_SOC_DOBJ_GRAPH;

View File

@ -379,7 +379,7 @@ static int non_hda_dai_hw_params_data(struct snd_pcm_substream *substream,
sdev = widget_to_sdev(w); sdev = widget_to_sdev(w);
if (sdev->dspless_mode_selected) if (sdev->dspless_mode_selected)
goto skip_tlv; return 0;
/* get stream_id */ /* get stream_id */
hext_stream = ops->get_hext_stream(sdev, cpu_dai, substream); hext_stream = ops->get_hext_stream(sdev, cpu_dai, substream);
@ -423,7 +423,6 @@ static int non_hda_dai_hw_params_data(struct snd_pcm_substream *substream,
dma_config->dma_stream_channel_map.device_count = 1; dma_config->dma_stream_channel_map.device_count = 1;
dma_config->dma_priv_config_size = 0; dma_config->dma_priv_config_size = 0;
skip_tlv:
return 0; return 0;
} }
@ -525,6 +524,9 @@ int sdw_hda_dai_hw_params(struct snd_pcm_substream *substream,
return ret; return ret;
} }
if (sdev->dspless_mode_selected)
return 0;
ipc4_copier = widget_to_copier(w); ipc4_copier = widget_to_copier(w);
dma_config_tlv = &ipc4_copier->dma_config_tlv[cpu_dai_id]; dma_config_tlv = &ipc4_copier->dma_config_tlv[cpu_dai_id];
dma_config = &dma_config_tlv->dma_config; dma_config = &dma_config_tlv->dma_config;

View File

@ -485,7 +485,7 @@ sink_prepare:
if (ret < 0) { if (ret < 0) {
/* unprepare the source widget */ /* unprepare the source widget */
if (widget_ops[widget->id].ipc_unprepare && if (widget_ops[widget->id].ipc_unprepare &&
swidget && swidget->prepared) { swidget && swidget->prepared && swidget->use_count == 0) {
widget_ops[widget->id].ipc_unprepare(swidget); widget_ops[widget->id].ipc_unprepare(swidget);
swidget->prepared = false; swidget->prepared = false;
} }

View File

@ -1472,10 +1472,11 @@ static int davinci_mcasp_hw_rule_min_periodsize(
{ {
struct snd_interval *period_size = hw_param_interval(params, struct snd_interval *period_size = hw_param_interval(params,
SNDRV_PCM_HW_PARAM_PERIOD_SIZE); SNDRV_PCM_HW_PARAM_PERIOD_SIZE);
u8 numevt = *((u8 *)rule->private);
struct snd_interval frames; struct snd_interval frames;
snd_interval_any(&frames); snd_interval_any(&frames);
frames.min = 64; frames.min = numevt;
frames.integer = 1; frames.integer = 1;
return snd_interval_refine(period_size, &frames); return snd_interval_refine(period_size, &frames);
@ -1490,6 +1491,7 @@ static int davinci_mcasp_startup(struct snd_pcm_substream *substream,
u32 max_channels = 0; u32 max_channels = 0;
int i, dir, ret; int i, dir, ret;
int tdm_slots = mcasp->tdm_slots; int tdm_slots = mcasp->tdm_slots;
u8 *numevt;
/* Do not allow more then one stream per direction */ /* Do not allow more then one stream per direction */
if (mcasp->substreams[substream->stream]) if (mcasp->substreams[substream->stream])
@ -1589,9 +1591,12 @@ static int davinci_mcasp_startup(struct snd_pcm_substream *substream,
return ret; return ret;
} }
numevt = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ?
&mcasp->txnumevt :
&mcasp->rxnumevt;
snd_pcm_hw_rule_add(substream->runtime, 0, snd_pcm_hw_rule_add(substream->runtime, 0,
SNDRV_PCM_HW_PARAM_PERIOD_SIZE, SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
davinci_mcasp_hw_rule_min_periodsize, NULL, davinci_mcasp_hw_rule_min_periodsize, numevt,
SNDRV_PCM_HW_PARAM_PERIOD_SIZE, -1); SNDRV_PCM_HW_PARAM_PERIOD_SIZE, -1);
return 0; return 0;

View File

@ -354,11 +354,7 @@ static int omap_hdmi_audio_probe(struct platform_device *pdev)
if (!card) if (!card)
return -ENOMEM; return -ENOMEM;
card->name = devm_kasprintf(dev, GFP_KERNEL, card->name = "HDMI";
"HDMI %s", dev_name(ad->dssdev));
if (!card->name)
return -ENOMEM;
card->owner = THIS_MODULE; card->owner = THIS_MODULE;
card->dai_link = card->dai_link =
devm_kzalloc(dev, sizeof(*(card->dai_link)), GFP_KERNEL); devm_kzalloc(dev, sizeof(*(card->dai_link)), GFP_KERNEL);