mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 06:01:57 +00:00
sound fixes for 6.8-rc1
A collection of small fixes: - Lots of ASoC SOF fixes and related reworks - ASoC TAS codec fixes including DT updates - A few HD-audio quirks and regression fixes - Minor fixes for aloop, oxygen and scarlett2 mixer -----BEGIN PGP SIGNATURE----- iQJCBAABCAAsFiEEIXTw5fNLNI7mMiVaLtJE4w1nLE8FAmWqn98OHHRpd2FpQHN1 c2UuZGUACgkQLtJE4w1nLE/wIBAArdsfEKeNgeH2Ta939koBiWknCXT12nMd+rgi ZywjXrK7gJZKuuRYV0CKSlXl7yJD1jhbt7kG5/RyQaTZuuqEny/nwokqQrgZnf+Z mz1D0naIKORXLdKVD9YcN9F85z2D0WToEhbg8HyBgO3BIJKpEP+7ggBQO7zz19Gx BsrJsR0X1OUDVz90ltMmvohgj3WeIQ0lIs3cCdORylXq2MPAonqbHv6fYPoGupfi Vyx4mSkowBQRl9zVAuT5yKRZcqUbrZXfumHTiPDNDu3veIzZ0JtXaGMWic9a/g3T q+4lvNI7+oT1ObIi1zXeBfll9k0khjKvj/d1MEH4mJYrNKnrZBkDHNTu87x5lwyU WXcbGl8QgOS+x7t52CKKymBZbIQ7OJPkwSWK3G6zrblRbYZ805W5Kn3zMlNvVY4F XAzxxwkhU2uraya+CSuiDnGPJ3OHxbjnsQplDjUXXm2JipC9+9TrorGuxZ/3LVkj 736ShKmfuUh/qAXuITd4QHGa/M3N7xq9jINQrWOjHJoEznC2rLfuVzLlsOU26Z29 NfrHuq0JACu1ed2xl4Kk6GVuBGSXnu1fQYGd/6U7U14CZnoG2hOwqVaq4Qx+ce1Z G37tcM9sISoCm6lPxotd+Aeu38s2dC+Ju5b3lKIKqxVLygJjSjUjiggJLatB8Bip zZ4ZH1g= =h9S1 -----END PGP SIGNATURE----- Merge tag 'sound-fix-6.8-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "A collection of small fixes: - Lots of ASoC SOF fixes and related reworks - ASoC TAS codec fixes including DT updates - A few HD-audio quirks and regression fixes - Minor fixes for aloop, oxygen and scarlett2 mixer" * tag 'sound-fix-6.8-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (23 commits) ALSA: hda/realtek: Enable headset mic on Lenovo M70 Gen5 ALSA: hda/realtek: Enable mute/micmute LEDs and limit mic boost on HP ZBook ALSA: hda/relatek: Enable Mute LED on HP Laptop 15s-fq2xxx ASoC: SOF: ipc4-loader: remove the CPC check warnings ASoC: SOF: ipc4-pcm: remove log message for LLP ALSA: hda: generic: Remove obsolete call to ledtrig_audio_get ALSA: scarlett2: Fix yet more -Wformat-truncation warnings ALSA: hda: Properly setup HDMI stream ASoC: audio-graph-card2: fix index check on graph_parse_node_multi_nm() ASoC: SOF: icp3-dtrace: Revert "Fix wrong kfree() usage" ALSA: oxygen: Fix right channel of capture volume mixer ALSA: aloop: Introduce a function to get if access is interleaved mode ASoC: mediatek: sof-common: Add NULL check for normal_link string ASoC: mediatek: mt8195: Remove afe-dai component and rework codec link ASoC: mediatek: mt8192: Check existence of dai_name before dereferencing ASoC: Intel: bxt_rt298: Fix kernel ops due to COMP_DUMMY change ASoC: Intel: bxt_da7219_max98357a: Fix kernel ops due to COMP_DUMMY change ASoC: codecs: rtq9128: Fix TDM enable and DAI format control flow ASoC: codecs: rtq9128: Fix PM_RUNTIME usage ASoC: tas2781: Add tas2563 into driver ...
This commit is contained in:
commit
a1fe5b6d0d
@ -18,7 +18,6 @@ description: |
|
||||
|
||||
Specifications about the audio amplifier can be found at:
|
||||
https://www.ti.com/lit/gpn/tas2562
|
||||
https://www.ti.com/lit/gpn/tas2563
|
||||
https://www.ti.com/lit/gpn/tas2564
|
||||
https://www.ti.com/lit/gpn/tas2110
|
||||
|
||||
@ -29,7 +28,6 @@ properties:
|
||||
compatible:
|
||||
enum:
|
||||
- ti,tas2562
|
||||
- ti,tas2563
|
||||
- ti,tas2564
|
||||
- ti,tas2110
|
||||
|
||||
|
@ -5,36 +5,46 @@
|
||||
$id: http://devicetree.org/schemas/sound/ti,tas2781.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Texas Instruments TAS2781 SmartAMP
|
||||
title: Texas Instruments TAS2563/TAS2781 SmartAMP
|
||||
|
||||
maintainers:
|
||||
- Shenghao Ding <shenghao-ding@ti.com>
|
||||
|
||||
description:
|
||||
The TAS2781 is a mono, digital input Class-D audio amplifier
|
||||
optimized for efficiently driving high peak power into small
|
||||
loudspeakers. An integrated on-chip DSP supports Texas Instruments
|
||||
Smart Amp speaker protection algorithm. The integrated speaker
|
||||
voltage and current sense provides for real time
|
||||
description: |
|
||||
The TAS2563/TAS2781 is a mono, digital input Class-D audio
|
||||
amplifier optimized for efficiently driving high peak power into
|
||||
small loudspeakers. An integrated on-chip DSP supports Texas
|
||||
Instruments Smart Amp speaker protection algorithm. The
|
||||
integrated speaker voltage and current sense provides for real time
|
||||
monitoring of loudspeaker behavior.
|
||||
|
||||
allOf:
|
||||
- $ref: dai-common.yaml#
|
||||
Specifications about the audio amplifier can be found at:
|
||||
https://www.ti.com/lit/gpn/tas2563
|
||||
https://www.ti.com/lit/gpn/tas2781
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- ti,tas2781
|
||||
description: |
|
||||
ti,tas2563: 6.1-W Boosted Class-D Audio Amplifier With Integrated
|
||||
DSP and IV Sense, 16/20/24/32bit stereo I2S or multichannel TDM.
|
||||
|
||||
ti,tas2781: 24-V Class-D Amplifier with Real Time Integrated Speaker
|
||||
Protection and Audio Processing, 16/20/24/32bit stereo I2S or
|
||||
multichannel TDM.
|
||||
oneOf:
|
||||
- items:
|
||||
- enum:
|
||||
- ti,tas2563
|
||||
- const: ti,tas2781
|
||||
- enum:
|
||||
- ti,tas2781
|
||||
|
||||
reg:
|
||||
description:
|
||||
I2C address, in multiple tas2781s case, all the i2c address
|
||||
I2C address, in multiple-AMP case, all the i2c address
|
||||
aggregate as one Audio Device to support multiple audio slots.
|
||||
maxItems: 8
|
||||
minItems: 1
|
||||
items:
|
||||
minimum: 0x38
|
||||
maximum: 0x3f
|
||||
|
||||
reset-gpios:
|
||||
maxItems: 1
|
||||
@ -49,6 +59,44 @@ required:
|
||||
- compatible
|
||||
- reg
|
||||
|
||||
allOf:
|
||||
- $ref: dai-common.yaml#
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- ti,tas2563
|
||||
then:
|
||||
properties:
|
||||
reg:
|
||||
description:
|
||||
I2C address, in multiple-AMP case, all the i2c address
|
||||
aggregate as one Audio Device to support multiple audio slots.
|
||||
maxItems: 4
|
||||
minItems: 1
|
||||
items:
|
||||
minimum: 0x4c
|
||||
maximum: 0x4f
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- ti,tas2781
|
||||
then:
|
||||
properties:
|
||||
reg:
|
||||
description:
|
||||
I2C address, in multiple-AMP case, all the i2c address
|
||||
aggregate as one Audio Device to support multiple audio slots.
|
||||
maxItems: 8
|
||||
minItems: 1
|
||||
items:
|
||||
minimum: 0x38
|
||||
maximum: 0x3f
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
|
@ -1,13 +1,13 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
//
|
||||
// ALSA SoC Texas Instruments TAS2781 Audio Smart Amplifier
|
||||
// ALSA SoC Texas Instruments TAS2563/TAS2781 Audio Smart Amplifier
|
||||
//
|
||||
// Copyright (C) 2022 - 2023 Texas Instruments Incorporated
|
||||
// https://www.ti.com
|
||||
//
|
||||
// The TAS2781 driver implements a flexible and configurable
|
||||
// The TAS2563/TAS2781 driver implements a flexible and configurable
|
||||
// algo coefficient setting for one, two, or even multiple
|
||||
// TAS2781 chips.
|
||||
// TAS2563/TAS2781 chips.
|
||||
//
|
||||
// Author: Shenghao Ding <shenghao-ding@ti.com>
|
||||
// Author: Kevin Lu <kevin-lu@ti.com>
|
||||
@ -60,7 +60,8 @@
|
||||
#define TASDEVICE_CMD_FIELD_W 0x4
|
||||
|
||||
enum audio_device {
|
||||
TAS2781 = 0,
|
||||
TAS2563,
|
||||
TAS2781,
|
||||
};
|
||||
|
||||
enum device_catlog_id {
|
||||
|
@ -322,6 +322,17 @@ static int loopback_snd_timer_close_cable(struct loopback_pcm *dpcm)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool is_access_interleaved(snd_pcm_access_t access)
|
||||
{
|
||||
switch (access) {
|
||||
case SNDRV_PCM_ACCESS_MMAP_INTERLEAVED:
|
||||
case SNDRV_PCM_ACCESS_RW_INTERLEAVED:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
static int loopback_check_format(struct loopback_cable *cable, int stream)
|
||||
{
|
||||
struct snd_pcm_runtime *runtime, *cruntime;
|
||||
@ -341,7 +352,8 @@ static int loopback_check_format(struct loopback_cable *cable, int stream)
|
||||
check = runtime->format != cruntime->format ||
|
||||
runtime->rate != cruntime->rate ||
|
||||
runtime->channels != cruntime->channels ||
|
||||
runtime->access != cruntime->access;
|
||||
is_access_interleaved(runtime->access) !=
|
||||
is_access_interleaved(cruntime->access);
|
||||
if (!check)
|
||||
return 0;
|
||||
if (stream == SNDRV_PCM_STREAM_CAPTURE) {
|
||||
@ -369,7 +381,8 @@ static int loopback_check_format(struct loopback_cable *cable, int stream)
|
||||
&setup->channels_id);
|
||||
setup->channels = runtime->channels;
|
||||
}
|
||||
if (setup->access != runtime->access) {
|
||||
if (is_access_interleaved(setup->access) !=
|
||||
is_access_interleaved(runtime->access)) {
|
||||
snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_VALUE,
|
||||
&setup->access_id);
|
||||
setup->access = runtime->access;
|
||||
@ -584,8 +597,7 @@ static void copy_play_buf(struct loopback_pcm *play,
|
||||
size = play->pcm_buffer_size - src_off;
|
||||
if (dst_off + size > capt->pcm_buffer_size)
|
||||
size = capt->pcm_buffer_size - dst_off;
|
||||
if (runtime->access == SNDRV_PCM_ACCESS_RW_NONINTERLEAVED ||
|
||||
runtime->access == SNDRV_PCM_ACCESS_MMAP_NONINTERLEAVED)
|
||||
if (!is_access_interleaved(runtime->access))
|
||||
copy_play_buf_part_n(play, capt, size, src_off, dst_off);
|
||||
else
|
||||
memcpy(dst + dst_off, src + src_off, size);
|
||||
@ -1544,8 +1556,7 @@ static int loopback_access_get(struct snd_kcontrol *kcontrol,
|
||||
mutex_lock(&loopback->cable_lock);
|
||||
access = loopback->setup[kcontrol->id.subdevice][kcontrol->id.device].access;
|
||||
|
||||
ucontrol->value.enumerated.item[0] = access == SNDRV_PCM_ACCESS_RW_NONINTERLEAVED ||
|
||||
access == SNDRV_PCM_ACCESS_MMAP_NONINTERLEAVED;
|
||||
ucontrol->value.enumerated.item[0] = !is_access_interleaved(access);
|
||||
|
||||
mutex_unlock(&loopback->cable_lock);
|
||||
return 0;
|
||||
|
@ -3946,7 +3946,6 @@ static int create_mute_led_cdev(struct hda_codec *codec,
|
||||
cdev->max_brightness = 1;
|
||||
cdev->default_trigger = micmute ? "audio-micmute" : "audio-mute";
|
||||
cdev->brightness_set_blocking = callback;
|
||||
cdev->brightness = ledtrig_audio_get(idx);
|
||||
cdev->flags = LED_CORE_SUSPENDRESUME;
|
||||
|
||||
err = led_classdev_register(&codec->core.dev, cdev);
|
||||
|
@ -2301,6 +2301,7 @@ static int generic_hdmi_build_pcms(struct hda_codec *codec)
|
||||
codec_dbg(codec, "hdmi: pcm_num set to %d\n", pcm_num);
|
||||
|
||||
for (idx = 0; idx < pcm_num; idx++) {
|
||||
struct hdmi_spec_per_cvt *per_cvt;
|
||||
struct hda_pcm *info;
|
||||
struct hda_pcm_stream *pstr;
|
||||
|
||||
@ -2316,6 +2317,11 @@ static int generic_hdmi_build_pcms(struct hda_codec *codec)
|
||||
pstr = &info->stream[SNDRV_PCM_STREAM_PLAYBACK];
|
||||
pstr->substreams = 1;
|
||||
pstr->ops = generic_ops;
|
||||
|
||||
per_cvt = get_cvt(spec, 0);
|
||||
pstr->channels_min = per_cvt->channels_min;
|
||||
pstr->channels_max = per_cvt->channels_max;
|
||||
|
||||
/* pcm number is less than pcm_rec array size */
|
||||
if (spec->pcm_used >= ARRAY_SIZE(spec->pcm_rec))
|
||||
break;
|
||||
|
@ -9861,6 +9861,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x103c, 0x87f5, "HP", ALC287_FIXUP_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x87f6, "HP Spectre x360 14", ALC245_FIXUP_HP_X360_AMP),
|
||||
SND_PCI_QUIRK(0x103c, 0x87f7, "HP Spectre x360 14", ALC245_FIXUP_HP_X360_AMP),
|
||||
SND_PCI_QUIRK(0x103c, 0x87fe, "HP Laptop 15s-fq2xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
|
||||
SND_PCI_QUIRK(0x103c, 0x8805, "HP ProBook 650 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x880d, "HP EliteBook 830 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8811, "HP Spectre x360 15-eb1xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
|
||||
@ -9955,6 +9956,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x103c, 0x8c71, "HP EliteBook 845 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8c72, "HP EliteBook 865 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8c96, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
|
||||
SND_PCI_QUIRK(0x103c, 0x8c97, "HP ZBook", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
|
||||
SND_PCI_QUIRK(0x103c, 0x8ca4, "HP ZBook Fury", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8ca7, "HP ZBook Fury", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8cf5, "HP ZBook Studio 16", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
|
||||
@ -10231,6 +10233,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x17aa, 0x3176, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x17aa, 0x3178, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x17aa, 0x31af, "ThinkCentre Station", ALC623_FIXUP_LENOVO_THINKSTATION_P340),
|
||||
SND_PCI_QUIRK(0x17aa, 0x334b, "Lenovo ThinkCentre M70 Gen5", ALC283_FIXUP_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x17aa, 0x3801, "Lenovo Yoga9 14IAP7", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),
|
||||
SND_PCI_QUIRK(0x17aa, 0x3802, "Lenovo Yoga DuetITL 2021", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
|
||||
SND_PCI_QUIRK(0x17aa, 0x3813, "Legion 7i 15IMHG05", ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS),
|
||||
|
@ -718,7 +718,7 @@ static int ac97_fp_rec_volume_put(struct snd_kcontrol *ctl,
|
||||
oldreg = oxygen_read_ac97(chip, 1, AC97_REC_GAIN);
|
||||
newreg = oldreg & ~0x0707;
|
||||
newreg = newreg | (value->value.integer.value[0] & 7);
|
||||
newreg = newreg | ((value->value.integer.value[0] & 7) << 8);
|
||||
newreg = newreg | ((value->value.integer.value[1] & 7) << 8);
|
||||
change = newreg != oldreg;
|
||||
if (change)
|
||||
oxygen_write_ac97(chip, 1, AC97_REC_GAIN, newreg);
|
||||
|
@ -59,6 +59,7 @@
|
||||
|
||||
struct rtq9128_data {
|
||||
struct gpio_desc *enable;
|
||||
unsigned int daifmt;
|
||||
int tdm_slots;
|
||||
int tdm_slot_width;
|
||||
bool tdm_input_data2_select;
|
||||
@ -391,7 +392,11 @@ static int rtq9128_component_probe(struct snd_soc_component *comp)
|
||||
unsigned int val;
|
||||
int i, ret;
|
||||
|
||||
pm_runtime_resume_and_get(comp->dev);
|
||||
ret = pm_runtime_resume_and_get(comp->dev);
|
||||
if (ret < 0) {
|
||||
dev_err(comp->dev, "Failed to resume device (%d)\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
val = snd_soc_component_read(comp, RTQ9128_REG_EFUSE_DATA);
|
||||
|
||||
@ -437,10 +442,7 @@ static const struct snd_soc_component_driver rtq9128_comp_driver = {
|
||||
static int rtq9128_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
|
||||
{
|
||||
struct rtq9128_data *data = snd_soc_dai_get_drvdata(dai);
|
||||
struct snd_soc_component *comp = dai->component;
|
||||
struct device *dev = dai->dev;
|
||||
unsigned int audfmt, fmtval;
|
||||
int ret;
|
||||
|
||||
dev_dbg(dev, "%s: fmt 0x%8x\n", __func__, fmt);
|
||||
|
||||
@ -450,35 +452,10 @@ static int rtq9128_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
fmtval = fmt & SND_SOC_DAIFMT_FORMAT_MASK;
|
||||
if (data->tdm_slots && fmtval != SND_SOC_DAIFMT_DSP_A && fmtval != SND_SOC_DAIFMT_DSP_B) {
|
||||
dev_err(dev, "TDM is used, format only support DSP_A or DSP_B\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
/* Store here and will be used in runtime hw_params for DAI format setting */
|
||||
data->daifmt = fmt;
|
||||
|
||||
switch (fmtval) {
|
||||
case SND_SOC_DAIFMT_I2S:
|
||||
audfmt = 8;
|
||||
break;
|
||||
case SND_SOC_DAIFMT_LEFT_J:
|
||||
audfmt = 9;
|
||||
break;
|
||||
case SND_SOC_DAIFMT_RIGHT_J:
|
||||
audfmt = 10;
|
||||
break;
|
||||
case SND_SOC_DAIFMT_DSP_A:
|
||||
audfmt = data->tdm_slots ? 12 : 11;
|
||||
break;
|
||||
case SND_SOC_DAIFMT_DSP_B:
|
||||
audfmt = data->tdm_slots ? 4 : 3;
|
||||
break;
|
||||
default:
|
||||
dev_err(dev, "Unsupported format 0x%8x\n", fmt);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = snd_soc_component_write_field(comp, RTQ9128_REG_I2S_OPT, RTQ9128_AUDFMT_MASK, audfmt);
|
||||
return ret < 0 ? ret : 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rtq9128_dai_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
|
||||
@ -554,10 +531,38 @@ static int rtq9128_dai_hw_params(struct snd_pcm_substream *stream, struct snd_pc
|
||||
unsigned int width, slot_width, bitrate, audbit, dolen;
|
||||
struct snd_soc_component *comp = dai->component;
|
||||
struct device *dev = dai->dev;
|
||||
unsigned int fmtval, audfmt;
|
||||
int ret;
|
||||
|
||||
dev_dbg(dev, "%s: width %d\n", __func__, params_width(param));
|
||||
|
||||
fmtval = FIELD_GET(SND_SOC_DAIFMT_FORMAT_MASK, data->daifmt);
|
||||
if (data->tdm_slots && fmtval != SND_SOC_DAIFMT_DSP_A && fmtval != SND_SOC_DAIFMT_DSP_B) {
|
||||
dev_err(dev, "TDM is used, format only support DSP_A or DSP_B\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
switch (fmtval) {
|
||||
case SND_SOC_DAIFMT_I2S:
|
||||
audfmt = 8;
|
||||
break;
|
||||
case SND_SOC_DAIFMT_LEFT_J:
|
||||
audfmt = 9;
|
||||
break;
|
||||
case SND_SOC_DAIFMT_RIGHT_J:
|
||||
audfmt = 10;
|
||||
break;
|
||||
case SND_SOC_DAIFMT_DSP_A:
|
||||
audfmt = data->tdm_slots ? 12 : 11;
|
||||
break;
|
||||
case SND_SOC_DAIFMT_DSP_B:
|
||||
audfmt = data->tdm_slots ? 4 : 3;
|
||||
break;
|
||||
default:
|
||||
dev_err(dev, "Unsupported format 0x%8x\n", fmtval);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
switch (width = params_width(param)) {
|
||||
case 16:
|
||||
audbit = 0;
|
||||
@ -611,6 +616,10 @@ static int rtq9128_dai_hw_params(struct snd_pcm_substream *stream, struct snd_pc
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = snd_soc_component_write_field(comp, RTQ9128_REG_I2S_OPT, RTQ9128_AUDFMT_MASK, audfmt);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = snd_soc_component_write_field(comp, RTQ9128_REG_I2S_OPT, RTQ9128_AUDBIT_MASK, audbit);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
@ -59,7 +59,6 @@ struct tas2562_data {
|
||||
|
||||
enum tas256x_model {
|
||||
TAS2562,
|
||||
TAS2563,
|
||||
TAS2564,
|
||||
TAS2110,
|
||||
};
|
||||
@ -721,7 +720,6 @@ static int tas2562_parse_dt(struct tas2562_data *tas2562)
|
||||
|
||||
static const struct i2c_device_id tas2562_id[] = {
|
||||
{ "tas2562", TAS2562 },
|
||||
{ "tas2563", TAS2563 },
|
||||
{ "tas2564", TAS2564 },
|
||||
{ "tas2110", TAS2110 },
|
||||
{ }
|
||||
@ -770,7 +768,6 @@ static int tas2562_probe(struct i2c_client *client)
|
||||
#ifdef CONFIG_OF
|
||||
static const struct of_device_id tas2562_of_match[] = {
|
||||
{ .compatible = "ti,tas2562", },
|
||||
{ .compatible = "ti,tas2563", },
|
||||
{ .compatible = "ti,tas2564", },
|
||||
{ .compatible = "ti,tas2110", },
|
||||
{ },
|
||||
|
@ -1,13 +1,13 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
//
|
||||
// ALSA SoC Texas Instruments TAS2781 Audio Smart Amplifier
|
||||
// ALSA SoC Texas Instruments TAS2563/TAS2781 Audio Smart Amplifier
|
||||
//
|
||||
// Copyright (C) 2022 - 2023 Texas Instruments Incorporated
|
||||
// https://www.ti.com
|
||||
//
|
||||
// The TAS2781 driver implements a flexible and configurable
|
||||
// The TAS2563/TAS2781 driver implements a flexible and configurable
|
||||
// algo coefficient setting for one, two, or even multiple
|
||||
// TAS2781 chips.
|
||||
// TAS2563/TAS2781 chips.
|
||||
//
|
||||
// Author: Shenghao Ding <shenghao-ding@ti.com>
|
||||
// Author: Kevin Lu <kevin-lu@ti.com>
|
||||
@ -32,6 +32,7 @@
|
||||
#include <sound/tas2781-tlv.h>
|
||||
|
||||
static const struct i2c_device_id tasdevice_id[] = {
|
||||
{ "tas2563", TAS2563 },
|
||||
{ "tas2781", TAS2781 },
|
||||
{}
|
||||
};
|
||||
@ -39,6 +40,7 @@ MODULE_DEVICE_TABLE(i2c, tasdevice_id);
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
static const struct of_device_id tasdevice_of_match[] = {
|
||||
{ .compatible = "ti,tas2563" },
|
||||
{ .compatible = "ti,tas2781" },
|
||||
{},
|
||||
};
|
||||
|
@ -556,7 +556,7 @@ static int graph_parse_node_multi_nm(struct snd_soc_dai_link *dai_link,
|
||||
struct device_node *mcodec_port;
|
||||
int codec_idx;
|
||||
|
||||
if (*nm_idx >= nm_max)
|
||||
if (*nm_idx > nm_max)
|
||||
break;
|
||||
|
||||
mcpu_ep_n = of_get_next_child(mcpu_port, mcpu_ep_n);
|
||||
|
@ -797,6 +797,9 @@ static int broxton_audio_probe(struct platform_device *pdev)
|
||||
broxton_audio_card.name = "glkda7219max";
|
||||
/* Fixup the SSP entries for geminilake */
|
||||
for (i = 0; i < ARRAY_SIZE(broxton_dais); i++) {
|
||||
if (!broxton_dais[i].codecs->dai_name)
|
||||
continue;
|
||||
|
||||
/* MAXIM_CODEC is connected to SSP1. */
|
||||
if (!strcmp(broxton_dais[i].codecs->dai_name,
|
||||
BXT_MAXIM_CODEC_DAI)) {
|
||||
@ -822,6 +825,9 @@ static int broxton_audio_probe(struct platform_device *pdev)
|
||||
broxton_audio_card.name = "cmlda7219max";
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(broxton_dais); i++) {
|
||||
if (!broxton_dais[i].codecs->dai_name)
|
||||
continue;
|
||||
|
||||
/* MAXIM_CODEC is connected to SSP1. */
|
||||
if (!strcmp(broxton_dais[i].codecs->dai_name,
|
||||
BXT_MAXIM_CODEC_DAI)) {
|
||||
|
@ -604,7 +604,8 @@ static int broxton_audio_probe(struct platform_device *pdev)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(broxton_rt298_dais); i++) {
|
||||
if (!strncmp(card->dai_link[i].codecs->name, "i2c-INT343A:00",
|
||||
if (card->dai_link[i].codecs->name &&
|
||||
!strncmp(card->dai_link[i].codecs->name, "i2c-INT343A:00",
|
||||
I2C_NAME_SIZE)) {
|
||||
if (!strncmp(card->name, "broxton-rt298",
|
||||
PLATFORM_NAME_SIZE)) {
|
||||
|
@ -24,7 +24,7 @@ int mtk_sof_dai_link_fixup(struct snd_soc_pcm_runtime *rtd,
|
||||
struct snd_soc_dai_link *sof_dai_link = NULL;
|
||||
const struct sof_conn_stream *conn = &sof_priv->conn_streams[i];
|
||||
|
||||
if (strcmp(rtd->dai_link->name, conn->normal_link))
|
||||
if (conn->normal_link && strcmp(rtd->dai_link->name, conn->normal_link))
|
||||
continue;
|
||||
|
||||
for_each_card_rtds(card, runtime) {
|
||||
|
@ -1208,7 +1208,8 @@ static int mt8192_mt6359_dev_probe(struct platform_device *pdev)
|
||||
dai_link->ignore = 0;
|
||||
}
|
||||
|
||||
if (strcmp(dai_link->codecs[0].dai_name, RT1015_CODEC_DAI) == 0)
|
||||
if (dai_link->num_codecs && dai_link->codecs[0].dai_name &&
|
||||
strcmp(dai_link->codecs[0].dai_name, RT1015_CODEC_DAI) == 0)
|
||||
dai_link->ops = &mt8192_rt1015_i2s_ops;
|
||||
|
||||
if (!dai_link->platforms->name)
|
||||
|
@ -1795,10 +1795,6 @@ static const struct snd_kcontrol_new mt8195_memif_controls[] = {
|
||||
MT8195_AFE_IRQ_28),
|
||||
};
|
||||
|
||||
static const struct snd_soc_component_driver mt8195_afe_pcm_dai_component = {
|
||||
.name = "mt8195-afe-pcm-dai",
|
||||
};
|
||||
|
||||
static const struct mtk_base_memif_data memif_data[MT8195_AFE_MEMIF_NUM] = {
|
||||
[MT8195_AFE_MEMIF_DL2] = {
|
||||
.name = "DL2",
|
||||
@ -3037,7 +3033,6 @@ static int mt8195_afe_pcm_dev_probe(struct platform_device *pdev)
|
||||
struct device *dev = &pdev->dev;
|
||||
struct reset_control *rstc;
|
||||
int i, irq_id, ret;
|
||||
struct snd_soc_component *component;
|
||||
|
||||
ret = of_reserved_mem_device_init(dev);
|
||||
if (ret)
|
||||
@ -3170,36 +3165,12 @@ static int mt8195_afe_pcm_dev_probe(struct platform_device *pdev)
|
||||
|
||||
/* register component */
|
||||
ret = devm_snd_soc_register_component(dev, &mt8195_afe_component,
|
||||
NULL, 0);
|
||||
afe->dai_drivers, afe->num_dai_drivers);
|
||||
if (ret) {
|
||||
dev_warn(dev, "err_platform\n");
|
||||
goto err_pm_put;
|
||||
}
|
||||
|
||||
component = devm_kzalloc(dev, sizeof(*component), GFP_KERNEL);
|
||||
if (!component) {
|
||||
ret = -ENOMEM;
|
||||
goto err_pm_put;
|
||||
}
|
||||
|
||||
ret = snd_soc_component_initialize(component,
|
||||
&mt8195_afe_pcm_dai_component,
|
||||
dev);
|
||||
if (ret)
|
||||
goto err_pm_put;
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
component->debugfs_prefix = "pcm";
|
||||
#endif
|
||||
|
||||
ret = snd_soc_add_component(component,
|
||||
afe->dai_drivers,
|
||||
afe->num_dai_drivers);
|
||||
if (ret) {
|
||||
dev_warn(dev, "err_dai_component\n");
|
||||
goto err_pm_put;
|
||||
}
|
||||
|
||||
ret = regmap_multi_reg_write(afe->regmap, mt8195_afe_reg_defaults,
|
||||
ARRAY_SIZE(mt8195_afe_reg_defaults));
|
||||
if (ret)
|
||||
@ -3224,8 +3195,6 @@ err_pm_put:
|
||||
|
||||
static void mt8195_afe_pcm_dev_remove(struct platform_device *pdev)
|
||||
{
|
||||
snd_soc_unregister_component(&pdev->dev);
|
||||
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
if (!pm_runtime_status_suspended(&pdev->dev))
|
||||
mt8195_afe_runtime_suspend(&pdev->dev);
|
||||
|
@ -934,12 +934,11 @@ SND_SOC_DAILINK_DEFS(ETDM1_IN_BE,
|
||||
|
||||
SND_SOC_DAILINK_DEFS(ETDM2_IN_BE,
|
||||
DAILINK_COMP_ARRAY(COMP_CPU("ETDM2_IN")),
|
||||
DAILINK_COMP_ARRAY(COMP_DUMMY()),
|
||||
DAILINK_COMP_ARRAY(COMP_EMPTY()),
|
||||
DAILINK_COMP_ARRAY(COMP_EMPTY()));
|
||||
|
||||
SND_SOC_DAILINK_DEFS(ETDM1_OUT_BE,
|
||||
DAILINK_COMP_ARRAY(COMP_CPU("ETDM1_OUT")),
|
||||
DAILINK_COMP_ARRAY(COMP_DUMMY()),
|
||||
DAILINK_COMP_ARRAY(COMP_EMPTY()));
|
||||
|
||||
SND_SOC_DAILINK_DEFS(ETDM2_OUT_BE,
|
||||
@ -1237,8 +1236,6 @@ static struct snd_soc_dai_link mt8195_mt6359_dai_links[] = {
|
||||
SND_SOC_DAIFMT_NB_NF |
|
||||
SND_SOC_DAIFMT_CBS_CFS,
|
||||
.dpcm_capture = 1,
|
||||
.init = mt8195_rt5682_init,
|
||||
.ops = &mt8195_rt5682_etdm_ops,
|
||||
.be_hw_params_fixup = mt8195_etdm_hw_params_fixup,
|
||||
SND_SOC_DAILINK_REG(ETDM2_IN_BE),
|
||||
},
|
||||
@ -1249,7 +1246,6 @@ static struct snd_soc_dai_link mt8195_mt6359_dai_links[] = {
|
||||
SND_SOC_DAIFMT_NB_NF |
|
||||
SND_SOC_DAIFMT_CBS_CFS,
|
||||
.dpcm_playback = 1,
|
||||
.ops = &mt8195_rt5682_etdm_ops,
|
||||
.be_hw_params_fixup = mt8195_etdm_hw_params_fixup,
|
||||
SND_SOC_DAILINK_REG(ETDM1_OUT_BE),
|
||||
},
|
||||
@ -1381,7 +1377,7 @@ static int mt8195_mt6359_dev_probe(struct platform_device *pdev)
|
||||
struct snd_soc_dai_link *dai_link;
|
||||
struct mtk_soc_card_data *soc_card_data;
|
||||
struct mt8195_mt6359_priv *mach_priv;
|
||||
struct device_node *platform_node, *adsp_node, *dp_node, *hdmi_node;
|
||||
struct device_node *platform_node, *adsp_node, *codec_node, *dp_node, *hdmi_node;
|
||||
struct mt8195_card_data *card_data;
|
||||
int is5682s = 0;
|
||||
int init6359 = 0;
|
||||
@ -1401,8 +1397,12 @@ static int mt8195_mt6359_dev_probe(struct platform_device *pdev)
|
||||
if (!card->name)
|
||||
card->name = card_data->name;
|
||||
|
||||
if (strstr(card->name, "_5682s"))
|
||||
if (strstr(card->name, "_5682s")) {
|
||||
codec_node = of_find_compatible_node(NULL, NULL, "realtek,rt5682s");
|
||||
is5682s = 1;
|
||||
} else
|
||||
codec_node = of_find_compatible_node(NULL, NULL, "realtek,rt5682i");
|
||||
|
||||
soc_card_data = devm_kzalloc(&pdev->dev, sizeof(*card_data), GFP_KERNEL);
|
||||
if (!soc_card_data)
|
||||
return -ENOMEM;
|
||||
@ -1488,12 +1488,27 @@ static int mt8195_mt6359_dev_probe(struct platform_device *pdev)
|
||||
dai_link->codecs->dai_name = "i2s-hifi";
|
||||
dai_link->init = mt8195_hdmi_codec_init;
|
||||
}
|
||||
} else if (strcmp(dai_link->name, "ETDM1_OUT_BE") == 0 ||
|
||||
strcmp(dai_link->name, "ETDM2_IN_BE") == 0) {
|
||||
dai_link->codecs->name =
|
||||
is5682s ? RT5682S_DEV0_NAME : RT5682_DEV0_NAME;
|
||||
dai_link->codecs->dai_name =
|
||||
is5682s ? RT5682S_CODEC_DAI : RT5682_CODEC_DAI;
|
||||
} else if (strcmp(dai_link->name, "ETDM1_OUT_BE") == 0) {
|
||||
if (!codec_node) {
|
||||
dev_err(&pdev->dev, "Codec not found!\n");
|
||||
} else {
|
||||
dai_link->codecs->of_node = codec_node;
|
||||
dai_link->codecs->name = NULL;
|
||||
dai_link->codecs->dai_name =
|
||||
is5682s ? RT5682S_CODEC_DAI : RT5682_CODEC_DAI;
|
||||
dai_link->init = mt8195_rt5682_init;
|
||||
dai_link->ops = &mt8195_rt5682_etdm_ops;
|
||||
}
|
||||
} else if (strcmp(dai_link->name, "ETDM2_IN_BE") == 0) {
|
||||
if (!codec_node) {
|
||||
dev_err(&pdev->dev, "Codec not found!\n");
|
||||
} else {
|
||||
dai_link->codecs->of_node = codec_node;
|
||||
dai_link->codecs->name = NULL;
|
||||
dai_link->codecs->dai_name =
|
||||
is5682s ? RT5682S_CODEC_DAI : RT5682_CODEC_DAI;
|
||||
dai_link->ops = &mt8195_rt5682_etdm_ops;
|
||||
}
|
||||
} else if (strcmp(dai_link->name, "DL_SRC_BE") == 0 ||
|
||||
strcmp(dai_link->name, "UL_SRC1_BE") == 0 ||
|
||||
strcmp(dai_link->name, "UL_SRC2_BE") == 0) {
|
||||
|
@ -137,7 +137,6 @@ static int trace_filter_parse(struct snd_sof_dev *sdev, char *string,
|
||||
dev_err(sdev->dev,
|
||||
"Parsing filter entry '%s' failed with %d\n",
|
||||
entry, entry_len);
|
||||
kfree(*out);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
@ -209,13 +208,13 @@ static ssize_t dfsentry_trace_filter_write(struct file *file, const char __user
|
||||
ret = ipc3_trace_update_filter(sdev, num_elems, elems);
|
||||
if (ret < 0) {
|
||||
dev_err(sdev->dev, "Filter update failed: %d\n", ret);
|
||||
kfree(elems);
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
ret = count;
|
||||
error:
|
||||
kfree(string);
|
||||
kfree(elems);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -482,13 +482,10 @@ void sof_ipc4_update_cpc_from_manifest(struct snd_sof_dev *sdev,
|
||||
msg = "No CPC match in the firmware file's manifest";
|
||||
|
||||
no_cpc:
|
||||
dev_warn(sdev->dev, "%s (UUID: %pUL): %s (ibs/obs: %u/%u)\n",
|
||||
fw_module->man4_module_entry.name,
|
||||
&fw_module->man4_module_entry.uuid, msg, basecfg->ibs,
|
||||
basecfg->obs);
|
||||
dev_warn_once(sdev->dev, "Please try to update the firmware.\n");
|
||||
dev_warn_once(sdev->dev, "If the issue persists, file a bug at\n");
|
||||
dev_warn_once(sdev->dev, "https://github.com/thesofproject/sof/issues/\n");
|
||||
dev_dbg(sdev->dev, "%s (UUID: %pUL): %s (ibs/obs: %u/%u)\n",
|
||||
fw_module->man4_module_entry.name,
|
||||
&fw_module->man4_module_entry.uuid, msg, basecfg->ibs,
|
||||
basecfg->obs);
|
||||
}
|
||||
|
||||
const struct sof_ipc_fw_loader_ops ipc4_loader_ops = {
|
||||
|
@ -768,10 +768,8 @@ static void sof_ipc4_build_time_info(struct snd_sof_dev *sdev, struct snd_sof_pc
|
||||
info->llp_offset = offsetof(struct sof_ipc4_fw_registers, llp_evad_reading_slot) +
|
||||
sdev->fw_info_box.offset;
|
||||
sof_mailbox_read(sdev, info->llp_offset, &llp_slot, sizeof(llp_slot));
|
||||
if (llp_slot.node_id != dai_copier->data.gtw_cfg.node_id) {
|
||||
dev_info(sdev->dev, "no llp found, fall back to default HDA path");
|
||||
if (llp_slot.node_id != dai_copier->data.gtw_cfg.node_id)
|
||||
info->llp_offset = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static int sof_ipc4_pcm_hw_params(struct snd_soc_component *component,
|
||||
|
@ -5361,9 +5361,9 @@ static int scarlett2_add_line_out_ctls(struct usb_mixer_interface *mixer)
|
||||
if (private->vol_sw_hw_switch[index])
|
||||
scarlett2_vol_ctl_set_writable(mixer, i, 0);
|
||||
|
||||
snprintf(s, sizeof(s),
|
||||
"Line Out %02d Volume Control Playback Enum",
|
||||
i + 1);
|
||||
scnprintf(s, sizeof(s),
|
||||
"Line Out %02d Volume Control Playback Enum",
|
||||
i + 1);
|
||||
err = scarlett2_add_new_ctl(mixer,
|
||||
&scarlett2_sw_hw_enum_ctl,
|
||||
i, 1, s,
|
||||
@ -5406,8 +5406,8 @@ static int scarlett2_add_line_in_ctls(struct usb_mixer_interface *mixer)
|
||||
|
||||
/* Add input level (line/inst) controls */
|
||||
for (i = 0; i < info->level_input_count; i++) {
|
||||
snprintf(s, sizeof(s), fmt, i + 1 + info->level_input_first,
|
||||
"Level", "Enum");
|
||||
scnprintf(s, sizeof(s), fmt, i + 1 + info->level_input_first,
|
||||
"Level", "Enum");
|
||||
err = scarlett2_add_new_ctl(mixer, &scarlett2_level_enum_ctl,
|
||||
i, 1, s, &private->level_ctls[i]);
|
||||
if (err < 0)
|
||||
@ -5416,7 +5416,7 @@ static int scarlett2_add_line_in_ctls(struct usb_mixer_interface *mixer)
|
||||
|
||||
/* Add input pad controls */
|
||||
for (i = 0; i < info->pad_input_count; i++) {
|
||||
snprintf(s, sizeof(s), fmt, i + 1, "Pad", "Switch");
|
||||
scnprintf(s, sizeof(s), fmt, i + 1, "Pad", "Switch");
|
||||
err = scarlett2_add_new_ctl(mixer, &scarlett2_pad_ctl,
|
||||
i, 1, s, &private->pad_ctls[i]);
|
||||
if (err < 0)
|
||||
@ -5425,8 +5425,8 @@ static int scarlett2_add_line_in_ctls(struct usb_mixer_interface *mixer)
|
||||
|
||||
/* Add input air controls */
|
||||
for (i = 0; i < info->air_input_count; i++) {
|
||||
snprintf(s, sizeof(s), fmt, i + 1 + info->air_input_first,
|
||||
"Air", info->air_option ? "Enum" : "Switch");
|
||||
scnprintf(s, sizeof(s), fmt, i + 1 + info->air_input_first,
|
||||
"Air", info->air_option ? "Enum" : "Switch");
|
||||
err = scarlett2_add_new_ctl(
|
||||
mixer, &scarlett2_air_ctl[info->air_option],
|
||||
i, 1, s, &private->air_ctls[i]);
|
||||
@ -5481,9 +5481,9 @@ static int scarlett2_add_line_in_ctls(struct usb_mixer_interface *mixer)
|
||||
|
||||
for (i = 0; i < info->gain_input_count; i++) {
|
||||
if (i % 2) {
|
||||
snprintf(s, sizeof(s),
|
||||
"Line In %d-%d Link Capture Switch",
|
||||
i, i + 1);
|
||||
scnprintf(s, sizeof(s),
|
||||
"Line In %d-%d Link Capture Switch",
|
||||
i, i + 1);
|
||||
err = scarlett2_add_new_ctl(
|
||||
mixer, &scarlett2_input_link_ctl,
|
||||
i / 2, 1, s,
|
||||
@ -5492,30 +5492,30 @@ static int scarlett2_add_line_in_ctls(struct usb_mixer_interface *mixer)
|
||||
return err;
|
||||
}
|
||||
|
||||
snprintf(s, sizeof(s), fmt, i + 1,
|
||||
"Gain", "Volume");
|
||||
scnprintf(s, sizeof(s), fmt, i + 1,
|
||||
"Gain", "Volume");
|
||||
err = scarlett2_add_new_ctl(
|
||||
mixer, &scarlett2_input_gain_ctl,
|
||||
i, 1, s, &private->input_gain_ctls[i]);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
snprintf(s, sizeof(s), fmt, i + 1,
|
||||
"Autogain", "Switch");
|
||||
scnprintf(s, sizeof(s), fmt, i + 1,
|
||||
"Autogain", "Switch");
|
||||
err = scarlett2_add_new_ctl(
|
||||
mixer, &scarlett2_autogain_switch_ctl,
|
||||
i, 1, s, &private->autogain_ctls[i]);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
snprintf(s, sizeof(s), fmt, i + 1,
|
||||
"Autogain Status", "Enum");
|
||||
scnprintf(s, sizeof(s), fmt, i + 1,
|
||||
"Autogain Status", "Enum");
|
||||
err = scarlett2_add_new_ctl(
|
||||
mixer, &scarlett2_autogain_status_ctl,
|
||||
i, 1, s, &private->autogain_status_ctls[i]);
|
||||
|
||||
snprintf(s, sizeof(s), fmt, i + 1,
|
||||
"Safe", "Switch");
|
||||
scnprintf(s, sizeof(s), fmt, i + 1,
|
||||
"Safe", "Switch");
|
||||
err = scarlett2_add_new_ctl(
|
||||
mixer, &scarlett2_safe_ctl,
|
||||
i, 1, s, &private->safe_ctls[i]);
|
||||
@ -5902,8 +5902,8 @@ static int scarlett2_add_direct_monitor_ctls(struct usb_mixer_interface *mixer)
|
||||
for (k = 0; k < private->num_mix_in; k++, index++) {
|
||||
char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
|
||||
|
||||
snprintf(name, sizeof(name), format,
|
||||
mix_type, 'A' + j, k + 1);
|
||||
scnprintf(name, sizeof(name), format,
|
||||
mix_type, 'A' + j, k + 1);
|
||||
|
||||
err = scarlett2_add_new_ctl(
|
||||
mixer, &scarlett2_monitor_mix_ctl,
|
||||
|
Loading…
Reference in New Issue
Block a user