mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-12-27 10:01:39 -05:00
Merge tag 'asoc-fix-v6.19-rc1' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-linus
ASoC: Fixes for v6.19 We've been quite busy with fixes since the merge window, though not in any particularly exciting ways - the standout thing is the fix for _SX controls which were broken by a change to how we do clamping, otherwise it's all fairly run of the mill fixes and quirks.
This commit is contained in:
@@ -282,20 +282,22 @@ static int keep_resources(struct snd_tscm *tscm, unsigned int rate,
|
||||
struct amdtp_stream *stream)
|
||||
{
|
||||
struct fw_iso_resources *resources;
|
||||
int speed;
|
||||
int err;
|
||||
|
||||
if (stream == &tscm->tx_stream)
|
||||
if (stream == &tscm->tx_stream) {
|
||||
resources = &tscm->tx_resources;
|
||||
else
|
||||
speed = fw_parent_device(tscm->unit)->max_speed;
|
||||
} else {
|
||||
resources = &tscm->rx_resources;
|
||||
speed = SCODE_400;
|
||||
}
|
||||
|
||||
err = amdtp_tscm_set_parameters(stream, rate);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
return fw_iso_resources_allocate(resources,
|
||||
amdtp_stream_get_max_payload(stream),
|
||||
fw_parent_device(tscm->unit)->max_speed);
|
||||
return fw_iso_resources_allocate(resources, amdtp_stream_get_max_payload(stream), speed);
|
||||
}
|
||||
|
||||
static int init_stream(struct snd_tscm *tscm, struct amdtp_stream *s)
|
||||
@@ -455,7 +457,6 @@ int snd_tscm_stream_start_duplex(struct snd_tscm *tscm, unsigned int rate)
|
||||
}
|
||||
|
||||
if (!amdtp_stream_running(&tscm->rx_stream)) {
|
||||
int spd = fw_parent_device(tscm->unit)->max_speed;
|
||||
unsigned int tx_init_skip_cycles;
|
||||
|
||||
err = set_stream_formats(tscm, rate);
|
||||
@@ -466,13 +467,13 @@ int snd_tscm_stream_start_duplex(struct snd_tscm *tscm, unsigned int rate)
|
||||
if (err < 0)
|
||||
goto error;
|
||||
|
||||
err = amdtp_domain_add_stream(&tscm->domain, &tscm->rx_stream,
|
||||
tscm->rx_resources.channel, spd);
|
||||
err = amdtp_domain_add_stream(&tscm->domain, &tscm->rx_stream, tscm->rx_resources.channel,
|
||||
fw_parent_device(tscm->unit)->max_speed);
|
||||
if (err < 0)
|
||||
goto error;
|
||||
|
||||
err = amdtp_domain_add_stream(&tscm->domain, &tscm->tx_stream,
|
||||
tscm->tx_resources.channel, spd);
|
||||
err = amdtp_domain_add_stream(&tscm->domain, &tscm->tx_stream, tscm->tx_resources.channel,
|
||||
SCODE_400);
|
||||
if (err < 0)
|
||||
goto error;
|
||||
|
||||
|
||||
@@ -661,6 +661,13 @@ static const struct dmi_system_id yc_acp_quirk_table[] = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Bravo 15 C7UCX"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.driver_data = &acp6x_card,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "HONOR"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "GOH-X"),
|
||||
}
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
@@ -783,16 +783,12 @@ static int ak4458_i2c_probe(struct i2c_client *i2c)
|
||||
|
||||
pm_runtime_enable(&i2c->dev);
|
||||
regcache_cache_only(ak4458->regmap, true);
|
||||
ak4458_reset(ak4458, false);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ak4458_i2c_remove(struct i2c_client *i2c)
|
||||
{
|
||||
struct ak4458_priv *ak4458 = i2c_get_clientdata(i2c);
|
||||
|
||||
ak4458_reset(ak4458, true);
|
||||
pm_runtime_disable(&i2c->dev);
|
||||
}
|
||||
|
||||
|
||||
@@ -115,7 +115,8 @@ static const struct reg_sequence rt1320_blind_write[] = {
|
||||
static const struct reg_sequence rt1320_vc_blind_write[] = {
|
||||
{ 0xc003, 0xe0 },
|
||||
{ 0xe80a, 0x01 },
|
||||
{ 0xc5c3, 0xf3 },
|
||||
{ 0xc5c3, 0xf2 },
|
||||
{ 0xc5c8, 0x03 },
|
||||
{ 0xc057, 0x51 },
|
||||
{ 0xc054, 0x35 },
|
||||
{ 0xca05, 0xd6 },
|
||||
@@ -126,8 +127,6 @@ static const struct reg_sequence rt1320_vc_blind_write[] = {
|
||||
{ 0xc609, 0x40 },
|
||||
{ 0xc046, 0xff },
|
||||
{ 0xc045, 0xff },
|
||||
{ 0xda81, 0x14 },
|
||||
{ 0xda8d, 0x14 },
|
||||
{ 0xc044, 0xff },
|
||||
{ 0xc043, 0xff },
|
||||
{ 0xc042, 0xff },
|
||||
@@ -136,8 +135,8 @@ static const struct reg_sequence rt1320_vc_blind_write[] = {
|
||||
{ 0xcc10, 0x01 },
|
||||
{ 0xc700, 0xf0 },
|
||||
{ 0xc701, 0x13 },
|
||||
{ 0xc901, 0x09 },
|
||||
{ 0xc900, 0xd0 },
|
||||
{ 0xc901, 0x04 },
|
||||
{ 0xc900, 0x73 },
|
||||
{ 0xde03, 0x05 },
|
||||
{ 0xdd0b, 0x0d },
|
||||
{ 0xdd0a, 0xff },
|
||||
@@ -153,6 +152,7 @@ static const struct reg_sequence rt1320_vc_blind_write[] = {
|
||||
{ 0xf082, 0xff },
|
||||
{ 0xf081, 0xff },
|
||||
{ 0xf080, 0xff },
|
||||
{ 0xe801, 0x01 },
|
||||
{ 0xe802, 0xf8 },
|
||||
{ 0xe803, 0xbe },
|
||||
{ 0xc003, 0xc0 },
|
||||
@@ -202,7 +202,7 @@ static const struct reg_sequence rt1320_vc_blind_write[] = {
|
||||
{ 0x3fc2bfc3, 0x00 },
|
||||
{ 0x3fc2bfc2, 0x00 },
|
||||
{ 0x3fc2bfc1, 0x00 },
|
||||
{ 0x3fc2bfc0, 0x03 },
|
||||
{ 0x3fc2bfc0, 0x07 },
|
||||
{ 0x0000d486, 0x43 },
|
||||
{ SDW_SDCA_CTL(FUNC_NUM_AMP, RT1320_SDCA_ENT_PDE23, RT1320_SDCA_CTL_REQ_POWER_STATE, 0), 0x00 },
|
||||
{ 0x1000db00, 0x07 },
|
||||
@@ -241,9 +241,7 @@ static const struct reg_sequence rt1320_vc_blind_write[] = {
|
||||
{ 0x1000db21, 0x00 },
|
||||
{ 0x1000db22, 0x00 },
|
||||
{ 0x1000db23, 0x00 },
|
||||
{ 0x0000d540, 0x01 },
|
||||
{ 0x0000c081, 0xfc },
|
||||
{ 0x0000f01e, 0x80 },
|
||||
{ 0x0000d540, 0x21 },
|
||||
{ 0xc01b, 0xfc },
|
||||
{ 0xc5d1, 0x89 },
|
||||
{ 0xc5d8, 0x0a },
|
||||
|
||||
@@ -1045,8 +1045,8 @@ static int fsl_asoc_card_probe(struct platform_device *pdev)
|
||||
* The notifier is initialized in snd_soc_card_jack_new(), then
|
||||
* snd_soc_jack_notifier_register can be called.
|
||||
*/
|
||||
if (of_property_read_bool(np, "hp-det-gpios") ||
|
||||
of_property_read_bool(np, "hp-det-gpio") /* deprecated */) {
|
||||
if (of_property_present(np, "hp-det-gpios") ||
|
||||
of_property_present(np, "hp-det-gpio") /* deprecated */) {
|
||||
ret = simple_util_init_jack(&priv->card, &priv->hp_jack,
|
||||
1, NULL, "Headphone Jack");
|
||||
if (ret)
|
||||
@@ -1055,8 +1055,8 @@ static int fsl_asoc_card_probe(struct platform_device *pdev)
|
||||
snd_soc_jack_notifier_register(&priv->hp_jack.jack, &hp_jack_nb);
|
||||
}
|
||||
|
||||
if (of_property_read_bool(np, "mic-det-gpios") ||
|
||||
of_property_read_bool(np, "mic-det-gpio") /* deprecated */) {
|
||||
if (of_property_present(np, "mic-det-gpios") ||
|
||||
of_property_present(np, "mic-det-gpio") /* deprecated */) {
|
||||
ret = simple_util_init_jack(&priv->card, &priv->mic_jack,
|
||||
0, NULL, "Mic Jack");
|
||||
if (ret)
|
||||
|
||||
@@ -473,5 +473,8 @@ struct snd_soc_component_driver fsl_asrc_component = {
|
||||
.pointer = fsl_asrc_dma_pcm_pointer,
|
||||
.pcm_construct = fsl_asrc_dma_pcm_new,
|
||||
.legacy_dai_naming = 1,
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
.debugfs_prefix = "asrc",
|
||||
#endif
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(fsl_asrc_component);
|
||||
|
||||
@@ -1577,6 +1577,9 @@ static const struct snd_soc_component_driver fsl_easrc_component = {
|
||||
.controls = fsl_easrc_snd_controls,
|
||||
.num_controls = ARRAY_SIZE(fsl_easrc_snd_controls),
|
||||
.legacy_dai_naming = 1,
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
.debugfs_prefix = "easrc",
|
||||
#endif
|
||||
};
|
||||
|
||||
static const struct reg_default fsl_easrc_reg_defaults[] = {
|
||||
|
||||
@@ -917,8 +917,14 @@ static int fsl_sai_startup(struct snd_pcm_substream *substream,
|
||||
tx ? sai->dma_params_tx.maxburst :
|
||||
sai->dma_params_rx.maxburst);
|
||||
|
||||
ret = snd_pcm_hw_constraint_list(substream->runtime, 0,
|
||||
SNDRV_PCM_HW_PARAM_RATE, &sai->constraint_rates);
|
||||
if (sai->is_consumer_mode[tx])
|
||||
ret = snd_pcm_hw_constraint_list(substream->runtime, 0,
|
||||
SNDRV_PCM_HW_PARAM_RATE,
|
||||
&fsl_sai_rate_constraints);
|
||||
else
|
||||
ret = snd_pcm_hw_constraint_list(substream->runtime, 0,
|
||||
SNDRV_PCM_HW_PARAM_RATE,
|
||||
&sai->constraint_rates);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -1075,6 +1081,7 @@ static const struct reg_default fsl_sai_reg_defaults_ofs0[] = {
|
||||
{FSL_SAI_TDR6, 0},
|
||||
{FSL_SAI_TDR7, 0},
|
||||
{FSL_SAI_TMR, 0},
|
||||
{FSL_SAI_TTCTL, 0},
|
||||
{FSL_SAI_RCR1(0), 0},
|
||||
{FSL_SAI_RCR2(0), 0},
|
||||
{FSL_SAI_RCR3(0), 0},
|
||||
@@ -1098,12 +1105,14 @@ static const struct reg_default fsl_sai_reg_defaults_ofs8[] = {
|
||||
{FSL_SAI_TDR6, 0},
|
||||
{FSL_SAI_TDR7, 0},
|
||||
{FSL_SAI_TMR, 0},
|
||||
{FSL_SAI_TTCTL, 0},
|
||||
{FSL_SAI_RCR1(8), 0},
|
||||
{FSL_SAI_RCR2(8), 0},
|
||||
{FSL_SAI_RCR3(8), 0},
|
||||
{FSL_SAI_RCR4(8), 0},
|
||||
{FSL_SAI_RCR5(8), 0},
|
||||
{FSL_SAI_RMR, 0},
|
||||
{FSL_SAI_RTCTL, 0},
|
||||
{FSL_SAI_MCTL, 0},
|
||||
{FSL_SAI_MDIV, 0},
|
||||
};
|
||||
|
||||
@@ -1323,6 +1323,7 @@ static const struct reg_default fsl_xcvr_phy_reg_defaults[] = {
|
||||
};
|
||||
|
||||
static const struct regmap_config fsl_xcvr_regmap_phy_cfg = {
|
||||
.name = "phy",
|
||||
.reg_bits = 8,
|
||||
.reg_stride = 4,
|
||||
.val_bits = 32,
|
||||
@@ -1335,6 +1336,7 @@ static const struct regmap_config fsl_xcvr_regmap_phy_cfg = {
|
||||
};
|
||||
|
||||
static const struct regmap_config fsl_xcvr_regmap_pllv0_cfg = {
|
||||
.name = "pllv0",
|
||||
.reg_bits = 8,
|
||||
.reg_stride = 4,
|
||||
.val_bits = 32,
|
||||
@@ -1345,6 +1347,7 @@ static const struct regmap_config fsl_xcvr_regmap_pllv0_cfg = {
|
||||
};
|
||||
|
||||
static const struct regmap_config fsl_xcvr_regmap_pllv1_cfg = {
|
||||
.name = "pllv1",
|
||||
.reg_bits = 8,
|
||||
.reg_stride = 4,
|
||||
.val_bits = 32,
|
||||
|
||||
@@ -699,6 +699,69 @@ static const struct snd_soc_acpi_adr_device cs35l56_1_fb_adr[] = {
|
||||
},
|
||||
};
|
||||
|
||||
static const struct snd_soc_acpi_adr_device cs35l56_6amp_1_fb_adr[] = {
|
||||
{
|
||||
.adr = 0x00013701FA355601ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_r_fb_endpoints),
|
||||
.endpoints = cs35l56_r_fb_endpoints,
|
||||
.name_prefix = "AMP6"
|
||||
},
|
||||
{
|
||||
.adr = 0x00013601FA355601ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_3_fb_endpoints),
|
||||
.endpoints = cs35l56_3_fb_endpoints,
|
||||
.name_prefix = "AMP5"
|
||||
},
|
||||
{
|
||||
.adr = 0x00013501FA355601ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_5_fb_endpoints),
|
||||
.endpoints = cs35l56_5_fb_endpoints,
|
||||
.name_prefix = "AMP4"
|
||||
},
|
||||
};
|
||||
|
||||
static const struct snd_soc_acpi_adr_device cs35l63_6amp_3_fb_adr[] = {
|
||||
{
|
||||
.adr = 0x00033001FA356301ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_l_fb_endpoints),
|
||||
.endpoints = cs35l56_l_fb_endpoints,
|
||||
.name_prefix = "AMP1"
|
||||
},
|
||||
{
|
||||
.adr = 0x00033201FA356301ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_2_fb_endpoints),
|
||||
.endpoints = cs35l56_2_fb_endpoints,
|
||||
.name_prefix = "AMP3"
|
||||
},
|
||||
{
|
||||
.adr = 0x00033401FA356301ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_4_fb_endpoints),
|
||||
.endpoints = cs35l56_4_fb_endpoints,
|
||||
.name_prefix = "AMP5"
|
||||
},
|
||||
};
|
||||
|
||||
static const struct snd_soc_acpi_adr_device cs35l63_6amp_2_fb_adr[] = {
|
||||
{
|
||||
.adr = 0x00023101FA356301ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_r_fb_endpoints),
|
||||
.endpoints = cs35l56_r_fb_endpoints,
|
||||
.name_prefix = "AMP2"
|
||||
},
|
||||
{
|
||||
.adr = 0x00023301FA356301ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_3_fb_endpoints),
|
||||
.endpoints = cs35l56_3_fb_endpoints,
|
||||
.name_prefix = "AMP4"
|
||||
},
|
||||
{
|
||||
.adr = 0x00023501FA356301ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_5_fb_endpoints),
|
||||
.endpoints = cs35l56_5_fb_endpoints,
|
||||
.name_prefix = "AMP6"
|
||||
},
|
||||
};
|
||||
|
||||
static const struct snd_soc_acpi_adr_device cs35l56_2_r_adr[] = {
|
||||
{
|
||||
.adr = 0x00023201FA355601ull,
|
||||
@@ -1069,6 +1132,35 @@ static const struct snd_soc_acpi_link_adr mtl_cs35l56_x8_link0_link1_fb[] = {
|
||||
{}
|
||||
};
|
||||
|
||||
static const struct snd_soc_acpi_link_adr mtl_cs35l56_x6_link0_link1_fb[] = {
|
||||
{
|
||||
.mask = BIT(1),
|
||||
.num_adr = ARRAY_SIZE(cs35l56_6amp_1_fb_adr),
|
||||
.adr_d = cs35l56_6amp_1_fb_adr,
|
||||
},
|
||||
{
|
||||
.mask = BIT(0),
|
||||
/* First 3 amps in cs35l56_0_fb_adr */
|
||||
.num_adr = 3,
|
||||
.adr_d = cs35l56_0_fb_adr,
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
static const struct snd_soc_acpi_link_adr mtl_cs35l63_x6_link2_link3_fb[] = {
|
||||
{
|
||||
.mask = BIT(3),
|
||||
.num_adr = ARRAY_SIZE(cs35l63_6amp_3_fb_adr),
|
||||
.adr_d = cs35l63_6amp_3_fb_adr,
|
||||
},
|
||||
{
|
||||
.mask = BIT(2),
|
||||
.num_adr = ARRAY_SIZE(cs35l63_6amp_2_fb_adr),
|
||||
.adr_d = cs35l63_6amp_2_fb_adr,
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
static const struct snd_soc_acpi_link_adr mtl_cs35l63_x2_link1_link3_fb[] = {
|
||||
{
|
||||
.mask = BIT(3),
|
||||
@@ -1189,6 +1281,12 @@ struct snd_soc_acpi_mach snd_soc_acpi_intel_mtl_sdw_machines[] = {
|
||||
.sof_tplg_filename = "sof-mtl-cs35l56-l01-fb8.tplg",
|
||||
.get_function_tplg_files = sof_sdw_get_tplg_files,
|
||||
},
|
||||
{
|
||||
.link_mask = BIT(0) | BIT(1),
|
||||
.links = mtl_cs35l56_x6_link0_link1_fb,
|
||||
.drv_name = "sof_sdw",
|
||||
.sof_tplg_filename = "sof-mtl-cs35l56-l01-fb6.tplg"
|
||||
},
|
||||
{
|
||||
.link_mask = BIT(0),
|
||||
.links = mtl_cs42l43_l0,
|
||||
@@ -1202,6 +1300,12 @@ struct snd_soc_acpi_mach snd_soc_acpi_intel_mtl_sdw_machines[] = {
|
||||
.drv_name = "sof_sdw",
|
||||
.sof_tplg_filename = "sof-mtl-cs35l56-l01-fb8.tplg",
|
||||
},
|
||||
{
|
||||
.link_mask = BIT(2) | BIT(3),
|
||||
.links = mtl_cs35l63_x6_link2_link3_fb,
|
||||
.drv_name = "sof_sdw",
|
||||
.sof_tplg_filename = "sof-mtl-cs35l56-l01-fb6.tplg",
|
||||
},
|
||||
{
|
||||
.link_mask = GENMASK(3, 0),
|
||||
.links = mtl_3_in_1_sdca,
|
||||
|
||||
@@ -15,49 +15,6 @@ struct snd_soc_acpi_mach snd_soc_acpi_intel_nvl_machines[] = {
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_nvl_machines);
|
||||
|
||||
/*
|
||||
* Multi-function codecs with three endpoints created for
|
||||
* headset, amp and dmic functions.
|
||||
*/
|
||||
static const struct snd_soc_acpi_endpoint rt_mf_endpoints[] = {
|
||||
{
|
||||
.num = 0,
|
||||
.aggregated = 0,
|
||||
.group_position = 0,
|
||||
.group_id = 0,
|
||||
},
|
||||
{
|
||||
.num = 1,
|
||||
.aggregated = 0,
|
||||
.group_position = 0,
|
||||
.group_id = 0,
|
||||
},
|
||||
{
|
||||
.num = 2,
|
||||
.aggregated = 0,
|
||||
.group_position = 0,
|
||||
.group_id = 0,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct snd_soc_acpi_adr_device rt722_3_single_adr[] = {
|
||||
{
|
||||
.adr = 0x000330025d072201ull,
|
||||
.num_endpoints = ARRAY_SIZE(rt_mf_endpoints),
|
||||
.endpoints = rt_mf_endpoints,
|
||||
.name_prefix = "rt722"
|
||||
}
|
||||
};
|
||||
|
||||
static const struct snd_soc_acpi_link_adr nvl_rt722_l3[] = {
|
||||
{
|
||||
.mask = BIT(3),
|
||||
.num_adr = ARRAY_SIZE(rt722_3_single_adr),
|
||||
.adr_d = rt722_3_single_adr,
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
/* this table is used when there is no I2S codec present */
|
||||
struct snd_soc_acpi_mach snd_soc_acpi_intel_nvl_sdw_machines[] = {
|
||||
/* mockup tests need to be first */
|
||||
@@ -79,12 +36,6 @@ struct snd_soc_acpi_mach snd_soc_acpi_intel_nvl_sdw_machines[] = {
|
||||
.drv_name = "sof_sdw",
|
||||
.sof_tplg_filename = "sof-nvl-rt715-rt711-rt1308-mono.tplg",
|
||||
},
|
||||
{
|
||||
.link_mask = BIT(3),
|
||||
.links = nvl_rt722_l3,
|
||||
.drv_name = "sof_sdw",
|
||||
.sof_tplg_filename = "sof-nvl-rt722.tplg",
|
||||
},
|
||||
{},
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_nvl_sdw_machines);
|
||||
|
||||
@@ -28,7 +28,7 @@ enum tplg_device_id {
|
||||
#define SOF_INTEL_PLATFORM_NAME_MAX 4
|
||||
|
||||
int sof_sdw_get_tplg_files(struct snd_soc_card *card, const struct snd_soc_acpi_mach *mach,
|
||||
const char *prefix, const char ***tplg_files)
|
||||
const char *prefix, const char ***tplg_files, bool best_effort)
|
||||
{
|
||||
struct snd_soc_acpi_mach_params mach_params = mach->mach_params;
|
||||
struct snd_soc_dai_link *dai_link;
|
||||
@@ -87,6 +87,9 @@ int sof_sdw_get_tplg_files(struct snd_soc_card *card, const struct snd_soc_acpi_
|
||||
dev_dbg(card->dev,
|
||||
"dai_link %s is not supported by separated tplg yet\n",
|
||||
dai_link->name);
|
||||
if (best_effort)
|
||||
continue;
|
||||
|
||||
return 0;
|
||||
}
|
||||
if (tplg_mask & BIT(tplg_dev))
|
||||
|
||||
@@ -10,6 +10,6 @@
|
||||
#define _SND_SOC_ACPI_INTEL_GET_TPLG_H
|
||||
|
||||
int sof_sdw_get_tplg_files(struct snd_soc_card *card, const struct snd_soc_acpi_mach *mach,
|
||||
const char *prefix, const char ***tplg_files);
|
||||
const char *prefix, const char ***tplg_files, bool best_effort);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -365,10 +365,12 @@ static int sdm845_snd_startup(struct snd_pcm_substream *substream)
|
||||
snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt);
|
||||
break;
|
||||
case QUATERNARY_MI2S_RX:
|
||||
codec_dai_fmt |= SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_I2S;
|
||||
snd_soc_dai_set_sysclk(cpu_dai,
|
||||
Q6AFE_LPASS_CLK_ID_QUAD_MI2S_IBIT,
|
||||
MI2S_BCLK_RATE, SNDRV_PCM_STREAM_PLAYBACK);
|
||||
snd_soc_dai_set_fmt(cpu_dai, fmt);
|
||||
snd_soc_dai_set_fmt(codec_dai, codec_dai_fmt);
|
||||
break;
|
||||
|
||||
case QUATERNARY_TDM_RX_0:
|
||||
|
||||
@@ -1534,8 +1534,10 @@ int asoc_sdw_parse_sdw_endpoints(struct snd_soc_card *card,
|
||||
* endpoint check is not necessary
|
||||
*/
|
||||
if (dai_info->quirk &&
|
||||
!(dai_info->quirk_exclude ^ !!(dai_info->quirk & ctx->mc_quirk)))
|
||||
!(dai_info->quirk_exclude ^ !!(dai_info->quirk & ctx->mc_quirk))) {
|
||||
(*num_devs)--;
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
/* Check SDCA codec endpoint if there is no matching quirk */
|
||||
ret = is_sdca_endpoint_present(dev, codec_info, adr_link, i, j);
|
||||
@@ -1543,8 +1545,10 @@ int asoc_sdw_parse_sdw_endpoints(struct snd_soc_card *card,
|
||||
return ret;
|
||||
|
||||
/* The endpoint is not present, skip */
|
||||
if (!ret)
|
||||
if (!ret) {
|
||||
(*num_devs)--;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
dev_dbg(dev,
|
||||
|
||||
@@ -111,7 +111,8 @@ int snd_soc_put_enum_double(struct snd_kcontrol *kcontrol,
|
||||
EXPORT_SYMBOL_GPL(snd_soc_put_enum_double);
|
||||
|
||||
static int sdca_soc_q78_reg_to_ctl(struct soc_mixer_control *mc, unsigned int reg_val,
|
||||
unsigned int mask, unsigned int shift, int max)
|
||||
unsigned int mask, unsigned int shift, int max,
|
||||
bool sx)
|
||||
{
|
||||
int val = reg_val;
|
||||
|
||||
@@ -141,20 +142,26 @@ static unsigned int sdca_soc_q78_ctl_to_reg(struct soc_mixer_control *mc, int va
|
||||
}
|
||||
|
||||
static int soc_mixer_reg_to_ctl(struct soc_mixer_control *mc, unsigned int reg_val,
|
||||
unsigned int mask, unsigned int shift, int max)
|
||||
unsigned int mask, unsigned int shift, int max,
|
||||
bool sx)
|
||||
{
|
||||
int val = (reg_val >> shift) & mask;
|
||||
|
||||
if (mc->sign_bit)
|
||||
val = sign_extend32(val, mc->sign_bit);
|
||||
|
||||
val = clamp(val, mc->min, mc->max);
|
||||
val -= mc->min;
|
||||
if (sx) {
|
||||
val -= mc->min; // SX controls intentionally can overflow here
|
||||
val = min_t(unsigned int, val & mask, max);
|
||||
} else {
|
||||
val = clamp(val, mc->min, mc->max);
|
||||
val -= mc->min;
|
||||
}
|
||||
|
||||
if (mc->invert)
|
||||
val = max - val;
|
||||
|
||||
return val & mask;
|
||||
return val;
|
||||
}
|
||||
|
||||
static unsigned int soc_mixer_ctl_to_reg(struct soc_mixer_control *mc, int val,
|
||||
@@ -280,9 +287,10 @@ static int soc_put_volsw(struct snd_kcontrol *kcontrol,
|
||||
|
||||
static int soc_get_volsw(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol,
|
||||
struct soc_mixer_control *mc, int mask, int max)
|
||||
struct soc_mixer_control *mc, int mask, int max, bool sx)
|
||||
{
|
||||
int (*reg_to_ctl)(struct soc_mixer_control *, unsigned int, unsigned int, unsigned int, int);
|
||||
int (*reg_to_ctl)(struct soc_mixer_control *, unsigned int, unsigned int,
|
||||
unsigned int, int, bool);
|
||||
struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
|
||||
unsigned int reg_val;
|
||||
int val;
|
||||
@@ -293,16 +301,16 @@ static int soc_get_volsw(struct snd_kcontrol *kcontrol,
|
||||
reg_to_ctl = soc_mixer_reg_to_ctl;
|
||||
|
||||
reg_val = snd_soc_component_read(component, mc->reg);
|
||||
val = reg_to_ctl(mc, reg_val, mask, mc->shift, max);
|
||||
val = reg_to_ctl(mc, reg_val, mask, mc->shift, max, sx);
|
||||
|
||||
ucontrol->value.integer.value[0] = val;
|
||||
|
||||
if (snd_soc_volsw_is_stereo(mc)) {
|
||||
if (mc->reg == mc->rreg) {
|
||||
val = reg_to_ctl(mc, reg_val, mask, mc->rshift, max);
|
||||
val = reg_to_ctl(mc, reg_val, mask, mc->rshift, max, sx);
|
||||
} else {
|
||||
reg_val = snd_soc_component_read(component, mc->rreg);
|
||||
val = reg_to_ctl(mc, reg_val, mask, mc->shift, max);
|
||||
val = reg_to_ctl(mc, reg_val, mask, mc->shift, max, sx);
|
||||
}
|
||||
|
||||
ucontrol->value.integer.value[1] = val;
|
||||
@@ -371,7 +379,7 @@ int snd_soc_get_volsw(struct snd_kcontrol *kcontrol,
|
||||
(struct soc_mixer_control *)kcontrol->private_value;
|
||||
unsigned int mask = soc_mixer_mask(mc);
|
||||
|
||||
return soc_get_volsw(kcontrol, ucontrol, mc, mask, mc->max - mc->min);
|
||||
return soc_get_volsw(kcontrol, ucontrol, mc, mask, mc->max - mc->min, false);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_get_volsw);
|
||||
|
||||
@@ -413,7 +421,7 @@ int snd_soc_get_volsw_sx(struct snd_kcontrol *kcontrol,
|
||||
(struct soc_mixer_control *)kcontrol->private_value;
|
||||
unsigned int mask = soc_mixer_sx_mask(mc);
|
||||
|
||||
return soc_get_volsw(kcontrol, ucontrol, mc, mask, mc->max);
|
||||
return soc_get_volsw(kcontrol, ucontrol, mc, mask, mc->max, true);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_get_volsw_sx);
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
* Hardware interface for SoundWire BPT support with HDA DMA
|
||||
*/
|
||||
|
||||
#include <linux/lcm.h>
|
||||
#include <sound/hdaudio_ext.h>
|
||||
#include <sound/hda-mlink.h>
|
||||
#include <sound/hda-sdw-bpt.h>
|
||||
@@ -236,6 +237,18 @@ static int hda_sdw_bpt_dma_disable(struct device *dev, struct hdac_ext_stream *s
|
||||
return ret;
|
||||
}
|
||||
|
||||
#define FIFO_ALIGNMENT 64
|
||||
|
||||
unsigned int hda_sdw_bpt_get_buf_size_alignment(unsigned int dma_bandwidth)
|
||||
{
|
||||
unsigned int num_channels = DIV_ROUND_UP(dma_bandwidth, BPT_FREQUENCY * 32);
|
||||
unsigned int data_block = num_channels * 4;
|
||||
unsigned int alignment = lcm(data_block, FIFO_ALIGNMENT);
|
||||
|
||||
return alignment;
|
||||
}
|
||||
EXPORT_SYMBOL_NS(hda_sdw_bpt_get_buf_size_alignment, "SND_SOC_SOF_INTEL_HDA_SDW_BPT");
|
||||
|
||||
int hda_sdw_bpt_open(struct device *dev, int link_id, struct hdac_ext_stream **bpt_tx_stream,
|
||||
struct snd_dma_buffer *dmab_tx_bdl, u32 bpt_tx_num_bytes,
|
||||
u32 tx_dma_bandwidth, struct hdac_ext_stream **bpt_rx_stream,
|
||||
|
||||
@@ -47,7 +47,7 @@ static const struct sof_dev_desc mtl_desc = {
|
||||
[SOF_IPC_TYPE_4] = "intel/sof-ipc4-lib/mtl",
|
||||
},
|
||||
.default_tplg_path = {
|
||||
[SOF_IPC_TYPE_4] = "intel/sof-ace-tplg",
|
||||
[SOF_IPC_TYPE_4] = "intel/sof-ipc4-tplg",
|
||||
},
|
||||
.default_fw_filename = {
|
||||
[SOF_IPC_TYPE_4] = "sof-mtl.ri",
|
||||
@@ -77,7 +77,7 @@ static const struct sof_dev_desc arl_desc = {
|
||||
[SOF_IPC_TYPE_4] = "intel/sof-ipc4-lib/arl",
|
||||
},
|
||||
.default_tplg_path = {
|
||||
[SOF_IPC_TYPE_4] = "intel/sof-ace-tplg",
|
||||
[SOF_IPC_TYPE_4] = "intel/sof-ipc4-tplg",
|
||||
},
|
||||
.default_fw_filename = {
|
||||
[SOF_IPC_TYPE_4] = "sof-arl.ri",
|
||||
@@ -107,7 +107,7 @@ static const struct sof_dev_desc arl_s_desc = {
|
||||
[SOF_IPC_TYPE_4] = "intel/sof-ipc4-lib/arl-s",
|
||||
},
|
||||
.default_tplg_path = {
|
||||
[SOF_IPC_TYPE_4] = "intel/sof-ace-tplg",
|
||||
[SOF_IPC_TYPE_4] = "intel/sof-ipc4-tplg",
|
||||
},
|
||||
.default_fw_filename = {
|
||||
[SOF_IPC_TYPE_4] = "sof-arl-s.ri",
|
||||
|
||||
@@ -1752,11 +1752,9 @@ snd_sof_get_nhlt_endpoint_data(struct snd_sof_dev *sdev, struct snd_sof_dai *dai
|
||||
channel_count = params_channels(params);
|
||||
sample_rate = params_rate(params);
|
||||
bit_depth = params_width(params);
|
||||
/*
|
||||
* Look for 32-bit blob first instead of 16-bit if copier
|
||||
* supports multiple formats
|
||||
*/
|
||||
if (bit_depth == 16 && !single_bitdepth) {
|
||||
|
||||
/* Prefer 32-bit blob if copier supports multiple formats */
|
||||
if (bit_depth <= 16 && !single_bitdepth) {
|
||||
dev_dbg(sdev->dev, "Looking for 32-bit blob first for DMIC\n");
|
||||
format_change = true;
|
||||
bit_depth = 32;
|
||||
@@ -1799,10 +1797,18 @@ snd_sof_get_nhlt_endpoint_data(struct snd_sof_dev *sdev, struct snd_sof_dai *dai
|
||||
if (format_change) {
|
||||
/*
|
||||
* The 32-bit blob was not found in NHLT table, try to
|
||||
* look for one based on the params
|
||||
* look for 16-bit for DMIC or based on the params for
|
||||
* SSP
|
||||
*/
|
||||
bit_depth = params_width(params);
|
||||
format_change = false;
|
||||
if (linktype == SOF_DAI_INTEL_DMIC) {
|
||||
bit_depth = 16;
|
||||
if (params_width(params) == 16)
|
||||
format_change = false;
|
||||
} else {
|
||||
bit_depth = params_width(params);
|
||||
format_change = false;
|
||||
}
|
||||
|
||||
get_new_blob = true;
|
||||
} else if (linktype == SOF_DAI_INTEL_DMIC && !single_bitdepth) {
|
||||
/*
|
||||
@@ -1837,7 +1843,7 @@ snd_sof_get_nhlt_endpoint_data(struct snd_sof_dev *sdev, struct snd_sof_dai *dai
|
||||
*len = cfg->size >> 2;
|
||||
*dst = (u32 *)cfg->caps;
|
||||
|
||||
if (format_change) {
|
||||
if (format_change || params_format(params) == SNDRV_PCM_FORMAT_FLOAT_LE) {
|
||||
/*
|
||||
* Update the params to reflect that different blob was loaded
|
||||
* instead of the requested bit depth (16 -> 32 or 32 -> 16).
|
||||
@@ -2280,8 +2286,19 @@ sof_ipc4_prepare_copier_module(struct snd_sof_widget *swidget,
|
||||
ch_map >>= 4;
|
||||
}
|
||||
|
||||
step = ch_count / blob->alh_cfg.device_count;
|
||||
mask = GENMASK(step - 1, 0);
|
||||
if (swidget->id == snd_soc_dapm_dai_in && ch_count == out_ref_channels) {
|
||||
/*
|
||||
* For playback DAI widgets where the channel number is equal to
|
||||
* the output reference channels, set the step = 0 to ensure all
|
||||
* the ch_mask is applied to all alh mappings.
|
||||
*/
|
||||
mask = ch_mask;
|
||||
step = 0;
|
||||
} else {
|
||||
step = ch_count / blob->alh_cfg.device_count;
|
||||
mask = GENMASK(step - 1, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Set each gtw_cfg.node_id to blob->alh_cfg.mapping[]
|
||||
* for all widgets with the same stream name
|
||||
@@ -2316,8 +2333,9 @@ sof_ipc4_prepare_copier_module(struct snd_sof_widget *swidget,
|
||||
}
|
||||
|
||||
/*
|
||||
* Set the same channel mask for playback as the audio data is
|
||||
* duplicated for all speakers. For capture, split the channels
|
||||
* Set the same channel mask if the widget channel count is the same
|
||||
* as the FE channels for playback as the audio data is duplicated
|
||||
* for all speakers in this case. Otherwise, split the channels
|
||||
* among the aggregated DAIs. For example, with 4 channels on 2
|
||||
* aggregated DAIs, the channel_mask should be 0x3 and 0xc for the
|
||||
* two DAI's.
|
||||
@@ -2326,10 +2344,7 @@ sof_ipc4_prepare_copier_module(struct snd_sof_widget *swidget,
|
||||
* the tables in soc_acpi files depending on the _ADR and devID
|
||||
* registers for each codec.
|
||||
*/
|
||||
if (w->id == snd_soc_dapm_dai_in)
|
||||
blob->alh_cfg.mapping[i].channel_mask = ch_mask;
|
||||
else
|
||||
blob->alh_cfg.mapping[i].channel_mask = mask << (step * i);
|
||||
blob->alh_cfg.mapping[i].channel_mask = mask << (step * i);
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
@@ -2106,8 +2106,8 @@ static int sof_route_load(struct snd_soc_component *scomp, int index,
|
||||
/* source component */
|
||||
source_swidget = snd_sof_find_swidget(scomp, (char *)route->source);
|
||||
if (!source_swidget) {
|
||||
dev_err(scomp->dev, "error: source %s not found\n",
|
||||
route->source);
|
||||
dev_err(scomp->dev, "source %s for sink %s is not found\n",
|
||||
route->source, route->sink);
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
@@ -2125,8 +2125,8 @@ static int sof_route_load(struct snd_soc_component *scomp, int index,
|
||||
/* sink component */
|
||||
sink_swidget = snd_sof_find_swidget(scomp, (char *)route->sink);
|
||||
if (!sink_swidget) {
|
||||
dev_err(scomp->dev, "error: sink %s not found\n",
|
||||
route->sink);
|
||||
dev_err(scomp->dev, "sink %s for source %s is not found\n",
|
||||
route->sink, route->source);
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
@@ -2506,12 +2506,28 @@ int snd_sof_load_topology(struct snd_soc_component *scomp, const char *file)
|
||||
if (!tplg_files)
|
||||
return -ENOMEM;
|
||||
|
||||
/* Try to use function topologies if possible */
|
||||
if (!sof_pdata->disable_function_topology && !disable_function_topology &&
|
||||
sof_pdata->machine && sof_pdata->machine->get_function_tplg_files) {
|
||||
/*
|
||||
* When the topology name contains 'dummy' word, it means that
|
||||
* there is no fallback option to monolithic topology in case
|
||||
* any of the function topologies might be missing.
|
||||
* In this case we should use best effort to form the card,
|
||||
* ignoring functionalities that we are missing a fragment for.
|
||||
*
|
||||
* Note: monolithic topologies also ignore these possibly
|
||||
* missing functions, so the functionality of the card would be
|
||||
* identical to the case if there would be a fallback monolithic
|
||||
* topology created for the configuration.
|
||||
*/
|
||||
bool no_fallback = strstr(file, "dummy");
|
||||
|
||||
tplg_cnt = sof_pdata->machine->get_function_tplg_files(scomp->card,
|
||||
sof_pdata->machine,
|
||||
tplg_filename_prefix,
|
||||
&tplg_files);
|
||||
&tplg_files,
|
||||
no_fallback);
|
||||
if (tplg_cnt < 0) {
|
||||
kfree(tplg_files);
|
||||
return tplg_cnt;
|
||||
|
||||
@@ -2077,7 +2077,7 @@ static const struct regmap_config tegra210_ahub_regmap_config = {
|
||||
.val_bits = 32,
|
||||
.reg_stride = 4,
|
||||
.max_register = TEGRA210_MAX_REGISTER_ADDR,
|
||||
.cache_type = REGCACHE_FLAT,
|
||||
.cache_type = REGCACHE_FLAT_S,
|
||||
};
|
||||
|
||||
static const struct regmap_config tegra186_ahub_regmap_config = {
|
||||
@@ -2085,7 +2085,7 @@ static const struct regmap_config tegra186_ahub_regmap_config = {
|
||||
.val_bits = 32,
|
||||
.reg_stride = 4,
|
||||
.max_register = TEGRA186_MAX_REGISTER_ADDR,
|
||||
.cache_type = REGCACHE_FLAT,
|
||||
.cache_type = REGCACHE_FLAT_S,
|
||||
};
|
||||
|
||||
static const struct regmap_config tegra264_ahub_regmap_config = {
|
||||
@@ -2094,7 +2094,7 @@ static const struct regmap_config tegra264_ahub_regmap_config = {
|
||||
.reg_stride = 4,
|
||||
.writeable_reg = tegra264_ahub_wr_reg,
|
||||
.max_register = TEGRA264_MAX_REGISTER_ADDR,
|
||||
.cache_type = REGCACHE_FLAT,
|
||||
.cache_type = REGCACHE_FLAT_S,
|
||||
};
|
||||
|
||||
static const struct tegra_ahub_soc_data soc_data_tegra210 = {
|
||||
|
||||
@@ -3417,10 +3417,6 @@ static int snd_bbfpro_controls_create(struct usb_mixer_interface *mixer)
|
||||
#define RME_DIGIFACE_REGISTER(reg, mask) (((reg) << 16) | (mask))
|
||||
#define RME_DIGIFACE_INVERT BIT(31)
|
||||
|
||||
/* Nonconst helpers */
|
||||
#define field_get(_mask, _reg) (((_reg) & (_mask)) >> (ffs(_mask) - 1))
|
||||
#define field_prep(_mask, _val) (((_val) << (ffs(_mask) - 1)) & (_mask))
|
||||
|
||||
static int snd_rme_digiface_write_reg(struct snd_kcontrol *kcontrol, int item, u16 mask, u16 val)
|
||||
{
|
||||
struct usb_mixer_elem_list *list = snd_kcontrol_chip(kcontrol);
|
||||
|
||||
Reference in New Issue
Block a user