mirror of
https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux
synced 2025-09-28 19:57:53 +10:00
sound fixes for 6.17-rc2
A collection of small fixes. - Potential OOB access fixes in USB-audio driver - ASoC kconfig menu fix for improving the generic drivers - HD-audio quirks and a fix revert - Codec and platform-specific small fixes for ASoC -----BEGIN PGP SIGNATURE----- iQJCBAABCAAsFiEEIXTw5fNLNI7mMiVaLtJE4w1nLE8FAmifC9YOHHRpd2FpQHN1 c2UuZGUACgkQLtJE4w1nLE/BehAAwhx8yxnhV9IYxS50C6ySvKnzaV8JbLeNaUeW JTJjGCY+zDX4+1D0NWyw/OhFEB2/Vua4MFWqwPrR7m0lgpm9wYnCT3ALbV3JKDPu b1ZlX6ZYHocSoMU1N1QDTC6Kec+UbKaOQwbrVFuKfo8Q+V7qo+burcyWgdpaVcLX OzmCUbONRNX68NlN4ZzfzBlKVDfkzPYHGcE5lmZKYHj4EfeeiK5MQGIuCj2UJ3bh urMTqJ7HmTfRmiiJZh9dMYET+Z0VtFkQtKIkZqIqgB6DbNsovkUMMvE6Bafzds4h BbzgXdMEbfRDvaCS2OrqgamtoTD5qC+Op6/XnnvSUwaCWobe/vrwJ0N/OIMCaaOo 2fY6ST25/z5FUqf3LPxINCtk0z1CloGB7OgiiuPLh5N0hOTV+vdbEoBFs228PHCN InaissJ56YBmyMiXGqcCXEG9pBFOnV0SuqvSCWWATRHA9pP05/E1iIoXCzMKDiJP +YGufk4hZg0bXYRbu6HaFbP2YKYY0h4hs1NxS1uewF1ORHUkAYOQ2WNH3mxwz3uz N1oE70WSOiz0p37NGGkNX8w3AVzT5L3Ef8UCvtfYAVAF6cRE+TipUzESFBkNLAHZ Zx/t4HV8MSudx2sUUIS7JiC7+DJXMhIAHwvNUeGrGsC5nvpRY0/VPCAt+t8Xgu04 n7hNYpo= =gCaR -----END PGP SIGNATURE----- Merge tag 'sound-6.17-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "A collection of small fixes: - Potential OOB access fixes in USB-audio driver - ASoC kconfig menu fix for improving the generic drivers - HD-audio quirks and a fix revert - Codec and platform-specific small fixes for ASoC" * tag 'sound-6.17-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: ALSA: hda/tas2781: Normalize the volume kcontrol name ALSA: usb-audio: Validate UAC3 cluster segment descriptors ALSA: usb-audio: Validate UAC3 power domain descriptors, too Revert "ALSA: hda: Add ASRock X670E Taichi to denylist" ALSA: azt3328: Put __maybe_unused for inline functions for gameport ASoC: tas2781: Normalize the volume kcontrol name ASoC: stm: stm32_i2s: Fix calc_clk_div() error handling in determine_rate() ASoC: codecs: Call strscpy() with correct size argument ALSA: hda/realtek: Fix headset mic on HONOR BRB-X ALSA: hda/realtek: Add Framework Laptop 13 (AMD Ryzen AI 300) to quirks ASoC: tas2781: Fix spelling mistake "dismatch" -> "mismatch" ASoC: rt1320: fix random cycle mute issue ASoC: rt721: fix FU33 Boost Volume control not working ASoC: generic: tidyup standardized ASoC menu for generic ASoC: codec: sma1307: replace spelling mistake with new error message ASoC: codecs: tx-macro: correct tx_macro_component_drv name ASoC: fsl_sai: replace regmap_write with regmap_update_bits
This commit is contained in:
commit
8d084337a3
@ -7140,6 +7140,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x1d72, 0x1901, "RedmiBook 14", ALC256_FIXUP_ASUS_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1d72, 0x1945, "Redmi G", ALC256_FIXUP_ASUS_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1d72, 0x1947, "RedmiBook Air", ALC255_FIXUP_XIAOMI_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1ee7, 0x2078, "HONOR BRB-X M1010", ALC2XX_FIXUP_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1f66, 0x0105, "Ayaneo Portable Game Player", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x2014, 0x800a, "Positivo ARN50", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
|
||||
SND_PCI_QUIRK(0x2782, 0x0214, "VAIO VJFE-CL", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
|
||||
@ -7158,6 +7159,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0xf111, 0x0001, "Framework Laptop", ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0xf111, 0x0006, "Framework Laptop", ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0xf111, 0x0009, "Framework Laptop", ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0xf111, 0x000b, "Framework Laptop", ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0xf111, 0x000c, "Framework Laptop", ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE),
|
||||
|
||||
#if 0
|
||||
|
@ -265,7 +265,7 @@ static const struct snd_kcontrol_new tas2770_snd_controls[] = {
|
||||
};
|
||||
|
||||
static const struct snd_kcontrol_new tas2781_snd_controls[] = {
|
||||
ACARD_SINGLE_RANGE_EXT_TLV("Speaker Analog Gain", TAS2781_AMP_LEVEL,
|
||||
ACARD_SINGLE_RANGE_EXT_TLV("Speaker Analog Volume", TAS2781_AMP_LEVEL,
|
||||
1, 0, 20, 0, tas2781_amp_getvol,
|
||||
tas2781_amp_putvol, amp_vol_tlv),
|
||||
ACARD_SINGLE_BOOL_EXT("Speaker Force Firmware Load", 0,
|
||||
|
@ -2077,7 +2077,6 @@ static const struct pci_device_id driver_denylist[] = {
|
||||
{ PCI_DEVICE_SUB(0x1022, 0x1487, 0x1043, 0x874f) }, /* ASUS ROG Zenith II / Strix */
|
||||
{ PCI_DEVICE_SUB(0x1022, 0x1487, 0x1462, 0xcb59) }, /* MSI TRX40 Creator */
|
||||
{ PCI_DEVICE_SUB(0x1022, 0x1487, 0x1462, 0xcb60) }, /* MSI TRX40 */
|
||||
{ PCI_DEVICE_SUB(0x1022, 0x15e3, 0x1022, 0xd601) }, /* ASRock X670E Taichi */
|
||||
{}
|
||||
};
|
||||
|
||||
|
@ -412,25 +412,25 @@ snd_azf3328_ctrl_outl(const struct snd_azf3328 *chip, unsigned reg, u32 value)
|
||||
outl(value, chip->ctrl_io + reg);
|
||||
}
|
||||
|
||||
static inline void
|
||||
static inline void __maybe_unused
|
||||
snd_azf3328_game_outb(const struct snd_azf3328 *chip, unsigned reg, u8 value)
|
||||
{
|
||||
outb(value, chip->game_io + reg);
|
||||
}
|
||||
|
||||
static inline void
|
||||
static inline void __maybe_unused
|
||||
snd_azf3328_game_outw(const struct snd_azf3328 *chip, unsigned reg, u16 value)
|
||||
{
|
||||
outw(value, chip->game_io + reg);
|
||||
}
|
||||
|
||||
static inline u8
|
||||
static inline u8 __maybe_unused
|
||||
snd_azf3328_game_inb(const struct snd_azf3328 *chip, unsigned reg)
|
||||
{
|
||||
return inb(chip->game_io + reg);
|
||||
}
|
||||
|
||||
static inline u16
|
||||
static inline u16 __maybe_unused
|
||||
snd_azf3328_game_inw(const struct snd_azf3328 *chip, unsigned reg)
|
||||
{
|
||||
return inw(chip->game_io + reg);
|
||||
|
@ -111,7 +111,6 @@ source "sound/soc/bcm/Kconfig"
|
||||
source "sound/soc/cirrus/Kconfig"
|
||||
source "sound/soc/dwc/Kconfig"
|
||||
source "sound/soc/fsl/Kconfig"
|
||||
source "sound/soc/generic/Kconfig"
|
||||
source "sound/soc/google/Kconfig"
|
||||
source "sound/soc/hisilicon/Kconfig"
|
||||
source "sound/soc/jz4740/Kconfig"
|
||||
@ -149,5 +148,8 @@ source "sound/soc/codecs/Kconfig"
|
||||
|
||||
source "sound/soc/sdw_utils/Kconfig"
|
||||
|
||||
# generic frame-work
|
||||
source "sound/soc/generic/Kconfig"
|
||||
|
||||
endif # SND_SOC
|
||||
|
||||
|
@ -177,7 +177,7 @@ static int aw87390_profile_info(struct snd_kcontrol *kcontrol,
|
||||
{
|
||||
struct snd_soc_component *codec = snd_soc_kcontrol_component(kcontrol);
|
||||
struct aw87390 *aw87390 = snd_soc_component_get_drvdata(codec);
|
||||
char *prof_name, *name;
|
||||
char *prof_name;
|
||||
int count, ret;
|
||||
|
||||
uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
|
||||
@ -194,17 +194,15 @@ static int aw87390_profile_info(struct snd_kcontrol *kcontrol,
|
||||
if (uinfo->value.enumerated.item >= count)
|
||||
uinfo->value.enumerated.item = count - 1;
|
||||
|
||||
name = uinfo->value.enumerated.name;
|
||||
count = uinfo->value.enumerated.item;
|
||||
|
||||
ret = aw87390_dev_get_prof_name(aw87390->aw_pa, count, &prof_name);
|
||||
if (ret) {
|
||||
strscpy(uinfo->value.enumerated.name, "null",
|
||||
strlen("null") + 1);
|
||||
strscpy(uinfo->value.enumerated.name, "null");
|
||||
return 0;
|
||||
}
|
||||
|
||||
strscpy(name, prof_name, sizeof(uinfo->value.enumerated.name));
|
||||
strscpy(uinfo->value.enumerated.name, prof_name);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -914,12 +914,11 @@ static int aw88081_profile_info(struct snd_kcontrol *kcontrol,
|
||||
|
||||
ret = aw88081_dev_get_prof_name(aw88081->aw_pa, count, &prof_name);
|
||||
if (ret) {
|
||||
strscpy(uinfo->value.enumerated.name, "null",
|
||||
sizeof(uinfo->value.enumerated.name));
|
||||
strscpy(uinfo->value.enumerated.name, "null");
|
||||
return 0;
|
||||
}
|
||||
|
||||
strscpy(uinfo->value.enumerated.name, prof_name, sizeof(uinfo->value.enumerated.name));
|
||||
strscpy(uinfo->value.enumerated.name, prof_name);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1478,7 +1478,7 @@ static int aw88166_profile_info(struct snd_kcontrol *kcontrol,
|
||||
{
|
||||
struct snd_soc_component *codec = snd_soc_kcontrol_component(kcontrol);
|
||||
struct aw88166 *aw88166 = snd_soc_component_get_drvdata(codec);
|
||||
char *prof_name, *name;
|
||||
char *prof_name;
|
||||
int count, ret;
|
||||
|
||||
uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
|
||||
@ -1495,17 +1495,15 @@ static int aw88166_profile_info(struct snd_kcontrol *kcontrol,
|
||||
if (uinfo->value.enumerated.item >= count)
|
||||
uinfo->value.enumerated.item = count - 1;
|
||||
|
||||
name = uinfo->value.enumerated.name;
|
||||
count = uinfo->value.enumerated.item;
|
||||
|
||||
ret = aw88166_dev_get_prof_name(aw88166->aw_pa, count, &prof_name);
|
||||
if (ret) {
|
||||
strscpy(uinfo->value.enumerated.name, "null",
|
||||
strlen("null") + 1);
|
||||
strscpy(uinfo->value.enumerated.name, "null");
|
||||
return 0;
|
||||
}
|
||||
|
||||
strscpy(name, prof_name, sizeof(uinfo->value.enumerated.name));
|
||||
strscpy(uinfo->value.enumerated.name, prof_name);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -819,7 +819,7 @@ static int aw88261_profile_info(struct snd_kcontrol *kcontrol,
|
||||
{
|
||||
struct snd_soc_component *codec = snd_soc_kcontrol_component(kcontrol);
|
||||
struct aw88261 *aw88261 = snd_soc_component_get_drvdata(codec);
|
||||
char *prof_name, *name;
|
||||
char *prof_name;
|
||||
int count, ret;
|
||||
|
||||
uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
|
||||
@ -836,17 +836,15 @@ static int aw88261_profile_info(struct snd_kcontrol *kcontrol,
|
||||
if (uinfo->value.enumerated.item >= count)
|
||||
uinfo->value.enumerated.item = count - 1;
|
||||
|
||||
name = uinfo->value.enumerated.name;
|
||||
count = uinfo->value.enumerated.item;
|
||||
|
||||
ret = aw88261_dev_get_prof_name(aw88261->aw_pa, count, &prof_name);
|
||||
if (ret) {
|
||||
strscpy(uinfo->value.enumerated.name, "null",
|
||||
strlen("null") + 1);
|
||||
strscpy(uinfo->value.enumerated.name, "null");
|
||||
return 0;
|
||||
}
|
||||
|
||||
strscpy(name, prof_name, sizeof(uinfo->value.enumerated.name));
|
||||
strscpy(uinfo->value.enumerated.name, prof_name);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -175,7 +175,7 @@ static int aw88395_profile_info(struct snd_kcontrol *kcontrol,
|
||||
{
|
||||
struct snd_soc_component *codec = snd_soc_kcontrol_component(kcontrol);
|
||||
struct aw88395 *aw88395 = snd_soc_component_get_drvdata(codec);
|
||||
char *prof_name, *name;
|
||||
char *prof_name;
|
||||
int count, ret;
|
||||
|
||||
uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
|
||||
@ -192,17 +192,15 @@ static int aw88395_profile_info(struct snd_kcontrol *kcontrol,
|
||||
if (uinfo->value.enumerated.item >= count)
|
||||
uinfo->value.enumerated.item = count - 1;
|
||||
|
||||
name = uinfo->value.enumerated.name;
|
||||
count = uinfo->value.enumerated.item;
|
||||
|
||||
ret = aw88395_dev_get_prof_name(aw88395->aw_pa, count, &prof_name);
|
||||
if (ret) {
|
||||
strscpy(uinfo->value.enumerated.name, "null",
|
||||
strlen("null") + 1);
|
||||
strscpy(uinfo->value.enumerated.name, "null");
|
||||
return 0;
|
||||
}
|
||||
|
||||
strscpy(name, prof_name, sizeof(uinfo->value.enumerated.name));
|
||||
strscpy(uinfo->value.enumerated.name, prof_name);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1831,7 +1831,7 @@ static int aw88399_profile_info(struct snd_kcontrol *kcontrol,
|
||||
{
|
||||
struct snd_soc_component *codec = snd_soc_kcontrol_component(kcontrol);
|
||||
struct aw88399 *aw88399 = snd_soc_component_get_drvdata(codec);
|
||||
char *prof_name, *name;
|
||||
char *prof_name;
|
||||
int count, ret;
|
||||
|
||||
uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
|
||||
@ -1848,17 +1848,15 @@ static int aw88399_profile_info(struct snd_kcontrol *kcontrol,
|
||||
if (uinfo->value.enumerated.item >= count)
|
||||
uinfo->value.enumerated.item = count - 1;
|
||||
|
||||
name = uinfo->value.enumerated.name;
|
||||
count = uinfo->value.enumerated.item;
|
||||
|
||||
ret = aw88399_dev_get_prof_name(aw88399->aw_pa, count, &prof_name);
|
||||
if (ret) {
|
||||
strscpy(uinfo->value.enumerated.name, "null",
|
||||
strlen("null") + 1);
|
||||
strscpy(uinfo->value.enumerated.name, "null");
|
||||
return 0;
|
||||
}
|
||||
|
||||
strscpy(name, prof_name, sizeof(uinfo->value.enumerated.name));
|
||||
strscpy(uinfo->value.enumerated.name, prof_name);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -2229,7 +2229,7 @@ static int tx_macro_register_mclk_output(struct tx_macro *tx)
|
||||
}
|
||||
|
||||
static const struct snd_soc_component_driver tx_macro_component_drv = {
|
||||
.name = "RX-MACRO",
|
||||
.name = "TX-MACRO",
|
||||
.probe = tx_macro_component_probe,
|
||||
.controls = tx_macro_snd_controls,
|
||||
.num_controls = ARRAY_SIZE(tx_macro_snd_controls),
|
||||
|
@ -109,6 +109,7 @@ static const struct reg_sequence rt1320_blind_write[] = {
|
||||
{ 0x0000d540, 0x01 },
|
||||
{ 0xd172, 0x2a },
|
||||
{ 0xc5d6, 0x01 },
|
||||
{ 0xd478, 0xff },
|
||||
};
|
||||
|
||||
static const struct reg_sequence rt1320_vc_blind_write[] = {
|
||||
@ -159,7 +160,7 @@ static const struct reg_sequence rt1320_vc_blind_write[] = {
|
||||
{ 0xd471, 0x3a },
|
||||
{ 0xd474, 0x11 },
|
||||
{ 0xd475, 0x32 },
|
||||
{ 0xd478, 0x64 },
|
||||
{ 0xd478, 0xff },
|
||||
{ 0xd479, 0x20 },
|
||||
{ 0xd47a, 0x10 },
|
||||
{ 0xd47c, 0xff },
|
||||
|
@ -278,6 +278,8 @@ static void rt721_sdca_jack_preset(struct rt721_sdca_priv *rt721)
|
||||
RT721_ENT_FLOAT_CTL1, 0x4040);
|
||||
rt_sdca_index_write(rt721->mbq_regmap, RT721_HDA_SDCA_FLOAT,
|
||||
RT721_ENT_FLOAT_CTL4, 0x1201);
|
||||
rt_sdca_index_write(rt721->mbq_regmap, RT721_BOOST_CTRL,
|
||||
RT721_BST_4CH_TOP_GATING_CTRL1, 0x002a);
|
||||
regmap_write(rt721->regmap, 0x2f58, 0x07);
|
||||
}
|
||||
|
||||
|
@ -56,6 +56,7 @@ struct rt721_sdca_dmic_kctrl_priv {
|
||||
#define RT721_CBJ_CTRL 0x0a
|
||||
#define RT721_CAP_PORT_CTRL 0x0c
|
||||
#define RT721_CLASD_AMP_CTRL 0x0d
|
||||
#define RT721_BOOST_CTRL 0x0f
|
||||
#define RT721_VENDOR_REG 0x20
|
||||
#define RT721_RC_CALIB_CTRL 0x40
|
||||
#define RT721_VENDOR_EQ_L 0x53
|
||||
@ -93,6 +94,9 @@ struct rt721_sdca_dmic_kctrl_priv {
|
||||
/* Index (NID:0dh) */
|
||||
#define RT721_CLASD_AMP_2CH_CAL 0x14
|
||||
|
||||
/* Index (NID:0fh) */
|
||||
#define RT721_BST_4CH_TOP_GATING_CTRL1 0x05
|
||||
|
||||
/* Index (NID:20h) */
|
||||
#define RT721_JD_PRODUCT_NUM 0x00
|
||||
#define RT721_ANALOG_BIAS_CTL3 0x04
|
||||
|
@ -1749,7 +1749,7 @@ static void sma1307_setting_loaded(struct sma1307_priv *sma1307, const char *fil
|
||||
sma1307->set.header_size * sizeof(int));
|
||||
|
||||
if ((sma1307->set.checksum >> 8) != SMA1307_SETTING_CHECKSUM) {
|
||||
dev_err(sma1307->dev, "%s: failed by dismatch \"%s\"\n",
|
||||
dev_err(sma1307->dev, "%s: checksum failed \"%s\"\n",
|
||||
__func__, setting_file);
|
||||
sma1307->set.status = false;
|
||||
return;
|
||||
|
@ -908,10 +908,10 @@ static const struct snd_kcontrol_new tasdevice_cali_controls[] = {
|
||||
};
|
||||
|
||||
static const struct snd_kcontrol_new tas2781_snd_controls[] = {
|
||||
SOC_SINGLE_RANGE_EXT_TLV("Speaker Analog Gain", TAS2781_AMP_LEVEL,
|
||||
SOC_SINGLE_RANGE_EXT_TLV("Speaker Analog Volume", TAS2781_AMP_LEVEL,
|
||||
1, 0, 20, 0, tas2781_amp_getvol,
|
||||
tas2781_amp_putvol, amp_vol_tlv),
|
||||
SOC_SINGLE_RANGE_EXT_TLV("Speaker Digital Gain", TAS2781_DVC_LVL,
|
||||
SOC_SINGLE_RANGE_EXT_TLV("Speaker Digital Volume", TAS2781_DVC_LVL,
|
||||
0, 0, 200, 1, tas2781_digital_getvol,
|
||||
tas2781_digital_putvol, dvc_tlv),
|
||||
};
|
||||
@ -1480,7 +1480,7 @@ static ssize_t acoustic_ctl_write(struct file *file,
|
||||
return PTR_ERR(src);
|
||||
|
||||
if (src[0] > max_pkg_len && src[0] != count) {
|
||||
dev_err(priv->dev, "pkg(%u), max(%u), count(%u) dismatch.\n",
|
||||
dev_err(priv->dev, "pkg(%u), max(%u), count(%u) mismatch.\n",
|
||||
src[0], max_pkg_len, (unsigned int)count);
|
||||
ret = 0;
|
||||
goto exit;
|
||||
|
@ -809,9 +809,9 @@ static void fsl_sai_config_disable(struct fsl_sai *sai, int dir)
|
||||
* are running concurrently.
|
||||
*/
|
||||
/* Software Reset */
|
||||
regmap_write(sai->regmap, FSL_SAI_xCSR(tx, ofs), FSL_SAI_CSR_SR);
|
||||
regmap_update_bits(sai->regmap, FSL_SAI_xCSR(tx, ofs), FSL_SAI_CSR_SR, FSL_SAI_CSR_SR);
|
||||
/* Clear SR bit to finish the reset */
|
||||
regmap_write(sai->regmap, FSL_SAI_xCSR(tx, ofs), 0);
|
||||
regmap_update_bits(sai->regmap, FSL_SAI_xCSR(tx, ofs), FSL_SAI_CSR_SR, 0);
|
||||
}
|
||||
|
||||
static int fsl_sai_trigger(struct snd_pcm_substream *substream, int cmd,
|
||||
@ -930,11 +930,11 @@ static int fsl_sai_dai_probe(struct snd_soc_dai *cpu_dai)
|
||||
unsigned int ofs = sai->soc_data->reg_offset;
|
||||
|
||||
/* Software Reset for both Tx and Rx */
|
||||
regmap_write(sai->regmap, FSL_SAI_TCSR(ofs), FSL_SAI_CSR_SR);
|
||||
regmap_write(sai->regmap, FSL_SAI_RCSR(ofs), FSL_SAI_CSR_SR);
|
||||
regmap_update_bits(sai->regmap, FSL_SAI_TCSR(ofs), FSL_SAI_CSR_SR, FSL_SAI_CSR_SR);
|
||||
regmap_update_bits(sai->regmap, FSL_SAI_RCSR(ofs), FSL_SAI_CSR_SR, FSL_SAI_CSR_SR);
|
||||
/* Clear SR bit to finish the reset */
|
||||
regmap_write(sai->regmap, FSL_SAI_TCSR(ofs), 0);
|
||||
regmap_write(sai->regmap, FSL_SAI_RCSR(ofs), 0);
|
||||
regmap_update_bits(sai->regmap, FSL_SAI_TCSR(ofs), FSL_SAI_CSR_SR, 0);
|
||||
regmap_update_bits(sai->regmap, FSL_SAI_RCSR(ofs), FSL_SAI_CSR_SR, 0);
|
||||
|
||||
regmap_update_bits(sai->regmap, FSL_SAI_TCR1(ofs),
|
||||
FSL_SAI_CR1_RFW_MASK(sai->soc_data->fifo_depth),
|
||||
@ -1824,11 +1824,11 @@ static int fsl_sai_runtime_resume(struct device *dev)
|
||||
|
||||
regcache_cache_only(sai->regmap, false);
|
||||
regcache_mark_dirty(sai->regmap);
|
||||
regmap_write(sai->regmap, FSL_SAI_TCSR(ofs), FSL_SAI_CSR_SR);
|
||||
regmap_write(sai->regmap, FSL_SAI_RCSR(ofs), FSL_SAI_CSR_SR);
|
||||
regmap_update_bits(sai->regmap, FSL_SAI_TCSR(ofs), FSL_SAI_CSR_SR, FSL_SAI_CSR_SR);
|
||||
regmap_update_bits(sai->regmap, FSL_SAI_RCSR(ofs), FSL_SAI_CSR_SR, FSL_SAI_CSR_SR);
|
||||
usleep_range(1000, 2000);
|
||||
regmap_write(sai->regmap, FSL_SAI_TCSR(ofs), 0);
|
||||
regmap_write(sai->regmap, FSL_SAI_RCSR(ofs), 0);
|
||||
regmap_update_bits(sai->regmap, FSL_SAI_TCSR(ofs), FSL_SAI_CSR_SR, 0);
|
||||
regmap_update_bits(sai->regmap, FSL_SAI_RCSR(ofs), FSL_SAI_CSR_SR, 0);
|
||||
|
||||
ret = regcache_sync(sai->regmap);
|
||||
if (ret)
|
||||
|
@ -469,11 +469,8 @@ static int stm32_i2smclk_determine_rate(struct clk_hw *hw,
|
||||
int ret;
|
||||
|
||||
ret = stm32_i2s_calc_clk_div(i2s, req->best_parent_rate, req->rate);
|
||||
if (ret) {
|
||||
req->rate = ret;
|
||||
|
||||
return 0;
|
||||
}
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
mclk->freq = req->best_parent_rate / i2s->divider;
|
||||
|
||||
|
@ -341,20 +341,28 @@ snd_pcm_chmap_elem *convert_chmap_v3(struct uac3_cluster_header_descriptor
|
||||
|
||||
len = le16_to_cpu(cluster->wLength);
|
||||
c = 0;
|
||||
p += sizeof(struct uac3_cluster_header_descriptor);
|
||||
p += sizeof(*cluster);
|
||||
len -= sizeof(*cluster);
|
||||
|
||||
while (((p - (void *)cluster) < len) && (c < channels)) {
|
||||
while (len > 0 && (c < channels)) {
|
||||
struct uac3_cluster_segment_descriptor *cs_desc = p;
|
||||
u16 cs_len;
|
||||
u8 cs_type;
|
||||
|
||||
if (len < sizeof(*p))
|
||||
break;
|
||||
cs_len = le16_to_cpu(cs_desc->wLength);
|
||||
if (len < cs_len)
|
||||
break;
|
||||
cs_type = cs_desc->bSegmentType;
|
||||
|
||||
if (cs_type == UAC3_CHANNEL_INFORMATION) {
|
||||
struct uac3_cluster_information_segment_descriptor *is = p;
|
||||
unsigned char map;
|
||||
|
||||
if (cs_len < sizeof(*is))
|
||||
break;
|
||||
|
||||
/*
|
||||
* TODO: this conversion is not complete, update it
|
||||
* after adding UAC3 values to asound.h
|
||||
@ -456,6 +464,7 @@ snd_pcm_chmap_elem *convert_chmap_v3(struct uac3_cluster_header_descriptor
|
||||
chmap->map[c++] = map;
|
||||
}
|
||||
p += cs_len;
|
||||
len -= cs_len;
|
||||
}
|
||||
|
||||
if (channels < c)
|
||||
@ -881,7 +890,7 @@ snd_usb_get_audioformat_uac3(struct snd_usb_audio *chip,
|
||||
u64 badd_formats = 0;
|
||||
unsigned int num_channels;
|
||||
struct audioformat *fp;
|
||||
u16 cluster_id, wLength;
|
||||
u16 cluster_id, wLength, cluster_wLength;
|
||||
int clock = 0;
|
||||
int err;
|
||||
|
||||
@ -1011,6 +1020,16 @@ snd_usb_get_audioformat_uac3(struct snd_usb_audio *chip,
|
||||
return ERR_PTR(-EIO);
|
||||
}
|
||||
|
||||
cluster_wLength = le16_to_cpu(cluster->wLength);
|
||||
if (cluster_wLength < sizeof(*cluster) ||
|
||||
cluster_wLength > wLength) {
|
||||
dev_err(&dev->dev,
|
||||
"%u:%d : invalid Cluster Descriptor size\n",
|
||||
iface_no, altno);
|
||||
kfree(cluster);
|
||||
return ERR_PTR(-EIO);
|
||||
}
|
||||
|
||||
num_channels = cluster->bNrChannels;
|
||||
chmap = convert_chmap_v3(cluster);
|
||||
kfree(cluster);
|
||||
|
@ -221,6 +221,17 @@ static bool validate_uac3_feature_unit(const void *p,
|
||||
return d->bLength >= sizeof(*d) + 4 + 2;
|
||||
}
|
||||
|
||||
static bool validate_uac3_power_domain_unit(const void *p,
|
||||
const struct usb_desc_validator *v)
|
||||
{
|
||||
const struct uac3_power_domain_descriptor *d = p;
|
||||
|
||||
if (d->bLength < sizeof(*d))
|
||||
return false;
|
||||
/* baEntities[] + wPDomainDescrStr */
|
||||
return d->bLength >= sizeof(*d) + d->bNrEntities + 2;
|
||||
}
|
||||
|
||||
static bool validate_midi_out_jack(const void *p,
|
||||
const struct usb_desc_validator *v)
|
||||
{
|
||||
@ -285,6 +296,7 @@ static const struct usb_desc_validator audio_validators[] = {
|
||||
struct uac3_clock_multiplier_descriptor),
|
||||
/* UAC_VERSION_3, UAC3_SAMPLE_RATE_CONVERTER: not implemented yet */
|
||||
/* UAC_VERSION_3, UAC3_CONNECTORS: not implemented yet */
|
||||
FUNC(UAC_VERSION_3, UAC3_POWER_DOMAIN, validate_uac3_power_domain_unit),
|
||||
{ } /* terminator */
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user