Skip to content

Commit f09d694

Browse files
committed
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
2 parents dd83757 + fe1544d commit f09d694

File tree

17 files changed

+162
-56
lines changed

17 files changed

+162
-56
lines changed

drivers/firmware/cirrus/cs_dsp.c

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1609,8 +1609,8 @@ static int cs_dsp_load(struct cs_dsp *dsp, const struct firmware *firmware,
16091609
goto out_fw;
16101610
}
16111611

1612-
ret = regmap_raw_write_async(regmap, reg, buf->buf,
1613-
le32_to_cpu(region->len));
1612+
ret = regmap_raw_write(regmap, reg, buf->buf,
1613+
le32_to_cpu(region->len));
16141614
if (ret != 0) {
16151615
cs_dsp_err(dsp,
16161616
"%s.%d: Failed to write %d bytes at %d in %s: %d\n",
@@ -1625,20 +1625,13 @@ static int cs_dsp_load(struct cs_dsp *dsp, const struct firmware *firmware,
16251625
regions++;
16261626
}
16271627

1628-
ret = regmap_async_complete(regmap);
1629-
if (ret != 0) {
1630-
cs_dsp_err(dsp, "Failed to complete async write: %d\n", ret);
1631-
goto out_fw;
1632-
}
1633-
16341628
if (pos > firmware->size)
16351629
cs_dsp_warn(dsp, "%s.%d: %zu bytes at end of file\n",
16361630
file, regions, pos - firmware->size);
16371631

16381632
cs_dsp_debugfs_save_wmfwname(dsp, file);
16391633

16401634
out_fw:
1641-
regmap_async_complete(regmap);
16421635
cs_dsp_buf_free(&buf_list);
16431636

16441637
if (ret == -EOVERFLOW)
@@ -2326,8 +2319,8 @@ static int cs_dsp_load_coeff(struct cs_dsp *dsp, const struct firmware *firmware
23262319
cs_dsp_dbg(dsp, "%s.%d: Writing %d bytes at %x\n",
23272320
file, blocks, le32_to_cpu(blk->len),
23282321
reg);
2329-
ret = regmap_raw_write_async(regmap, reg, buf->buf,
2330-
le32_to_cpu(blk->len));
2322+
ret = regmap_raw_write(regmap, reg, buf->buf,
2323+
le32_to_cpu(blk->len));
23312324
if (ret != 0) {
23322325
cs_dsp_err(dsp,
23332326
"%s.%d: Failed to write to %x in %s: %d\n",
@@ -2339,18 +2332,13 @@ static int cs_dsp_load_coeff(struct cs_dsp *dsp, const struct firmware *firmware
23392332
blocks++;
23402333
}
23412334

2342-
ret = regmap_async_complete(regmap);
2343-
if (ret != 0)
2344-
cs_dsp_err(dsp, "Failed to complete async write: %d\n", ret);
2345-
23462335
if (pos > firmware->size)
23472336
cs_dsp_warn(dsp, "%s.%d: %zu bytes at end of file\n",
23482337
file, blocks, pos - firmware->size);
23492338

23502339
cs_dsp_debugfs_save_binname(dsp, file);
23512340

23522341
out_fw:
2353-
regmap_async_complete(regmap);
23542342
cs_dsp_buf_free(&buf_list);
23552343

23562344
if (ret == -EOVERFLOW)
@@ -2561,8 +2549,8 @@ static int cs_dsp_adsp2_enable_core(struct cs_dsp *dsp)
25612549
{
25622550
int ret;
25632551

2564-
ret = regmap_update_bits_async(dsp->regmap, dsp->base + ADSP2_CONTROL,
2565-
ADSP2_SYS_ENA, ADSP2_SYS_ENA);
2552+
ret = regmap_update_bits(dsp->regmap, dsp->base + ADSP2_CONTROL,
2553+
ADSP2_SYS_ENA, ADSP2_SYS_ENA);
25662554
if (ret != 0)
25672555
return ret;
25682556

include/sound/cs35l56.h

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include <linux/firmware/cirrus/cs_dsp.h>
1313
#include <linux/regulator/consumer.h>
1414
#include <linux/regmap.h>
15+
#include <linux/spi/spi.h>
1516
#include <sound/cs-amp-lib.h>
1617

1718
#define CS35L56_DEVID 0x0000000
@@ -61,6 +62,7 @@
6162
#define CS35L56_IRQ1_MASK_8 0x000E0AC
6263
#define CS35L56_IRQ1_MASK_18 0x000E0D4
6364
#define CS35L56_IRQ1_MASK_20 0x000E0DC
65+
#define CS35L56_DSP_MBOX_1_RAW 0x0011000
6466
#define CS35L56_DSP_VIRTUAL1_MBOX_1 0x0011020
6567
#define CS35L56_DSP_VIRTUAL1_MBOX_2 0x0011024
6668
#define CS35L56_DSP_VIRTUAL1_MBOX_3 0x0011028
@@ -224,6 +226,7 @@
224226
#define CS35L56_HALO_STATE_SHUTDOWN 1
225227
#define CS35L56_HALO_STATE_BOOT_DONE 2
226228

229+
#define CS35L56_MBOX_CMD_PING 0x0A000000
227230
#define CS35L56_MBOX_CMD_AUDIO_PLAY 0x0B000001
228231
#define CS35L56_MBOX_CMD_AUDIO_PAUSE 0x0B000002
229232
#define CS35L56_MBOX_CMD_AUDIO_REINIT 0x0B000003
@@ -254,6 +257,16 @@
254257
#define CS35L56_NUM_BULK_SUPPLIES 3
255258
#define CS35L56_NUM_DSP_REGIONS 5
256259

260+
/* Additional margin for SYSTEM_RESET to control port ready on SPI */
261+
#define CS35L56_SPI_RESET_TO_PORT_READY_US (CS35L56_CONTROL_PORT_READY_US + 2500)
262+
263+
struct cs35l56_spi_payload {
264+
__be32 addr;
265+
__be16 pad;
266+
__be32 value;
267+
} __packed;
268+
static_assert(sizeof(struct cs35l56_spi_payload) == 10);
269+
257270
struct cs35l56_base {
258271
struct device *dev;
259272
struct regmap *regmap;
@@ -269,13 +282,31 @@ struct cs35l56_base {
269282
s8 cal_index;
270283
struct cirrus_amp_cal_data cal_data;
271284
struct gpio_desc *reset_gpio;
285+
struct cs35l56_spi_payload *spi_payload_buf;
272286
};
273287

274288
static inline bool cs35l56_is_otp_register(unsigned int reg)
275289
{
276290
return (reg >> 16) == 3;
277291
}
278292

293+
static inline int cs35l56_init_config_for_spi(struct cs35l56_base *cs35l56,
294+
struct spi_device *spi)
295+
{
296+
cs35l56->spi_payload_buf = devm_kzalloc(&spi->dev,
297+
sizeof(*cs35l56->spi_payload_buf),
298+
GFP_KERNEL | GFP_DMA);
299+
if (!cs35l56->spi_payload_buf)
300+
return -ENOMEM;
301+
302+
return 0;
303+
}
304+
305+
static inline bool cs35l56_is_spi(struct cs35l56_base *cs35l56)
306+
{
307+
return IS_ENABLED(CONFIG_SPI_MASTER) && !!cs35l56->spi_payload_buf;
308+
}
309+
279310
extern const struct regmap_config cs35l56_regmap_i2c;
280311
extern const struct regmap_config cs35l56_regmap_spi;
281312
extern const struct regmap_config cs35l56_regmap_sdw;

sound/pci/hda/cs35l56_hda_spi.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ static int cs35l56_hda_spi_probe(struct spi_device *spi)
2222
return -ENOMEM;
2323

2424
cs35l56->base.dev = &spi->dev;
25+
ret = cs35l56_init_config_for_spi(&cs35l56->base, spi);
26+
if (ret)
27+
return ret;
2528

2629
#ifdef CS35L56_WAKE_HOLD_TIME_US
2730
cs35l56->base.can_hibernate = true;

sound/pci/hda/patch_realtek.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10623,6 +10623,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
1062310623
SND_PCI_QUIRK(0x1043, 0x13b0, "ASUS Z550SA", ALC256_FIXUP_ASUS_MIC),
1062410624
SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK),
1062510625
SND_PCI_QUIRK(0x1043, 0x1433, "ASUS GX650PY/PZ/PV/PU/PYV/PZV/PIV/PVV", ALC285_FIXUP_ASUS_I2C_HEADSET_MIC),
10626+
SND_PCI_QUIRK(0x1043, 0x1460, "Asus VivoBook 15", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
1062610627
SND_PCI_QUIRK(0x1043, 0x1463, "Asus GA402X/GA402N", ALC285_FIXUP_ASUS_I2C_HEADSET_MIC),
1062710628
SND_PCI_QUIRK(0x1043, 0x1473, "ASUS GU604VI/VC/VE/VG/VJ/VQ/VU/VV/VY/VZ", ALC285_FIXUP_ASUS_HEADSET_MIC),
1062810629
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[] = {
1065610657
SND_PCI_QUIRK(0x1043, 0x19ce, "ASUS B9450FA", ALC294_FIXUP_ASUS_HPE),
1065710658
SND_PCI_QUIRK(0x1043, 0x19e1, "ASUS UX581LV", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE),
1065810659
SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
10659-
SND_PCI_QUIRK(0x1043, 0x1a30, "ASUS X705UD", ALC256_FIXUP_ASUS_MIC),
1066010660
SND_PCI_QUIRK(0x1043, 0x1a63, "ASUS UX3405MA", ALC245_FIXUP_CS35L41_SPI_2),
1066110661
SND_PCI_QUIRK(0x1043, 0x1a83, "ASUS UM5302LA", ALC294_FIXUP_CS35L41_I2C_2),
1066210662
SND_PCI_QUIRK(0x1043, 0x1a8f, "ASUS UX582ZS", ALC245_FIXUP_CS35L41_SPI_2),

sound/soc/codecs/cs35l56-shared.c

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <linux/gpio/consumer.h>
1111
#include <linux/regmap.h>
1212
#include <linux/regulator/consumer.h>
13+
#include <linux/spi/spi.h>
1314
#include <linux/types.h>
1415
#include <sound/cs-amp-lib.h>
1516

@@ -303,6 +304,79 @@ void cs35l56_wait_min_reset_pulse(void)
303304
}
304305
EXPORT_SYMBOL_NS_GPL(cs35l56_wait_min_reset_pulse, "SND_SOC_CS35L56_SHARED");
305306

307+
static const struct {
308+
u32 addr;
309+
u32 value;
310+
} cs35l56_spi_system_reset_stages[] = {
311+
{ .addr = CS35L56_DSP_VIRTUAL1_MBOX_1, .value = CS35L56_MBOX_CMD_SYSTEM_RESET },
312+
/* The next write is necessary to delimit the soft reset */
313+
{ .addr = CS35L56_DSP_MBOX_1_RAW, .value = CS35L56_MBOX_CMD_PING },
314+
};
315+
316+
static void cs35l56_spi_issue_bus_locked_reset(struct cs35l56_base *cs35l56_base,
317+
struct spi_device *spi)
318+
{
319+
struct cs35l56_spi_payload *buf = cs35l56_base->spi_payload_buf;
320+
struct spi_transfer t = {
321+
.tx_buf = buf,
322+
.len = sizeof(*buf),
323+
};
324+
struct spi_message m;
325+
int i, ret;
326+
327+
for (i = 0; i < ARRAY_SIZE(cs35l56_spi_system_reset_stages); i++) {
328+
buf->addr = cpu_to_be32(cs35l56_spi_system_reset_stages[i].addr);
329+
buf->value = cpu_to_be32(cs35l56_spi_system_reset_stages[i].value);
330+
spi_message_init_with_transfers(&m, &t, 1);
331+
ret = spi_sync_locked(spi, &m);
332+
if (ret)
333+
dev_warn(cs35l56_base->dev, "spi_sync failed: %d\n", ret);
334+
335+
usleep_range(CS35L56_SPI_RESET_TO_PORT_READY_US,
336+
2 * CS35L56_SPI_RESET_TO_PORT_READY_US);
337+
}
338+
}
339+
340+
static void cs35l56_spi_system_reset(struct cs35l56_base *cs35l56_base)
341+
{
342+
struct spi_device *spi = to_spi_device(cs35l56_base->dev);
343+
unsigned int val;
344+
int read_ret, ret;
345+
346+
/*
347+
* There must not be any other SPI bus activity while the amp is
348+
* soft-resetting.
349+
*/
350+
ret = spi_bus_lock(spi->controller);
351+
if (ret) {
352+
dev_warn(cs35l56_base->dev, "spi_bus_lock failed: %d\n", ret);
353+
return;
354+
}
355+
356+
cs35l56_spi_issue_bus_locked_reset(cs35l56_base, spi);
357+
spi_bus_unlock(spi->controller);
358+
359+
/*
360+
* Check firmware boot by testing for a response in MBOX_2.
361+
* HALO_STATE cannot be trusted yet because the reset sequence
362+
* can leave it with stale state. But MBOX is reset.
363+
* The regmap must remain in cache-only until the chip has
364+
* booted, so use a bypassed read.
365+
*/
366+
ret = read_poll_timeout(regmap_read_bypassed, read_ret,
367+
(val > 0) && (val < 0xffffffff),
368+
CS35L56_HALO_STATE_POLL_US,
369+
CS35L56_HALO_STATE_TIMEOUT_US,
370+
false,
371+
cs35l56_base->regmap,
372+
CS35L56_DSP_VIRTUAL1_MBOX_2,
373+
&val);
374+
if (ret) {
375+
dev_err(cs35l56_base->dev, "SPI reboot timed out(%d): MBOX2=%#x\n",
376+
read_ret, val);
377+
}
378+
}
379+
306380
static const struct reg_sequence cs35l56_system_reset_seq[] = {
307381
REG_SEQ0(CS35L56_DSP1_HALO_STATE, 0),
308382
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)
315389
* accesses other than the controlled system reset sequence below.
316390
*/
317391
regcache_cache_only(cs35l56_base->regmap, true);
392+
393+
if (cs35l56_is_spi(cs35l56_base)) {
394+
cs35l56_spi_system_reset(cs35l56_base);
395+
return;
396+
}
397+
318398
regmap_multi_reg_write_bypassed(cs35l56_base->regmap,
319399
cs35l56_system_reset_seq,
320400
ARRAY_SIZE(cs35l56_system_reset_seq));

sound/soc/codecs/cs35l56-spi.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ static int cs35l56_spi_probe(struct spi_device *spi)
3333

3434
cs35l56->base.dev = &spi->dev;
3535
cs35l56->base.can_hibernate = true;
36+
ret = cs35l56_init_config_for_spi(&cs35l56->base, spi);
37+
if (ret)
38+
return ret;
3639

3740
ret = cs35l56_common_probe(cs35l56);
3841
if (ret != 0)

sound/soc/codecs/es8328.c

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,6 @@ static const struct snd_kcontrol_new es8328_right_line_controls =
233233

234234
/* Left Mixer */
235235
static const struct snd_kcontrol_new es8328_left_mixer_controls[] = {
236-
SOC_DAPM_SINGLE("Playback Switch", ES8328_DACCONTROL17, 7, 1, 0),
237236
SOC_DAPM_SINGLE("Left Bypass Switch", ES8328_DACCONTROL17, 6, 1, 0),
238237
SOC_DAPM_SINGLE("Right Playback Switch", ES8328_DACCONTROL18, 7, 1, 0),
239238
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[] = {
243242
static const struct snd_kcontrol_new es8328_right_mixer_controls[] = {
244243
SOC_DAPM_SINGLE("Left Playback Switch", ES8328_DACCONTROL19, 7, 1, 0),
245244
SOC_DAPM_SINGLE("Left Bypass Switch", ES8328_DACCONTROL19, 6, 1, 0),
246-
SOC_DAPM_SINGLE("Playback Switch", ES8328_DACCONTROL20, 7, 1, 0),
247245
SOC_DAPM_SINGLE("Right Bypass Switch", ES8328_DACCONTROL20, 6, 1, 0),
248246
};
249247

@@ -336,10 +334,10 @@ static const struct snd_soc_dapm_widget es8328_dapm_widgets[] = {
336334
SND_SOC_DAPM_DAC("Left DAC", "Left Playback", ES8328_DACPOWER,
337335
ES8328_DACPOWER_LDAC_OFF, 1),
338336

339-
SND_SOC_DAPM_MIXER("Left Mixer", SND_SOC_NOPM, 0, 0,
337+
SND_SOC_DAPM_MIXER("Left Mixer", ES8328_DACCONTROL17, 7, 0,
340338
&es8328_left_mixer_controls[0],
341339
ARRAY_SIZE(es8328_left_mixer_controls)),
342-
SND_SOC_DAPM_MIXER("Right Mixer", SND_SOC_NOPM, 0, 0,
340+
SND_SOC_DAPM_MIXER("Right Mixer", ES8328_DACCONTROL20, 7, 0,
343341
&es8328_right_mixer_controls[0],
344342
ARRAY_SIZE(es8328_right_mixer_controls)),
345343

@@ -418,19 +416,14 @@ static const struct snd_soc_dapm_route es8328_dapm_routes[] = {
418416
{ "Right Line Mux", "PGA", "Right PGA Mux" },
419417
{ "Right Line Mux", "Differential", "Differential Mux" },
420418

421-
{ "Left Out 1", NULL, "Left DAC" },
422-
{ "Right Out 1", NULL, "Right DAC" },
423-
{ "Left Out 2", NULL, "Left DAC" },
424-
{ "Right Out 2", NULL, "Right DAC" },
425-
426-
{ "Left Mixer", "Playback Switch", "Left DAC" },
419+
{ "Left Mixer", NULL, "Left DAC" },
427420
{ "Left Mixer", "Left Bypass Switch", "Left Line Mux" },
428421
{ "Left Mixer", "Right Playback Switch", "Right DAC" },
429422
{ "Left Mixer", "Right Bypass Switch", "Right Line Mux" },
430423

431424
{ "Right Mixer", "Left Playback Switch", "Left DAC" },
432425
{ "Right Mixer", "Left Bypass Switch", "Left Line Mux" },
433-
{ "Right Mixer", "Playback Switch", "Right DAC" },
426+
{ "Right Mixer", NULL, "Right DAC" },
434427
{ "Right Mixer", "Right Bypass Switch", "Right Line Mux" },
435428

436429
{ "DAC DIG", NULL, "DAC STM" },

sound/soc/codecs/tas2764.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,7 @@ static int tas2764_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
365365
{
366366
struct snd_soc_component *component = dai->component;
367367
struct tas2764_priv *tas2764 = snd_soc_component_get_drvdata(component);
368-
u8 tdm_rx_start_slot = 0, asi_cfg_0 = 0, asi_cfg_1 = 0;
368+
u8 tdm_rx_start_slot = 0, asi_cfg_0 = 0, asi_cfg_1 = 0, asi_cfg_4 = 0;
369369
int ret;
370370

371371
switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
@@ -374,12 +374,14 @@ static int tas2764_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
374374
fallthrough;
375375
case SND_SOC_DAIFMT_NB_NF:
376376
asi_cfg_1 = TAS2764_TDM_CFG1_RX_RISING;
377+
asi_cfg_4 = TAS2764_TDM_CFG4_TX_FALLING;
377378
break;
378379
case SND_SOC_DAIFMT_IB_IF:
379380
asi_cfg_0 ^= TAS2764_TDM_CFG0_FRAME_START;
380381
fallthrough;
381382
case SND_SOC_DAIFMT_IB_NF:
382383
asi_cfg_1 = TAS2764_TDM_CFG1_RX_FALLING;
384+
asi_cfg_4 = TAS2764_TDM_CFG4_TX_RISING;
383385
break;
384386
}
385387

@@ -389,6 +391,12 @@ static int tas2764_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
389391
if (ret < 0)
390392
return ret;
391393

394+
ret = snd_soc_component_update_bits(component, TAS2764_TDM_CFG4,
395+
TAS2764_TDM_CFG4_TX_MASK,
396+
asi_cfg_4);
397+
if (ret < 0)
398+
return ret;
399+
392400
switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
393401
case SND_SOC_DAIFMT_I2S:
394402
asi_cfg_0 ^= TAS2764_TDM_CFG0_FRAME_START;

sound/soc/codecs/tas2764.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525

2626
/* Power Control */
2727
#define TAS2764_PWR_CTRL TAS2764_REG(0X0, 0x02)
28-
#define TAS2764_PWR_CTRL_MASK GENMASK(1, 0)
28+
#define TAS2764_PWR_CTRL_MASK GENMASK(2, 0)
2929
#define TAS2764_PWR_CTRL_ACTIVE 0x0
3030
#define TAS2764_PWR_CTRL_MUTE BIT(0)
3131
#define TAS2764_PWR_CTRL_SHUTDOWN BIT(1)
@@ -79,6 +79,12 @@
7979
#define TAS2764_TDM_CFG3_RXS_SHIFT 0x4
8080
#define TAS2764_TDM_CFG3_MASK GENMASK(3, 0)
8181

82+
/* TDM Configuration Reg4 */
83+
#define TAS2764_TDM_CFG4 TAS2764_REG(0X0, 0x0d)
84+
#define TAS2764_TDM_CFG4_TX_MASK BIT(0)
85+
#define TAS2764_TDM_CFG4_TX_RISING 0x0
86+
#define TAS2764_TDM_CFG4_TX_FALLING BIT(0)
87+
8288
/* TDM Configuration Reg5 */
8389
#define TAS2764_TDM_CFG5 TAS2764_REG(0X0, 0x0e)
8490
#define TAS2764_TDM_CFG5_VSNS_MASK BIT(6)

0 commit comments

Comments
 (0)