ASoC: Fixes for v6.14
More fixes and deviec quirks, most of them driver specific including a few SOF robustness fixes. Nothing super remarkable individually. -----BEGIN PGP SIGNATURE----- iQEyBAABCgAdFiEEreZoqmdXGLWf4p/qJNaLcl1Uh9AFAmeuOjAACgkQJNaLcl1U h9B9Sgf4n79GM4fBc0i0lSJJ3QcFJSMjR5gh9+KN4j1P21Lfa6suqWofgmr+QJD3 TKwNu2f4Avns/adAx7HsGddwvtI/epcop8P0RjgrUDwAANSeg679E27sVORXJu1N j5XPTWNwIUFwLprfronORJxmbPU9FwxdWOrakp9lInGDmmza2q5+tsvX3lxgnWGS 0SM2KX4sNGh2dY22FMnG9+x+r1Jl1UIjuyn2mrGQTljT5daZJlI87PLYXJ2OnuKp uzGptfQSMa8t/r5Zpf83FOXaBO0K+GJn4+eG03UamZLqdpK4PsdgqMoiDPu/jM2v J1tl9CL1XPbpgwm/12MuKXTcVsjV =pve8 -----END PGP SIGNATURE----- Merge tag 'asoc-fix-v6.14-rc2' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-linus ASoC: Fixes for v6.14 More fixes and deviec quirks, most of them driver specific including a few SOF robustness fixes. Nothing super remarkable individually.
This commit is contained in:
commit
c5a9df928e
26 changed files with 245 additions and 136 deletions
|
@ -967,7 +967,7 @@ int arizona_out_ev(struct snd_soc_dapm_widget *w,
|
|||
case ARIZONA_OUT3L_ENA_SHIFT:
|
||||
case ARIZONA_OUT3R_ENA_SHIFT:
|
||||
priv->out_up_pending++;
|
||||
priv->out_up_delay += 17;
|
||||
priv->out_up_delay += 17000;
|
||||
break;
|
||||
case ARIZONA_OUT4L_ENA_SHIFT:
|
||||
case ARIZONA_OUT4R_ENA_SHIFT:
|
||||
|
@ -977,7 +977,7 @@ int arizona_out_ev(struct snd_soc_dapm_widget *w,
|
|||
case WM8997:
|
||||
break;
|
||||
default:
|
||||
priv->out_up_delay += 10;
|
||||
priv->out_up_delay += 10000;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
@ -999,7 +999,7 @@ int arizona_out_ev(struct snd_soc_dapm_widget *w,
|
|||
if (!priv->out_up_pending && priv->out_up_delay) {
|
||||
dev_dbg(component->dev, "Power up delay: %d\n",
|
||||
priv->out_up_delay);
|
||||
msleep(priv->out_up_delay);
|
||||
fsleep(priv->out_up_delay);
|
||||
priv->out_up_delay = 0;
|
||||
}
|
||||
break;
|
||||
|
@ -1017,7 +1017,7 @@ int arizona_out_ev(struct snd_soc_dapm_widget *w,
|
|||
case ARIZONA_OUT3L_ENA_SHIFT:
|
||||
case ARIZONA_OUT3R_ENA_SHIFT:
|
||||
priv->out_down_pending++;
|
||||
priv->out_down_delay++;
|
||||
priv->out_down_delay += 1000;
|
||||
break;
|
||||
case ARIZONA_OUT4L_ENA_SHIFT:
|
||||
case ARIZONA_OUT4R_ENA_SHIFT:
|
||||
|
@ -1028,10 +1028,10 @@ int arizona_out_ev(struct snd_soc_dapm_widget *w,
|
|||
break;
|
||||
case WM8998:
|
||||
case WM1814:
|
||||
priv->out_down_delay += 5;
|
||||
priv->out_down_delay += 5000;
|
||||
break;
|
||||
default:
|
||||
priv->out_down_delay++;
|
||||
priv->out_down_delay += 1000;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
@ -1053,7 +1053,7 @@ int arizona_out_ev(struct snd_soc_dapm_widget *w,
|
|||
if (!priv->out_down_pending && priv->out_down_delay) {
|
||||
dev_dbg(component->dev, "Power down delay: %d\n",
|
||||
priv->out_down_delay);
|
||||
msleep(priv->out_down_delay);
|
||||
fsleep(priv->out_down_delay);
|
||||
priv->out_down_delay = 0;
|
||||
}
|
||||
break;
|
||||
|
|
|
@ -1148,21 +1148,31 @@ err_dsp:
|
|||
return ret;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
static int cs35l41_acpi_get_name(struct cs35l41_private *cs35l41)
|
||||
{
|
||||
acpi_handle handle = ACPI_HANDLE(cs35l41->dev);
|
||||
struct acpi_device *adev = ACPI_COMPANION(cs35l41->dev);
|
||||
acpi_handle handle = acpi_device_handle(adev);
|
||||
const char *hid;
|
||||
const char *sub;
|
||||
|
||||
/* If there is no ACPI_HANDLE, there is no ACPI for this system, return 0 */
|
||||
if (!handle)
|
||||
/* If there is no acpi_device, there is no ACPI for this system, return 0 */
|
||||
if (!adev)
|
||||
return 0;
|
||||
|
||||
sub = acpi_get_subsystem_id(handle);
|
||||
if (IS_ERR(sub)) {
|
||||
/* If bad ACPI, return 0 and fallback to legacy firmware path, otherwise fail */
|
||||
if (PTR_ERR(sub) == -ENODATA)
|
||||
return 0;
|
||||
else
|
||||
/* If no _SUB, fallback to _HID, otherwise fail */
|
||||
if (PTR_ERR(sub) == -ENODATA) {
|
||||
hid = acpi_device_hid(adev);
|
||||
/* If dummy hid, return 0 and fallback to legacy firmware path */
|
||||
if (!strcmp(hid, "device"))
|
||||
return 0;
|
||||
sub = kstrdup(hid, GFP_KERNEL);
|
||||
if (!sub)
|
||||
sub = ERR_PTR(-ENOMEM);
|
||||
|
||||
} else
|
||||
return PTR_ERR(sub);
|
||||
}
|
||||
|
||||
|
@ -1171,6 +1181,12 @@ static int cs35l41_acpi_get_name(struct cs35l41_private *cs35l41)
|
|||
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
static int cs35l41_acpi_get_name(struct cs35l41_private *cs35l41)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_ACPI */
|
||||
|
||||
int cs35l41_probe(struct cs35l41_private *cs35l41, const struct cs35l41_hw_cfg *hw_cfg)
|
||||
{
|
||||
|
|
|
@ -2323,10 +2323,10 @@ int madera_out_ev(struct snd_soc_dapm_widget *w,
|
|||
case CS42L92:
|
||||
case CS47L92:
|
||||
case CS47L93:
|
||||
out_up_delay = 6;
|
||||
out_up_delay = 6000;
|
||||
break;
|
||||
default:
|
||||
out_up_delay = 17;
|
||||
out_up_delay = 17000;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -2357,7 +2357,7 @@ int madera_out_ev(struct snd_soc_dapm_widget *w,
|
|||
case MADERA_OUT3R_ENA_SHIFT:
|
||||
priv->out_up_pending--;
|
||||
if (!priv->out_up_pending) {
|
||||
msleep(priv->out_up_delay);
|
||||
fsleep(priv->out_up_delay);
|
||||
priv->out_up_delay = 0;
|
||||
}
|
||||
break;
|
||||
|
@ -2376,7 +2376,7 @@ int madera_out_ev(struct snd_soc_dapm_widget *w,
|
|||
case MADERA_OUT3L_ENA_SHIFT:
|
||||
case MADERA_OUT3R_ENA_SHIFT:
|
||||
priv->out_down_pending++;
|
||||
priv->out_down_delay++;
|
||||
priv->out_down_delay += 1000;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -2393,7 +2393,7 @@ int madera_out_ev(struct snd_soc_dapm_widget *w,
|
|||
case MADERA_OUT3R_ENA_SHIFT:
|
||||
priv->out_down_pending--;
|
||||
if (!priv->out_down_pending) {
|
||||
msleep(priv->out_down_delay);
|
||||
fsleep(priv->out_down_delay);
|
||||
priv->out_down_delay = 0;
|
||||
}
|
||||
break;
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
//
|
||||
// ALSA SoC Texas Instruments TAS2563/TAS2781 Audio Smart Amplifier
|
||||
//
|
||||
// Copyright (C) 2022 - 2024 Texas Instruments Incorporated
|
||||
// Copyright (C) 2022 - 2025 Texas Instruments Incorporated
|
||||
// https://www.ti.com
|
||||
//
|
||||
// The TAS2563/TAS2781 driver implements a flexible and configurable
|
||||
|
@ -1260,8 +1260,6 @@ static int tasdevice_create_cali_ctrls(struct tasdevice_priv *priv)
|
|||
(cali_data->cali_dat_sz_per_dev + 1) + 1 + 15 + 1;
|
||||
priv->cali_data.total_sz = priv->ndev *
|
||||
(cali_data->cali_dat_sz_per_dev + 1);
|
||||
priv->cali_data.data = devm_kzalloc(priv->dev,
|
||||
ext_cali_data->max, GFP_KERNEL);
|
||||
cali_ctrls[i].name = cali_name;
|
||||
cali_ctrls[i].iface = SNDRV_CTL_ELEM_IFACE_MIXER;
|
||||
cali_ctrls[i].info = snd_soc_bytes_info_ext;
|
||||
|
|
|
@ -302,7 +302,7 @@ static int wm5110_hp_pre_enable(struct snd_soc_dapm_widget *w)
|
|||
} else {
|
||||
wseq = wm5110_no_dre_left_enable;
|
||||
nregs = ARRAY_SIZE(wm5110_no_dre_left_enable);
|
||||
priv->out_up_delay += 10;
|
||||
priv->out_up_delay += 10000;
|
||||
}
|
||||
break;
|
||||
case ARIZONA_OUT1R_ENA_SHIFT:
|
||||
|
@ -312,7 +312,7 @@ static int wm5110_hp_pre_enable(struct snd_soc_dapm_widget *w)
|
|||
} else {
|
||||
wseq = wm5110_no_dre_right_enable;
|
||||
nregs = ARRAY_SIZE(wm5110_no_dre_right_enable);
|
||||
priv->out_up_delay += 10;
|
||||
priv->out_up_delay += 10000;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
@ -338,7 +338,7 @@ static int wm5110_hp_pre_disable(struct snd_soc_dapm_widget *w)
|
|||
snd_soc_component_update_bits(component,
|
||||
ARIZONA_SPARE_TRIGGERS,
|
||||
ARIZONA_WS_TRG1, 0);
|
||||
priv->out_down_delay += 27;
|
||||
priv->out_down_delay += 27000;
|
||||
}
|
||||
break;
|
||||
case ARIZONA_OUT1R_ENA_SHIFT:
|
||||
|
@ -350,7 +350,7 @@ static int wm5110_hp_pre_disable(struct snd_soc_dapm_widget *w)
|
|||
snd_soc_component_update_bits(component,
|
||||
ARIZONA_SPARE_TRIGGERS,
|
||||
ARIZONA_WS_TRG2, 0);
|
||||
priv->out_down_delay += 27;
|
||||
priv->out_down_delay += 27000;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
|
|
@ -183,6 +183,8 @@ static int micfil_set_quality(struct fsl_micfil *micfil)
|
|||
case QUALITY_VLOW2:
|
||||
qsel = MICFIL_QSEL_VLOW2_QUALITY;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return regmap_update_bits(micfil->regmap, REG_MICFIL_CTRL2,
|
||||
|
|
|
@ -23,7 +23,6 @@ struct imx_audmix {
|
|||
struct snd_soc_card card;
|
||||
struct platform_device *audmix_pdev;
|
||||
struct platform_device *out_pdev;
|
||||
struct clk *cpu_mclk;
|
||||
int num_dai;
|
||||
struct snd_soc_dai_link *dai;
|
||||
int num_dai_conf;
|
||||
|
@ -32,34 +31,11 @@ struct imx_audmix {
|
|||
struct snd_soc_dapm_route *dapm_routes;
|
||||
};
|
||||
|
||||
static const u32 imx_audmix_rates[] = {
|
||||
8000, 12000, 16000, 24000, 32000, 48000, 64000, 96000,
|
||||
};
|
||||
|
||||
static const struct snd_pcm_hw_constraint_list imx_audmix_rate_constraints = {
|
||||
.count = ARRAY_SIZE(imx_audmix_rates),
|
||||
.list = imx_audmix_rates,
|
||||
};
|
||||
|
||||
static int imx_audmix_fe_startup(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct imx_audmix *priv = snd_soc_card_get_drvdata(rtd->card);
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
struct device *dev = rtd->card->dev;
|
||||
unsigned long clk_rate = clk_get_rate(priv->cpu_mclk);
|
||||
int ret;
|
||||
|
||||
if (clk_rate % 24576000 == 0) {
|
||||
ret = snd_pcm_hw_constraint_list(runtime, 0,
|
||||
SNDRV_PCM_HW_PARAM_RATE,
|
||||
&imx_audmix_rate_constraints);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
} else {
|
||||
dev_warn(dev, "mclk may be not supported %lu\n", clk_rate);
|
||||
}
|
||||
|
||||
ret = snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_CHANNELS,
|
||||
1, 8);
|
||||
if (ret < 0)
|
||||
|
@ -323,13 +299,6 @@ static int imx_audmix_probe(struct platform_device *pdev)
|
|||
}
|
||||
put_device(&cpu_pdev->dev);
|
||||
|
||||
priv->cpu_mclk = devm_clk_get(&cpu_pdev->dev, "mclk1");
|
||||
if (IS_ERR(priv->cpu_mclk)) {
|
||||
ret = PTR_ERR(priv->cpu_mclk);
|
||||
dev_err(&cpu_pdev->dev, "failed to get DAI mclk1: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
priv->audmix_pdev = audmix_pdev;
|
||||
priv->out_pdev = cpu_pdev;
|
||||
|
||||
|
|
|
@ -1092,6 +1092,7 @@ int graph_util_parse_dai(struct device *dev, struct device_node *ep,
|
|||
args.np = ep;
|
||||
dai = snd_soc_get_dai_via_args(&args);
|
||||
if (dai) {
|
||||
dlc->of_node = node;
|
||||
dlc->dai_name = snd_soc_dai_name_get(dai);
|
||||
dlc->dai_args = snd_soc_copy_dai_args(dev, &args);
|
||||
if (!dlc->dai_args)
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include <linux/soundwire/sdw.h>
|
||||
#include <linux/soundwire/sdw_type.h>
|
||||
#include <linux/soundwire/sdw_intel.h>
|
||||
#include <sound/core.h>
|
||||
#include <sound/soc-acpi.h>
|
||||
#include "sof_sdw_common.h"
|
||||
#include "../../codecs/rt711.h"
|
||||
|
@ -748,9 +749,36 @@ static const struct dmi_system_id sof_sdw_quirk_table[] = {
|
|||
},
|
||||
.driver_data = (void *)(SOC_SDW_PCH_DMIC),
|
||||
},
|
||||
{
|
||||
.callback = sof_sdw_quirk_cb,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Google"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Fatcat"),
|
||||
},
|
||||
.driver_data = (void *)(SOC_SDW_PCH_DMIC |
|
||||
SOF_BT_OFFLOAD_SSP(2) |
|
||||
SOF_SSP_BT_OFFLOAD_PRESENT),
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
static const struct snd_pci_quirk sof_sdw_ssid_quirk_table[] = {
|
||||
SND_PCI_QUIRK(0x1043, 0x1e13, "ASUS Zenbook S14", SOC_SDW_CODEC_MIC),
|
||||
{}
|
||||
};
|
||||
|
||||
static void sof_sdw_check_ssid_quirk(const struct snd_soc_acpi_mach *mach)
|
||||
{
|
||||
const struct snd_pci_quirk *quirk_entry;
|
||||
|
||||
quirk_entry = snd_pci_quirk_lookup_id(mach->mach_params.subsystem_vendor,
|
||||
mach->mach_params.subsystem_device,
|
||||
sof_sdw_ssid_quirk_table);
|
||||
|
||||
if (quirk_entry)
|
||||
sof_sdw_quirk = quirk_entry->value;
|
||||
}
|
||||
|
||||
static struct snd_soc_dai_link_component platform_component[] = {
|
||||
{
|
||||
/* name might be overridden during probe */
|
||||
|
@ -1278,6 +1306,13 @@ static int mc_probe(struct platform_device *pdev)
|
|||
|
||||
snd_soc_card_set_drvdata(card, ctx);
|
||||
|
||||
if (mach->mach_params.subsystem_id_set) {
|
||||
snd_soc_card_set_pci_ssid(card,
|
||||
mach->mach_params.subsystem_vendor,
|
||||
mach->mach_params.subsystem_device);
|
||||
sof_sdw_check_ssid_quirk(mach);
|
||||
}
|
||||
|
||||
dmi_check_system(sof_sdw_quirk_table);
|
||||
|
||||
if (quirk_override != -1) {
|
||||
|
@ -1293,12 +1328,6 @@ static int mc_probe(struct platform_device *pdev)
|
|||
for (i = 0; i < ctx->codec_info_list_count; i++)
|
||||
codec_info_list[i].amp_num = 0;
|
||||
|
||||
if (mach->mach_params.subsystem_id_set) {
|
||||
snd_soc_card_set_pci_ssid(card,
|
||||
mach->mach_params.subsystem_vendor,
|
||||
mach->mach_params.subsystem_device);
|
||||
}
|
||||
|
||||
ret = sof_card_dai_links_create(card);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
|
|
@ -330,7 +330,7 @@ static const struct snd_soc_acpi_adr_device rt1316_3_single_adr[] = {
|
|||
|
||||
static const struct snd_soc_acpi_adr_device rt1318_1_single_adr[] = {
|
||||
{
|
||||
.adr = 0x000130025D131801,
|
||||
.adr = 0x000130025D131801ull,
|
||||
.num_endpoints = 1,
|
||||
.endpoints = &single_endpoint,
|
||||
.name_prefix = "rt1318-1"
|
||||
|
|
|
@ -251,7 +251,7 @@ static const struct snd_soc_acpi_link_adr ptl_rvp[] = {
|
|||
{}
|
||||
};
|
||||
|
||||
static const struct snd_soc_acpi_link_adr lnl_sdw_rt713_vb_l2_rt1320_l13[] = {
|
||||
static const struct snd_soc_acpi_link_adr ptl_sdw_rt713_vb_l2_rt1320_l13[] = {
|
||||
{
|
||||
.mask = BIT(2),
|
||||
.num_adr = ARRAY_SIZE(rt713_vb_2_adr),
|
||||
|
@ -270,7 +270,7 @@ static const struct snd_soc_acpi_link_adr lnl_sdw_rt713_vb_l2_rt1320_l13[] = {
|
|||
{}
|
||||
};
|
||||
|
||||
static const struct snd_soc_acpi_link_adr lnl_sdw_rt712_vb_l2_rt1320_l1[] = {
|
||||
static const struct snd_soc_acpi_link_adr ptl_sdw_rt712_vb_l2_rt1320_l1[] = {
|
||||
{
|
||||
.mask = BIT(2),
|
||||
.num_adr = ARRAY_SIZE(rt712_vb_2_group1_adr),
|
||||
|
@ -337,17 +337,17 @@ struct snd_soc_acpi_mach snd_soc_acpi_intel_ptl_sdw_machines[] = {
|
|||
},
|
||||
{
|
||||
.link_mask = BIT(1) | BIT(2),
|
||||
.links = lnl_sdw_rt712_vb_l2_rt1320_l1,
|
||||
.links = ptl_sdw_rt712_vb_l2_rt1320_l1,
|
||||
.drv_name = "sof_sdw",
|
||||
.machine_check = snd_soc_acpi_intel_sdca_is_device_rt712_vb,
|
||||
.sof_tplg_filename = "sof-lnl-rt712-l2-rt1320-l1.tplg"
|
||||
.sof_tplg_filename = "sof-ptl-rt712-l2-rt1320-l1.tplg"
|
||||
},
|
||||
{
|
||||
.link_mask = BIT(1) | BIT(2) | BIT(3),
|
||||
.links = lnl_sdw_rt713_vb_l2_rt1320_l13,
|
||||
.links = ptl_sdw_rt713_vb_l2_rt1320_l13,
|
||||
.drv_name = "sof_sdw",
|
||||
.machine_check = snd_soc_acpi_intel_sdca_is_device_rt712_vb,
|
||||
.sof_tplg_filename = "sof-lnl-rt713-l2-rt1320-l13.tplg"
|
||||
.sof_tplg_filename = "sof-ptl-rt713-l2-rt1320-l13.tplg"
|
||||
},
|
||||
{},
|
||||
};
|
||||
|
|
|
@ -658,25 +658,25 @@ static const struct snd_soc_acpi_endpoint cs35l56_7_fb_endpoints[] = {
|
|||
|
||||
static const struct snd_soc_acpi_adr_device cs35l56_sdw_eight_1_4_fb_adr[] = {
|
||||
{
|
||||
.adr = 0x00003301fa355601,
|
||||
.adr = 0x00003301fa355601ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_l_fb_endpoints),
|
||||
.endpoints = cs35l56_l_fb_endpoints,
|
||||
.name_prefix = "AMP1"
|
||||
},
|
||||
{
|
||||
.adr = 0x00003201fa355601,
|
||||
.adr = 0x00003201fa355601ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_2_fb_endpoints),
|
||||
.endpoints = cs35l56_2_fb_endpoints,
|
||||
.name_prefix = "AMP2"
|
||||
},
|
||||
{
|
||||
.adr = 0x00003101fa355601,
|
||||
.adr = 0x00003101fa355601ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_4_fb_endpoints),
|
||||
.endpoints = cs35l56_4_fb_endpoints,
|
||||
.name_prefix = "AMP3"
|
||||
},
|
||||
{
|
||||
.adr = 0x00003001fa355601,
|
||||
.adr = 0x00003001fa355601ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_6_fb_endpoints),
|
||||
.endpoints = cs35l56_6_fb_endpoints,
|
||||
.name_prefix = "AMP4"
|
||||
|
@ -685,25 +685,25 @@ static const struct snd_soc_acpi_adr_device cs35l56_sdw_eight_1_4_fb_adr[] = {
|
|||
|
||||
static const struct snd_soc_acpi_adr_device cs35l56_sdw_eight_5_8_fb_adr[] = {
|
||||
{
|
||||
.adr = 0x00013701fa355601,
|
||||
.adr = 0x00013701fa355601ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_r_fb_endpoints),
|
||||
.endpoints = cs35l56_r_fb_endpoints,
|
||||
.name_prefix = "AMP8"
|
||||
},
|
||||
{
|
||||
.adr = 0x00013601fa355601,
|
||||
.adr = 0x00013601fa355601ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_3_fb_endpoints),
|
||||
.endpoints = cs35l56_3_fb_endpoints,
|
||||
.name_prefix = "AMP7"
|
||||
},
|
||||
{
|
||||
.adr = 0x00013501fa355601,
|
||||
.adr = 0x00013501fa355601ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_5_fb_endpoints),
|
||||
.endpoints = cs35l56_5_fb_endpoints,
|
||||
.name_prefix = "AMP6"
|
||||
},
|
||||
{
|
||||
.adr = 0x00013401fa355601,
|
||||
.adr = 0x00013401fa355601ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_7_fb_endpoints),
|
||||
.endpoints = cs35l56_7_fb_endpoints,
|
||||
.name_prefix = "AMP5"
|
||||
|
|
|
@ -1770,20 +1770,6 @@ int rsnd_kctrl_accept_anytime(struct rsnd_dai_stream *io)
|
|||
return 1;
|
||||
}
|
||||
|
||||
int rsnd_kctrl_accept_runtime(struct rsnd_dai_stream *io)
|
||||
{
|
||||
struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
|
||||
struct rsnd_priv *priv = rsnd_io_to_priv(io);
|
||||
struct device *dev = rsnd_priv_to_dev(priv);
|
||||
|
||||
if (!runtime) {
|
||||
dev_warn(dev, "Can't update kctrl when idle\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
struct rsnd_kctrl_cfg *rsnd_kctrl_init_m(struct rsnd_kctrl_cfg_m *cfg)
|
||||
{
|
||||
cfg->cfg.val = cfg->val;
|
||||
|
|
|
@ -742,7 +742,6 @@ struct rsnd_kctrl_cfg_s {
|
|||
#define rsnd_kctrl_vals(x) ((x).val) /* = (x).cfg.val[0] */
|
||||
|
||||
int rsnd_kctrl_accept_anytime(struct rsnd_dai_stream *io);
|
||||
int rsnd_kctrl_accept_runtime(struct rsnd_dai_stream *io);
|
||||
struct rsnd_kctrl_cfg *rsnd_kctrl_init_m(struct rsnd_kctrl_cfg_m *cfg);
|
||||
struct rsnd_kctrl_cfg *rsnd_kctrl_init_s(struct rsnd_kctrl_cfg_s *cfg);
|
||||
int rsnd_kctrl_new(struct rsnd_mod *mod,
|
||||
|
|
|
@ -35,6 +35,7 @@ struct rsnd_src {
|
|||
struct rsnd_mod *dma;
|
||||
struct rsnd_kctrl_cfg_s sen; /* sync convert enable */
|
||||
struct rsnd_kctrl_cfg_s sync; /* sync convert */
|
||||
u32 current_sync_rate;
|
||||
int irq;
|
||||
};
|
||||
|
||||
|
@ -100,7 +101,7 @@ static u32 rsnd_src_convert_rate(struct rsnd_dai_stream *io,
|
|||
if (!rsnd_src_sync_is_enabled(mod))
|
||||
return rsnd_io_converted_rate(io);
|
||||
|
||||
convert_rate = src->sync.val;
|
||||
convert_rate = src->current_sync_rate;
|
||||
|
||||
if (!convert_rate)
|
||||
convert_rate = rsnd_io_converted_rate(io);
|
||||
|
@ -201,13 +202,73 @@ static const u32 chan222222[] = {
|
|||
static void rsnd_src_set_convert_rate(struct rsnd_dai_stream *io,
|
||||
struct rsnd_mod *mod)
|
||||
{
|
||||
struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
|
||||
struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
|
||||
struct rsnd_src *src = rsnd_mod_to_src(mod);
|
||||
u32 fin, fout, new_rate;
|
||||
int inc, cnt, rate;
|
||||
u64 base, val;
|
||||
|
||||
if (!runtime)
|
||||
return;
|
||||
|
||||
if (!rsnd_src_sync_is_enabled(mod))
|
||||
return;
|
||||
|
||||
fin = rsnd_src_get_in_rate(priv, io);
|
||||
fout = rsnd_src_get_out_rate(priv, io);
|
||||
|
||||
new_rate = src->sync.val;
|
||||
|
||||
if (!new_rate)
|
||||
new_rate = fout;
|
||||
|
||||
/* Do nothing if no diff */
|
||||
if (new_rate == src->current_sync_rate)
|
||||
return;
|
||||
|
||||
/*
|
||||
* SRCm_IFSVR::INTIFS can change within 1%
|
||||
* see
|
||||
* SRCm_IFSVR::INTIFS Note
|
||||
*/
|
||||
inc = fout / 100;
|
||||
cnt = abs(new_rate - fout) / inc;
|
||||
if (fout > new_rate)
|
||||
inc *= -1;
|
||||
|
||||
/*
|
||||
* After start running SRC, we can update only SRC_IFSVR
|
||||
* for Synchronous Mode
|
||||
*/
|
||||
base = (u64)0x0400000 * fin;
|
||||
rate = fout;
|
||||
for (int i = 0; i < cnt; i++) {
|
||||
val = base;
|
||||
rate += inc;
|
||||
do_div(val, rate);
|
||||
|
||||
rsnd_mod_write(mod, SRC_IFSVR, val);
|
||||
}
|
||||
val = base;
|
||||
do_div(val, new_rate);
|
||||
|
||||
rsnd_mod_write(mod, SRC_IFSVR, val);
|
||||
|
||||
/* update current_sync_rate */
|
||||
src->current_sync_rate = new_rate;
|
||||
}
|
||||
|
||||
static void rsnd_src_init_convert_rate(struct rsnd_dai_stream *io,
|
||||
struct rsnd_mod *mod)
|
||||
{
|
||||
struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
|
||||
struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
|
||||
struct device *dev = rsnd_priv_to_dev(priv);
|
||||
struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
|
||||
int is_play = rsnd_io_is_play(io);
|
||||
int use_src = 0;
|
||||
u32 fin, fout;
|
||||
u32 ifscr, fsrate, adinr;
|
||||
u32 ifscr, adinr;
|
||||
u32 cr, route;
|
||||
u32 i_busif, o_busif, tmp;
|
||||
const u32 *bsdsr_table;
|
||||
|
@ -245,26 +306,15 @@ static void rsnd_src_set_convert_rate(struct rsnd_dai_stream *io,
|
|||
adinr = rsnd_get_adinr_bit(mod, io) | chan;
|
||||
|
||||
/*
|
||||
* SRC_IFSCR / SRC_IFSVR
|
||||
*/
|
||||
ifscr = 0;
|
||||
fsrate = 0;
|
||||
if (use_src) {
|
||||
u64 n;
|
||||
|
||||
ifscr = 1;
|
||||
n = (u64)0x0400000 * fin;
|
||||
do_div(n, fout);
|
||||
fsrate = n;
|
||||
}
|
||||
|
||||
/*
|
||||
* SRC_IFSCR
|
||||
* SRC_SRCCR / SRC_ROUTE_MODE0
|
||||
*/
|
||||
ifscr = 0;
|
||||
cr = 0x00011110;
|
||||
route = 0x0;
|
||||
if (use_src) {
|
||||
route = 0x1;
|
||||
ifscr = 0x1;
|
||||
|
||||
if (rsnd_src_sync_is_enabled(mod)) {
|
||||
cr |= 0x1;
|
||||
|
@ -335,7 +385,6 @@ static void rsnd_src_set_convert_rate(struct rsnd_dai_stream *io,
|
|||
rsnd_mod_write(mod, SRC_SRCIR, 1); /* initialize */
|
||||
rsnd_mod_write(mod, SRC_ADINR, adinr);
|
||||
rsnd_mod_write(mod, SRC_IFSCR, ifscr);
|
||||
rsnd_mod_write(mod, SRC_IFSVR, fsrate);
|
||||
rsnd_mod_write(mod, SRC_SRCCR, cr);
|
||||
rsnd_mod_write(mod, SRC_BSDSR, bsdsr_table[idx]);
|
||||
rsnd_mod_write(mod, SRC_BSISR, bsisr_table[idx]);
|
||||
|
@ -348,6 +397,9 @@ static void rsnd_src_set_convert_rate(struct rsnd_dai_stream *io,
|
|||
|
||||
rsnd_adg_set_src_timesel_gen2(mod, io, fin, fout);
|
||||
|
||||
/* update SRC_IFSVR */
|
||||
rsnd_src_set_convert_rate(io, mod);
|
||||
|
||||
return;
|
||||
|
||||
convert_rate_err:
|
||||
|
@ -467,7 +519,8 @@ static int rsnd_src_init(struct rsnd_mod *mod,
|
|||
int ret;
|
||||
|
||||
/* reset sync convert_rate */
|
||||
src->sync.val = 0;
|
||||
src->sync.val =
|
||||
src->current_sync_rate = 0;
|
||||
|
||||
ret = rsnd_mod_power_on(mod);
|
||||
if (ret < 0)
|
||||
|
@ -475,7 +528,7 @@ static int rsnd_src_init(struct rsnd_mod *mod,
|
|||
|
||||
rsnd_src_activation(mod);
|
||||
|
||||
rsnd_src_set_convert_rate(io, mod);
|
||||
rsnd_src_init_convert_rate(io, mod);
|
||||
|
||||
rsnd_src_status_clear(mod);
|
||||
|
||||
|
@ -493,7 +546,8 @@ static int rsnd_src_quit(struct rsnd_mod *mod,
|
|||
rsnd_mod_power_off(mod);
|
||||
|
||||
/* reset sync convert_rate */
|
||||
src->sync.val = 0;
|
||||
src->sync.val =
|
||||
src->current_sync_rate = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -531,6 +585,22 @@ static irqreturn_t rsnd_src_interrupt(int irq, void *data)
|
|||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int rsnd_src_kctrl_accept_runtime(struct rsnd_dai_stream *io)
|
||||
{
|
||||
struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
|
||||
|
||||
if (!runtime) {
|
||||
struct rsnd_priv *priv = rsnd_io_to_priv(io);
|
||||
struct device *dev = rsnd_priv_to_dev(priv);
|
||||
|
||||
dev_warn(dev, "\"SRC Out Rate\" can use during running\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int rsnd_src_probe_(struct rsnd_mod *mod,
|
||||
struct rsnd_dai_stream *io,
|
||||
struct rsnd_priv *priv)
|
||||
|
@ -585,7 +655,7 @@ static int rsnd_src_pcm_new(struct rsnd_mod *mod,
|
|||
"SRC Out Rate Switch" :
|
||||
"SRC In Rate Switch",
|
||||
rsnd_kctrl_accept_anytime,
|
||||
rsnd_src_set_convert_rate,
|
||||
rsnd_src_init_convert_rate,
|
||||
&src->sen, 1);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
@ -594,7 +664,7 @@ static int rsnd_src_pcm_new(struct rsnd_mod *mod,
|
|||
rsnd_io_is_play(io) ?
|
||||
"SRC Out Rate" :
|
||||
"SRC In Rate",
|
||||
rsnd_kctrl_accept_runtime,
|
||||
rsnd_src_kctrl_accept_runtime,
|
||||
rsnd_src_set_convert_rate,
|
||||
&src->sync, 192000);
|
||||
|
||||
|
|
|
@ -336,7 +336,8 @@ static int rsnd_ssi_master_clk_start(struct rsnd_mod *mod,
|
|||
return 0;
|
||||
|
||||
rate_err:
|
||||
dev_err(dev, "unsupported clock rate\n");
|
||||
dev_err(dev, "unsupported clock rate (%d)\n", rate);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -451,11 +451,11 @@ static int rockchip_i2s_tdm_set_fmt(struct snd_soc_dai *cpu_dai,
|
|||
break;
|
||||
case SND_SOC_DAIFMT_DSP_A:
|
||||
val = I2S_TXCR_TFS_TDM_PCM;
|
||||
tdm_val = TDM_SHIFT_CTRL(0);
|
||||
tdm_val = TDM_SHIFT_CTRL(2);
|
||||
break;
|
||||
case SND_SOC_DAIFMT_DSP_B:
|
||||
val = I2S_TXCR_TFS_TDM_PCM;
|
||||
tdm_val = TDM_SHIFT_CTRL(2);
|
||||
tdm_val = TDM_SHIFT_CTRL(4);
|
||||
break;
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
|
|
|
@ -165,8 +165,9 @@ irqreturn_t acp_sof_ipc_irq_thread(int irq, void *context)
|
|||
int dsp_msg, dsp_ack;
|
||||
unsigned int status;
|
||||
|
||||
if (sdev->first_boot && sdev->fw_state != SOF_FW_BOOT_COMPLETE) {
|
||||
if (unlikely(sdev->first_boot && sdev->fw_state != SOF_FW_BOOT_COMPLETE)) {
|
||||
acp_mailbox_read(sdev, sdev->dsp_box.offset, &status, sizeof(status));
|
||||
|
||||
if ((status & SOF_IPC_PANIC_MAGIC_MASK) == SOF_IPC_PANIC_MAGIC) {
|
||||
snd_sof_dsp_panic(sdev, sdev->dsp_box.offset + sizeof(status),
|
||||
true);
|
||||
|
@ -188,13 +189,21 @@ irqreturn_t acp_sof_ipc_irq_thread(int irq, void *context)
|
|||
|
||||
dsp_ack = snd_sof_dsp_read(sdev, ACP_DSP_BAR, ACP_SCRATCH_REG_0 + dsp_ack_write);
|
||||
if (dsp_ack) {
|
||||
spin_lock_irq(&sdev->ipc_lock);
|
||||
/* handle immediate reply from DSP core */
|
||||
acp_dsp_ipc_get_reply(sdev);
|
||||
snd_sof_ipc_reply(sdev, 0);
|
||||
/* set the done bit */
|
||||
acp_dsp_ipc_dsp_done(sdev);
|
||||
spin_unlock_irq(&sdev->ipc_lock);
|
||||
if (likely(sdev->fw_state == SOF_FW_BOOT_COMPLETE)) {
|
||||
spin_lock_irq(&sdev->ipc_lock);
|
||||
|
||||
/* handle immediate reply from DSP core */
|
||||
acp_dsp_ipc_get_reply(sdev);
|
||||
snd_sof_ipc_reply(sdev, 0);
|
||||
/* set the done bit */
|
||||
acp_dsp_ipc_dsp_done(sdev);
|
||||
|
||||
spin_unlock_irq(&sdev->ipc_lock);
|
||||
} else {
|
||||
dev_dbg_ratelimited(sdev->dev, "IPC reply before FW_BOOT_COMPLETE: %#x\n",
|
||||
dsp_ack);
|
||||
}
|
||||
|
||||
ipc_irq = true;
|
||||
}
|
||||
|
||||
|
|
|
@ -27,6 +27,7 @@ MODULE_PARM_DESC(enable_fw_debug, "Enable Firmware debug");
|
|||
static struct acp_quirk_entry quirk_valve_galileo = {
|
||||
.signed_fw_image = true,
|
||||
.skip_iram_dram_size_mod = true,
|
||||
.post_fw_run_delay = true,
|
||||
};
|
||||
|
||||
const struct dmi_system_id acp_sof_quirk_table[] = {
|
||||
|
|
|
@ -220,6 +220,7 @@ struct sof_amd_acp_desc {
|
|||
struct acp_quirk_entry {
|
||||
bool signed_fw_image;
|
||||
bool skip_iram_dram_size_mod;
|
||||
bool post_fw_run_delay;
|
||||
};
|
||||
|
||||
/* Common device data struct for ACP devices */
|
||||
|
|
|
@ -13,11 +13,9 @@
|
|||
|
||||
#include <linux/module.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <sound/sof.h>
|
||||
#include <sound/soc-acpi.h>
|
||||
|
||||
#include "../ops.h"
|
||||
#include "../sof-pci-dev.h"
|
||||
#include "../../amd/mach-config.h"
|
||||
#include "acp.h"
|
||||
|
|
|
@ -11,13 +11,10 @@
|
|||
* Hardware interface for Audio DSP on Vangogh platform
|
||||
*/
|
||||
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include "../ops.h"
|
||||
#include "../sof-audio.h"
|
||||
#include "acp.h"
|
||||
#include "acp-dsp-offset.h"
|
||||
|
||||
#define I2S_HS_INSTANCE 0
|
||||
#define I2S_BT_INSTANCE 1
|
||||
|
@ -136,6 +133,20 @@ static struct snd_soc_dai_driver vangogh_sof_dai[] = {
|
|||
},
|
||||
};
|
||||
|
||||
static int sof_vangogh_post_fw_run_delay(struct snd_sof_dev *sdev)
|
||||
{
|
||||
/*
|
||||
* Resuming from suspend in some cases my cause the DSP firmware
|
||||
* to enter an unrecoverable faulty state. Delaying a bit any host
|
||||
* to DSP transmission right after firmware boot completion seems
|
||||
* to resolve the issue.
|
||||
*/
|
||||
if (!sdev->first_boot)
|
||||
usleep_range(100, 150);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Vangogh ops */
|
||||
struct snd_sof_dsp_ops sof_vangogh_ops;
|
||||
EXPORT_SYMBOL_NS(sof_vangogh_ops, "SND_SOC_SOF_AMD_COMMON");
|
||||
|
@ -157,6 +168,9 @@ int sof_vangogh_ops_init(struct snd_sof_dev *sdev)
|
|||
|
||||
if (quirks->signed_fw_image)
|
||||
sof_vangogh_ops.load_firmware = acp_sof_load_signed_firmware;
|
||||
|
||||
if (quirks->post_fw_run_delay)
|
||||
sof_vangogh_ops.post_fw_run = sof_vangogh_post_fw_run_delay;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -454,6 +454,7 @@ int hda_codec_i915_exit(struct snd_sof_dev *sdev)
|
|||
}
|
||||
EXPORT_SYMBOL_NS_GPL(hda_codec_i915_exit, "SND_SOC_SOF_HDA_AUDIO_CODEC_I915");
|
||||
|
||||
MODULE_SOFTDEP("pre: snd-hda-codec-hdmi");
|
||||
#endif
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
|
|
@ -765,10 +765,16 @@ static int sof_ipc4_widget_setup_comp_dai(struct snd_sof_widget *swidget)
|
|||
}
|
||||
|
||||
list_for_each_entry(w, &sdev->widget_list, list) {
|
||||
if (w->widget->sname &&
|
||||
struct snd_sof_dai *alh_dai;
|
||||
|
||||
if (!WIDGET_IS_DAI(w->id) || !w->widget->sname ||
|
||||
strcmp(w->widget->sname, swidget->widget->sname))
|
||||
continue;
|
||||
|
||||
alh_dai = w->private;
|
||||
if (alh_dai->type != SOF_DAI_INTEL_ALH)
|
||||
continue;
|
||||
|
||||
blob->alh_cfg.device_count++;
|
||||
}
|
||||
|
||||
|
@ -2061,11 +2067,13 @@ sof_ipc4_prepare_copier_module(struct snd_sof_widget *swidget,
|
|||
list_for_each_entry(w, &sdev->widget_list, list) {
|
||||
u32 node_type;
|
||||
|
||||
if (w->widget->sname &&
|
||||
if (!WIDGET_IS_DAI(w->id) || !w->widget->sname ||
|
||||
strcmp(w->widget->sname, swidget->widget->sname))
|
||||
continue;
|
||||
|
||||
dai = w->private;
|
||||
if (dai->type != SOF_DAI_INTEL_ALH)
|
||||
continue;
|
||||
alh_copier = (struct sof_ipc4_copier *)dai->private;
|
||||
alh_data = &alh_copier->data;
|
||||
node_type = SOF_IPC4_GET_NODE_TYPE(alh_data->gtw_cfg.node_id);
|
||||
|
|
|
@ -511,6 +511,8 @@ static int sof_pcm_close(struct snd_soc_component *component,
|
|||
*/
|
||||
}
|
||||
|
||||
spcm->stream[substream->stream].substream = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -43,7 +43,7 @@ int sof_ipc_msg_data(struct snd_sof_dev *sdev,
|
|||
return -ESTRPIPE;
|
||||
|
||||
posn_offset = stream->posn_offset;
|
||||
} else {
|
||||
} else if (sps->cstream) {
|
||||
|
||||
struct sof_compr_stream *sstream = sps->cstream->runtime->private_data;
|
||||
|
||||
|
@ -51,6 +51,10 @@ int sof_ipc_msg_data(struct snd_sof_dev *sdev,
|
|||
return -ESTRPIPE;
|
||||
|
||||
posn_offset = sstream->posn_offset;
|
||||
|
||||
} else {
|
||||
dev_err(sdev->dev, "%s: No stream opened\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
snd_sof_dsp_mailbox_read(sdev, posn_offset, p, sz);
|
||||
|
|
Loading…
Add table
Reference in a new issue