sound fixes for 6.14-rc5
A collection of fixes. The only slightly large change is for ASoC Cirrus codec, but that's still in a normal range. All the rest are small device-specific fixes and should be fairly safe to take. -----BEGIN PGP SIGNATURE----- iQJCBAABCAAsFiEEIXTw5fNLNI7mMiVaLtJE4w1nLE8FAmfAkMUOHHRpd2FpQHN1 c2UuZGUACgkQLtJE4w1nLE/GpxAAzClmQQKKzYBdKkmV8A42R9Vvr1jv1lZCshfR VseHMkbDhnnDpV/doj7dW5oj5juSuBdehpmcTeBTME3H+cNKrkGH19dxI86Y7rwb ED1nOHWT7xNFaJmSsRFGDOY8H1FjXYKchN6vPKZKTKVqemtT1XWOwJjCKzDlNcjj y1TnjwnkS5ESbT8uYVnjImoO7t3IfXq8NcjTbu2VwEJtngbjDdRZKep2w6rIMyQ9 MG3pqcV5DPFjlRYNwjEqIcqpHhLR/d7N/i0Qe2akg5cViCRGRtuavozT+YiBw49a 30RctZyekiakGochh507fkhRv9Hmg+VxFFw1JlE2hwTCVjzB0xgijNzcDvxbk3eU bnRu+8BThQv2MHoQalobQ+4+RM9YRxJAq9Vbo3W6yxl6MU1AH8jhv26Ax+gH1cbf gea7FYCOFR2tziVIqfWS83i7ACw4JxT1ASIRJqlw80y7uZsszTcX3NcX+xHWI6wj L69NLUBHjktIzdWFJLGSJTg2sszJNiHm11mqN8ASikQjtA0P4hP1w4soDYFGx4Ti QHJFQF+ifU0t2tNbAr75tuegzL4Zk34w0vVgJslxTwJtMG+UXS7bdzDXqz/49xE8 m4alSRtANOF2t1sbZid76QFv4emvykkMhpnh3m8uz8svLwmACID7gMhx/IT+MKzo fovA7AQ= =i1Wa -----END PGP SIGNATURE----- Merge tag 'sound-6.14-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "A collection of fixes. The only slightly large change is for ASoC Cirrus codec, but that's still in a normal range. All the rest are small device-specific fixes and should be fairly safe to take" * tag 'sound-6.14-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: ALSA: hda/realtek: Fix microphone regression on ASUS N705UD ALSA: hda/realtek: Fix wrong mic setup for ASUS VivoBook 15 ASoC: cs35l56: Prevent races when soft-resetting using SPI control firmware: cs_dsp: Remove async regmap writes ASoC: Intel: sof_sdw: warn both sdw and pch dmic are used ASoC: SOF: Intel: don't check number of sdw links when set dmic_fixup ASoC: dapm-graph: set fill colour of turned on nodes ASoC: fsl: Rename stream name of SAI DAI driver ASoC: es8328: fix route from DAC to output ALSA: usb-audio: Re-add sample rate quirk for Pioneer DJM-900NXS2 ASoC: tas2764: Set the SDOUT polarity correctly ASoC: tas2764: Fix power control mask ALSA: usb-audio: Avoid dropping MIDI events at closing multiple ports ASoC: tas2770: Fix volume scale
This commit is contained in:
commit
f09d694cf7
17 changed files with 162 additions and 56 deletions
drivers/firmware/cirrus
include/sound
sound
pci/hda
soc
codecs
fsl
intel/boards
sof/intel
usb
tools/sound
|
@ -1609,8 +1609,8 @@ static int cs_dsp_load(struct cs_dsp *dsp, const struct firmware *firmware,
|
|||
goto out_fw;
|
||||
}
|
||||
|
||||
ret = regmap_raw_write_async(regmap, reg, buf->buf,
|
||||
le32_to_cpu(region->len));
|
||||
ret = regmap_raw_write(regmap, reg, buf->buf,
|
||||
le32_to_cpu(region->len));
|
||||
if (ret != 0) {
|
||||
cs_dsp_err(dsp,
|
||||
"%s.%d: Failed to write %d bytes at %d in %s: %d\n",
|
||||
|
@ -1625,12 +1625,6 @@ static int cs_dsp_load(struct cs_dsp *dsp, const struct firmware *firmware,
|
|||
regions++;
|
||||
}
|
||||
|
||||
ret = regmap_async_complete(regmap);
|
||||
if (ret != 0) {
|
||||
cs_dsp_err(dsp, "Failed to complete async write: %d\n", ret);
|
||||
goto out_fw;
|
||||
}
|
||||
|
||||
if (pos > firmware->size)
|
||||
cs_dsp_warn(dsp, "%s.%d: %zu bytes at end of file\n",
|
||||
file, regions, pos - firmware->size);
|
||||
|
@ -1638,7 +1632,6 @@ static int cs_dsp_load(struct cs_dsp *dsp, const struct firmware *firmware,
|
|||
cs_dsp_debugfs_save_wmfwname(dsp, file);
|
||||
|
||||
out_fw:
|
||||
regmap_async_complete(regmap);
|
||||
cs_dsp_buf_free(&buf_list);
|
||||
|
||||
if (ret == -EOVERFLOW)
|
||||
|
@ -2326,8 +2319,8 @@ static int cs_dsp_load_coeff(struct cs_dsp *dsp, const struct firmware *firmware
|
|||
cs_dsp_dbg(dsp, "%s.%d: Writing %d bytes at %x\n",
|
||||
file, blocks, le32_to_cpu(blk->len),
|
||||
reg);
|
||||
ret = regmap_raw_write_async(regmap, reg, buf->buf,
|
||||
le32_to_cpu(blk->len));
|
||||
ret = regmap_raw_write(regmap, reg, buf->buf,
|
||||
le32_to_cpu(blk->len));
|
||||
if (ret != 0) {
|
||||
cs_dsp_err(dsp,
|
||||
"%s.%d: Failed to write to %x in %s: %d\n",
|
||||
|
@ -2339,10 +2332,6 @@ static int cs_dsp_load_coeff(struct cs_dsp *dsp, const struct firmware *firmware
|
|||
blocks++;
|
||||
}
|
||||
|
||||
ret = regmap_async_complete(regmap);
|
||||
if (ret != 0)
|
||||
cs_dsp_err(dsp, "Failed to complete async write: %d\n", ret);
|
||||
|
||||
if (pos > firmware->size)
|
||||
cs_dsp_warn(dsp, "%s.%d: %zu bytes at end of file\n",
|
||||
file, blocks, pos - firmware->size);
|
||||
|
@ -2350,7 +2339,6 @@ static int cs_dsp_load_coeff(struct cs_dsp *dsp, const struct firmware *firmware
|
|||
cs_dsp_debugfs_save_binname(dsp, file);
|
||||
|
||||
out_fw:
|
||||
regmap_async_complete(regmap);
|
||||
cs_dsp_buf_free(&buf_list);
|
||||
|
||||
if (ret == -EOVERFLOW)
|
||||
|
@ -2561,8 +2549,8 @@ static int cs_dsp_adsp2_enable_core(struct cs_dsp *dsp)
|
|||
{
|
||||
int ret;
|
||||
|
||||
ret = regmap_update_bits_async(dsp->regmap, dsp->base + ADSP2_CONTROL,
|
||||
ADSP2_SYS_ENA, ADSP2_SYS_ENA);
|
||||
ret = regmap_update_bits(dsp->regmap, dsp->base + ADSP2_CONTROL,
|
||||
ADSP2_SYS_ENA, ADSP2_SYS_ENA);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#include <linux/firmware/cirrus/cs_dsp.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <sound/cs-amp-lib.h>
|
||||
|
||||
#define CS35L56_DEVID 0x0000000
|
||||
|
@ -61,6 +62,7 @@
|
|||
#define CS35L56_IRQ1_MASK_8 0x000E0AC
|
||||
#define CS35L56_IRQ1_MASK_18 0x000E0D4
|
||||
#define CS35L56_IRQ1_MASK_20 0x000E0DC
|
||||
#define CS35L56_DSP_MBOX_1_RAW 0x0011000
|
||||
#define CS35L56_DSP_VIRTUAL1_MBOX_1 0x0011020
|
||||
#define CS35L56_DSP_VIRTUAL1_MBOX_2 0x0011024
|
||||
#define CS35L56_DSP_VIRTUAL1_MBOX_3 0x0011028
|
||||
|
@ -224,6 +226,7 @@
|
|||
#define CS35L56_HALO_STATE_SHUTDOWN 1
|
||||
#define CS35L56_HALO_STATE_BOOT_DONE 2
|
||||
|
||||
#define CS35L56_MBOX_CMD_PING 0x0A000000
|
||||
#define CS35L56_MBOX_CMD_AUDIO_PLAY 0x0B000001
|
||||
#define CS35L56_MBOX_CMD_AUDIO_PAUSE 0x0B000002
|
||||
#define CS35L56_MBOX_CMD_AUDIO_REINIT 0x0B000003
|
||||
|
@ -254,6 +257,16 @@
|
|||
#define CS35L56_NUM_BULK_SUPPLIES 3
|
||||
#define CS35L56_NUM_DSP_REGIONS 5
|
||||
|
||||
/* Additional margin for SYSTEM_RESET to control port ready on SPI */
|
||||
#define CS35L56_SPI_RESET_TO_PORT_READY_US (CS35L56_CONTROL_PORT_READY_US + 2500)
|
||||
|
||||
struct cs35l56_spi_payload {
|
||||
__be32 addr;
|
||||
__be16 pad;
|
||||
__be32 value;
|
||||
} __packed;
|
||||
static_assert(sizeof(struct cs35l56_spi_payload) == 10);
|
||||
|
||||
struct cs35l56_base {
|
||||
struct device *dev;
|
||||
struct regmap *regmap;
|
||||
|
@ -269,6 +282,7 @@ struct cs35l56_base {
|
|||
s8 cal_index;
|
||||
struct cirrus_amp_cal_data cal_data;
|
||||
struct gpio_desc *reset_gpio;
|
||||
struct cs35l56_spi_payload *spi_payload_buf;
|
||||
};
|
||||
|
||||
static inline bool cs35l56_is_otp_register(unsigned int reg)
|
||||
|
@ -276,6 +290,23 @@ static inline bool cs35l56_is_otp_register(unsigned int reg)
|
|||
return (reg >> 16) == 3;
|
||||
}
|
||||
|
||||
static inline int cs35l56_init_config_for_spi(struct cs35l56_base *cs35l56,
|
||||
struct spi_device *spi)
|
||||
{
|
||||
cs35l56->spi_payload_buf = devm_kzalloc(&spi->dev,
|
||||
sizeof(*cs35l56->spi_payload_buf),
|
||||
GFP_KERNEL | GFP_DMA);
|
||||
if (!cs35l56->spi_payload_buf)
|
||||
return -ENOMEM;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline bool cs35l56_is_spi(struct cs35l56_base *cs35l56)
|
||||
{
|
||||
return IS_ENABLED(CONFIG_SPI_MASTER) && !!cs35l56->spi_payload_buf;
|
||||
}
|
||||
|
||||
extern const struct regmap_config cs35l56_regmap_i2c;
|
||||
extern const struct regmap_config cs35l56_regmap_spi;
|
||||
extern const struct regmap_config cs35l56_regmap_sdw;
|
||||
|
|
|
@ -22,6 +22,9 @@ static int cs35l56_hda_spi_probe(struct spi_device *spi)
|
|||
return -ENOMEM;
|
||||
|
||||
cs35l56->base.dev = &spi->dev;
|
||||
ret = cs35l56_init_config_for_spi(&cs35l56->base, spi);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
#ifdef CS35L56_WAKE_HOLD_TIME_US
|
||||
cs35l56->base.can_hibernate = true;
|
||||
|
|
|
@ -10623,6 +10623,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x1043, 0x13b0, "ASUS Z550SA", ALC256_FIXUP_ASUS_MIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK),
|
||||
SND_PCI_QUIRK(0x1043, 0x1433, "ASUS GX650PY/PZ/PV/PU/PYV/PZV/PIV/PVV", ALC285_FIXUP_ASUS_I2C_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x1460, "Asus VivoBook 15", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1043, 0x1463, "Asus GA402X/GA402N", ALC285_FIXUP_ASUS_I2C_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x1473, "ASUS GU604VI/VC/VE/VG/VJ/VQ/VU/VV/VY/VZ", ALC285_FIXUP_ASUS_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x1483, "ASUS GU603VQ/VU/VV/VJ/VI", ALC285_FIXUP_ASUS_HEADSET_MIC),
|
||||
|
@ -10656,7 +10657,6 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x1043, 0x19ce, "ASUS B9450FA", ALC294_FIXUP_ASUS_HPE),
|
||||
SND_PCI_QUIRK(0x1043, 0x19e1, "ASUS UX581LV", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
|
||||
SND_PCI_QUIRK(0x1043, 0x1a30, "ASUS X705UD", ALC256_FIXUP_ASUS_MIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x1a63, "ASUS UX3405MA", ALC245_FIXUP_CS35L41_SPI_2),
|
||||
SND_PCI_QUIRK(0x1043, 0x1a83, "ASUS UM5302LA", ALC294_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x1043, 0x1a8f, "ASUS UX582ZS", ALC245_FIXUP_CS35L41_SPI_2),
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include <linux/gpio/consumer.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/types.h>
|
||||
#include <sound/cs-amp-lib.h>
|
||||
|
||||
|
@ -303,6 +304,79 @@ void cs35l56_wait_min_reset_pulse(void)
|
|||
}
|
||||
EXPORT_SYMBOL_NS_GPL(cs35l56_wait_min_reset_pulse, "SND_SOC_CS35L56_SHARED");
|
||||
|
||||
static const struct {
|
||||
u32 addr;
|
||||
u32 value;
|
||||
} cs35l56_spi_system_reset_stages[] = {
|
||||
{ .addr = CS35L56_DSP_VIRTUAL1_MBOX_1, .value = CS35L56_MBOX_CMD_SYSTEM_RESET },
|
||||
/* The next write is necessary to delimit the soft reset */
|
||||
{ .addr = CS35L56_DSP_MBOX_1_RAW, .value = CS35L56_MBOX_CMD_PING },
|
||||
};
|
||||
|
||||
static void cs35l56_spi_issue_bus_locked_reset(struct cs35l56_base *cs35l56_base,
|
||||
struct spi_device *spi)
|
||||
{
|
||||
struct cs35l56_spi_payload *buf = cs35l56_base->spi_payload_buf;
|
||||
struct spi_transfer t = {
|
||||
.tx_buf = buf,
|
||||
.len = sizeof(*buf),
|
||||
};
|
||||
struct spi_message m;
|
||||
int i, ret;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(cs35l56_spi_system_reset_stages); i++) {
|
||||
buf->addr = cpu_to_be32(cs35l56_spi_system_reset_stages[i].addr);
|
||||
buf->value = cpu_to_be32(cs35l56_spi_system_reset_stages[i].value);
|
||||
spi_message_init_with_transfers(&m, &t, 1);
|
||||
ret = spi_sync_locked(spi, &m);
|
||||
if (ret)
|
||||
dev_warn(cs35l56_base->dev, "spi_sync failed: %d\n", ret);
|
||||
|
||||
usleep_range(CS35L56_SPI_RESET_TO_PORT_READY_US,
|
||||
2 * CS35L56_SPI_RESET_TO_PORT_READY_US);
|
||||
}
|
||||
}
|
||||
|
||||
static void cs35l56_spi_system_reset(struct cs35l56_base *cs35l56_base)
|
||||
{
|
||||
struct spi_device *spi = to_spi_device(cs35l56_base->dev);
|
||||
unsigned int val;
|
||||
int read_ret, ret;
|
||||
|
||||
/*
|
||||
* There must not be any other SPI bus activity while the amp is
|
||||
* soft-resetting.
|
||||
*/
|
||||
ret = spi_bus_lock(spi->controller);
|
||||
if (ret) {
|
||||
dev_warn(cs35l56_base->dev, "spi_bus_lock failed: %d\n", ret);
|
||||
return;
|
||||
}
|
||||
|
||||
cs35l56_spi_issue_bus_locked_reset(cs35l56_base, spi);
|
||||
spi_bus_unlock(spi->controller);
|
||||
|
||||
/*
|
||||
* Check firmware boot by testing for a response in MBOX_2.
|
||||
* HALO_STATE cannot be trusted yet because the reset sequence
|
||||
* can leave it with stale state. But MBOX is reset.
|
||||
* The regmap must remain in cache-only until the chip has
|
||||
* booted, so use a bypassed read.
|
||||
*/
|
||||
ret = read_poll_timeout(regmap_read_bypassed, read_ret,
|
||||
(val > 0) && (val < 0xffffffff),
|
||||
CS35L56_HALO_STATE_POLL_US,
|
||||
CS35L56_HALO_STATE_TIMEOUT_US,
|
||||
false,
|
||||
cs35l56_base->regmap,
|
||||
CS35L56_DSP_VIRTUAL1_MBOX_2,
|
||||
&val);
|
||||
if (ret) {
|
||||
dev_err(cs35l56_base->dev, "SPI reboot timed out(%d): MBOX2=%#x\n",
|
||||
read_ret, val);
|
||||
}
|
||||
}
|
||||
|
||||
static const struct reg_sequence cs35l56_system_reset_seq[] = {
|
||||
REG_SEQ0(CS35L56_DSP1_HALO_STATE, 0),
|
||||
REG_SEQ0(CS35L56_DSP_VIRTUAL1_MBOX_1, CS35L56_MBOX_CMD_SYSTEM_RESET),
|
||||
|
@ -315,6 +389,12 @@ void cs35l56_system_reset(struct cs35l56_base *cs35l56_base, bool is_soundwire)
|
|||
* accesses other than the controlled system reset sequence below.
|
||||
*/
|
||||
regcache_cache_only(cs35l56_base->regmap, true);
|
||||
|
||||
if (cs35l56_is_spi(cs35l56_base)) {
|
||||
cs35l56_spi_system_reset(cs35l56_base);
|
||||
return;
|
||||
}
|
||||
|
||||
regmap_multi_reg_write_bypassed(cs35l56_base->regmap,
|
||||
cs35l56_system_reset_seq,
|
||||
ARRAY_SIZE(cs35l56_system_reset_seq));
|
||||
|
|
|
@ -33,6 +33,9 @@ static int cs35l56_spi_probe(struct spi_device *spi)
|
|||
|
||||
cs35l56->base.dev = &spi->dev;
|
||||
cs35l56->base.can_hibernate = true;
|
||||
ret = cs35l56_init_config_for_spi(&cs35l56->base, spi);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = cs35l56_common_probe(cs35l56);
|
||||
if (ret != 0)
|
||||
|
|
|
@ -233,7 +233,6 @@ static const struct snd_kcontrol_new es8328_right_line_controls =
|
|||
|
||||
/* Left Mixer */
|
||||
static const struct snd_kcontrol_new es8328_left_mixer_controls[] = {
|
||||
SOC_DAPM_SINGLE("Playback Switch", ES8328_DACCONTROL17, 7, 1, 0),
|
||||
SOC_DAPM_SINGLE("Left Bypass Switch", ES8328_DACCONTROL17, 6, 1, 0),
|
||||
SOC_DAPM_SINGLE("Right Playback Switch", ES8328_DACCONTROL18, 7, 1, 0),
|
||||
SOC_DAPM_SINGLE("Right Bypass Switch", ES8328_DACCONTROL18, 6, 1, 0),
|
||||
|
@ -243,7 +242,6 @@ static const struct snd_kcontrol_new es8328_left_mixer_controls[] = {
|
|||
static const struct snd_kcontrol_new es8328_right_mixer_controls[] = {
|
||||
SOC_DAPM_SINGLE("Left Playback Switch", ES8328_DACCONTROL19, 7, 1, 0),
|
||||
SOC_DAPM_SINGLE("Left Bypass Switch", ES8328_DACCONTROL19, 6, 1, 0),
|
||||
SOC_DAPM_SINGLE("Playback Switch", ES8328_DACCONTROL20, 7, 1, 0),
|
||||
SOC_DAPM_SINGLE("Right Bypass Switch", ES8328_DACCONTROL20, 6, 1, 0),
|
||||
};
|
||||
|
||||
|
@ -336,10 +334,10 @@ static const struct snd_soc_dapm_widget es8328_dapm_widgets[] = {
|
|||
SND_SOC_DAPM_DAC("Left DAC", "Left Playback", ES8328_DACPOWER,
|
||||
ES8328_DACPOWER_LDAC_OFF, 1),
|
||||
|
||||
SND_SOC_DAPM_MIXER("Left Mixer", SND_SOC_NOPM, 0, 0,
|
||||
SND_SOC_DAPM_MIXER("Left Mixer", ES8328_DACCONTROL17, 7, 0,
|
||||
&es8328_left_mixer_controls[0],
|
||||
ARRAY_SIZE(es8328_left_mixer_controls)),
|
||||
SND_SOC_DAPM_MIXER("Right Mixer", SND_SOC_NOPM, 0, 0,
|
||||
SND_SOC_DAPM_MIXER("Right Mixer", ES8328_DACCONTROL20, 7, 0,
|
||||
&es8328_right_mixer_controls[0],
|
||||
ARRAY_SIZE(es8328_right_mixer_controls)),
|
||||
|
||||
|
@ -418,19 +416,14 @@ static const struct snd_soc_dapm_route es8328_dapm_routes[] = {
|
|||
{ "Right Line Mux", "PGA", "Right PGA Mux" },
|
||||
{ "Right Line Mux", "Differential", "Differential Mux" },
|
||||
|
||||
{ "Left Out 1", NULL, "Left DAC" },
|
||||
{ "Right Out 1", NULL, "Right DAC" },
|
||||
{ "Left Out 2", NULL, "Left DAC" },
|
||||
{ "Right Out 2", NULL, "Right DAC" },
|
||||
|
||||
{ "Left Mixer", "Playback Switch", "Left DAC" },
|
||||
{ "Left Mixer", NULL, "Left DAC" },
|
||||
{ "Left Mixer", "Left Bypass Switch", "Left Line Mux" },
|
||||
{ "Left Mixer", "Right Playback Switch", "Right DAC" },
|
||||
{ "Left Mixer", "Right Bypass Switch", "Right Line Mux" },
|
||||
|
||||
{ "Right Mixer", "Left Playback Switch", "Left DAC" },
|
||||
{ "Right Mixer", "Left Bypass Switch", "Left Line Mux" },
|
||||
{ "Right Mixer", "Playback Switch", "Right DAC" },
|
||||
{ "Right Mixer", NULL, "Right DAC" },
|
||||
{ "Right Mixer", "Right Bypass Switch", "Right Line Mux" },
|
||||
|
||||
{ "DAC DIG", NULL, "DAC STM" },
|
||||
|
|
|
@ -365,7 +365,7 @@ static int tas2764_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
|
|||
{
|
||||
struct snd_soc_component *component = dai->component;
|
||||
struct tas2764_priv *tas2764 = snd_soc_component_get_drvdata(component);
|
||||
u8 tdm_rx_start_slot = 0, asi_cfg_0 = 0, asi_cfg_1 = 0;
|
||||
u8 tdm_rx_start_slot = 0, asi_cfg_0 = 0, asi_cfg_1 = 0, asi_cfg_4 = 0;
|
||||
int ret;
|
||||
|
||||
switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
|
||||
|
@ -374,12 +374,14 @@ static int tas2764_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
|
|||
fallthrough;
|
||||
case SND_SOC_DAIFMT_NB_NF:
|
||||
asi_cfg_1 = TAS2764_TDM_CFG1_RX_RISING;
|
||||
asi_cfg_4 = TAS2764_TDM_CFG4_TX_FALLING;
|
||||
break;
|
||||
case SND_SOC_DAIFMT_IB_IF:
|
||||
asi_cfg_0 ^= TAS2764_TDM_CFG0_FRAME_START;
|
||||
fallthrough;
|
||||
case SND_SOC_DAIFMT_IB_NF:
|
||||
asi_cfg_1 = TAS2764_TDM_CFG1_RX_FALLING;
|
||||
asi_cfg_4 = TAS2764_TDM_CFG4_TX_RISING;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -389,6 +391,12 @@ static int tas2764_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
|
|||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = snd_soc_component_update_bits(component, TAS2764_TDM_CFG4,
|
||||
TAS2764_TDM_CFG4_TX_MASK,
|
||||
asi_cfg_4);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
|
||||
case SND_SOC_DAIFMT_I2S:
|
||||
asi_cfg_0 ^= TAS2764_TDM_CFG0_FRAME_START;
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
|
||||
/* Power Control */
|
||||
#define TAS2764_PWR_CTRL TAS2764_REG(0X0, 0x02)
|
||||
#define TAS2764_PWR_CTRL_MASK GENMASK(1, 0)
|
||||
#define TAS2764_PWR_CTRL_MASK GENMASK(2, 0)
|
||||
#define TAS2764_PWR_CTRL_ACTIVE 0x0
|
||||
#define TAS2764_PWR_CTRL_MUTE BIT(0)
|
||||
#define TAS2764_PWR_CTRL_SHUTDOWN BIT(1)
|
||||
|
@ -79,6 +79,12 @@
|
|||
#define TAS2764_TDM_CFG3_RXS_SHIFT 0x4
|
||||
#define TAS2764_TDM_CFG3_MASK GENMASK(3, 0)
|
||||
|
||||
/* TDM Configuration Reg4 */
|
||||
#define TAS2764_TDM_CFG4 TAS2764_REG(0X0, 0x0d)
|
||||
#define TAS2764_TDM_CFG4_TX_MASK BIT(0)
|
||||
#define TAS2764_TDM_CFG4_TX_RISING 0x0
|
||||
#define TAS2764_TDM_CFG4_TX_FALLING BIT(0)
|
||||
|
||||
/* TDM Configuration Reg5 */
|
||||
#define TAS2764_TDM_CFG5 TAS2764_REG(0X0, 0x0e)
|
||||
#define TAS2764_TDM_CFG5_VSNS_MASK BIT(6)
|
||||
|
|
|
@ -506,7 +506,7 @@ static int tas2770_codec_probe(struct snd_soc_component *component)
|
|||
}
|
||||
|
||||
static DECLARE_TLV_DB_SCALE(tas2770_digital_tlv, 1100, 50, 0);
|
||||
static DECLARE_TLV_DB_SCALE(tas2770_playback_volume, -12750, 50, 0);
|
||||
static DECLARE_TLV_DB_SCALE(tas2770_playback_volume, -10050, 50, 0);
|
||||
|
||||
static const struct snd_kcontrol_new tas2770_snd_controls[] = {
|
||||
SOC_SINGLE_TLV("Speaker Playback Volume", TAS2770_PLAY_CFG_REG2,
|
||||
|
|
|
@ -994,10 +994,10 @@ static struct snd_soc_dai_driver fsl_sai_dai_template[] = {
|
|||
{
|
||||
.name = "sai-tx",
|
||||
.playback = {
|
||||
.stream_name = "CPU-Playback",
|
||||
.stream_name = "SAI-Playback",
|
||||
.channels_min = 1,
|
||||
.channels_max = 32,
|
||||
.rate_min = 8000,
|
||||
.rate_min = 8000,
|
||||
.rate_max = 2822400,
|
||||
.rates = SNDRV_PCM_RATE_KNOT,
|
||||
.formats = FSL_SAI_FORMATS,
|
||||
|
@ -1007,7 +1007,7 @@ static struct snd_soc_dai_driver fsl_sai_dai_template[] = {
|
|||
{
|
||||
.name = "sai-rx",
|
||||
.capture = {
|
||||
.stream_name = "CPU-Capture",
|
||||
.stream_name = "SAI-Capture",
|
||||
.channels_min = 1,
|
||||
.channels_max = 32,
|
||||
.rate_min = 8000,
|
||||
|
|
|
@ -119,8 +119,8 @@ static const struct snd_soc_ops imx_audmix_be_ops = {
|
|||
static const char *name[][3] = {
|
||||
{"HiFi-AUDMIX-FE-0", "HiFi-AUDMIX-FE-1", "HiFi-AUDMIX-FE-2"},
|
||||
{"sai-tx", "sai-tx", "sai-rx"},
|
||||
{"AUDMIX-Playback-0", "AUDMIX-Playback-1", "CPU-Capture"},
|
||||
{"CPU-Playback", "CPU-Playback", "AUDMIX-Capture-0"},
|
||||
{"AUDMIX-Playback-0", "AUDMIX-Playback-1", "SAI-Capture"},
|
||||
{"SAI-Playback", "SAI-Playback", "AUDMIX-Capture-0"},
|
||||
};
|
||||
|
||||
static int imx_audmix_probe(struct platform_device *pdev)
|
||||
|
|
|
@ -803,7 +803,9 @@ static int create_sdw_dailink(struct snd_soc_card *card,
|
|||
int *be_id, struct snd_soc_codec_conf **codec_conf)
|
||||
{
|
||||
struct device *dev = card->dev;
|
||||
struct snd_soc_acpi_mach *mach = dev_get_platdata(card->dev);
|
||||
struct asoc_sdw_mc_private *ctx = snd_soc_card_get_drvdata(card);
|
||||
struct snd_soc_acpi_mach_params *mach_params = &mach->mach_params;
|
||||
struct intel_mc_ctx *intel_ctx = (struct intel_mc_ctx *)ctx->private;
|
||||
struct asoc_sdw_endpoint *sof_end;
|
||||
int stream;
|
||||
|
@ -900,6 +902,11 @@ static int create_sdw_dailink(struct snd_soc_card *card,
|
|||
|
||||
codecs[j].name = sof_end->codec_name;
|
||||
codecs[j].dai_name = sof_end->dai_info->dai_name;
|
||||
if (sof_end->dai_info->dai_type == SOC_SDW_DAI_TYPE_MIC &&
|
||||
mach_params->dmic_num > 0) {
|
||||
dev_warn(dev,
|
||||
"Both SDW DMIC and PCH DMIC are present, if incorrect, please set kernel params snd_sof_intel_hda_generic dmic_num=0 to disable PCH DMIC\n");
|
||||
}
|
||||
j++;
|
||||
}
|
||||
|
||||
|
|
|
@ -1312,22 +1312,8 @@ struct snd_soc_acpi_mach *hda_machine_select(struct snd_sof_dev *sdev)
|
|||
/* report to machine driver if any DMICs are found */
|
||||
mach->mach_params.dmic_num = check_dmic_num(sdev);
|
||||
|
||||
if (sdw_mach_found) {
|
||||
/*
|
||||
* DMICs use up to 4 pins and are typically pin-muxed with SoundWire
|
||||
* link 2 and 3, or link 1 and 2, thus we only try to enable dmics
|
||||
* if all conditions are true:
|
||||
* a) 2 or fewer links are used by SoundWire
|
||||
* b) the NHLT table reports the presence of microphones
|
||||
*/
|
||||
if (hweight_long(mach->link_mask) <= 2)
|
||||
dmic_fixup = true;
|
||||
else
|
||||
mach->mach_params.dmic_num = 0;
|
||||
} else {
|
||||
if (mach->tplg_quirk_mask & SND_SOC_ACPI_TPLG_INTEL_DMIC_NUMBER)
|
||||
dmic_fixup = true;
|
||||
}
|
||||
if (sdw_mach_found || mach->tplg_quirk_mask & SND_SOC_ACPI_TPLG_INTEL_DMIC_NUMBER)
|
||||
dmic_fixup = true;
|
||||
|
||||
if (tplg_fixup &&
|
||||
dmic_fixup &&
|
||||
|
|
|
@ -1145,7 +1145,7 @@ static int snd_usbmidi_output_close(struct snd_rawmidi_substream *substream)
|
|||
{
|
||||
struct usbmidi_out_port *port = substream->runtime->private_data;
|
||||
|
||||
cancel_work_sync(&port->ep->work);
|
||||
flush_work(&port->ep->work);
|
||||
return substream_open(substream, 0, 0);
|
||||
}
|
||||
|
||||
|
|
|
@ -1868,6 +1868,7 @@ void snd_usb_set_format_quirk(struct snd_usb_substream *subs,
|
|||
case USB_ID(0x534d, 0x2109): /* MacroSilicon MS2109 */
|
||||
subs->stream_offset_adj = 2;
|
||||
break;
|
||||
case USB_ID(0x2b73, 0x000a): /* Pioneer DJM-900NXS2 */
|
||||
case USB_ID(0x2b73, 0x0013): /* Pioneer DJM-450 */
|
||||
pioneer_djm_set_format_quirk(subs, 0x0082);
|
||||
break;
|
||||
|
|
|
@ -10,7 +10,7 @@ set -eu
|
|||
|
||||
STYLE_COMPONENT_ON="color=dodgerblue;style=bold"
|
||||
STYLE_COMPONENT_OFF="color=gray40;style=filled;fillcolor=gray90"
|
||||
STYLE_NODE_ON="shape=box,style=bold,color=green4"
|
||||
STYLE_NODE_ON="shape=box,style=bold,color=green4,fillcolor=white"
|
||||
STYLE_NODE_OFF="shape=box,style=filled,color=gray30,fillcolor=gray95"
|
||||
|
||||
# Print usage and exit
|
||||
|
|
Loading…
Add table
Reference in a new issue