mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-23 09:56:00 +00:00
sound fixes for 4.11-rc5
At this time, most of changes are for ASoC, while we got one fix for yet another race of ALSA sequencer core and a usual HD-audio quirk. The ASoC changes are mostly small and device-specific fixes. A slightly large volume is seen in sun8i-codec, which is a new code in 4.11, and we'd like to fix user-visible stuff before the official 4.1 release. -----BEGIN PGP SIGNATURE----- iQJCBAABCAAsFiEECxfAB4MH3rD5mfB6bDGAVD0pKaQFAljeLGMOHHRpd2FpQHN1 c2UuZGUACgkQbDGAVD0pKaSqhhAArkaOfZ/5Dz+ejvjhvYO/usH0eTEmi6KaE/Ra 5Vl7WrnixcpXvIu6MwDJCcgCMuayJ83K3GC3PoER9FPXSJJAiowzmDRRuTfUzyQP JzgR9DPuRrbk+ErOn/gK1P1PHVQjMXB5U+L67oV+FTbcqdATQGVQqDqaQH+jX9MD ymMzrd0hR6gFbxKFCO5Pg+BQIyIo7ZzrD8hYHsvFKA5i/NIxQFHvnae2NzBytn8Q NnXbBN6Cnf3h6M/+oYnW5FQ4Ik6jhH4iuXe2XrGY03NoN5t2eXe1247bK3ty/9i+ OCBwuFDadOnfkABr0xDMZGaCrbdMdUlh78SLEapszcuTvNrnW3zbul9WXIrDO/tn MfRJwfAcoc7FzhmrFSGlicNAqUFMU5HkO7atQyu/FafN3Q5vUhV1+yVZKZsXbJm/ pOxOSdt2PCQeA8WZhT5GoP8uPTyu+EW4wU93Gy1Fj1YjmkYh65kmDQRCHTZu6l7u T/hZtBrQDkalExxGVGkrIG6P3Fi+g/ztBIM70XkxAIVLclKOru+ghwNt0ru0ltOb ayr01QdLlSAx1MCvHnWvQmNIyPvKJKAOz8geBtY0fEXdrivnYv9nSXbXyq+SXYfk 4sTDbgo9+VUHv8LO3K/BDUqcpaES4bgHIFbS7IO3hqL7t6xdR5+QtwDr+GAJV27e P5NHP4s= =qutY -----END PGP SIGNATURE----- Merge tag 'sound-4.11-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "At this time, most of changes are for ASoC, while we got one fix for yet another race of ALSA sequencer core and a usual HD-audio quirk. The ASoC changes are mostly small and device-specific fixes. A slightly large volume is seen in sun8i-codec, which is a new code in 4.11, and we'd like to fix user-visible stuff before the official 4.1 release" * tag 'sound-4.11-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (27 commits) ALSA: hda - fix a problem for lineout on a Dell AIO machine ASoC: simple-card: fix simple_dai clk lookup ASoC: STI: Fix reader substream pointer set ALSA: seq: Fix race during FIFO resize ARM: dts: sun8i: Update audio-routing with renamed widgets ASoC: sun8i-codec: Convert to use SND_SOC_DAPM_AIF_IN ASoC: sun8i-codec: Fix space on audio-routing widget ASoC: sun8i-codec: Update mixer to use SOC_DAPM_DOUBLE ASoC: sun8i-codec: Remove analog "HP" widget ASoC: rt5665: fix wrong shift rt5665_if2_1_adc_in_enum ASoC: rt5665: fix define of RT5665_HP_DRIVER_5X ASoC: rcar: dma: remove unnecessary "volatile" ASoC: rcar: clear DE bit only in PDMACHCR when it stops ASoC: rsnd: fix sound route path when using SRC6/SRC9 ASoC: don't dereference NULL pcm_{new,free} ASoC: rt5665: CLKDET is also a power of ASRC ASoC: rt5665: Vref3 is necessary for Mono Amp ASoC: rt5665: increase LDO level ASoC: rt5665: fix getting wrong work handler container ASoC: atmel-classd: fix audio clock rate ...
This commit is contained in:
commit
0fc04f9113
@ -113,8 +113,8 @@
|
||||
simple-audio-card,mclk-fs = <512>;
|
||||
simple-audio-card,aux-devs = <&codec_analog>;
|
||||
simple-audio-card,routing =
|
||||
"Left DAC", "Digital Left DAC",
|
||||
"Right DAC", "Digital Right DAC";
|
||||
"Left DAC", "AIF1 Slot 0 Left",
|
||||
"Right DAC", "AIF1 Slot 0 Right";
|
||||
status = "disabled";
|
||||
|
||||
simple-audio-card,cpu {
|
||||
|
@ -267,6 +267,10 @@ int snd_seq_fifo_resize(struct snd_seq_fifo *f, int poolsize)
|
||||
/* NOTE: overflow flag is not cleared */
|
||||
spin_unlock_irqrestore(&f->lock, flags);
|
||||
|
||||
/* close the old pool and wait until all users are gone */
|
||||
snd_seq_pool_mark_closing(oldpool);
|
||||
snd_use_lock_sync(&f->use_lock);
|
||||
|
||||
/* release cells in old pool */
|
||||
for (cell = oldhead; cell; cell = next) {
|
||||
next = cell->next;
|
||||
|
@ -4858,6 +4858,7 @@ enum {
|
||||
ALC292_FIXUP_DISABLE_AAMIX,
|
||||
ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK,
|
||||
ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
|
||||
ALC275_FIXUP_DELL_XPS,
|
||||
ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE,
|
||||
ALC293_FIXUP_LENOVO_SPK_NOISE,
|
||||
@ -5470,6 +5471,15 @@ static const struct hda_fixup alc269_fixups[] = {
|
||||
.chained = true,
|
||||
.chain_id = ALC269_FIXUP_HEADSET_MODE
|
||||
},
|
||||
[ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE] = {
|
||||
.type = HDA_FIXUP_PINS,
|
||||
.v.pins = (const struct hda_pintbl[]) {
|
||||
{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
|
||||
{ }
|
||||
},
|
||||
.chained = true,
|
||||
.chain_id = ALC269_FIXUP_HEADSET_MODE
|
||||
},
|
||||
[ALC275_FIXUP_DELL_XPS] = {
|
||||
.type = HDA_FIXUP_VERBS,
|
||||
.v.verbs = (const struct hda_verb[]) {
|
||||
@ -5542,7 +5552,7 @@ static const struct hda_fixup alc269_fixups[] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc298_fixup_speaker_volume,
|
||||
.chained = true,
|
||||
.chain_id = ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
.chain_id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
|
||||
},
|
||||
[ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER] = {
|
||||
.type = HDA_FIXUP_PINS,
|
||||
|
@ -349,7 +349,7 @@ static int atmel_classd_codec_dai_digital_mute(struct snd_soc_dai *codec_dai,
|
||||
}
|
||||
|
||||
#define CLASSD_ACLK_RATE_11M2896_MPY_8 (112896 * 100 * 8)
|
||||
#define CLASSD_ACLK_RATE_12M288_MPY_8 (12228 * 1000 * 8)
|
||||
#define CLASSD_ACLK_RATE_12M288_MPY_8 (12288 * 1000 * 8)
|
||||
|
||||
static struct {
|
||||
int rate;
|
||||
|
@ -1534,21 +1534,20 @@ static void hdac_hdmi_eld_notify_cb(void *aptr, int port, int pipe)
|
||||
pin->mst_capable = false;
|
||||
/* if not MST, default is port[0] */
|
||||
hport = &pin->ports[0];
|
||||
goto out;
|
||||
} else {
|
||||
for (i = 0; i < pin->num_ports; i++) {
|
||||
pin->mst_capable = true;
|
||||
if (pin->ports[i].id == pipe) {
|
||||
hport = &pin->ports[i];
|
||||
goto out;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (hport)
|
||||
hdac_hdmi_present_sense(pin, hport);
|
||||
}
|
||||
|
||||
out:
|
||||
if (pin && hport)
|
||||
hdac_hdmi_present_sense(pin, hport);
|
||||
}
|
||||
|
||||
static struct i915_audio_component_audio_ops aops = {
|
||||
@ -1998,7 +1997,7 @@ static int hdac_hdmi_dev_remove(struct hdac_ext_device *edev)
|
||||
struct hdac_hdmi_pin *pin, *pin_next;
|
||||
struct hdac_hdmi_cvt *cvt, *cvt_next;
|
||||
struct hdac_hdmi_pcm *pcm, *pcm_next;
|
||||
struct hdac_hdmi_port *port;
|
||||
struct hdac_hdmi_port *port, *port_next;
|
||||
int i;
|
||||
|
||||
snd_soc_unregister_codec(&edev->hdac.dev);
|
||||
@ -2008,8 +2007,9 @@ static int hdac_hdmi_dev_remove(struct hdac_ext_device *edev)
|
||||
if (list_empty(&pcm->port_list))
|
||||
continue;
|
||||
|
||||
list_for_each_entry(port, &pcm->port_list, head)
|
||||
port = NULL;
|
||||
list_for_each_entry_safe(port, port_next,
|
||||
&pcm->port_list, head)
|
||||
list_del(&port->head);
|
||||
|
||||
list_del(&pcm->head);
|
||||
kfree(pcm);
|
||||
|
@ -1241,7 +1241,7 @@ static irqreturn_t rt5665_irq(int irq, void *data)
|
||||
static void rt5665_jd_check_handler(struct work_struct *work)
|
||||
{
|
||||
struct rt5665_priv *rt5665 = container_of(work, struct rt5665_priv,
|
||||
calibrate_work.work);
|
||||
jd_check_work.work);
|
||||
|
||||
if (snd_soc_read(rt5665->codec, RT5665_AJD1_CTRL) & 0x0010) {
|
||||
/* jack out */
|
||||
@ -2252,7 +2252,7 @@ static const char * const rt5665_if2_1_adc_in_src[] = {
|
||||
|
||||
static const SOC_ENUM_SINGLE_DECL(
|
||||
rt5665_if2_1_adc_in_enum, RT5665_DIG_INF2_DATA,
|
||||
RT5665_IF3_ADC_IN_SFT, rt5665_if2_1_adc_in_src);
|
||||
RT5665_IF2_1_ADC_IN_SFT, rt5665_if2_1_adc_in_src);
|
||||
|
||||
static const struct snd_kcontrol_new rt5665_if2_1_adc_in_mux =
|
||||
SOC_DAPM_ENUM("IF2_1 ADC IN Source", rt5665_if2_1_adc_in_enum);
|
||||
@ -3178,6 +3178,9 @@ static const struct snd_soc_dapm_route rt5665_dapm_routes[] = {
|
||||
{"DAC Mono Right Filter", NULL, "DAC Mono R ASRC", is_using_asrc},
|
||||
{"DAC Stereo1 Filter", NULL, "DAC STO1 ASRC", is_using_asrc},
|
||||
{"DAC Stereo2 Filter", NULL, "DAC STO2 ASRC", is_using_asrc},
|
||||
{"I2S1 ASRC", NULL, "CLKDET"},
|
||||
{"I2S2 ASRC", NULL, "CLKDET"},
|
||||
{"I2S3 ASRC", NULL, "CLKDET"},
|
||||
|
||||
/*Vref*/
|
||||
{"Mic Det Power", NULL, "Vref2"},
|
||||
@ -3912,6 +3915,7 @@ static const struct snd_soc_dapm_route rt5665_dapm_routes[] = {
|
||||
{"Mono MIX", "MONOVOL Switch", "MONOVOL"},
|
||||
{"Mono Amp", NULL, "Mono MIX"},
|
||||
{"Mono Amp", NULL, "Vref2"},
|
||||
{"Mono Amp", NULL, "Vref3"},
|
||||
{"Mono Amp", NULL, "CLKDET SYS"},
|
||||
{"Mono Amp", NULL, "CLKDET MONO"},
|
||||
{"Mono Playback", "Switch", "Mono Amp"},
|
||||
@ -4798,7 +4802,7 @@ static int rt5665_i2c_probe(struct i2c_client *i2c,
|
||||
/* Enhance performance*/
|
||||
regmap_update_bits(rt5665->regmap, RT5665_PWR_ANLG_1,
|
||||
RT5665_HP_DRIVER_MASK | RT5665_LDO1_DVO_MASK,
|
||||
RT5665_HP_DRIVER_5X | RT5665_LDO1_DVO_09);
|
||||
RT5665_HP_DRIVER_5X | RT5665_LDO1_DVO_12);
|
||||
|
||||
INIT_DELAYED_WORK(&rt5665->jack_detect_work,
|
||||
rt5665_jack_detect_handler);
|
||||
|
@ -1106,7 +1106,7 @@
|
||||
#define RT5665_HP_DRIVER_MASK (0x3 << 2)
|
||||
#define RT5665_HP_DRIVER_1X (0x0 << 2)
|
||||
#define RT5665_HP_DRIVER_3X (0x1 << 2)
|
||||
#define RT5665_HP_DRIVER_5X (0x2 << 2)
|
||||
#define RT5665_HP_DRIVER_5X (0x3 << 2)
|
||||
#define RT5665_LDO1_DVO_MASK (0x3)
|
||||
#define RT5665_LDO1_DVO_09 (0x0)
|
||||
#define RT5665_LDO1_DVO_10 (0x1)
|
||||
|
@ -899,7 +899,10 @@ static int wm_coeff_put(struct snd_kcontrol *kctl,
|
||||
|
||||
mutex_lock(&ctl->dsp->pwr_lock);
|
||||
|
||||
memcpy(ctl->cache, p, ctl->len);
|
||||
if (ctl->flags & WMFW_CTL_FLAG_VOLATILE)
|
||||
ret = -EPERM;
|
||||
else
|
||||
memcpy(ctl->cache, p, ctl->len);
|
||||
|
||||
ctl->set = 1;
|
||||
if (ctl->enabled && ctl->dsp->running)
|
||||
@ -926,6 +929,8 @@ static int wm_coeff_tlv_put(struct snd_kcontrol *kctl,
|
||||
ctl->set = 1;
|
||||
if (ctl->enabled && ctl->dsp->running)
|
||||
ret = wm_coeff_write_control(ctl, ctl->cache, size);
|
||||
else if (ctl->flags & WMFW_CTL_FLAG_VOLATILE)
|
||||
ret = -EPERM;
|
||||
}
|
||||
|
||||
mutex_unlock(&ctl->dsp->pwr_lock);
|
||||
@ -947,7 +952,7 @@ static int wm_coeff_put_acked(struct snd_kcontrol *kctl,
|
||||
|
||||
mutex_lock(&ctl->dsp->pwr_lock);
|
||||
|
||||
if (ctl->enabled)
|
||||
if (ctl->enabled && ctl->dsp->running)
|
||||
ret = wm_coeff_write_acked_control(ctl, val);
|
||||
else
|
||||
ret = -EPERM;
|
||||
|
@ -115,6 +115,7 @@ int asoc_simple_card_parse_clk(struct device *dev,
|
||||
clk = devm_get_clk_from_child(dev, node, NULL);
|
||||
if (!IS_ERR(clk)) {
|
||||
simple_dai->sysclk = clk_get_rate(clk);
|
||||
simple_dai->clk = clk;
|
||||
} else if (!of_property_read_u32(node, "system-clock-frequency", &val)) {
|
||||
simple_dai->sysclk = val;
|
||||
} else {
|
||||
|
@ -512,7 +512,7 @@ static int skl_tplg_set_module_init_data(struct snd_soc_dapm_widget *w)
|
||||
if (bc->set_params != SKL_PARAM_INIT)
|
||||
continue;
|
||||
|
||||
mconfig->formats_config.caps = (u32 *)&bc->params;
|
||||
mconfig->formats_config.caps = (u32 *)bc->params;
|
||||
mconfig->formats_config.caps_size = bc->size;
|
||||
|
||||
break;
|
||||
|
@ -13,7 +13,7 @@ config SND_SOC_MT2701
|
||||
|
||||
config SND_SOC_MT2701_CS42448
|
||||
tristate "ASoc Audio driver for MT2701 with CS42448 codec"
|
||||
depends on SND_SOC_MT2701
|
||||
depends on SND_SOC_MT2701 && I2C
|
||||
select SND_SOC_CS42XX8_I2C
|
||||
select SND_SOC_BT_SCO
|
||||
help
|
||||
|
@ -31,23 +31,24 @@ static int rsnd_cmd_init(struct rsnd_mod *mod,
|
||||
struct rsnd_mod *mix = rsnd_io_to_mod_mix(io);
|
||||
struct device *dev = rsnd_priv_to_dev(priv);
|
||||
u32 data;
|
||||
u32 path[] = {
|
||||
[1] = 1 << 0,
|
||||
[5] = 1 << 8,
|
||||
[6] = 1 << 12,
|
||||
[9] = 1 << 15,
|
||||
};
|
||||
|
||||
if (!mix && !dvc)
|
||||
return 0;
|
||||
|
||||
if (ARRAY_SIZE(path) < rsnd_mod_id(mod) + 1)
|
||||
return -ENXIO;
|
||||
|
||||
if (mix) {
|
||||
struct rsnd_dai *rdai;
|
||||
struct rsnd_mod *src;
|
||||
struct rsnd_dai_stream *tio;
|
||||
int i;
|
||||
u32 path[] = {
|
||||
[0] = 0,
|
||||
[1] = 1 << 0,
|
||||
[2] = 0,
|
||||
[3] = 0,
|
||||
[4] = 0,
|
||||
[5] = 1 << 8
|
||||
};
|
||||
|
||||
/*
|
||||
* it is assuming that integrater is well understanding about
|
||||
@ -70,16 +71,19 @@ static int rsnd_cmd_init(struct rsnd_mod *mod,
|
||||
} else {
|
||||
struct rsnd_mod *src = rsnd_io_to_mod_src(io);
|
||||
|
||||
u32 path[] = {
|
||||
[0] = 0x30000,
|
||||
[1] = 0x30001,
|
||||
[2] = 0x40000,
|
||||
[3] = 0x10000,
|
||||
[4] = 0x20000,
|
||||
[5] = 0x40100
|
||||
u8 cmd_case[] = {
|
||||
[0] = 0x3,
|
||||
[1] = 0x3,
|
||||
[2] = 0x4,
|
||||
[3] = 0x1,
|
||||
[4] = 0x2,
|
||||
[5] = 0x4,
|
||||
[6] = 0x1,
|
||||
[9] = 0x2,
|
||||
};
|
||||
|
||||
data = path[rsnd_mod_id(src)];
|
||||
data = path[rsnd_mod_id(src)] |
|
||||
cmd_case[rsnd_mod_id(src)] << 16;
|
||||
}
|
||||
|
||||
dev_dbg(dev, "ctu/mix path = 0x%08x", data);
|
||||
|
@ -454,6 +454,20 @@ static u32 rsnd_dmapp_read(struct rsnd_dma *dma, u32 reg)
|
||||
return ioread32(rsnd_dmapp_addr(dmac, dma, reg));
|
||||
}
|
||||
|
||||
static void rsnd_dmapp_bset(struct rsnd_dma *dma, u32 data, u32 mask, u32 reg)
|
||||
{
|
||||
struct rsnd_mod *mod = rsnd_mod_get(dma);
|
||||
struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
|
||||
struct rsnd_dma_ctrl *dmac = rsnd_priv_to_dmac(priv);
|
||||
void __iomem *addr = rsnd_dmapp_addr(dmac, dma, reg);
|
||||
u32 val = ioread32(addr);
|
||||
|
||||
val &= ~mask;
|
||||
val |= (data & mask);
|
||||
|
||||
iowrite32(val, addr);
|
||||
}
|
||||
|
||||
static int rsnd_dmapp_stop(struct rsnd_mod *mod,
|
||||
struct rsnd_dai_stream *io,
|
||||
struct rsnd_priv *priv)
|
||||
@ -461,10 +475,10 @@ static int rsnd_dmapp_stop(struct rsnd_mod *mod,
|
||||
struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
|
||||
int i;
|
||||
|
||||
rsnd_dmapp_write(dma, 0, PDMACHCR);
|
||||
rsnd_dmapp_bset(dma, 0, PDMACHCR_DE, PDMACHCR);
|
||||
|
||||
for (i = 0; i < 1024; i++) {
|
||||
if (0 == rsnd_dmapp_read(dma, PDMACHCR))
|
||||
if (0 == (rsnd_dmapp_read(dma, PDMACHCR) & PDMACHCR_DE))
|
||||
return 0;
|
||||
udelay(1);
|
||||
}
|
||||
|
@ -64,7 +64,11 @@ static int rsnd_ssiu_init(struct rsnd_mod *mod,
|
||||
mask1 = (1 << 4) | (1 << 20); /* mask sync bit */
|
||||
mask2 = (1 << 4); /* mask sync bit */
|
||||
val1 = val2 = 0;
|
||||
if (rsnd_ssi_is_pin_sharing(io)) {
|
||||
if (id == 8) {
|
||||
/*
|
||||
* SSI8 pin is sharing with SSI7, nothing to do.
|
||||
*/
|
||||
} else if (rsnd_ssi_is_pin_sharing(io)) {
|
||||
int shift = -1;
|
||||
|
||||
switch (id) {
|
||||
|
@ -3326,7 +3326,10 @@ static int snd_soc_platform_drv_pcm_new(struct snd_soc_pcm_runtime *rtd)
|
||||
{
|
||||
struct snd_soc_platform *platform = rtd->platform;
|
||||
|
||||
return platform->driver->pcm_new(rtd);
|
||||
if (platform->driver->pcm_new)
|
||||
return platform->driver->pcm_new(rtd);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void snd_soc_platform_drv_pcm_free(struct snd_pcm *pcm)
|
||||
@ -3334,7 +3337,8 @@ static void snd_soc_platform_drv_pcm_free(struct snd_pcm *pcm)
|
||||
struct snd_soc_pcm_runtime *rtd = pcm->private_data;
|
||||
struct snd_soc_platform *platform = rtd->platform;
|
||||
|
||||
platform->driver->pcm_free(pcm);
|
||||
if (platform->driver->pcm_free)
|
||||
platform->driver->pcm_free(pcm);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -349,6 +349,8 @@ static int uni_reader_startup(struct snd_pcm_substream *substream,
|
||||
struct uniperif *reader = priv->dai_data.uni;
|
||||
int ret;
|
||||
|
||||
reader->substream = substream;
|
||||
|
||||
if (!UNIPERIF_TYPE_IS_TDM(reader))
|
||||
return 0;
|
||||
|
||||
@ -378,6 +380,7 @@ static void uni_reader_shutdown(struct snd_pcm_substream *substream,
|
||||
/* Stop the reader */
|
||||
uni_reader_stop(reader);
|
||||
}
|
||||
reader->substream = NULL;
|
||||
}
|
||||
|
||||
static const struct snd_soc_dai_ops uni_reader_dai_ops = {
|
||||
|
@ -259,25 +259,20 @@ static int sun8i_codec_hw_params(struct snd_pcm_substream *substream,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct snd_kcontrol_new sun8i_output_left_mixer_controls[] = {
|
||||
SOC_DAPM_SINGLE("LSlot 0", SUN8I_DAC_MXR_SRC,
|
||||
SUN8I_DAC_MXR_SRC_DACL_MXR_SRC_AIF1DA0L, 1, 0),
|
||||
SOC_DAPM_SINGLE("LSlot 1", SUN8I_DAC_MXR_SRC,
|
||||
SUN8I_DAC_MXR_SRC_DACL_MXR_SRC_AIF1DA1L, 1, 0),
|
||||
SOC_DAPM_SINGLE("DACL", SUN8I_DAC_MXR_SRC,
|
||||
SUN8I_DAC_MXR_SRC_DACL_MXR_SRC_AIF2DACL, 1, 0),
|
||||
SOC_DAPM_SINGLE("ADCL", SUN8I_DAC_MXR_SRC,
|
||||
SUN8I_DAC_MXR_SRC_DACL_MXR_SRC_ADCL, 1, 0),
|
||||
};
|
||||
|
||||
static const struct snd_kcontrol_new sun8i_output_right_mixer_controls[] = {
|
||||
SOC_DAPM_SINGLE("RSlot 0", SUN8I_DAC_MXR_SRC,
|
||||
static const struct snd_kcontrol_new sun8i_dac_mixer_controls[] = {
|
||||
SOC_DAPM_DOUBLE("AIF1 Slot 0 Digital DAC Playback Switch",
|
||||
SUN8I_DAC_MXR_SRC,
|
||||
SUN8I_DAC_MXR_SRC_DACL_MXR_SRC_AIF1DA0L,
|
||||
SUN8I_DAC_MXR_SRC_DACR_MXR_SRC_AIF1DA0R, 1, 0),
|
||||
SOC_DAPM_SINGLE("RSlot 1", SUN8I_DAC_MXR_SRC,
|
||||
SOC_DAPM_DOUBLE("AIF1 Slot 1 Digital DAC Playback Switch",
|
||||
SUN8I_DAC_MXR_SRC,
|
||||
SUN8I_DAC_MXR_SRC_DACL_MXR_SRC_AIF1DA1L,
|
||||
SUN8I_DAC_MXR_SRC_DACR_MXR_SRC_AIF1DA1R, 1, 0),
|
||||
SOC_DAPM_SINGLE("DACR", SUN8I_DAC_MXR_SRC,
|
||||
SOC_DAPM_DOUBLE("AIF2 Digital DAC Playback Switch", SUN8I_DAC_MXR_SRC,
|
||||
SUN8I_DAC_MXR_SRC_DACL_MXR_SRC_AIF2DACL,
|
||||
SUN8I_DAC_MXR_SRC_DACR_MXR_SRC_AIF2DACR, 1, 0),
|
||||
SOC_DAPM_SINGLE("ADCR", SUN8I_DAC_MXR_SRC,
|
||||
SOC_DAPM_DOUBLE("ADC Digital DAC Playback Switch", SUN8I_DAC_MXR_SRC,
|
||||
SUN8I_DAC_MXR_SRC_DACL_MXR_SRC_ADCL,
|
||||
SUN8I_DAC_MXR_SRC_DACR_MXR_SRC_ADCR, 1, 0),
|
||||
};
|
||||
|
||||
@ -286,19 +281,21 @@ static const struct snd_soc_dapm_widget sun8i_codec_dapm_widgets[] = {
|
||||
SND_SOC_DAPM_SUPPLY("DAC", SUN8I_DAC_DIG_CTRL, SUN8I_DAC_DIG_CTRL_ENDA,
|
||||
0, NULL, 0),
|
||||
|
||||
/* Analog DAC */
|
||||
SND_SOC_DAPM_DAC("Digital Left DAC", "Playback", SUN8I_AIF1_DACDAT_CTRL,
|
||||
SUN8I_AIF1_DACDAT_CTRL_AIF1_DA0L_ENA, 0),
|
||||
SND_SOC_DAPM_DAC("Digital Right DAC", "Playback", SUN8I_AIF1_DACDAT_CTRL,
|
||||
SUN8I_AIF1_DACDAT_CTRL_AIF1_DA0R_ENA, 0),
|
||||
/* Analog DAC AIF */
|
||||
SND_SOC_DAPM_AIF_IN("AIF1 Slot 0 Left", "Playback", 0,
|
||||
SUN8I_AIF1_DACDAT_CTRL,
|
||||
SUN8I_AIF1_DACDAT_CTRL_AIF1_DA0L_ENA, 0),
|
||||
SND_SOC_DAPM_AIF_IN("AIF1 Slot 0 Right", "Playback", 0,
|
||||
SUN8I_AIF1_DACDAT_CTRL,
|
||||
SUN8I_AIF1_DACDAT_CTRL_AIF1_DA0R_ENA, 0),
|
||||
|
||||
/* DAC Mixers */
|
||||
SND_SOC_DAPM_MIXER("Left DAC Mixer", SND_SOC_NOPM, 0, 0,
|
||||
sun8i_output_left_mixer_controls,
|
||||
ARRAY_SIZE(sun8i_output_left_mixer_controls)),
|
||||
SND_SOC_DAPM_MIXER("Right DAC Mixer", SND_SOC_NOPM, 0, 0,
|
||||
sun8i_output_right_mixer_controls,
|
||||
ARRAY_SIZE(sun8i_output_right_mixer_controls)),
|
||||
SND_SOC_DAPM_MIXER("Left Digital DAC Mixer", SND_SOC_NOPM, 0, 0,
|
||||
sun8i_dac_mixer_controls,
|
||||
ARRAY_SIZE(sun8i_dac_mixer_controls)),
|
||||
SND_SOC_DAPM_MIXER("Right Digital DAC Mixer", SND_SOC_NOPM, 0, 0,
|
||||
sun8i_dac_mixer_controls,
|
||||
ARRAY_SIZE(sun8i_dac_mixer_controls)),
|
||||
|
||||
/* Clocks */
|
||||
SND_SOC_DAPM_SUPPLY("MODCLK AFI1", SUN8I_MOD_CLK_ENA,
|
||||
@ -321,8 +318,6 @@ static const struct snd_soc_dapm_widget sun8i_codec_dapm_widgets[] = {
|
||||
SUN8I_MOD_RST_CTL_AIF1, 0, NULL, 0),
|
||||
SND_SOC_DAPM_SUPPLY("RST DAC", SUN8I_MOD_RST_CTL,
|
||||
SUN8I_MOD_RST_CTL_DAC, 0, NULL, 0),
|
||||
|
||||
SND_SOC_DAPM_OUTPUT("HP"),
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_route sun8i_codec_dapm_routes[] = {
|
||||
@ -338,16 +333,14 @@ static const struct snd_soc_dapm_route sun8i_codec_dapm_routes[] = {
|
||||
{ "DAC", NULL, "MODCLK DAC" },
|
||||
|
||||
/* DAC Routes */
|
||||
{ "Digital Left DAC", NULL, "DAC" },
|
||||
{ "Digital Right DAC", NULL, "DAC" },
|
||||
{ "AIF1 Slot 0 Right", NULL, "DAC" },
|
||||
{ "AIF1 Slot 0 Left", NULL, "DAC" },
|
||||
|
||||
/* DAC Mixer Routes */
|
||||
{ "Left DAC Mixer", "LSlot 0", "Digital Left DAC"},
|
||||
{ "Right DAC Mixer", "RSlot 0", "Digital Right DAC"},
|
||||
|
||||
/* End of route : HP out */
|
||||
{ "HP", NULL, "Left DAC Mixer" },
|
||||
{ "HP", NULL, "Right DAC Mixer" },
|
||||
{ "Left Digital DAC Mixer", "AIF1 Slot 0 Digital DAC Playback Switch",
|
||||
"AIF1 Slot 0 Left"},
|
||||
{ "Right Digital DAC Mixer", "AIF1 Slot 0 Digital DAC Playback Switch",
|
||||
"AIF1 Slot 0 Right"},
|
||||
};
|
||||
|
||||
static struct snd_soc_dai_ops sun8i_codec_dai_ops = {
|
||||
|
Loading…
Reference in New Issue
Block a user