mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-16 18:26:42 +00:00
ASoC: Fixes for v6.8
A bunch of small fixes that come in during the merge window, mainly fixing issues from some core refactoring around dummy components that weren't detected until things reached mainline. The TAS driver changes are a little larger than normal for a device ID addition due to some shuffling around of where things are registered and DT updates but aren't really any more substantial than normal. -----BEGIN PGP SIGNATURE----- iQEzBAABCgAdFiEEreZoqmdXGLWf4p/qJNaLcl1Uh9AFAmWmnFEACgkQJNaLcl1U h9Dzvgf/RfM1g44TeC/hSX0+qdrL6QYg5wPeMWPtV4xgLqx2oqftU9eIcBLHPz03 N1hdutFFqNTR3W5GiTmyV5mLdgJpZBgkYU5dkhXCrlI7xJ6tV7Wsx86Q9ClSmEBH Z4ZR2oAmCQIt3swshOBvwYUI6MOcG/zSqDBcRQ6t6d98TOkp2m3PPrjEYqEA2ja9 tyr73WXsdammYXZVYPu9oYoNE2Ef6Io5nkyds1F4irCcx1EXiS95cZjF3/OZ9OPP iGpzVkXvgwb0Jbq+NsBogydsIsSAu4pyNNcu3P9Xcr1rkNqVwz1X1KYvvnSHDqdw ZbmU6r83dCUpizpgFA4wv8irNn+aKw== =Rr9L -----END PGP SIGNATURE----- Merge tag 'asoc-fix-v6.8-merge-window' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-linus ASoC: Fixes for v6.8 A bunch of small fixes that come in during the merge window, mainly fixing issues from some core refactoring around dummy components that weren't detected until things reached mainline. The TAS driver changes are a little larger than normal for a device ID addition due to some shuffling around of where things are registered and DT updates but aren't really any more substantial than normal.
This commit is contained in:
commit
e069642059
@ -18,7 +18,6 @@ description: |
|
||||
|
||||
Specifications about the audio amplifier can be found at:
|
||||
https://www.ti.com/lit/gpn/tas2562
|
||||
https://www.ti.com/lit/gpn/tas2563
|
||||
https://www.ti.com/lit/gpn/tas2564
|
||||
https://www.ti.com/lit/gpn/tas2110
|
||||
|
||||
@ -29,7 +28,6 @@ properties:
|
||||
compatible:
|
||||
enum:
|
||||
- ti,tas2562
|
||||
- ti,tas2563
|
||||
- ti,tas2564
|
||||
- ti,tas2110
|
||||
|
||||
|
@ -5,36 +5,46 @@
|
||||
$id: http://devicetree.org/schemas/sound/ti,tas2781.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Texas Instruments TAS2781 SmartAMP
|
||||
title: Texas Instruments TAS2563/TAS2781 SmartAMP
|
||||
|
||||
maintainers:
|
||||
- Shenghao Ding <shenghao-ding@ti.com>
|
||||
|
||||
description:
|
||||
The TAS2781 is a mono, digital input Class-D audio amplifier
|
||||
optimized for efficiently driving high peak power into small
|
||||
loudspeakers. An integrated on-chip DSP supports Texas Instruments
|
||||
Smart Amp speaker protection algorithm. The integrated speaker
|
||||
voltage and current sense provides for real time
|
||||
description: |
|
||||
The TAS2563/TAS2781 is a mono, digital input Class-D audio
|
||||
amplifier optimized for efficiently driving high peak power into
|
||||
small loudspeakers. An integrated on-chip DSP supports Texas
|
||||
Instruments Smart Amp speaker protection algorithm. The
|
||||
integrated speaker voltage and current sense provides for real time
|
||||
monitoring of loudspeaker behavior.
|
||||
|
||||
allOf:
|
||||
- $ref: dai-common.yaml#
|
||||
Specifications about the audio amplifier can be found at:
|
||||
https://www.ti.com/lit/gpn/tas2563
|
||||
https://www.ti.com/lit/gpn/tas2781
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- ti,tas2781
|
||||
description: |
|
||||
ti,tas2563: 6.1-W Boosted Class-D Audio Amplifier With Integrated
|
||||
DSP and IV Sense, 16/20/24/32bit stereo I2S or multichannel TDM.
|
||||
|
||||
ti,tas2781: 24-V Class-D Amplifier with Real Time Integrated Speaker
|
||||
Protection and Audio Processing, 16/20/24/32bit stereo I2S or
|
||||
multichannel TDM.
|
||||
oneOf:
|
||||
- items:
|
||||
- enum:
|
||||
- ti,tas2563
|
||||
- const: ti,tas2781
|
||||
- enum:
|
||||
- ti,tas2781
|
||||
|
||||
reg:
|
||||
description:
|
||||
I2C address, in multiple tas2781s case, all the i2c address
|
||||
I2C address, in multiple-AMP case, all the i2c address
|
||||
aggregate as one Audio Device to support multiple audio slots.
|
||||
maxItems: 8
|
||||
minItems: 1
|
||||
items:
|
||||
minimum: 0x38
|
||||
maximum: 0x3f
|
||||
|
||||
reset-gpios:
|
||||
maxItems: 1
|
||||
@ -49,6 +59,44 @@ required:
|
||||
- compatible
|
||||
- reg
|
||||
|
||||
allOf:
|
||||
- $ref: dai-common.yaml#
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- ti,tas2563
|
||||
then:
|
||||
properties:
|
||||
reg:
|
||||
description:
|
||||
I2C address, in multiple-AMP case, all the i2c address
|
||||
aggregate as one Audio Device to support multiple audio slots.
|
||||
maxItems: 4
|
||||
minItems: 1
|
||||
items:
|
||||
minimum: 0x4c
|
||||
maximum: 0x4f
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- ti,tas2781
|
||||
then:
|
||||
properties:
|
||||
reg:
|
||||
description:
|
||||
I2C address, in multiple-AMP case, all the i2c address
|
||||
aggregate as one Audio Device to support multiple audio slots.
|
||||
maxItems: 8
|
||||
minItems: 1
|
||||
items:
|
||||
minimum: 0x38
|
||||
maximum: 0x3f
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
|
@ -1,13 +1,13 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
//
|
||||
// ALSA SoC Texas Instruments TAS2781 Audio Smart Amplifier
|
||||
// ALSA SoC Texas Instruments TAS2563/TAS2781 Audio Smart Amplifier
|
||||
//
|
||||
// Copyright (C) 2022 - 2023 Texas Instruments Incorporated
|
||||
// https://www.ti.com
|
||||
//
|
||||
// The TAS2781 driver implements a flexible and configurable
|
||||
// The TAS2563/TAS2781 driver implements a flexible and configurable
|
||||
// algo coefficient setting for one, two, or even multiple
|
||||
// TAS2781 chips.
|
||||
// TAS2563/TAS2781 chips.
|
||||
//
|
||||
// Author: Shenghao Ding <shenghao-ding@ti.com>
|
||||
// Author: Kevin Lu <kevin-lu@ti.com>
|
||||
@ -60,7 +60,8 @@
|
||||
#define TASDEVICE_CMD_FIELD_W 0x4
|
||||
|
||||
enum audio_device {
|
||||
TAS2781 = 0,
|
||||
TAS2563,
|
||||
TAS2781,
|
||||
};
|
||||
|
||||
enum device_catlog_id {
|
||||
|
@ -59,6 +59,7 @@
|
||||
|
||||
struct rtq9128_data {
|
||||
struct gpio_desc *enable;
|
||||
unsigned int daifmt;
|
||||
int tdm_slots;
|
||||
int tdm_slot_width;
|
||||
bool tdm_input_data2_select;
|
||||
@ -391,7 +392,11 @@ static int rtq9128_component_probe(struct snd_soc_component *comp)
|
||||
unsigned int val;
|
||||
int i, ret;
|
||||
|
||||
pm_runtime_resume_and_get(comp->dev);
|
||||
ret = pm_runtime_resume_and_get(comp->dev);
|
||||
if (ret < 0) {
|
||||
dev_err(comp->dev, "Failed to resume device (%d)\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
val = snd_soc_component_read(comp, RTQ9128_REG_EFUSE_DATA);
|
||||
|
||||
@ -437,10 +442,7 @@ static const struct snd_soc_component_driver rtq9128_comp_driver = {
|
||||
static int rtq9128_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
|
||||
{
|
||||
struct rtq9128_data *data = snd_soc_dai_get_drvdata(dai);
|
||||
struct snd_soc_component *comp = dai->component;
|
||||
struct device *dev = dai->dev;
|
||||
unsigned int audfmt, fmtval;
|
||||
int ret;
|
||||
|
||||
dev_dbg(dev, "%s: fmt 0x%8x\n", __func__, fmt);
|
||||
|
||||
@ -450,35 +452,10 @@ static int rtq9128_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
fmtval = fmt & SND_SOC_DAIFMT_FORMAT_MASK;
|
||||
if (data->tdm_slots && fmtval != SND_SOC_DAIFMT_DSP_A && fmtval != SND_SOC_DAIFMT_DSP_B) {
|
||||
dev_err(dev, "TDM is used, format only support DSP_A or DSP_B\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
/* Store here and will be used in runtime hw_params for DAI format setting */
|
||||
data->daifmt = fmt;
|
||||
|
||||
switch (fmtval) {
|
||||
case SND_SOC_DAIFMT_I2S:
|
||||
audfmt = 8;
|
||||
break;
|
||||
case SND_SOC_DAIFMT_LEFT_J:
|
||||
audfmt = 9;
|
||||
break;
|
||||
case SND_SOC_DAIFMT_RIGHT_J:
|
||||
audfmt = 10;
|
||||
break;
|
||||
case SND_SOC_DAIFMT_DSP_A:
|
||||
audfmt = data->tdm_slots ? 12 : 11;
|
||||
break;
|
||||
case SND_SOC_DAIFMT_DSP_B:
|
||||
audfmt = data->tdm_slots ? 4 : 3;
|
||||
break;
|
||||
default:
|
||||
dev_err(dev, "Unsupported format 0x%8x\n", fmt);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = snd_soc_component_write_field(comp, RTQ9128_REG_I2S_OPT, RTQ9128_AUDFMT_MASK, audfmt);
|
||||
return ret < 0 ? ret : 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rtq9128_dai_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
|
||||
@ -554,10 +531,38 @@ static int rtq9128_dai_hw_params(struct snd_pcm_substream *stream, struct snd_pc
|
||||
unsigned int width, slot_width, bitrate, audbit, dolen;
|
||||
struct snd_soc_component *comp = dai->component;
|
||||
struct device *dev = dai->dev;
|
||||
unsigned int fmtval, audfmt;
|
||||
int ret;
|
||||
|
||||
dev_dbg(dev, "%s: width %d\n", __func__, params_width(param));
|
||||
|
||||
fmtval = FIELD_GET(SND_SOC_DAIFMT_FORMAT_MASK, data->daifmt);
|
||||
if (data->tdm_slots && fmtval != SND_SOC_DAIFMT_DSP_A && fmtval != SND_SOC_DAIFMT_DSP_B) {
|
||||
dev_err(dev, "TDM is used, format only support DSP_A or DSP_B\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
switch (fmtval) {
|
||||
case SND_SOC_DAIFMT_I2S:
|
||||
audfmt = 8;
|
||||
break;
|
||||
case SND_SOC_DAIFMT_LEFT_J:
|
||||
audfmt = 9;
|
||||
break;
|
||||
case SND_SOC_DAIFMT_RIGHT_J:
|
||||
audfmt = 10;
|
||||
break;
|
||||
case SND_SOC_DAIFMT_DSP_A:
|
||||
audfmt = data->tdm_slots ? 12 : 11;
|
||||
break;
|
||||
case SND_SOC_DAIFMT_DSP_B:
|
||||
audfmt = data->tdm_slots ? 4 : 3;
|
||||
break;
|
||||
default:
|
||||
dev_err(dev, "Unsupported format 0x%8x\n", fmtval);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
switch (width = params_width(param)) {
|
||||
case 16:
|
||||
audbit = 0;
|
||||
@ -611,6 +616,10 @@ static int rtq9128_dai_hw_params(struct snd_pcm_substream *stream, struct snd_pc
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = snd_soc_component_write_field(comp, RTQ9128_REG_I2S_OPT, RTQ9128_AUDFMT_MASK, audfmt);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = snd_soc_component_write_field(comp, RTQ9128_REG_I2S_OPT, RTQ9128_AUDBIT_MASK, audbit);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
@ -59,7 +59,6 @@ struct tas2562_data {
|
||||
|
||||
enum tas256x_model {
|
||||
TAS2562,
|
||||
TAS2563,
|
||||
TAS2564,
|
||||
TAS2110,
|
||||
};
|
||||
@ -721,7 +720,6 @@ static int tas2562_parse_dt(struct tas2562_data *tas2562)
|
||||
|
||||
static const struct i2c_device_id tas2562_id[] = {
|
||||
{ "tas2562", TAS2562 },
|
||||
{ "tas2563", TAS2563 },
|
||||
{ "tas2564", TAS2564 },
|
||||
{ "tas2110", TAS2110 },
|
||||
{ }
|
||||
@ -770,7 +768,6 @@ static int tas2562_probe(struct i2c_client *client)
|
||||
#ifdef CONFIG_OF
|
||||
static const struct of_device_id tas2562_of_match[] = {
|
||||
{ .compatible = "ti,tas2562", },
|
||||
{ .compatible = "ti,tas2563", },
|
||||
{ .compatible = "ti,tas2564", },
|
||||
{ .compatible = "ti,tas2110", },
|
||||
{ },
|
||||
|
@ -1,13 +1,13 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
//
|
||||
// ALSA SoC Texas Instruments TAS2781 Audio Smart Amplifier
|
||||
// ALSA SoC Texas Instruments TAS2563/TAS2781 Audio Smart Amplifier
|
||||
//
|
||||
// Copyright (C) 2022 - 2023 Texas Instruments Incorporated
|
||||
// https://www.ti.com
|
||||
//
|
||||
// The TAS2781 driver implements a flexible and configurable
|
||||
// The TAS2563/TAS2781 driver implements a flexible and configurable
|
||||
// algo coefficient setting for one, two, or even multiple
|
||||
// TAS2781 chips.
|
||||
// TAS2563/TAS2781 chips.
|
||||
//
|
||||
// Author: Shenghao Ding <shenghao-ding@ti.com>
|
||||
// Author: Kevin Lu <kevin-lu@ti.com>
|
||||
@ -32,6 +32,7 @@
|
||||
#include <sound/tas2781-tlv.h>
|
||||
|
||||
static const struct i2c_device_id tasdevice_id[] = {
|
||||
{ "tas2563", TAS2563 },
|
||||
{ "tas2781", TAS2781 },
|
||||
{}
|
||||
};
|
||||
@ -39,6 +40,7 @@ MODULE_DEVICE_TABLE(i2c, tasdevice_id);
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
static const struct of_device_id tasdevice_of_match[] = {
|
||||
{ .compatible = "ti,tas2563" },
|
||||
{ .compatible = "ti,tas2781" },
|
||||
{},
|
||||
};
|
||||
|
@ -556,7 +556,7 @@ static int graph_parse_node_multi_nm(struct snd_soc_dai_link *dai_link,
|
||||
struct device_node *mcodec_port;
|
||||
int codec_idx;
|
||||
|
||||
if (*nm_idx >= nm_max)
|
||||
if (*nm_idx > nm_max)
|
||||
break;
|
||||
|
||||
mcpu_ep_n = of_get_next_child(mcpu_port, mcpu_ep_n);
|
||||
|
@ -797,6 +797,9 @@ static int broxton_audio_probe(struct platform_device *pdev)
|
||||
broxton_audio_card.name = "glkda7219max";
|
||||
/* Fixup the SSP entries for geminilake */
|
||||
for (i = 0; i < ARRAY_SIZE(broxton_dais); i++) {
|
||||
if (!broxton_dais[i].codecs->dai_name)
|
||||
continue;
|
||||
|
||||
/* MAXIM_CODEC is connected to SSP1. */
|
||||
if (!strcmp(broxton_dais[i].codecs->dai_name,
|
||||
BXT_MAXIM_CODEC_DAI)) {
|
||||
@ -822,6 +825,9 @@ static int broxton_audio_probe(struct platform_device *pdev)
|
||||
broxton_audio_card.name = "cmlda7219max";
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(broxton_dais); i++) {
|
||||
if (!broxton_dais[i].codecs->dai_name)
|
||||
continue;
|
||||
|
||||
/* MAXIM_CODEC is connected to SSP1. */
|
||||
if (!strcmp(broxton_dais[i].codecs->dai_name,
|
||||
BXT_MAXIM_CODEC_DAI)) {
|
||||
|
@ -604,7 +604,8 @@ static int broxton_audio_probe(struct platform_device *pdev)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(broxton_rt298_dais); i++) {
|
||||
if (!strncmp(card->dai_link[i].codecs->name, "i2c-INT343A:00",
|
||||
if (card->dai_link[i].codecs->name &&
|
||||
!strncmp(card->dai_link[i].codecs->name, "i2c-INT343A:00",
|
||||
I2C_NAME_SIZE)) {
|
||||
if (!strncmp(card->name, "broxton-rt298",
|
||||
PLATFORM_NAME_SIZE)) {
|
||||
|
@ -24,7 +24,7 @@ int mtk_sof_dai_link_fixup(struct snd_soc_pcm_runtime *rtd,
|
||||
struct snd_soc_dai_link *sof_dai_link = NULL;
|
||||
const struct sof_conn_stream *conn = &sof_priv->conn_streams[i];
|
||||
|
||||
if (strcmp(rtd->dai_link->name, conn->normal_link))
|
||||
if (conn->normal_link && strcmp(rtd->dai_link->name, conn->normal_link))
|
||||
continue;
|
||||
|
||||
for_each_card_rtds(card, runtime) {
|
||||
|
@ -1208,7 +1208,8 @@ static int mt8192_mt6359_dev_probe(struct platform_device *pdev)
|
||||
dai_link->ignore = 0;
|
||||
}
|
||||
|
||||
if (strcmp(dai_link->codecs[0].dai_name, RT1015_CODEC_DAI) == 0)
|
||||
if (dai_link->num_codecs && dai_link->codecs[0].dai_name &&
|
||||
strcmp(dai_link->codecs[0].dai_name, RT1015_CODEC_DAI) == 0)
|
||||
dai_link->ops = &mt8192_rt1015_i2s_ops;
|
||||
|
||||
if (!dai_link->platforms->name)
|
||||
|
@ -1795,10 +1795,6 @@ static const struct snd_kcontrol_new mt8195_memif_controls[] = {
|
||||
MT8195_AFE_IRQ_28),
|
||||
};
|
||||
|
||||
static const struct snd_soc_component_driver mt8195_afe_pcm_dai_component = {
|
||||
.name = "mt8195-afe-pcm-dai",
|
||||
};
|
||||
|
||||
static const struct mtk_base_memif_data memif_data[MT8195_AFE_MEMIF_NUM] = {
|
||||
[MT8195_AFE_MEMIF_DL2] = {
|
||||
.name = "DL2",
|
||||
@ -3037,7 +3033,6 @@ static int mt8195_afe_pcm_dev_probe(struct platform_device *pdev)
|
||||
struct device *dev = &pdev->dev;
|
||||
struct reset_control *rstc;
|
||||
int i, irq_id, ret;
|
||||
struct snd_soc_component *component;
|
||||
|
||||
ret = of_reserved_mem_device_init(dev);
|
||||
if (ret)
|
||||
@ -3170,36 +3165,12 @@ static int mt8195_afe_pcm_dev_probe(struct platform_device *pdev)
|
||||
|
||||
/* register component */
|
||||
ret = devm_snd_soc_register_component(dev, &mt8195_afe_component,
|
||||
NULL, 0);
|
||||
afe->dai_drivers, afe->num_dai_drivers);
|
||||
if (ret) {
|
||||
dev_warn(dev, "err_platform\n");
|
||||
goto err_pm_put;
|
||||
}
|
||||
|
||||
component = devm_kzalloc(dev, sizeof(*component), GFP_KERNEL);
|
||||
if (!component) {
|
||||
ret = -ENOMEM;
|
||||
goto err_pm_put;
|
||||
}
|
||||
|
||||
ret = snd_soc_component_initialize(component,
|
||||
&mt8195_afe_pcm_dai_component,
|
||||
dev);
|
||||
if (ret)
|
||||
goto err_pm_put;
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
component->debugfs_prefix = "pcm";
|
||||
#endif
|
||||
|
||||
ret = snd_soc_add_component(component,
|
||||
afe->dai_drivers,
|
||||
afe->num_dai_drivers);
|
||||
if (ret) {
|
||||
dev_warn(dev, "err_dai_component\n");
|
||||
goto err_pm_put;
|
||||
}
|
||||
|
||||
ret = regmap_multi_reg_write(afe->regmap, mt8195_afe_reg_defaults,
|
||||
ARRAY_SIZE(mt8195_afe_reg_defaults));
|
||||
if (ret)
|
||||
@ -3224,8 +3195,6 @@ err_pm_put:
|
||||
|
||||
static void mt8195_afe_pcm_dev_remove(struct platform_device *pdev)
|
||||
{
|
||||
snd_soc_unregister_component(&pdev->dev);
|
||||
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
if (!pm_runtime_status_suspended(&pdev->dev))
|
||||
mt8195_afe_runtime_suspend(&pdev->dev);
|
||||
|
@ -934,12 +934,11 @@ SND_SOC_DAILINK_DEFS(ETDM1_IN_BE,
|
||||
|
||||
SND_SOC_DAILINK_DEFS(ETDM2_IN_BE,
|
||||
DAILINK_COMP_ARRAY(COMP_CPU("ETDM2_IN")),
|
||||
DAILINK_COMP_ARRAY(COMP_DUMMY()),
|
||||
DAILINK_COMP_ARRAY(COMP_EMPTY()),
|
||||
DAILINK_COMP_ARRAY(COMP_EMPTY()));
|
||||
|
||||
SND_SOC_DAILINK_DEFS(ETDM1_OUT_BE,
|
||||
DAILINK_COMP_ARRAY(COMP_CPU("ETDM1_OUT")),
|
||||
DAILINK_COMP_ARRAY(COMP_DUMMY()),
|
||||
DAILINK_COMP_ARRAY(COMP_EMPTY()));
|
||||
|
||||
SND_SOC_DAILINK_DEFS(ETDM2_OUT_BE,
|
||||
@ -1237,8 +1236,6 @@ static struct snd_soc_dai_link mt8195_mt6359_dai_links[] = {
|
||||
SND_SOC_DAIFMT_NB_NF |
|
||||
SND_SOC_DAIFMT_CBS_CFS,
|
||||
.dpcm_capture = 1,
|
||||
.init = mt8195_rt5682_init,
|
||||
.ops = &mt8195_rt5682_etdm_ops,
|
||||
.be_hw_params_fixup = mt8195_etdm_hw_params_fixup,
|
||||
SND_SOC_DAILINK_REG(ETDM2_IN_BE),
|
||||
},
|
||||
@ -1249,7 +1246,6 @@ static struct snd_soc_dai_link mt8195_mt6359_dai_links[] = {
|
||||
SND_SOC_DAIFMT_NB_NF |
|
||||
SND_SOC_DAIFMT_CBS_CFS,
|
||||
.dpcm_playback = 1,
|
||||
.ops = &mt8195_rt5682_etdm_ops,
|
||||
.be_hw_params_fixup = mt8195_etdm_hw_params_fixup,
|
||||
SND_SOC_DAILINK_REG(ETDM1_OUT_BE),
|
||||
},
|
||||
@ -1381,7 +1377,7 @@ static int mt8195_mt6359_dev_probe(struct platform_device *pdev)
|
||||
struct snd_soc_dai_link *dai_link;
|
||||
struct mtk_soc_card_data *soc_card_data;
|
||||
struct mt8195_mt6359_priv *mach_priv;
|
||||
struct device_node *platform_node, *adsp_node, *dp_node, *hdmi_node;
|
||||
struct device_node *platform_node, *adsp_node, *codec_node, *dp_node, *hdmi_node;
|
||||
struct mt8195_card_data *card_data;
|
||||
int is5682s = 0;
|
||||
int init6359 = 0;
|
||||
@ -1401,8 +1397,12 @@ static int mt8195_mt6359_dev_probe(struct platform_device *pdev)
|
||||
if (!card->name)
|
||||
card->name = card_data->name;
|
||||
|
||||
if (strstr(card->name, "_5682s"))
|
||||
if (strstr(card->name, "_5682s")) {
|
||||
codec_node = of_find_compatible_node(NULL, NULL, "realtek,rt5682s");
|
||||
is5682s = 1;
|
||||
} else
|
||||
codec_node = of_find_compatible_node(NULL, NULL, "realtek,rt5682i");
|
||||
|
||||
soc_card_data = devm_kzalloc(&pdev->dev, sizeof(*card_data), GFP_KERNEL);
|
||||
if (!soc_card_data)
|
||||
return -ENOMEM;
|
||||
@ -1488,12 +1488,27 @@ static int mt8195_mt6359_dev_probe(struct platform_device *pdev)
|
||||
dai_link->codecs->dai_name = "i2s-hifi";
|
||||
dai_link->init = mt8195_hdmi_codec_init;
|
||||
}
|
||||
} else if (strcmp(dai_link->name, "ETDM1_OUT_BE") == 0 ||
|
||||
strcmp(dai_link->name, "ETDM2_IN_BE") == 0) {
|
||||
dai_link->codecs->name =
|
||||
is5682s ? RT5682S_DEV0_NAME : RT5682_DEV0_NAME;
|
||||
dai_link->codecs->dai_name =
|
||||
is5682s ? RT5682S_CODEC_DAI : RT5682_CODEC_DAI;
|
||||
} else if (strcmp(dai_link->name, "ETDM1_OUT_BE") == 0) {
|
||||
if (!codec_node) {
|
||||
dev_err(&pdev->dev, "Codec not found!\n");
|
||||
} else {
|
||||
dai_link->codecs->of_node = codec_node;
|
||||
dai_link->codecs->name = NULL;
|
||||
dai_link->codecs->dai_name =
|
||||
is5682s ? RT5682S_CODEC_DAI : RT5682_CODEC_DAI;
|
||||
dai_link->init = mt8195_rt5682_init;
|
||||
dai_link->ops = &mt8195_rt5682_etdm_ops;
|
||||
}
|
||||
} else if (strcmp(dai_link->name, "ETDM2_IN_BE") == 0) {
|
||||
if (!codec_node) {
|
||||
dev_err(&pdev->dev, "Codec not found!\n");
|
||||
} else {
|
||||
dai_link->codecs->of_node = codec_node;
|
||||
dai_link->codecs->name = NULL;
|
||||
dai_link->codecs->dai_name =
|
||||
is5682s ? RT5682S_CODEC_DAI : RT5682_CODEC_DAI;
|
||||
dai_link->ops = &mt8195_rt5682_etdm_ops;
|
||||
}
|
||||
} else if (strcmp(dai_link->name, "DL_SRC_BE") == 0 ||
|
||||
strcmp(dai_link->name, "UL_SRC1_BE") == 0 ||
|
||||
strcmp(dai_link->name, "UL_SRC2_BE") == 0) {
|
||||
|
@ -137,7 +137,6 @@ static int trace_filter_parse(struct snd_sof_dev *sdev, char *string,
|
||||
dev_err(sdev->dev,
|
||||
"Parsing filter entry '%s' failed with %d\n",
|
||||
entry, entry_len);
|
||||
kfree(*out);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
@ -209,13 +208,13 @@ static ssize_t dfsentry_trace_filter_write(struct file *file, const char __user
|
||||
ret = ipc3_trace_update_filter(sdev, num_elems, elems);
|
||||
if (ret < 0) {
|
||||
dev_err(sdev->dev, "Filter update failed: %d\n", ret);
|
||||
kfree(elems);
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
ret = count;
|
||||
error:
|
||||
kfree(string);
|
||||
kfree(elems);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -482,13 +482,10 @@ void sof_ipc4_update_cpc_from_manifest(struct snd_sof_dev *sdev,
|
||||
msg = "No CPC match in the firmware file's manifest";
|
||||
|
||||
no_cpc:
|
||||
dev_warn(sdev->dev, "%s (UUID: %pUL): %s (ibs/obs: %u/%u)\n",
|
||||
fw_module->man4_module_entry.name,
|
||||
&fw_module->man4_module_entry.uuid, msg, basecfg->ibs,
|
||||
basecfg->obs);
|
||||
dev_warn_once(sdev->dev, "Please try to update the firmware.\n");
|
||||
dev_warn_once(sdev->dev, "If the issue persists, file a bug at\n");
|
||||
dev_warn_once(sdev->dev, "https://github.com/thesofproject/sof/issues/\n");
|
||||
dev_dbg(sdev->dev, "%s (UUID: %pUL): %s (ibs/obs: %u/%u)\n",
|
||||
fw_module->man4_module_entry.name,
|
||||
&fw_module->man4_module_entry.uuid, msg, basecfg->ibs,
|
||||
basecfg->obs);
|
||||
}
|
||||
|
||||
const struct sof_ipc_fw_loader_ops ipc4_loader_ops = {
|
||||
|
@ -768,10 +768,8 @@ static void sof_ipc4_build_time_info(struct snd_sof_dev *sdev, struct snd_sof_pc
|
||||
info->llp_offset = offsetof(struct sof_ipc4_fw_registers, llp_evad_reading_slot) +
|
||||
sdev->fw_info_box.offset;
|
||||
sof_mailbox_read(sdev, info->llp_offset, &llp_slot, sizeof(llp_slot));
|
||||
if (llp_slot.node_id != dai_copier->data.gtw_cfg.node_id) {
|
||||
dev_info(sdev->dev, "no llp found, fall back to default HDA path");
|
||||
if (llp_slot.node_id != dai_copier->data.gtw_cfg.node_id)
|
||||
info->llp_offset = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static int sof_ipc4_pcm_hw_params(struct snd_soc_component *component,
|
||||
|
Loading…
x
Reference in New Issue
Block a user