sound fixes for 5.9-rc2
A collection of small fixes over several drivers, but all are driver- specific and nothing looks scary. Slightly large changes are seen in ASoC qcom driver for the bugs that were revealed by the recent ASoC core change to report the invalid register access errors. Also ASoC fsl got a slight intensive change for the distortion fix. Others are only trivial fixes or device-specific quirks. -----BEGIN PGP SIGNATURE----- iQJCBAABCAAsFiEEIXTw5fNLNI7mMiVaLtJE4w1nLE8FAl8/kt4OHHRpd2FpQHN1 c2UuZGUACgkQLtJE4w1nLE+sexAAoPtgbUActijlJY34J4cm7kIt1wVulKKgdxMu LQEbuJPbRuv80fcr7MIcYTc6Q20frb3kQYJNxyPAG7afVV5wkGa/dO6mUrS3LHyg UsQLqm6iHqZNg0wo8cZK9Lhs+VwWrD1VWnV+5ODL5koT/SYfzqI7Km3lKketA4y/ MvsRFhW03Mc6SabRINqxNcE3YTUHi8HPgM4aF9mQmBQTqm3tnld6MSCgo4B129cY rnNoGcpJmcZRGo1ZM7kUGS+FfLeclt3STvepbpz2iAoTWiI55X67uVwjAO3GHW4s 5EoycKu0f8D6g3ZO0evari1vJRhC0X2QVHO42CaDk32PKxnh+xlR4sBfuJW0Zsqt AR+Jibv/wiF+vmlC0s+DQqgaxPkCJrK6zJ4uvjZi+iZhqXhq8Rl9DmIOCUwPoPZd PsKhenrmjecL3yd7kgYMtSm6orjaAzkG9r8rUnTWuWvtnpIyMe9eN3BsOGZnI0GV sn0UCVJQSmlxNcbWfFX+w/hYajY82FGRYbUf8bOAMWIxZP5ecPu54cn5eta70JQk w+b3Th9FSFJDlnATA+WAoh4TmYHmuYBISjmx4tLjnMwKxUCirJt90o7hl04Ntwwe 1/pA4bIN6dN+csaLgWJzstlCxr/8H0LyQgRdvCfAES2ejboUQliiNOO0fDHkdf87 PTCJtUg= =T8Rb -----END PGP SIGNATURE----- Merge tag 'sound-5.9-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "A collection of small fixes over several drivers, but all are driver- specific and nothing looks scary. Slightly large changes are seen in ASoC qcom driver for the bugs that were revealed by the recent ASoC core change to report the invalid register access errors. Also ASoC fsl got a slight intensive change for the distortion fix. Others are only trivial fixes or device-specific quirks" * tag 'sound-5.9-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (25 commits) ALSA: hda: avoid reset of sdo_limit ALSA: hda/realtek: Add quirk for Samsung Galaxy Book Ion ALSA: usb-audio: ignore broken processing/extension unit ASoC: intel: Fix memleak in sst_media_open ASoC: wm8994: Avoid attempts to read unreadable registers ASoC: msm8916-wcd-analog: fix register Interrupt offset ASoC: wm8994: Prevent access to invalid VU register bits on WM1811 ALSA: hda/realtek: Add model alc298-samsung-headphone ALSA: usb-audio: Update documentation comment for MS2109 quirk ALSA: isa: fix spelling mistakes in the comments ALSA: usb-audio: Add capture support for Saffire 6 (USB 1.1) ALSA: hda/realtek: Add quirk for Samsung Galaxy Flex Book ASoC: q6routing: add dummy register read/write function ASoC: q6afe-dai: mark all widgets registers as SND_SOC_NOPM ASoC: Make soc_component_read() returning an error code again ASoC: amd: Replacing component->name with codec_dai->name. ASoC: fsl: Fix unused variable warning ASoC: tegra: tegra210_i2s: Fix compile warning with CONFIG_PM=n ASoC: tegra: tegra210_dmic: Fix compile warning with CONFIG_PM=n ASoC: tegra: tegra210_ahub: Fix compile warning with CONFIG_PM=n ...
This commit is contained in:
commit
7f04f3ed62
|
@ -46,6 +46,18 @@ int snd_hdac_bus_init(struct hdac_bus *bus, struct device *dev,
|
||||||
INIT_LIST_HEAD(&bus->hlink_list);
|
INIT_LIST_HEAD(&bus->hlink_list);
|
||||||
init_waitqueue_head(&bus->rirb_wq);
|
init_waitqueue_head(&bus->rirb_wq);
|
||||||
bus->irq = -1;
|
bus->irq = -1;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Default value of '8' is as per the HD audio specification (Rev 1.0a).
|
||||||
|
* Following relation is used to derive STRIPE control value.
|
||||||
|
* For sample rate <= 48K:
|
||||||
|
* { ((num_channels * bits_per_sample) / number of SDOs) >= 8 }
|
||||||
|
* For sample rate > 48K:
|
||||||
|
* { ((num_channels * bits_per_sample * rate/48000) /
|
||||||
|
* number of SDOs) >= 8 }
|
||||||
|
*/
|
||||||
|
bus->sdo_limit = 8;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(snd_hdac_bus_init);
|
EXPORT_SYMBOL_GPL(snd_hdac_bus_init);
|
||||||
|
|
|
@ -529,17 +529,6 @@ bool snd_hdac_bus_init_chip(struct hdac_bus *bus, bool full_reset)
|
||||||
|
|
||||||
bus->chip_init = true;
|
bus->chip_init = true;
|
||||||
|
|
||||||
/*
|
|
||||||
* Default value of '8' is as per the HD audio specification (Rev 1.0a).
|
|
||||||
* Following relation is used to derive STRIPE control value.
|
|
||||||
* For sample rate <= 48K:
|
|
||||||
* { ((num_channels * bits_per_sample) / number of SDOs) >= 8 }
|
|
||||||
* For sample rate > 48K:
|
|
||||||
* { ((num_channels * bits_per_sample * rate/48000) /
|
|
||||||
* number of SDOs) >= 8 }
|
|
||||||
*/
|
|
||||||
bus->sdo_limit = 8;
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(snd_hdac_bus_init_chip);
|
EXPORT_SYMBOL_GPL(snd_hdac_bus_init_chip);
|
||||||
|
|
|
@ -308,7 +308,7 @@ static inline int verify_mpu401(const struct snd_mpu401 *mpu)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is apparently the standard way to initailise an MPU-401
|
* This is apparently the standard way to initialise an MPU-401
|
||||||
*/
|
*/
|
||||||
static inline void initialise_mpu401(const struct snd_mpu401 *mpu)
|
static inline void initialise_mpu401(const struct snd_mpu401 *mpu)
|
||||||
{
|
{
|
||||||
|
@ -339,7 +339,7 @@ static void soundscape_free(struct snd_card *c)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Tell the SoundScape to begin a DMA tranfer using the given channel.
|
* Tell the SoundScape to begin a DMA transfer using the given channel.
|
||||||
* All locking issues are left to the caller.
|
* All locking issues are left to the caller.
|
||||||
*/
|
*/
|
||||||
static void sscape_start_dma_unsafe(unsigned io_base, enum GA_REG reg)
|
static void sscape_start_dma_unsafe(unsigned io_base, enum GA_REG reg)
|
||||||
|
@ -803,7 +803,7 @@ static int mpu401_open(struct snd_mpu401 *mpu)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialse an MPU-401 subdevice for MIDI support on the SoundScape.
|
* Initialise an MPU-401 subdevice for MIDI support on the SoundScape.
|
||||||
*/
|
*/
|
||||||
static int create_mpu401(struct snd_card *card, int devnum,
|
static int create_mpu401(struct snd_card *card, int devnum,
|
||||||
unsigned long port, int irq)
|
unsigned long port, int irq)
|
||||||
|
|
|
@ -7694,6 +7694,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||||
SND_PCI_QUIRK(0x144d, 0xc109, "Samsung Ativ book 9 (NP900X3G)", ALC269_FIXUP_INV_DMIC),
|
SND_PCI_QUIRK(0x144d, 0xc109, "Samsung Ativ book 9 (NP900X3G)", ALC269_FIXUP_INV_DMIC),
|
||||||
SND_PCI_QUIRK(0x144d, 0xc169, "Samsung Notebook 9 Pen (NP930SBE-K01US)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
|
SND_PCI_QUIRK(0x144d, 0xc169, "Samsung Notebook 9 Pen (NP930SBE-K01US)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
|
||||||
SND_PCI_QUIRK(0x144d, 0xc176, "Samsung Notebook 9 Pro (NP930MBE-K04US)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
|
SND_PCI_QUIRK(0x144d, 0xc176, "Samsung Notebook 9 Pro (NP930MBE-K04US)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
|
||||||
|
SND_PCI_QUIRK(0x144d, 0xc189, "Samsung Galaxy Flex Book (NT950QCG-X716)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
|
||||||
|
SND_PCI_QUIRK(0x144d, 0xc18a, "Samsung Galaxy Book Ion (NT950XCJ-X716A)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
|
||||||
SND_PCI_QUIRK(0x144d, 0xc740, "Samsung Ativ book 8 (NP870Z5G)", ALC269_FIXUP_ATIV_BOOK_8),
|
SND_PCI_QUIRK(0x144d, 0xc740, "Samsung Ativ book 8 (NP870Z5G)", ALC269_FIXUP_ATIV_BOOK_8),
|
||||||
SND_PCI_QUIRK(0x144d, 0xc812, "Samsung Notebook Pen S (NT950SBE-X58)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
|
SND_PCI_QUIRK(0x144d, 0xc812, "Samsung Notebook Pen S (NT950SBE-X58)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
|
||||||
SND_PCI_QUIRK(0x1458, 0xfa53, "Gigabyte BXBT-2807", ALC283_FIXUP_HEADSET_MIC),
|
SND_PCI_QUIRK(0x1458, 0xfa53, "Gigabyte BXBT-2807", ALC283_FIXUP_HEADSET_MIC),
|
||||||
|
@ -7955,6 +7957,7 @@ static const struct hda_model_fixup alc269_fixup_models[] = {
|
||||||
{.id = ALC299_FIXUP_PREDATOR_SPK, .name = "predator-spk"},
|
{.id = ALC299_FIXUP_PREDATOR_SPK, .name = "predator-spk"},
|
||||||
{.id = ALC298_FIXUP_HUAWEI_MBX_STEREO, .name = "huawei-mbx-stereo"},
|
{.id = ALC298_FIXUP_HUAWEI_MBX_STEREO, .name = "huawei-mbx-stereo"},
|
||||||
{.id = ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE, .name = "alc256-medion-headset"},
|
{.id = ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE, .name = "alc256-medion-headset"},
|
||||||
|
{.id = ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET, .name = "alc298-samsung-headphone"},
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
#define ALC225_STANDARD_PINS \
|
#define ALC225_STANDARD_PINS \
|
||||||
|
|
|
@ -138,7 +138,7 @@ static int acp3x_1015_hw_params(struct snd_pcm_substream *substream,
|
||||||
srate = params_rate(params);
|
srate = params_rate(params);
|
||||||
|
|
||||||
for_each_rtd_codec_dais(rtd, i, codec_dai) {
|
for_each_rtd_codec_dais(rtd, i, codec_dai) {
|
||||||
if (strcmp(codec_dai->component->name, "rt1015-aif"))
|
if (strcmp(codec_dai->name, "rt1015-aif"))
|
||||||
continue;
|
continue;
|
||||||
ret = snd_soc_dai_set_bclk_ratio(codec_dai, 64);
|
ret = snd_soc_dai_set_bclk_ratio(codec_dai, 64);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
|
|
|
@ -314,40 +314,30 @@ static int acp_pdm_dma_close(struct snd_soc_component *component,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int acp_pdm_dai_hw_params(struct snd_pcm_substream *substream,
|
|
||||||
struct snd_pcm_hw_params *params,
|
|
||||||
struct snd_soc_dai *dai)
|
|
||||||
{
|
|
||||||
struct pdm_stream_instance *rtd;
|
|
||||||
unsigned int ch_mask;
|
|
||||||
|
|
||||||
rtd = substream->runtime->private_data;
|
|
||||||
switch (params_channels(params)) {
|
|
||||||
case TWO_CH:
|
|
||||||
ch_mask = 0x00;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
rn_writel(ch_mask, rtd->acp_base + ACP_WOV_PDM_NO_OF_CHANNELS);
|
|
||||||
rn_writel(PDM_DECIMATION_FACTOR, rtd->acp_base +
|
|
||||||
ACP_WOV_PDM_DECIMATION_FACTOR);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int acp_pdm_dai_trigger(struct snd_pcm_substream *substream,
|
static int acp_pdm_dai_trigger(struct snd_pcm_substream *substream,
|
||||||
int cmd, struct snd_soc_dai *dai)
|
int cmd, struct snd_soc_dai *dai)
|
||||||
{
|
{
|
||||||
struct pdm_stream_instance *rtd;
|
struct pdm_stream_instance *rtd;
|
||||||
int ret;
|
int ret;
|
||||||
bool pdm_status;
|
bool pdm_status;
|
||||||
|
unsigned int ch_mask;
|
||||||
|
|
||||||
rtd = substream->runtime->private_data;
|
rtd = substream->runtime->private_data;
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
switch (substream->runtime->channels) {
|
||||||
|
case TWO_CH:
|
||||||
|
ch_mask = 0x00;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case SNDRV_PCM_TRIGGER_START:
|
case SNDRV_PCM_TRIGGER_START:
|
||||||
case SNDRV_PCM_TRIGGER_RESUME:
|
case SNDRV_PCM_TRIGGER_RESUME:
|
||||||
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
|
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
|
||||||
|
rn_writel(ch_mask, rtd->acp_base + ACP_WOV_PDM_NO_OF_CHANNELS);
|
||||||
|
rn_writel(PDM_DECIMATION_FACTOR, rtd->acp_base +
|
||||||
|
ACP_WOV_PDM_DECIMATION_FACTOR);
|
||||||
rtd->bytescount = acp_pdm_get_byte_count(rtd,
|
rtd->bytescount = acp_pdm_get_byte_count(rtd,
|
||||||
substream->stream);
|
substream->stream);
|
||||||
pdm_status = check_pdm_dma_status(rtd->acp_base);
|
pdm_status = check_pdm_dma_status(rtd->acp_base);
|
||||||
|
@ -369,7 +359,6 @@ static int acp_pdm_dai_trigger(struct snd_pcm_substream *substream,
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct snd_soc_dai_ops acp_pdm_dai_ops = {
|
static struct snd_soc_dai_ops acp_pdm_dai_ops = {
|
||||||
.hw_params = acp_pdm_dai_hw_params,
|
|
||||||
.trigger = acp_pdm_dai_trigger,
|
.trigger = acp_pdm_dai_trigger,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
|
|
||||||
#define CDC_D_REVISION1 (0xf000)
|
#define CDC_D_REVISION1 (0xf000)
|
||||||
#define CDC_D_PERPH_SUBTYPE (0xf005)
|
#define CDC_D_PERPH_SUBTYPE (0xf005)
|
||||||
#define CDC_D_INT_EN_SET (0x015)
|
#define CDC_D_INT_EN_SET (0xf015)
|
||||||
#define CDC_D_INT_EN_CLR (0x016)
|
#define CDC_D_INT_EN_CLR (0xf016)
|
||||||
#define MBHC_SWITCH_INT BIT(7)
|
#define MBHC_SWITCH_INT BIT(7)
|
||||||
#define MBHC_MIC_ELECTRICAL_INS_REM_DET BIT(6)
|
#define MBHC_MIC_ELECTRICAL_INS_REM_DET BIT(6)
|
||||||
#define MBHC_BUTTON_PRESS_DET BIT(5)
|
#define MBHC_BUTTON_PRESS_DET BIT(5)
|
||||||
|
|
|
@ -412,8 +412,12 @@ int wm8958_aif_ev(struct snd_soc_dapm_widget *w,
|
||||||
struct snd_kcontrol *kcontrol, int event)
|
struct snd_kcontrol *kcontrol, int event)
|
||||||
{
|
{
|
||||||
struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
|
struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
|
||||||
|
struct wm8994 *control = dev_get_drvdata(component->dev->parent);
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
if (control->type != WM8958)
|
||||||
|
return 0;
|
||||||
|
|
||||||
switch (event) {
|
switch (event) {
|
||||||
case SND_SOC_DAPM_POST_PMU:
|
case SND_SOC_DAPM_POST_PMU:
|
||||||
case SND_SOC_DAPM_PRE_PMU:
|
case SND_SOC_DAPM_PRE_PMU:
|
||||||
|
|
|
@ -151,7 +151,6 @@ static const struct reg_default wm8962_reg[] = {
|
||||||
{ 40, 0x0000 }, /* R40 - SPKOUTL volume */
|
{ 40, 0x0000 }, /* R40 - SPKOUTL volume */
|
||||||
{ 41, 0x0000 }, /* R41 - SPKOUTR volume */
|
{ 41, 0x0000 }, /* R41 - SPKOUTR volume */
|
||||||
|
|
||||||
{ 48, 0x0000 }, /* R48 - Additional control(4) */
|
|
||||||
{ 49, 0x0010 }, /* R49 - Class D Control 1 */
|
{ 49, 0x0010 }, /* R49 - Class D Control 1 */
|
||||||
{ 51, 0x0003 }, /* R51 - Class D Control 2 */
|
{ 51, 0x0003 }, /* R51 - Class D Control 2 */
|
||||||
|
|
||||||
|
@ -842,6 +841,7 @@ static bool wm8962_readable_register(struct device *dev, unsigned int reg)
|
||||||
case WM8962_SPKOUTL_VOLUME:
|
case WM8962_SPKOUTL_VOLUME:
|
||||||
case WM8962_SPKOUTR_VOLUME:
|
case WM8962_SPKOUTR_VOLUME:
|
||||||
case WM8962_THERMAL_SHUTDOWN_STATUS:
|
case WM8962_THERMAL_SHUTDOWN_STATUS:
|
||||||
|
case WM8962_ADDITIONAL_CONTROL_4:
|
||||||
case WM8962_CLASS_D_CONTROL_1:
|
case WM8962_CLASS_D_CONTROL_1:
|
||||||
case WM8962_CLASS_D_CONTROL_2:
|
case WM8962_CLASS_D_CONTROL_2:
|
||||||
case WM8962_CLOCKING_4:
|
case WM8962_CLOCKING_4:
|
||||||
|
|
|
@ -43,10 +43,12 @@
|
||||||
#define WM8994_NUM_DRC 3
|
#define WM8994_NUM_DRC 3
|
||||||
#define WM8994_NUM_EQ 3
|
#define WM8994_NUM_EQ 3
|
||||||
|
|
||||||
static struct {
|
struct wm8994_reg_mask {
|
||||||
unsigned int reg;
|
unsigned int reg;
|
||||||
unsigned int mask;
|
unsigned int mask;
|
||||||
} wm8994_vu_bits[] = {
|
};
|
||||||
|
|
||||||
|
static struct wm8994_reg_mask wm8994_vu_bits[] = {
|
||||||
{ WM8994_LEFT_LINE_INPUT_1_2_VOLUME, WM8994_IN1_VU },
|
{ WM8994_LEFT_LINE_INPUT_1_2_VOLUME, WM8994_IN1_VU },
|
||||||
{ WM8994_RIGHT_LINE_INPUT_1_2_VOLUME, WM8994_IN1_VU },
|
{ WM8994_RIGHT_LINE_INPUT_1_2_VOLUME, WM8994_IN1_VU },
|
||||||
{ WM8994_LEFT_LINE_INPUT_3_4_VOLUME, WM8994_IN2_VU },
|
{ WM8994_LEFT_LINE_INPUT_3_4_VOLUME, WM8994_IN2_VU },
|
||||||
|
@ -60,14 +62,10 @@ static struct {
|
||||||
|
|
||||||
{ WM8994_AIF1_DAC1_LEFT_VOLUME, WM8994_AIF1DAC1_VU },
|
{ WM8994_AIF1_DAC1_LEFT_VOLUME, WM8994_AIF1DAC1_VU },
|
||||||
{ WM8994_AIF1_DAC1_RIGHT_VOLUME, WM8994_AIF1DAC1_VU },
|
{ WM8994_AIF1_DAC1_RIGHT_VOLUME, WM8994_AIF1DAC1_VU },
|
||||||
{ WM8994_AIF1_DAC2_LEFT_VOLUME, WM8994_AIF1DAC2_VU },
|
|
||||||
{ WM8994_AIF1_DAC2_RIGHT_VOLUME, WM8994_AIF1DAC2_VU },
|
|
||||||
{ WM8994_AIF2_DAC_LEFT_VOLUME, WM8994_AIF2DAC_VU },
|
{ WM8994_AIF2_DAC_LEFT_VOLUME, WM8994_AIF2DAC_VU },
|
||||||
{ WM8994_AIF2_DAC_RIGHT_VOLUME, WM8994_AIF2DAC_VU },
|
{ WM8994_AIF2_DAC_RIGHT_VOLUME, WM8994_AIF2DAC_VU },
|
||||||
{ WM8994_AIF1_ADC1_LEFT_VOLUME, WM8994_AIF1ADC1_VU },
|
{ WM8994_AIF1_ADC1_LEFT_VOLUME, WM8994_AIF1ADC1_VU },
|
||||||
{ WM8994_AIF1_ADC1_RIGHT_VOLUME, WM8994_AIF1ADC1_VU },
|
{ WM8994_AIF1_ADC1_RIGHT_VOLUME, WM8994_AIF1ADC1_VU },
|
||||||
{ WM8994_AIF1_ADC2_LEFT_VOLUME, WM8994_AIF1ADC2_VU },
|
|
||||||
{ WM8994_AIF1_ADC2_RIGHT_VOLUME, WM8994_AIF1ADC2_VU },
|
|
||||||
{ WM8994_AIF2_ADC_LEFT_VOLUME, WM8994_AIF2ADC_VU },
|
{ WM8994_AIF2_ADC_LEFT_VOLUME, WM8994_AIF2ADC_VU },
|
||||||
{ WM8994_AIF2_ADC_RIGHT_VOLUME, WM8994_AIF1ADC2_VU },
|
{ WM8994_AIF2_ADC_RIGHT_VOLUME, WM8994_AIF1ADC2_VU },
|
||||||
{ WM8994_DAC1_LEFT_VOLUME, WM8994_DAC1_VU },
|
{ WM8994_DAC1_LEFT_VOLUME, WM8994_DAC1_VU },
|
||||||
|
@ -76,6 +74,14 @@ static struct {
|
||||||
{ WM8994_DAC2_RIGHT_VOLUME, WM8994_DAC2_VU },
|
{ WM8994_DAC2_RIGHT_VOLUME, WM8994_DAC2_VU },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* VU bitfields for ADC2, DAC2 not available on WM1811 */
|
||||||
|
static struct wm8994_reg_mask wm8994_adc2_dac2_vu_bits[] = {
|
||||||
|
{ WM8994_AIF1_DAC2_LEFT_VOLUME, WM8994_AIF1DAC2_VU },
|
||||||
|
{ WM8994_AIF1_DAC2_RIGHT_VOLUME, WM8994_AIF1DAC2_VU },
|
||||||
|
{ WM8994_AIF1_ADC2_LEFT_VOLUME, WM8994_AIF1ADC2_VU },
|
||||||
|
{ WM8994_AIF1_ADC2_RIGHT_VOLUME, WM8994_AIF1ADC2_VU },
|
||||||
|
};
|
||||||
|
|
||||||
static int wm8994_drc_base[] = {
|
static int wm8994_drc_base[] = {
|
||||||
WM8994_AIF1_DRC1_1,
|
WM8994_AIF1_DRC1_1,
|
||||||
WM8994_AIF1_DRC2_1,
|
WM8994_AIF1_DRC2_1,
|
||||||
|
@ -1030,6 +1036,26 @@ static bool wm8994_check_class_w_digital(struct snd_soc_component *component)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void wm8994_update_vu_bits(struct snd_soc_component *component)
|
||||||
|
{
|
||||||
|
struct wm8994_priv *wm8994 = snd_soc_component_get_drvdata(component);
|
||||||
|
struct wm8994 *control = wm8994->wm8994;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE(wm8994_vu_bits); i++)
|
||||||
|
snd_soc_component_write(component, wm8994_vu_bits[i].reg,
|
||||||
|
snd_soc_component_read(component,
|
||||||
|
wm8994_vu_bits[i].reg));
|
||||||
|
if (control->type == WM1811)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE(wm8994_adc2_dac2_vu_bits); i++)
|
||||||
|
snd_soc_component_write(component,
|
||||||
|
wm8994_adc2_dac2_vu_bits[i].reg,
|
||||||
|
snd_soc_component_read(component,
|
||||||
|
wm8994_adc2_dac2_vu_bits[i].reg));
|
||||||
|
}
|
||||||
|
|
||||||
static int aif_mclk_set(struct snd_soc_component *component, int aif, bool enable)
|
static int aif_mclk_set(struct snd_soc_component *component, int aif, bool enable)
|
||||||
{
|
{
|
||||||
struct wm8994_priv *wm8994 = snd_soc_component_get_drvdata(component);
|
struct wm8994_priv *wm8994 = snd_soc_component_get_drvdata(component);
|
||||||
|
@ -1076,7 +1102,7 @@ static int aif1clk_ev(struct snd_soc_dapm_widget *w,
|
||||||
struct wm8994_priv *wm8994 = snd_soc_component_get_drvdata(component);
|
struct wm8994_priv *wm8994 = snd_soc_component_get_drvdata(component);
|
||||||
struct wm8994 *control = wm8994->wm8994;
|
struct wm8994 *control = wm8994->wm8994;
|
||||||
int mask = WM8994_AIF1DAC1L_ENA | WM8994_AIF1DAC1R_ENA;
|
int mask = WM8994_AIF1DAC1L_ENA | WM8994_AIF1DAC1R_ENA;
|
||||||
int ret, i;
|
int ret;
|
||||||
int dac;
|
int dac;
|
||||||
int adc;
|
int adc;
|
||||||
int val;
|
int val;
|
||||||
|
@ -1144,10 +1170,7 @@ static int aif1clk_ev(struct snd_soc_dapm_widget *w,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SND_SOC_DAPM_POST_PMU:
|
case SND_SOC_DAPM_POST_PMU:
|
||||||
for (i = 0; i < ARRAY_SIZE(wm8994_vu_bits); i++)
|
wm8994_update_vu_bits(component);
|
||||||
snd_soc_component_write(component, wm8994_vu_bits[i].reg,
|
|
||||||
snd_soc_component_read(component,
|
|
||||||
wm8994_vu_bits[i].reg));
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SND_SOC_DAPM_PRE_PMD:
|
case SND_SOC_DAPM_PRE_PMD:
|
||||||
|
@ -1181,7 +1204,7 @@ static int aif2clk_ev(struct snd_soc_dapm_widget *w,
|
||||||
struct snd_kcontrol *kcontrol, int event)
|
struct snd_kcontrol *kcontrol, int event)
|
||||||
{
|
{
|
||||||
struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
|
struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
|
||||||
int ret, i;
|
int ret;
|
||||||
int dac;
|
int dac;
|
||||||
int adc;
|
int adc;
|
||||||
int val;
|
int val;
|
||||||
|
@ -1237,10 +1260,7 @@ static int aif2clk_ev(struct snd_soc_dapm_widget *w,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SND_SOC_DAPM_POST_PMU:
|
case SND_SOC_DAPM_POST_PMU:
|
||||||
for (i = 0; i < ARRAY_SIZE(wm8994_vu_bits); i++)
|
wm8994_update_vu_bits(component);
|
||||||
snd_soc_component_write(component, wm8994_vu_bits[i].reg,
|
|
||||||
snd_soc_component_read(component,
|
|
||||||
wm8994_vu_bits[i].reg));
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SND_SOC_DAPM_PRE_PMD:
|
case SND_SOC_DAPM_PRE_PMD:
|
||||||
|
@ -4346,6 +4366,14 @@ static int wm8994_component_probe(struct snd_soc_component *component)
|
||||||
wm8994_vu_bits[i].mask,
|
wm8994_vu_bits[i].mask,
|
||||||
wm8994_vu_bits[i].mask);
|
wm8994_vu_bits[i].mask);
|
||||||
|
|
||||||
|
if (control->type != WM1811) {
|
||||||
|
for (i = 0; i < ARRAY_SIZE(wm8994_adc2_dac2_vu_bits); i++)
|
||||||
|
snd_soc_component_update_bits(component,
|
||||||
|
wm8994_adc2_dac2_vu_bits[i].reg,
|
||||||
|
wm8994_adc2_dac2_vu_bits[i].mask,
|
||||||
|
wm8994_adc2_dac2_vu_bits[i].mask);
|
||||||
|
}
|
||||||
|
|
||||||
/* Set the low bit of the 3D stereo depth so TLV matches */
|
/* Set the low bit of the 3D stereo depth so TLV matches */
|
||||||
snd_soc_component_update_bits(component, WM8994_AIF1_DAC1_FILTERS_2,
|
snd_soc_component_update_bits(component, WM8994_AIF1_DAC1_FILTERS_2,
|
||||||
1 << WM8994_AIF1DAC1_3D_GAIN_SHIFT,
|
1 << WM8994_AIF1DAC1_3D_GAIN_SHIFT,
|
||||||
|
|
|
@ -73,6 +73,7 @@ struct cpu_priv {
|
||||||
* @codec_priv: CODEC private data
|
* @codec_priv: CODEC private data
|
||||||
* @cpu_priv: CPU private data
|
* @cpu_priv: CPU private data
|
||||||
* @card: ASoC card structure
|
* @card: ASoC card structure
|
||||||
|
* @streams: Mask of current active streams
|
||||||
* @sample_rate: Current sample rate
|
* @sample_rate: Current sample rate
|
||||||
* @sample_format: Current sample format
|
* @sample_format: Current sample format
|
||||||
* @asrc_rate: ASRC sample rate used by Back-Ends
|
* @asrc_rate: ASRC sample rate used by Back-Ends
|
||||||
|
@ -89,6 +90,7 @@ struct fsl_asoc_card_priv {
|
||||||
struct codec_priv codec_priv;
|
struct codec_priv codec_priv;
|
||||||
struct cpu_priv cpu_priv;
|
struct cpu_priv cpu_priv;
|
||||||
struct snd_soc_card card;
|
struct snd_soc_card card;
|
||||||
|
u8 streams;
|
||||||
u32 sample_rate;
|
u32 sample_rate;
|
||||||
snd_pcm_format_t sample_format;
|
snd_pcm_format_t sample_format;
|
||||||
u32 asrc_rate;
|
u32 asrc_rate;
|
||||||
|
@ -151,21 +153,17 @@ static int fsl_asoc_card_hw_params(struct snd_pcm_substream *substream,
|
||||||
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
|
||||||
struct fsl_asoc_card_priv *priv = snd_soc_card_get_drvdata(rtd->card);
|
struct fsl_asoc_card_priv *priv = snd_soc_card_get_drvdata(rtd->card);
|
||||||
bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
|
bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
|
||||||
|
struct codec_priv *codec_priv = &priv->codec_priv;
|
||||||
struct cpu_priv *cpu_priv = &priv->cpu_priv;
|
struct cpu_priv *cpu_priv = &priv->cpu_priv;
|
||||||
struct device *dev = rtd->card->dev;
|
struct device *dev = rtd->card->dev;
|
||||||
|
unsigned int pll_out;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
priv->sample_rate = params_rate(params);
|
priv->sample_rate = params_rate(params);
|
||||||
priv->sample_format = params_format(params);
|
priv->sample_format = params_format(params);
|
||||||
|
priv->streams |= BIT(substream->stream);
|
||||||
|
|
||||||
/*
|
if (fsl_asoc_card_is_ac97(priv))
|
||||||
* If codec-dai is DAI Master and all configurations are already in the
|
|
||||||
* set_bias_level(), bypass the remaining settings in hw_params().
|
|
||||||
* Note: (dai_fmt & CBM_CFM) includes CBM_CFM and CBM_CFS.
|
|
||||||
*/
|
|
||||||
if ((priv->card.set_bias_level &&
|
|
||||||
priv->dai_fmt & SND_SOC_DAIFMT_CBM_CFM) ||
|
|
||||||
fsl_asoc_card_is_ac97(priv))
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* Specific configurations of DAIs starts from here */
|
/* Specific configurations of DAIs starts from here */
|
||||||
|
@ -174,7 +172,7 @@ static int fsl_asoc_card_hw_params(struct snd_pcm_substream *substream,
|
||||||
cpu_priv->sysclk_dir[tx]);
|
cpu_priv->sysclk_dir[tx]);
|
||||||
if (ret && ret != -ENOTSUPP) {
|
if (ret && ret != -ENOTSUPP) {
|
||||||
dev_err(dev, "failed to set sysclk for cpu dai\n");
|
dev_err(dev, "failed to set sysclk for cpu dai\n");
|
||||||
return ret;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cpu_priv->slot_width) {
|
if (cpu_priv->slot_width) {
|
||||||
|
@ -182,6 +180,68 @@ static int fsl_asoc_card_hw_params(struct snd_pcm_substream *substream,
|
||||||
cpu_priv->slot_width);
|
cpu_priv->slot_width);
|
||||||
if (ret && ret != -ENOTSUPP) {
|
if (ret && ret != -ENOTSUPP) {
|
||||||
dev_err(dev, "failed to set TDM slot for cpu dai\n");
|
dev_err(dev, "failed to set TDM slot for cpu dai\n");
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Specific configuration for PLL */
|
||||||
|
if (codec_priv->pll_id && codec_priv->fll_id) {
|
||||||
|
if (priv->sample_format == SNDRV_PCM_FORMAT_S24_LE)
|
||||||
|
pll_out = priv->sample_rate * 384;
|
||||||
|
else
|
||||||
|
pll_out = priv->sample_rate * 256;
|
||||||
|
|
||||||
|
ret = snd_soc_dai_set_pll(asoc_rtd_to_codec(rtd, 0),
|
||||||
|
codec_priv->pll_id,
|
||||||
|
codec_priv->mclk_id,
|
||||||
|
codec_priv->mclk_freq, pll_out);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(dev, "failed to start FLL: %d\n", ret);
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = snd_soc_dai_set_sysclk(asoc_rtd_to_codec(rtd, 0),
|
||||||
|
codec_priv->fll_id,
|
||||||
|
pll_out, SND_SOC_CLOCK_IN);
|
||||||
|
|
||||||
|
if (ret && ret != -ENOTSUPP) {
|
||||||
|
dev_err(dev, "failed to set SYSCLK: %d\n", ret);
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
priv->streams &= ~BIT(substream->stream);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int fsl_asoc_card_hw_free(struct snd_pcm_substream *substream)
|
||||||
|
{
|
||||||
|
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||||
|
struct fsl_asoc_card_priv *priv = snd_soc_card_get_drvdata(rtd->card);
|
||||||
|
struct codec_priv *codec_priv = &priv->codec_priv;
|
||||||
|
struct device *dev = rtd->card->dev;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
priv->streams &= ~BIT(substream->stream);
|
||||||
|
|
||||||
|
if (!priv->streams && codec_priv->pll_id && codec_priv->fll_id) {
|
||||||
|
/* Force freq to be 0 to avoid error message in codec */
|
||||||
|
ret = snd_soc_dai_set_sysclk(asoc_rtd_to_codec(rtd, 0),
|
||||||
|
codec_priv->mclk_id,
|
||||||
|
0,
|
||||||
|
SND_SOC_CLOCK_IN);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(dev, "failed to switch away from FLL: %d\n", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = snd_soc_dai_set_pll(asoc_rtd_to_codec(rtd, 0),
|
||||||
|
codec_priv->pll_id, 0, 0, 0);
|
||||||
|
if (ret && ret != -ENOTSUPP) {
|
||||||
|
dev_err(dev, "failed to stop FLL: %d\n", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -191,6 +251,7 @@ static int fsl_asoc_card_hw_params(struct snd_pcm_substream *substream,
|
||||||
|
|
||||||
static const struct snd_soc_ops fsl_asoc_card_ops = {
|
static const struct snd_soc_ops fsl_asoc_card_ops = {
|
||||||
.hw_params = fsl_asoc_card_hw_params,
|
.hw_params = fsl_asoc_card_hw_params,
|
||||||
|
.hw_free = fsl_asoc_card_hw_free,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
|
static int be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
|
||||||
|
@ -254,75 +315,6 @@ static struct snd_soc_dai_link fsl_asoc_card_dai[] = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static int fsl_asoc_card_set_bias_level(struct snd_soc_card *card,
|
|
||||||
struct snd_soc_dapm_context *dapm,
|
|
||||||
enum snd_soc_bias_level level)
|
|
||||||
{
|
|
||||||
struct fsl_asoc_card_priv *priv = snd_soc_card_get_drvdata(card);
|
|
||||||
struct snd_soc_pcm_runtime *rtd;
|
|
||||||
struct snd_soc_dai *codec_dai;
|
|
||||||
struct codec_priv *codec_priv = &priv->codec_priv;
|
|
||||||
struct device *dev = card->dev;
|
|
||||||
unsigned int pll_out;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
rtd = snd_soc_get_pcm_runtime(card, &card->dai_link[0]);
|
|
||||||
codec_dai = asoc_rtd_to_codec(rtd, 0);
|
|
||||||
if (dapm->dev != codec_dai->dev)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
switch (level) {
|
|
||||||
case SND_SOC_BIAS_PREPARE:
|
|
||||||
if (dapm->bias_level != SND_SOC_BIAS_STANDBY)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (priv->sample_format == SNDRV_PCM_FORMAT_S24_LE)
|
|
||||||
pll_out = priv->sample_rate * 384;
|
|
||||||
else
|
|
||||||
pll_out = priv->sample_rate * 256;
|
|
||||||
|
|
||||||
ret = snd_soc_dai_set_pll(codec_dai, codec_priv->pll_id,
|
|
||||||
codec_priv->mclk_id,
|
|
||||||
codec_priv->mclk_freq, pll_out);
|
|
||||||
if (ret) {
|
|
||||||
dev_err(dev, "failed to start FLL: %d\n", ret);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = snd_soc_dai_set_sysclk(codec_dai, codec_priv->fll_id,
|
|
||||||
pll_out, SND_SOC_CLOCK_IN);
|
|
||||||
if (ret && ret != -ENOTSUPP) {
|
|
||||||
dev_err(dev, "failed to set SYSCLK: %d\n", ret);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SND_SOC_BIAS_STANDBY:
|
|
||||||
if (dapm->bias_level != SND_SOC_BIAS_PREPARE)
|
|
||||||
break;
|
|
||||||
|
|
||||||
ret = snd_soc_dai_set_sysclk(codec_dai, codec_priv->mclk_id,
|
|
||||||
codec_priv->mclk_freq,
|
|
||||||
SND_SOC_CLOCK_IN);
|
|
||||||
if (ret && ret != -ENOTSUPP) {
|
|
||||||
dev_err(dev, "failed to switch away from FLL: %d\n", ret);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = snd_soc_dai_set_pll(codec_dai, codec_priv->pll_id, 0, 0, 0);
|
|
||||||
if (ret) {
|
|
||||||
dev_err(dev, "failed to stop FLL: %d\n", ret);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int fsl_asoc_card_audmux_init(struct device_node *np,
|
static int fsl_asoc_card_audmux_init(struct device_node *np,
|
||||||
struct fsl_asoc_card_priv *priv)
|
struct fsl_asoc_card_priv *priv)
|
||||||
{
|
{
|
||||||
|
@ -611,7 +603,6 @@ static int fsl_asoc_card_probe(struct platform_device *pdev)
|
||||||
/* Diversify the card configurations */
|
/* Diversify the card configurations */
|
||||||
if (of_device_is_compatible(np, "fsl,imx-audio-cs42888")) {
|
if (of_device_is_compatible(np, "fsl,imx-audio-cs42888")) {
|
||||||
codec_dai_name = "cs42888";
|
codec_dai_name = "cs42888";
|
||||||
priv->card.set_bias_level = NULL;
|
|
||||||
priv->cpu_priv.sysclk_freq[TX] = priv->codec_priv.mclk_freq;
|
priv->cpu_priv.sysclk_freq[TX] = priv->codec_priv.mclk_freq;
|
||||||
priv->cpu_priv.sysclk_freq[RX] = priv->codec_priv.mclk_freq;
|
priv->cpu_priv.sysclk_freq[RX] = priv->codec_priv.mclk_freq;
|
||||||
priv->cpu_priv.sysclk_dir[TX] = SND_SOC_CLOCK_OUT;
|
priv->cpu_priv.sysclk_dir[TX] = SND_SOC_CLOCK_OUT;
|
||||||
|
@ -628,26 +619,22 @@ static int fsl_asoc_card_probe(struct platform_device *pdev)
|
||||||
priv->dai_fmt |= SND_SOC_DAIFMT_CBM_CFM;
|
priv->dai_fmt |= SND_SOC_DAIFMT_CBM_CFM;
|
||||||
} else if (of_device_is_compatible(np, "fsl,imx-audio-wm8962")) {
|
} else if (of_device_is_compatible(np, "fsl,imx-audio-wm8962")) {
|
||||||
codec_dai_name = "wm8962";
|
codec_dai_name = "wm8962";
|
||||||
priv->card.set_bias_level = fsl_asoc_card_set_bias_level;
|
|
||||||
priv->codec_priv.mclk_id = WM8962_SYSCLK_MCLK;
|
priv->codec_priv.mclk_id = WM8962_SYSCLK_MCLK;
|
||||||
priv->codec_priv.fll_id = WM8962_SYSCLK_FLL;
|
priv->codec_priv.fll_id = WM8962_SYSCLK_FLL;
|
||||||
priv->codec_priv.pll_id = WM8962_FLL;
|
priv->codec_priv.pll_id = WM8962_FLL;
|
||||||
priv->dai_fmt |= SND_SOC_DAIFMT_CBM_CFM;
|
priv->dai_fmt |= SND_SOC_DAIFMT_CBM_CFM;
|
||||||
} else if (of_device_is_compatible(np, "fsl,imx-audio-wm8960")) {
|
} else if (of_device_is_compatible(np, "fsl,imx-audio-wm8960")) {
|
||||||
codec_dai_name = "wm8960-hifi";
|
codec_dai_name = "wm8960-hifi";
|
||||||
priv->card.set_bias_level = fsl_asoc_card_set_bias_level;
|
|
||||||
priv->codec_priv.fll_id = WM8960_SYSCLK_AUTO;
|
priv->codec_priv.fll_id = WM8960_SYSCLK_AUTO;
|
||||||
priv->codec_priv.pll_id = WM8960_SYSCLK_AUTO;
|
priv->codec_priv.pll_id = WM8960_SYSCLK_AUTO;
|
||||||
priv->dai_fmt |= SND_SOC_DAIFMT_CBM_CFM;
|
priv->dai_fmt |= SND_SOC_DAIFMT_CBM_CFM;
|
||||||
} else if (of_device_is_compatible(np, "fsl,imx-audio-ac97")) {
|
} else if (of_device_is_compatible(np, "fsl,imx-audio-ac97")) {
|
||||||
codec_dai_name = "ac97-hifi";
|
codec_dai_name = "ac97-hifi";
|
||||||
priv->card.set_bias_level = NULL;
|
|
||||||
priv->dai_fmt = SND_SOC_DAIFMT_AC97;
|
priv->dai_fmt = SND_SOC_DAIFMT_AC97;
|
||||||
priv->card.dapm_routes = audio_map_ac97;
|
priv->card.dapm_routes = audio_map_ac97;
|
||||||
priv->card.num_dapm_routes = ARRAY_SIZE(audio_map_ac97);
|
priv->card.num_dapm_routes = ARRAY_SIZE(audio_map_ac97);
|
||||||
} else if (of_device_is_compatible(np, "fsl,imx-audio-mqs")) {
|
} else if (of_device_is_compatible(np, "fsl,imx-audio-mqs")) {
|
||||||
codec_dai_name = "fsl-mqs-dai";
|
codec_dai_name = "fsl-mqs-dai";
|
||||||
priv->card.set_bias_level = NULL;
|
|
||||||
priv->dai_fmt = SND_SOC_DAIFMT_LEFT_J |
|
priv->dai_fmt = SND_SOC_DAIFMT_LEFT_J |
|
||||||
SND_SOC_DAIFMT_CBS_CFS |
|
SND_SOC_DAIFMT_CBS_CFS |
|
||||||
SND_SOC_DAIFMT_NB_NF;
|
SND_SOC_DAIFMT_NB_NF;
|
||||||
|
@ -657,7 +644,6 @@ static int fsl_asoc_card_probe(struct platform_device *pdev)
|
||||||
priv->card.num_dapm_routes = ARRAY_SIZE(audio_map_tx);
|
priv->card.num_dapm_routes = ARRAY_SIZE(audio_map_tx);
|
||||||
} else if (of_device_is_compatible(np, "fsl,imx-audio-wm8524")) {
|
} else if (of_device_is_compatible(np, "fsl,imx-audio-wm8524")) {
|
||||||
codec_dai_name = "wm8524-hifi";
|
codec_dai_name = "wm8524-hifi";
|
||||||
priv->card.set_bias_level = NULL;
|
|
||||||
priv->dai_fmt |= SND_SOC_DAIFMT_CBS_CFS;
|
priv->dai_fmt |= SND_SOC_DAIFMT_CBS_CFS;
|
||||||
priv->dai_link[1].dpcm_capture = 0;
|
priv->dai_link[1].dpcm_capture = 0;
|
||||||
priv->dai_link[2].dpcm_capture = 0;
|
priv->dai_link[2].dpcm_capture = 0;
|
||||||
|
|
|
@ -339,7 +339,6 @@ static int psc_dma_new(struct snd_soc_component *component,
|
||||||
static void psc_dma_free(struct snd_soc_component *component,
|
static void psc_dma_free(struct snd_soc_component *component,
|
||||||
struct snd_pcm *pcm)
|
struct snd_pcm *pcm)
|
||||||
{
|
{
|
||||||
struct snd_soc_pcm_runtime *rtd = pcm->private_data;
|
|
||||||
struct snd_pcm_substream *substream;
|
struct snd_pcm_substream *substream;
|
||||||
int stream;
|
int stream;
|
||||||
|
|
||||||
|
|
|
@ -331,7 +331,7 @@ static int sst_media_open(struct snd_pcm_substream *substream,
|
||||||
|
|
||||||
ret_val = power_up_sst(stream);
|
ret_val = power_up_sst(stream);
|
||||||
if (ret_val < 0)
|
if (ret_val < 0)
|
||||||
return ret_val;
|
goto out_power_up;
|
||||||
|
|
||||||
/* Make sure, that the period size is always even */
|
/* Make sure, that the period size is always even */
|
||||||
snd_pcm_hw_constraint_step(substream->runtime, 0,
|
snd_pcm_hw_constraint_step(substream->runtime, 0,
|
||||||
|
@ -340,8 +340,9 @@ static int sst_media_open(struct snd_pcm_substream *substream,
|
||||||
return snd_pcm_hw_constraint_integer(runtime,
|
return snd_pcm_hw_constraint_integer(runtime,
|
||||||
SNDRV_PCM_HW_PARAM_PERIODS);
|
SNDRV_PCM_HW_PARAM_PERIODS);
|
||||||
out_ops:
|
out_ops:
|
||||||
kfree(stream);
|
|
||||||
mutex_unlock(&sst_lock);
|
mutex_unlock(&sst_lock);
|
||||||
|
out_power_up:
|
||||||
|
kfree(stream);
|
||||||
return ret_val;
|
return ret_val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1150,206 +1150,206 @@ static int q6afe_of_xlate_dai_name(struct snd_soc_component *component,
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct snd_soc_dapm_widget q6afe_dai_widgets[] = {
|
static const struct snd_soc_dapm_widget q6afe_dai_widgets[] = {
|
||||||
SND_SOC_DAPM_AIF_IN("HDMI_RX", NULL, 0, 0, 0, 0),
|
SND_SOC_DAPM_AIF_IN("HDMI_RX", NULL, 0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("SLIMBUS_0_RX", NULL, 0, 0, 0, 0),
|
SND_SOC_DAPM_AIF_IN("SLIMBUS_0_RX", NULL, 0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("SLIMBUS_1_RX", NULL, 0, 0, 0, 0),
|
SND_SOC_DAPM_AIF_IN("SLIMBUS_1_RX", NULL, 0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("SLIMBUS_2_RX", NULL, 0, 0, 0, 0),
|
SND_SOC_DAPM_AIF_IN("SLIMBUS_2_RX", NULL, 0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("SLIMBUS_3_RX", NULL, 0, 0, 0, 0),
|
SND_SOC_DAPM_AIF_IN("SLIMBUS_3_RX", NULL, 0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("SLIMBUS_4_RX", NULL, 0, 0, 0, 0),
|
SND_SOC_DAPM_AIF_IN("SLIMBUS_4_RX", NULL, 0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("SLIMBUS_5_RX", NULL, 0, 0, 0, 0),
|
SND_SOC_DAPM_AIF_IN("SLIMBUS_5_RX", NULL, 0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("SLIMBUS_6_RX", NULL, 0, 0, 0, 0),
|
SND_SOC_DAPM_AIF_IN("SLIMBUS_6_RX", NULL, 0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("SLIMBUS_0_TX", NULL, 0, 0, 0, 0),
|
SND_SOC_DAPM_AIF_OUT("SLIMBUS_0_TX", NULL, 0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("SLIMBUS_1_TX", NULL, 0, 0, 0, 0),
|
SND_SOC_DAPM_AIF_OUT("SLIMBUS_1_TX", NULL, 0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("SLIMBUS_2_TX", NULL, 0, 0, 0, 0),
|
SND_SOC_DAPM_AIF_OUT("SLIMBUS_2_TX", NULL, 0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("SLIMBUS_3_TX", NULL, 0, 0, 0, 0),
|
SND_SOC_DAPM_AIF_OUT("SLIMBUS_3_TX", NULL, 0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("SLIMBUS_4_TX", NULL, 0, 0, 0, 0),
|
SND_SOC_DAPM_AIF_OUT("SLIMBUS_4_TX", NULL, 0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("SLIMBUS_5_TX", NULL, 0, 0, 0, 0),
|
SND_SOC_DAPM_AIF_OUT("SLIMBUS_5_TX", NULL, 0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("SLIMBUS_6_TX", NULL, 0, 0, 0, 0),
|
SND_SOC_DAPM_AIF_OUT("SLIMBUS_6_TX", NULL, 0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("QUAT_MI2S_RX", NULL,
|
SND_SOC_DAPM_AIF_IN("QUAT_MI2S_RX", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("QUAT_MI2S_TX", NULL,
|
SND_SOC_DAPM_AIF_OUT("QUAT_MI2S_TX", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("TERT_MI2S_RX", NULL,
|
SND_SOC_DAPM_AIF_IN("TERT_MI2S_RX", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("TERT_MI2S_TX", NULL,
|
SND_SOC_DAPM_AIF_OUT("TERT_MI2S_TX", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("SEC_MI2S_RX", NULL,
|
SND_SOC_DAPM_AIF_IN("SEC_MI2S_RX", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("SEC_MI2S_TX", NULL,
|
SND_SOC_DAPM_AIF_OUT("SEC_MI2S_TX", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("SEC_MI2S_RX_SD1",
|
SND_SOC_DAPM_AIF_IN("SEC_MI2S_RX_SD1",
|
||||||
"Secondary MI2S Playback SD1",
|
"Secondary MI2S Playback SD1",
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("PRI_MI2S_RX", NULL,
|
SND_SOC_DAPM_AIF_IN("PRI_MI2S_RX", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("PRI_MI2S_TX", NULL,
|
SND_SOC_DAPM_AIF_OUT("PRI_MI2S_TX", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
|
|
||||||
SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_RX_0", NULL,
|
SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_RX_0", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_RX_1", NULL,
|
SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_RX_1", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_RX_2", NULL,
|
SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_RX_2", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_RX_3", NULL,
|
SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_RX_3", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_RX_4", NULL,
|
SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_RX_4", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_RX_5", NULL,
|
SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_RX_5", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_RX_6", NULL,
|
SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_RX_6", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_RX_7", NULL,
|
SND_SOC_DAPM_AIF_IN("PRIMARY_TDM_RX_7", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_TX_0", NULL,
|
SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_TX_0", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_TX_1", NULL,
|
SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_TX_1", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_TX_2", NULL,
|
SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_TX_2", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_TX_3", NULL,
|
SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_TX_3", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_TX_4", NULL,
|
SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_TX_4", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_TX_5", NULL,
|
SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_TX_5", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_TX_6", NULL,
|
SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_TX_6", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_TX_7", NULL,
|
SND_SOC_DAPM_AIF_OUT("PRIMARY_TDM_TX_7", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
|
|
||||||
SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_0", NULL,
|
SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_0", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_1", NULL,
|
SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_1", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_2", NULL,
|
SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_2", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_3", NULL,
|
SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_3", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_4", NULL,
|
SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_4", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_5", NULL,
|
SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_5", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_6", NULL,
|
SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_6", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_7", NULL,
|
SND_SOC_DAPM_AIF_IN("SEC_TDM_RX_7", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_0", NULL,
|
SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_0", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_1", NULL,
|
SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_1", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_2", NULL,
|
SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_2", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_3", NULL,
|
SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_3", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_4", NULL,
|
SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_4", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_5", NULL,
|
SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_5", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_6", NULL,
|
SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_6", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_7", NULL,
|
SND_SOC_DAPM_AIF_OUT("SEC_TDM_TX_7", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
|
|
||||||
SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_0", NULL,
|
SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_0", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_1", NULL,
|
SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_1", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_2", NULL,
|
SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_2", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_3", NULL,
|
SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_3", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_4", NULL,
|
SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_4", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_5", NULL,
|
SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_5", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_6", NULL,
|
SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_6", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_7", NULL,
|
SND_SOC_DAPM_AIF_IN("TERT_TDM_RX_7", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_0", NULL,
|
SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_0", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_1", NULL,
|
SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_1", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_2", NULL,
|
SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_2", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_3", NULL,
|
SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_3", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_4", NULL,
|
SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_4", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_5", NULL,
|
SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_5", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_6", NULL,
|
SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_6", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_7", NULL,
|
SND_SOC_DAPM_AIF_OUT("TERT_TDM_TX_7", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
|
|
||||||
SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_0", NULL,
|
SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_0", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_1", NULL,
|
SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_1", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_2", NULL,
|
SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_2", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_3", NULL,
|
SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_3", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_4", NULL,
|
SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_4", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_5", NULL,
|
SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_5", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_6", NULL,
|
SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_6", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_7", NULL,
|
SND_SOC_DAPM_AIF_IN("QUAT_TDM_RX_7", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_0", NULL,
|
SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_0", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_1", NULL,
|
SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_1", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_2", NULL,
|
SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_2", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_3", NULL,
|
SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_3", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_4", NULL,
|
SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_4", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_5", NULL,
|
SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_5", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_6", NULL,
|
SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_6", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_7", NULL,
|
SND_SOC_DAPM_AIF_OUT("QUAT_TDM_TX_7", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
|
|
||||||
SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_0", NULL,
|
SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_0", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_1", NULL,
|
SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_1", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_2", NULL,
|
SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_2", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_3", NULL,
|
SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_3", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_4", NULL,
|
SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_4", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_5", NULL,
|
SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_5", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_6", NULL,
|
SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_6", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_7", NULL,
|
SND_SOC_DAPM_AIF_IN("QUIN_TDM_RX_7", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_0", NULL,
|
SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_0", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_1", NULL,
|
SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_1", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_2", NULL,
|
SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_2", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_3", NULL,
|
SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_3", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_4", NULL,
|
SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_4", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_5", NULL,
|
SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_5", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_6", NULL,
|
SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_6", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_7", NULL,
|
SND_SOC_DAPM_AIF_OUT("QUIN_TDM_TX_7", NULL,
|
||||||
0, 0, 0, 0),
|
0, SND_SOC_NOPM, 0, 0),
|
||||||
SND_SOC_DAPM_AIF_OUT("DISPLAY_PORT_RX", "NULL", 0, 0, 0, 0),
|
SND_SOC_DAPM_AIF_OUT("DISPLAY_PORT_RX", "NULL", 0, SND_SOC_NOPM, 0, 0),
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct snd_soc_component_driver q6afe_dai_component = {
|
static const struct snd_soc_component_driver q6afe_dai_component = {
|
||||||
|
|
|
@ -973,6 +973,20 @@ static int msm_routing_probe(struct snd_soc_component *c)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static unsigned int q6routing_reg_read(struct snd_soc_component *component,
|
||||||
|
unsigned int reg)
|
||||||
|
{
|
||||||
|
/* default value */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int q6routing_reg_write(struct snd_soc_component *component,
|
||||||
|
unsigned int reg, unsigned int val)
|
||||||
|
{
|
||||||
|
/* dummy */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static const struct snd_soc_component_driver msm_soc_routing_component = {
|
static const struct snd_soc_component_driver msm_soc_routing_component = {
|
||||||
.probe = msm_routing_probe,
|
.probe = msm_routing_probe,
|
||||||
.name = DRV_NAME,
|
.name = DRV_NAME,
|
||||||
|
@ -981,6 +995,8 @@ static const struct snd_soc_component_driver msm_soc_routing_component = {
|
||||||
.num_dapm_widgets = ARRAY_SIZE(msm_qdsp6_widgets),
|
.num_dapm_widgets = ARRAY_SIZE(msm_qdsp6_widgets),
|
||||||
.dapm_routes = intercon,
|
.dapm_routes = intercon,
|
||||||
.num_dapm_routes = ARRAY_SIZE(intercon),
|
.num_dapm_routes = ARRAY_SIZE(intercon),
|
||||||
|
.read = q6routing_reg_read,
|
||||||
|
.write = q6routing_reg_write,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int q6pcm_routing_probe(struct platform_device *pdev)
|
static int q6pcm_routing_probe(struct platform_device *pdev)
|
||||||
|
|
|
@ -406,7 +406,7 @@ static unsigned int soc_component_read_no_lock(
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
soc_component_ret(component, ret);
|
return soc_component_ret(component, ret);
|
||||||
|
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,7 +71,7 @@ static int tegra186_dspk_put_control(struct snd_kcontrol *kcontrol,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tegra186_dspk_runtime_suspend(struct device *dev)
|
static int __maybe_unused tegra186_dspk_runtime_suspend(struct device *dev)
|
||||||
{
|
{
|
||||||
struct tegra186_dspk *dspk = dev_get_drvdata(dev);
|
struct tegra186_dspk *dspk = dev_get_drvdata(dev);
|
||||||
|
|
||||||
|
@ -83,7 +83,7 @@ static int tegra186_dspk_runtime_suspend(struct device *dev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tegra186_dspk_runtime_resume(struct device *dev)
|
static int __maybe_unused tegra186_dspk_runtime_resume(struct device *dev)
|
||||||
{
|
{
|
||||||
struct tegra186_dspk *dspk = dev_get_drvdata(dev);
|
struct tegra186_dspk *dspk = dev_get_drvdata(dev);
|
||||||
int err;
|
int err;
|
||||||
|
|
|
@ -219,7 +219,7 @@ static const struct regmap_config tegra186_admaif_regmap_config = {
|
||||||
.cache_type = REGCACHE_FLAT,
|
.cache_type = REGCACHE_FLAT,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int tegra_admaif_runtime_suspend(struct device *dev)
|
static int __maybe_unused tegra_admaif_runtime_suspend(struct device *dev)
|
||||||
{
|
{
|
||||||
struct tegra_admaif *admaif = dev_get_drvdata(dev);
|
struct tegra_admaif *admaif = dev_get_drvdata(dev);
|
||||||
|
|
||||||
|
@ -229,7 +229,7 @@ static int tegra_admaif_runtime_suspend(struct device *dev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tegra_admaif_runtime_resume(struct device *dev)
|
static int __maybe_unused tegra_admaif_runtime_resume(struct device *dev)
|
||||||
{
|
{
|
||||||
struct tegra_admaif *admaif = dev_get_drvdata(dev);
|
struct tegra_admaif *admaif = dev_get_drvdata(dev);
|
||||||
|
|
||||||
|
|
|
@ -564,7 +564,7 @@ static const struct of_device_id tegra_ahub_of_match[] = {
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(of, tegra_ahub_of_match);
|
MODULE_DEVICE_TABLE(of, tegra_ahub_of_match);
|
||||||
|
|
||||||
static int tegra_ahub_runtime_suspend(struct device *dev)
|
static int __maybe_unused tegra_ahub_runtime_suspend(struct device *dev)
|
||||||
{
|
{
|
||||||
struct tegra_ahub *ahub = dev_get_drvdata(dev);
|
struct tegra_ahub *ahub = dev_get_drvdata(dev);
|
||||||
|
|
||||||
|
@ -576,7 +576,7 @@ static int tegra_ahub_runtime_suspend(struct device *dev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tegra_ahub_runtime_resume(struct device *dev)
|
static int __maybe_unused tegra_ahub_runtime_resume(struct device *dev)
|
||||||
{
|
{
|
||||||
struct tegra_ahub *ahub = dev_get_drvdata(dev);
|
struct tegra_ahub *ahub = dev_get_drvdata(dev);
|
||||||
int err;
|
int err;
|
||||||
|
|
|
@ -40,7 +40,7 @@ static const struct reg_default tegra210_dmic_reg_defaults[] = {
|
||||||
{ TEGRA210_DMIC_LP_BIQUAD_1_COEF_4, 0x0 },
|
{ TEGRA210_DMIC_LP_BIQUAD_1_COEF_4, 0x0 },
|
||||||
};
|
};
|
||||||
|
|
||||||
static int tegra210_dmic_runtime_suspend(struct device *dev)
|
static int __maybe_unused tegra210_dmic_runtime_suspend(struct device *dev)
|
||||||
{
|
{
|
||||||
struct tegra210_dmic *dmic = dev_get_drvdata(dev);
|
struct tegra210_dmic *dmic = dev_get_drvdata(dev);
|
||||||
|
|
||||||
|
@ -52,7 +52,7 @@ static int tegra210_dmic_runtime_suspend(struct device *dev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tegra210_dmic_runtime_resume(struct device *dev)
|
static int __maybe_unused tegra210_dmic_runtime_resume(struct device *dev)
|
||||||
{
|
{
|
||||||
struct tegra210_dmic *dmic = dev_get_drvdata(dev);
|
struct tegra210_dmic *dmic = dev_get_drvdata(dev);
|
||||||
int err;
|
int err;
|
||||||
|
|
|
@ -164,7 +164,7 @@ static int tegra210_i2s_init(struct snd_soc_dapm_widget *w,
|
||||||
return tegra210_i2s_sw_reset(compnt, is_playback);
|
return tegra210_i2s_sw_reset(compnt, is_playback);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tegra210_i2s_runtime_suspend(struct device *dev)
|
static int __maybe_unused tegra210_i2s_runtime_suspend(struct device *dev)
|
||||||
{
|
{
|
||||||
struct tegra210_i2s *i2s = dev_get_drvdata(dev);
|
struct tegra210_i2s *i2s = dev_get_drvdata(dev);
|
||||||
|
|
||||||
|
@ -176,7 +176,7 @@ static int tegra210_i2s_runtime_suspend(struct device *dev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tegra210_i2s_runtime_resume(struct device *dev)
|
static int __maybe_unused tegra210_i2s_runtime_resume(struct device *dev)
|
||||||
{
|
{
|
||||||
struct tegra210_i2s *i2s = dev_get_drvdata(dev);
|
struct tegra210_i2s *i2s = dev_get_drvdata(dev);
|
||||||
int err;
|
int err;
|
||||||
|
|
|
@ -2371,7 +2371,7 @@ static int build_audio_procunit(struct mixer_build *state, int unitid,
|
||||||
int num_ins;
|
int num_ins;
|
||||||
struct usb_mixer_elem_info *cval;
|
struct usb_mixer_elem_info *cval;
|
||||||
struct snd_kcontrol *kctl;
|
struct snd_kcontrol *kctl;
|
||||||
int i, err, nameid, type, len;
|
int i, err, nameid, type, len, val;
|
||||||
const struct procunit_info *info;
|
const struct procunit_info *info;
|
||||||
const struct procunit_value_info *valinfo;
|
const struct procunit_value_info *valinfo;
|
||||||
const struct usbmix_name_map *map;
|
const struct usbmix_name_map *map;
|
||||||
|
@ -2474,6 +2474,12 @@ static int build_audio_procunit(struct mixer_build *state, int unitid,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err = get_cur_ctl_value(cval, cval->control << 8, &val);
|
||||||
|
if (err < 0) {
|
||||||
|
usb_mixer_elem_info_free(cval);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
kctl = snd_ctl_new1(&mixer_procunit_ctl, cval);
|
kctl = snd_ctl_new1(&mixer_procunit_ctl, cval);
|
||||||
if (!kctl) {
|
if (!kctl) {
|
||||||
usb_mixer_elem_info_free(cval);
|
usb_mixer_elem_info_free(cval);
|
||||||
|
|
|
@ -2678,6 +2678,10 @@ YAMAHA_DEVICE(0x7010, "UB99"),
|
||||||
.ifnum = QUIRK_ANY_INTERFACE,
|
.ifnum = QUIRK_ANY_INTERFACE,
|
||||||
.type = QUIRK_COMPOSITE,
|
.type = QUIRK_COMPOSITE,
|
||||||
.data = (const struct snd_usb_audio_quirk[]) {
|
.data = (const struct snd_usb_audio_quirk[]) {
|
||||||
|
{
|
||||||
|
.ifnum = 0,
|
||||||
|
.type = QUIRK_AUDIO_STANDARD_MIXER,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.ifnum = 0,
|
.ifnum = 0,
|
||||||
.type = QUIRK_AUDIO_FIXED_ENDPOINT,
|
.type = QUIRK_AUDIO_FIXED_ENDPOINT,
|
||||||
|
@ -2690,6 +2694,32 @@ YAMAHA_DEVICE(0x7010, "UB99"),
|
||||||
.attributes = UAC_EP_CS_ATTR_SAMPLE_RATE,
|
.attributes = UAC_EP_CS_ATTR_SAMPLE_RATE,
|
||||||
.endpoint = 0x01,
|
.endpoint = 0x01,
|
||||||
.ep_attr = USB_ENDPOINT_XFER_ISOC,
|
.ep_attr = USB_ENDPOINT_XFER_ISOC,
|
||||||
|
.datainterval = 1,
|
||||||
|
.maxpacksize = 0x024c,
|
||||||
|
.rates = SNDRV_PCM_RATE_44100 |
|
||||||
|
SNDRV_PCM_RATE_48000,
|
||||||
|
.rate_min = 44100,
|
||||||
|
.rate_max = 48000,
|
||||||
|
.nr_rates = 2,
|
||||||
|
.rate_table = (unsigned int[]) {
|
||||||
|
44100, 48000
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.ifnum = 0,
|
||||||
|
.type = QUIRK_AUDIO_FIXED_ENDPOINT,
|
||||||
|
.data = &(const struct audioformat) {
|
||||||
|
.formats = SNDRV_PCM_FMTBIT_S24_3LE,
|
||||||
|
.channels = 2,
|
||||||
|
.iface = 0,
|
||||||
|
.altsetting = 1,
|
||||||
|
.altset_idx = 1,
|
||||||
|
.attributes = 0,
|
||||||
|
.endpoint = 0x82,
|
||||||
|
.ep_attr = USB_ENDPOINT_XFER_ISOC,
|
||||||
|
.datainterval = 1,
|
||||||
|
.maxpacksize = 0x0126,
|
||||||
.rates = SNDRV_PCM_RATE_44100 |
|
.rates = SNDRV_PCM_RATE_44100 |
|
||||||
SNDRV_PCM_RATE_48000,
|
SNDRV_PCM_RATE_48000,
|
||||||
.rate_min = 44100,
|
.rate_min = 44100,
|
||||||
|
@ -3714,8 +3744,8 @@ ALC1220_VB_DESKTOP(0x26ce, 0x0a01), /* Asrock TRX40 Creator */
|
||||||
* they pretend to be 96kHz mono as a workaround for stereo being broken
|
* they pretend to be 96kHz mono as a workaround for stereo being broken
|
||||||
* by that...
|
* by that...
|
||||||
*
|
*
|
||||||
* They also have swapped L-R channels, but that's for userspace to deal
|
* They also have an issue with initial stream alignment that causes the
|
||||||
* with.
|
* channels to be swapped and out of phase, which is dealt with in quirks.c.
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
.match_flags = USB_DEVICE_ID_MATCH_DEVICE |
|
.match_flags = USB_DEVICE_ID_MATCH_DEVICE |
|
||||||
|
|
Loading…
Reference in New Issue