mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-30 22:26:55 +00:00
ASoC: Fixes for v6.5
A relatively large but generally not super urgent set of fixes for ASoC, including some quirks and a MAINTAINERS update. There's also an update to cs35l56 to change the firmware ABI, there are no current shipping systems which use the current interface and the sooner we get the new interface in the less likely it is that something will start. It'd be nice if these landed for v6.5 but not the end of the world if they wait till v6.6. -----BEGIN PGP SIGNATURE----- iQEzBAABCgAdFiEEreZoqmdXGLWf4p/qJNaLcl1Uh9AFAmTmXz0ACgkQJNaLcl1U h9CsMAf+Mx63RS33aKGrfArRMTIAGDmOLTEqPk4Vhb1zPNYsnpMYPaJ6CoWLw+uA D+UjNbjLpbYM86n2AyyEzzKhU+TgruyvPAmvTuksmSn8SBBy1n1ZLeBKMj3fBKjB 0FmeR377shDhh/P34Q5xz6SMSs/OqgwRH4gf4pufhTuizVSUHN0ZLONBdEY2vgIm nlR3ViA/UuMZ9CI3714sm8UWEEpfSyKsGX6pbEjGvG1XaSwrinQqNPsf53A08mZM wWfNKZ9KYc2W49N2baS9VTxWx5er2H4X41y9swNZ1CQJffKDO9nXUdml0knmhI0o LRkeEWvcsIPPxfH4WLsg0OjPY/25dw== =caOM -----END PGP SIGNATURE----- Merge tag 'asoc-fix-v6.5-rc7' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-linus ASoC: Fixes for v6.5 A relatively large but generally not super urgent set of fixes for ASoC, including some quirks and a MAINTAINERS update. There's also an update to cs35l56 to change the firmware ABI, there are no current shipping systems which use the current interface and the sooner we get the new interface in the less likely it is that something will start. It'd be nice if these landed for v6.5 but not the end of the world if they wait till v6.6.
This commit is contained in:
commit
a4a6eed851
8 changed files with 84 additions and 29 deletions
33
MAINTAINERS
33
MAINTAINERS
|
@ -21063,6 +21063,39 @@ S: Maintained
|
||||||
F: Documentation/devicetree/bindings/sound/davinci-mcasp-audio.yaml
|
F: Documentation/devicetree/bindings/sound/davinci-mcasp-audio.yaml
|
||||||
F: sound/soc/ti/
|
F: sound/soc/ti/
|
||||||
|
|
||||||
|
TEXAS INSTRUMENTS AUDIO (ASoC/HDA) DRIVERS
|
||||||
|
M: Shenghao Ding <shenghao-ding@ti.com>
|
||||||
|
M: Kevin Lu <kevin-lu@ti.com>
|
||||||
|
M: Baojun Xu <x1077012@ti.com>
|
||||||
|
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||||
|
S: Maintained
|
||||||
|
F: Documentation/devicetree/bindings/sound/tas2552.txt
|
||||||
|
F: Documentation/devicetree/bindings/sound/tas2562.yaml
|
||||||
|
F: Documentation/devicetree/bindings/sound/tas2770.yaml
|
||||||
|
F: Documentation/devicetree/bindings/sound/tas27xx.yaml
|
||||||
|
F: Documentation/devicetree/bindings/sound/ti,pcm1681.txt
|
||||||
|
F: Documentation/devicetree/bindings/sound/ti,pcm3168a.yaml
|
||||||
|
F: Documentation/devicetree/bindings/sound/ti,tlv320*.yaml
|
||||||
|
F: Documentation/devicetree/bindings/sound/tlv320adcx140.yaml
|
||||||
|
F: Documentation/devicetree/bindings/sound/tlv320aic31xx.txt
|
||||||
|
F: Documentation/devicetree/bindings/sound/tpa6130a2.txt
|
||||||
|
F: include/sound/tas2*.h
|
||||||
|
F: include/sound/tlv320*.h
|
||||||
|
F: include/sound/tpa6130a2-plat.h
|
||||||
|
F: sound/pci/hda/tas2781_hda_i2c.c
|
||||||
|
F: sound/soc/codecs/pcm1681.c
|
||||||
|
F: sound/soc/codecs/pcm1789*.*
|
||||||
|
F: sound/soc/codecs/pcm179x*.*
|
||||||
|
F: sound/soc/codecs/pcm186x*.*
|
||||||
|
F: sound/soc/codecs/pcm3008.*
|
||||||
|
F: sound/soc/codecs/pcm3060*.*
|
||||||
|
F: sound/soc/codecs/pcm3168a*.*
|
||||||
|
F: sound/soc/codecs/pcm5102a.c
|
||||||
|
F: sound/soc/codecs/pcm512x*.*
|
||||||
|
F: sound/soc/codecs/tas2*.*
|
||||||
|
F: sound/soc/codecs/tlv320*.*
|
||||||
|
F: sound/soc/codecs/tpa6130a2.*
|
||||||
|
|
||||||
TEXAS INSTRUMENTS DMA DRIVERS
|
TEXAS INSTRUMENTS DMA DRIVERS
|
||||||
M: Peter Ujfalusi <peter.ujfalusi@gmail.com>
|
M: Peter Ujfalusi <peter.ujfalusi@gmail.com>
|
||||||
L: dmaengine@vger.kernel.org
|
L: dmaengine@vger.kernel.org
|
||||||
|
|
|
@ -248,6 +248,13 @@ static const struct dmi_system_id yc_acp_quirk_table[] = {
|
||||||
DMI_MATCH(DMI_PRODUCT_NAME, "M3402RA"),
|
DMI_MATCH(DMI_PRODUCT_NAME, "M3402RA"),
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.driver_data = &acp6x_card,
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||||
|
DMI_MATCH(DMI_PRODUCT_NAME, "M6500RC"),
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.driver_data = &acp6x_card,
|
.driver_data = &acp6x_card,
|
||||||
.matches = {
|
.matches = {
|
||||||
|
|
|
@ -168,7 +168,7 @@ static int cs35l41_get_fs_mon_config_index(int freq)
|
||||||
static const DECLARE_TLV_DB_RANGE(dig_vol_tlv,
|
static const DECLARE_TLV_DB_RANGE(dig_vol_tlv,
|
||||||
0, 0, TLV_DB_SCALE_ITEM(TLV_DB_GAIN_MUTE, 0, 1),
|
0, 0, TLV_DB_SCALE_ITEM(TLV_DB_GAIN_MUTE, 0, 1),
|
||||||
1, 913, TLV_DB_MINMAX_ITEM(-10200, 1200));
|
1, 913, TLV_DB_MINMAX_ITEM(-10200, 1200));
|
||||||
static DECLARE_TLV_DB_SCALE(amp_gain_tlv, 0, 1, 1);
|
static DECLARE_TLV_DB_SCALE(amp_gain_tlv, 50, 100, 0);
|
||||||
|
|
||||||
static const struct snd_kcontrol_new dre_ctrl =
|
static const struct snd_kcontrol_new dre_ctrl =
|
||||||
SOC_DAPM_SINGLE("Switch", CS35L41_PWR_CTRL3, 20, 1, 0);
|
SOC_DAPM_SINGLE("Switch", CS35L41_PWR_CTRL3, 20, 1, 0);
|
||||||
|
|
|
@ -62,10 +62,19 @@ static const struct i2c_device_id cs35l56_id_i2c[] = {
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(i2c, cs35l56_id_i2c);
|
MODULE_DEVICE_TABLE(i2c, cs35l56_id_i2c);
|
||||||
|
|
||||||
|
#ifdef CONFIG_ACPI
|
||||||
|
static const struct acpi_device_id cs35l56_asoc_acpi_match[] = {
|
||||||
|
{ "CSC355C", 0 },
|
||||||
|
{},
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(acpi, cs35l56_asoc_acpi_match);
|
||||||
|
#endif
|
||||||
|
|
||||||
static struct i2c_driver cs35l56_i2c_driver = {
|
static struct i2c_driver cs35l56_i2c_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "cs35l56",
|
.name = "cs35l56",
|
||||||
.pm = &cs35l56_pm_ops_i2c_spi,
|
.pm = &cs35l56_pm_ops_i2c_spi,
|
||||||
|
.acpi_match_table = ACPI_PTR(cs35l56_asoc_acpi_match),
|
||||||
},
|
},
|
||||||
.id_table = cs35l56_id_i2c,
|
.id_table = cs35l56_id_i2c,
|
||||||
.probe = cs35l56_i2c_probe,
|
.probe = cs35l56_i2c_probe,
|
||||||
|
|
|
@ -59,10 +59,19 @@ static const struct spi_device_id cs35l56_id_spi[] = {
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(spi, cs35l56_id_spi);
|
MODULE_DEVICE_TABLE(spi, cs35l56_id_spi);
|
||||||
|
|
||||||
|
#ifdef CONFIG_ACPI
|
||||||
|
static const struct acpi_device_id cs35l56_asoc_acpi_match[] = {
|
||||||
|
{ "CSC355C", 0 },
|
||||||
|
{},
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(acpi, cs35l56_asoc_acpi_match);
|
||||||
|
#endif
|
||||||
|
|
||||||
static struct spi_driver cs35l56_spi_driver = {
|
static struct spi_driver cs35l56_spi_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "cs35l56",
|
.name = "cs35l56",
|
||||||
.pm = &cs35l56_pm_ops_i2c_spi,
|
.pm = &cs35l56_pm_ops_i2c_spi,
|
||||||
|
.acpi_match_table = ACPI_PTR(cs35l56_asoc_acpi_match),
|
||||||
},
|
},
|
||||||
.id_table = cs35l56_id_spi,
|
.id_table = cs35l56_id_spi,
|
||||||
.probe = cs35l56_spi_probe,
|
.probe = cs35l56_spi_probe,
|
||||||
|
|
|
@ -5,7 +5,6 @@
|
||||||
// Copyright (C) 2023 Cirrus Logic, Inc. and
|
// Copyright (C) 2023 Cirrus Logic, Inc. and
|
||||||
// Cirrus Logic International Semiconductor Ltd.
|
// Cirrus Logic International Semiconductor Ltd.
|
||||||
|
|
||||||
#include <linux/acpi.h>
|
|
||||||
#include <linux/completion.h>
|
#include <linux/completion.h>
|
||||||
#include <linux/debugfs.h>
|
#include <linux/debugfs.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
|
@ -1354,26 +1353,22 @@ static int cs35l56_dsp_init(struct cs35l56_private *cs35l56)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cs35l56_acpi_get_name(struct cs35l56_private *cs35l56)
|
static int cs35l56_get_firmware_uid(struct cs35l56_private *cs35l56)
|
||||||
{
|
{
|
||||||
acpi_handle handle = ACPI_HANDLE(cs35l56->dev);
|
struct device *dev = cs35l56->dev;
|
||||||
const char *sub;
|
const char *prop;
|
||||||
|
int ret;
|
||||||
|
|
||||||
/* If there is no ACPI_HANDLE, there is no ACPI for this system, return 0 */
|
ret = device_property_read_string(dev, "cirrus,firmware-uid", &prop);
|
||||||
if (!handle)
|
/* If bad sw node property, return 0 and fallback to legacy firmware path */
|
||||||
|
if (ret < 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
sub = acpi_get_subsystem_id(handle);
|
cs35l56->dsp.system_name = devm_kstrdup(dev, prop, GFP_KERNEL);
|
||||||
if (IS_ERR(sub)) {
|
if (cs35l56->dsp.system_name == NULL)
|
||||||
/* If bad ACPI, return 0 and fallback to legacy firmware path, otherwise fail */
|
return -ENOMEM;
|
||||||
if (PTR_ERR(sub) == -ENODATA)
|
|
||||||
return 0;
|
|
||||||
else
|
|
||||||
return PTR_ERR(sub);
|
|
||||||
}
|
|
||||||
|
|
||||||
cs35l56->dsp.system_name = sub;
|
dev_dbg(dev, "Firmware UID: %s\n", cs35l56->dsp.system_name);
|
||||||
dev_dbg(cs35l56->dev, "Subsystem ID: %s\n", cs35l56->dsp.system_name);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1417,7 +1412,7 @@ int cs35l56_common_probe(struct cs35l56_private *cs35l56)
|
||||||
gpiod_set_value_cansleep(cs35l56->reset_gpio, 1);
|
gpiod_set_value_cansleep(cs35l56->reset_gpio, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = cs35l56_acpi_get_name(cs35l56);
|
ret = cs35l56_get_firmware_uid(cs35l56);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
|
@ -1604,8 +1599,6 @@ void cs35l56_remove(struct cs35l56_private *cs35l56)
|
||||||
|
|
||||||
regcache_cache_only(cs35l56->regmap, true);
|
regcache_cache_only(cs35l56->regmap, true);
|
||||||
|
|
||||||
kfree(cs35l56->dsp.system_name);
|
|
||||||
|
|
||||||
gpiod_set_value_cansleep(cs35l56->reset_gpio, 0);
|
gpiod_set_value_cansleep(cs35l56->reset_gpio, 0);
|
||||||
regulator_bulk_disable(ARRAY_SIZE(cs35l56->supplies), cs35l56->supplies);
|
regulator_bulk_disable(ARRAY_SIZE(cs35l56->supplies), cs35l56->supplies);
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,17 +57,18 @@ static int tasdevice_change_chn_book(struct tasdevice_priv *tas_priv,
|
||||||
|
|
||||||
if (client->addr != tasdev->dev_addr) {
|
if (client->addr != tasdev->dev_addr) {
|
||||||
client->addr = tasdev->dev_addr;
|
client->addr = tasdev->dev_addr;
|
||||||
if (tasdev->cur_book == book) {
|
/* All tas2781s share the same regmap, clear the page
|
||||||
ret = regmap_write(map,
|
* inside regmap once switching to another tas2781.
|
||||||
TASDEVICE_PAGE_SELECT, 0);
|
* Register 0 at any pages and any books inside tas2781
|
||||||
|
* is the same one for page-switching.
|
||||||
|
*/
|
||||||
|
ret = regmap_write(map, TASDEVICE_PAGE_SELECT, 0);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
dev_err(tas_priv->dev, "%s, E=%d\n",
|
dev_err(tas_priv->dev, "%s, E=%d\n",
|
||||||
__func__, ret);
|
__func__, ret);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tasdev->cur_book != book) {
|
if (tasdev->cur_book != book) {
|
||||||
ret = regmap_write(map, TASDEVICE_BOOKCTL_REG, book);
|
ret = regmap_write(map, TASDEVICE_BOOKCTL_REG, book);
|
||||||
|
|
|
@ -708,6 +708,9 @@ static int sof_ipc4_pcm_hw_params(struct snd_soc_component *component,
|
||||||
struct snd_sof_pcm *spcm;
|
struct snd_sof_pcm *spcm;
|
||||||
|
|
||||||
spcm = snd_sof_find_spcm_dai(component, rtd);
|
spcm = snd_sof_find_spcm_dai(component, rtd);
|
||||||
|
if (!spcm)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
time_info = spcm->stream[substream->stream].private;
|
time_info = spcm->stream[substream->stream].private;
|
||||||
/* delay calculation is not supported by current fw_reg ABI */
|
/* delay calculation is not supported by current fw_reg ABI */
|
||||||
if (!time_info)
|
if (!time_info)
|
||||||
|
|
Loading…
Reference in a new issue