Commit 73d75ba9 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'sound-fix-3.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound

Pull sound fixes from Takashi Iwai:
 "Two peaks in diffstat are for the audio EQ init of IDT codecs and the
  EMU2004 usb mixer addition, both of which are pretty device-specific,
  so safe to apply.  The rest are a bunch of small fixes, most of them
  are regression fixes"

* tag 'sound-fix-3.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (26 commits)
  ALSA: hda - load EQ params into IDT codec on HP bNB13 systems
  ASoC: cs42l52: Correct MIC CTL mask
  ASoC: wm8962: Turn on regcache_cache_only before disabling regulator
  ALSA: jack: Unregister input device at disconnection
  ALSA: pcsp: Fix the order of input device unregistration
  ASoC: fsl: imx-pcm-fiq: omit fiq counter to avoid harm in unbalanced situations
  ASoC: blackfin: Fix missing break
  ALSA: usb-audio: add front jack channel selector for EMU0204
  ALSA: hda - Don't clear the power state at snd_hda_codec_reset()
  ASoC: arizona: Fix typo in name of EQ coefficient controls
  ALSA: hda - Control EAPD for Master volume on Lenovo N100
  ALSA: hda - Don't turn off EAPD for headphone on Lenovo N100
  ALSA: isa: not allocating enough space
  ALSA: snd-aoa: two copy and paste bugs
  ASoC: wm8997: Correct typo in ISRC mux routes
  ALSA: hda - Check keep_eapd_on before inv_eapd
  ALSA: hda - Fix Line Out automute on Realtek multifunction jacks
  ALSA: msnd: Avoid duplicated driver name
  ALSA: compress_core: don't return -EBADFD from poll if paused
  ALSA: hda - hdmi: Fix wrong baseline length in ATI/AMD generated ELD
  ...
parents 71f777ed abfe69dd
...@@ -644,7 +644,7 @@ static int n##_control_put(struct snd_kcontrol *kcontrol, \ ...@@ -644,7 +644,7 @@ static int n##_control_put(struct snd_kcontrol *kcontrol, \
struct snd_ctl_elem_value *ucontrol) \ struct snd_ctl_elem_value *ucontrol) \
{ \ { \
struct gpio_runtime *gpio = snd_kcontrol_chip(kcontrol); \ struct gpio_runtime *gpio = snd_kcontrol_chip(kcontrol); \
if (gpio->methods && gpio->methods->get_##n) \ if (gpio->methods && gpio->methods->set_##n) \
gpio->methods->set_##n(gpio, \ gpio->methods->set_##n(gpio, \
!!ucontrol->value.integer.value[0]); \ !!ucontrol->value.integer.value[0]); \
return 1; \ return 1; \
...@@ -1135,7 +1135,7 @@ static int aoa_fabric_layout_resume(struct soundbus_dev *sdev) ...@@ -1135,7 +1135,7 @@ static int aoa_fabric_layout_resume(struct soundbus_dev *sdev)
{ {
struct layout_dev *ldev = dev_get_drvdata(&sdev->ofdev.dev); struct layout_dev *ldev = dev_get_drvdata(&sdev->ofdev.dev);
if (ldev->gpio.methods && ldev->gpio.methods->all_amps_off) if (ldev->gpio.methods && ldev->gpio.methods->all_amps_restore)
ldev->gpio.methods->all_amps_restore(&ldev->gpio); ldev->gpio.methods->all_amps_restore(&ldev->gpio);
return 0; return 0;
......
...@@ -384,8 +384,7 @@ static unsigned int snd_compr_poll(struct file *f, poll_table *wait) ...@@ -384,8 +384,7 @@ static unsigned int snd_compr_poll(struct file *f, poll_table *wait)
return -EFAULT; return -EFAULT;
mutex_lock(&stream->device->lock); mutex_lock(&stream->device->lock);
if (stream->runtime->state == SNDRV_PCM_STATE_PAUSED || if (stream->runtime->state == SNDRV_PCM_STATE_OPEN) {
stream->runtime->state == SNDRV_PCM_STATE_OPEN) {
retval = -EBADFD; retval = -EBADFD;
goto out; goto out;
} }
......
...@@ -34,12 +34,12 @@ static int jack_switch_types[SND_JACK_SWITCH_TYPES] = { ...@@ -34,12 +34,12 @@ static int jack_switch_types[SND_JACK_SWITCH_TYPES] = {
SW_LINEIN_INSERT, SW_LINEIN_INSERT,
}; };
static int snd_jack_dev_free(struct snd_device *device) static int snd_jack_dev_disconnect(struct snd_device *device)
{ {
struct snd_jack *jack = device->device_data; struct snd_jack *jack = device->device_data;
if (jack->private_free) if (!jack->input_dev)
jack->private_free(jack); return 0;
/* If the input device is registered with the input subsystem /* If the input device is registered with the input subsystem
* then we need to use a different deallocator. */ * then we need to use a different deallocator. */
...@@ -47,6 +47,18 @@ static int snd_jack_dev_free(struct snd_device *device) ...@@ -47,6 +47,18 @@ static int snd_jack_dev_free(struct snd_device *device)
input_unregister_device(jack->input_dev); input_unregister_device(jack->input_dev);
else else
input_free_device(jack->input_dev); input_free_device(jack->input_dev);
jack->input_dev = NULL;
return 0;
}
static int snd_jack_dev_free(struct snd_device *device)
{
struct snd_jack *jack = device->device_data;
if (jack->private_free)
jack->private_free(jack);
snd_jack_dev_disconnect(device);
kfree(jack->id); kfree(jack->id);
kfree(jack); kfree(jack);
...@@ -110,6 +122,7 @@ int snd_jack_new(struct snd_card *card, const char *id, int type, ...@@ -110,6 +122,7 @@ int snd_jack_new(struct snd_card *card, const char *id, int type,
static struct snd_device_ops ops = { static struct snd_device_ops ops = {
.dev_free = snd_jack_dev_free, .dev_free = snd_jack_dev_free,
.dev_register = snd_jack_dev_register, .dev_register = snd_jack_dev_register,
.dev_disconnect = snd_jack_dev_disconnect,
}; };
jack = kzalloc(sizeof(struct snd_jack), GFP_KERNEL); jack = kzalloc(sizeof(struct snd_jack), GFP_KERNEL);
......
...@@ -188,8 +188,8 @@ static int pcsp_probe(struct platform_device *dev) ...@@ -188,8 +188,8 @@ static int pcsp_probe(struct platform_device *dev)
static int pcsp_remove(struct platform_device *dev) static int pcsp_remove(struct platform_device *dev)
{ {
struct snd_pcsp *chip = platform_get_drvdata(dev); struct snd_pcsp *chip = platform_get_drvdata(dev);
alsa_card_pcsp_exit(chip);
pcspkr_input_remove(chip->input_dev); pcspkr_input_remove(chip->input_dev);
alsa_card_pcsp_exit(chip);
return 0; return 0;
} }
......
...@@ -73,9 +73,11 @@ ...@@ -73,9 +73,11 @@
#ifdef MSND_CLASSIC #ifdef MSND_CLASSIC
# include "msnd_classic.h" # include "msnd_classic.h"
# define LOGNAME "msnd_classic" # define LOGNAME "msnd_classic"
# define DEV_NAME "msnd-classic"
#else #else
# include "msnd_pinnacle.h" # include "msnd_pinnacle.h"
# define LOGNAME "snd_msnd_pinnacle" # define LOGNAME "snd_msnd_pinnacle"
# define DEV_NAME "msnd-pinnacle"
#endif #endif
static void set_default_audio_parameters(struct snd_msnd *chip) static void set_default_audio_parameters(struct snd_msnd *chip)
...@@ -1067,8 +1069,6 @@ static int snd_msnd_isa_remove(struct device *pdev, unsigned int dev) ...@@ -1067,8 +1069,6 @@ static int snd_msnd_isa_remove(struct device *pdev, unsigned int dev)
return 0; return 0;
} }
#define DEV_NAME "msnd-pinnacle"
static struct isa_driver snd_msnd_driver = { static struct isa_driver snd_msnd_driver = {
.match = snd_msnd_isa_match, .match = snd_msnd_isa_match,
.probe = snd_msnd_isa_probe, .probe = snd_msnd_isa_probe,
......
...@@ -1196,7 +1196,7 @@ wavefront_send_multisample (snd_wavefront_t *dev, wavefront_patch_info *header) ...@@ -1196,7 +1196,7 @@ wavefront_send_multisample (snd_wavefront_t *dev, wavefront_patch_info *header)
int num_samples; int num_samples;
unsigned char *msample_hdr; unsigned char *msample_hdr;
msample_hdr = kmalloc(sizeof(WF_MSAMPLE_BYTES), GFP_KERNEL); msample_hdr = kmalloc(WF_MSAMPLE_BYTES, GFP_KERNEL);
if (! msample_hdr) if (! msample_hdr)
return -ENOMEM; return -ENOMEM;
......
...@@ -2579,9 +2579,6 @@ int snd_hda_codec_reset(struct hda_codec *codec) ...@@ -2579,9 +2579,6 @@ int snd_hda_codec_reset(struct hda_codec *codec)
cancel_delayed_work_sync(&codec->jackpoll_work); cancel_delayed_work_sync(&codec->jackpoll_work);
#ifdef CONFIG_PM #ifdef CONFIG_PM
cancel_delayed_work_sync(&codec->power_work); cancel_delayed_work_sync(&codec->power_work);
codec->power_on = 0;
codec->power_transition = 0;
codec->power_jiffies = jiffies;
flush_workqueue(bus->workq); flush_workqueue(bus->workq);
#endif #endif
snd_hda_ctls_clear(codec); snd_hda_ctls_clear(codec);
......
...@@ -680,7 +680,7 @@ int snd_hdmi_get_eld_ati(struct hda_codec *codec, hda_nid_t nid, ...@@ -680,7 +680,7 @@ int snd_hdmi_get_eld_ati(struct hda_codec *codec, hda_nid_t nid,
spkalloc = snd_hda_codec_read(codec, nid, 0, ATI_VERB_GET_SPEAKER_ALLOCATION, 0); spkalloc = snd_hda_codec_read(codec, nid, 0, ATI_VERB_GET_SPEAKER_ALLOCATION, 0);
if (!spkalloc) { if (spkalloc <= 0) {
snd_printd(KERN_INFO "HDMI ATI/AMD: no speaker allocation for ELD\n"); snd_printd(KERN_INFO "HDMI ATI/AMD: no speaker allocation for ELD\n");
return -EINVAL; return -EINVAL;
} }
...@@ -742,6 +742,9 @@ int snd_hdmi_get_eld_ati(struct hda_codec *codec, hda_nid_t nid, ...@@ -742,6 +742,9 @@ int snd_hdmi_get_eld_ati(struct hda_codec *codec, hda_nid_t nid,
snd_hda_codec_write(codec, nid, 0, ATI_VERB_SET_AUDIO_DESCRIPTOR, i << 3); snd_hda_codec_write(codec, nid, 0, ATI_VERB_SET_AUDIO_DESCRIPTOR, i << 3);
ati_sad = snd_hda_codec_read(codec, nid, 0, ATI_VERB_GET_AUDIO_DESCRIPTOR, 0); ati_sad = snd_hda_codec_read(codec, nid, 0, ATI_VERB_GET_AUDIO_DESCRIPTOR, 0);
if (ati_sad <= 0)
continue;
if (ati_sad & ATI_AUDIODESC_RATES) { if (ati_sad & ATI_AUDIODESC_RATES) {
/* format is supported, copy SAD as-is */ /* format is supported, copy SAD as-is */
buf[pos++] = (ati_sad & 0x0000ff) >> 0; buf[pos++] = (ati_sad & 0x0000ff) >> 0;
...@@ -765,21 +768,39 @@ int snd_hdmi_get_eld_ati(struct hda_codec *codec, hda_nid_t nid, ...@@ -765,21 +768,39 @@ int snd_hdmi_get_eld_ati(struct hda_codec *codec, hda_nid_t nid,
return -EINVAL; return -EINVAL;
} }
/*
* HDMI VSDB latency format:
* separately for both audio and video:
* 0 field not valid or unknown latency
* [1..251] msecs = (x-1)*2 (max 500ms with x = 251 = 0xfb)
* 255 audio/video not supported
*
* HDA latency format:
* single value indicating video latency relative to audio:
* 0 unknown or 0ms
* [1..250] msecs = x*2 (max 500ms with x = 250 = 0xfa)
* [251..255] reserved
*/
aud_synch = snd_hda_codec_read(codec, nid, 0, ATI_VERB_GET_AUDIO_VIDEO_DELAY, 0); aud_synch = snd_hda_codec_read(codec, nid, 0, ATI_VERB_GET_AUDIO_VIDEO_DELAY, 0);
if ((aud_synch & ATI_DELAY_VIDEO_LATENCY) && (aud_synch & ATI_DELAY_AUDIO_LATENCY)) { if ((aud_synch & ATI_DELAY_VIDEO_LATENCY) && (aud_synch & ATI_DELAY_AUDIO_LATENCY)) {
int video_latency = (aud_synch & ATI_DELAY_VIDEO_LATENCY) - 1; int video_latency_hdmi = (aud_synch & ATI_DELAY_VIDEO_LATENCY);
int audio_latency = ((aud_synch & ATI_DELAY_AUDIO_LATENCY) >> 8) - 1; int audio_latency_hdmi = (aud_synch & ATI_DELAY_AUDIO_LATENCY) >> 8;
if (video_latency > audio_latency) if (video_latency_hdmi <= 0xfb && audio_latency_hdmi <= 0xfb &&
buf[6] = min(video_latency - audio_latency, 0xfa); video_latency_hdmi > audio_latency_hdmi)
buf[6] = video_latency_hdmi - audio_latency_hdmi;
/* else unknown/invalid or 0ms or video ahead of audio, so use zero */
} }
/* Baseline length */
buf[2] = pos - 4;
/* SAD count */ /* SAD count */
buf[5] |= ((pos - ELD_FIXED_BYTES - sink_desc_len) / 3) << 4; buf[5] |= ((pos - ELD_FIXED_BYTES - sink_desc_len) / 3) << 4;
/* Baseline ELD block length is 4-byte aligned */
pos = round_up(pos, 4);
/* Baseline ELD length (4-byte header is not counted in) */
buf[2] = (pos - 4) / 4;
*eld_size = pos; *eld_size = pos;
return 0; return 0;
......
...@@ -796,10 +796,10 @@ static void set_pin_eapd(struct hda_codec *codec, hda_nid_t pin, bool enable) ...@@ -796,10 +796,10 @@ static void set_pin_eapd(struct hda_codec *codec, hda_nid_t pin, bool enable)
if (spec->own_eapd_ctl || if (spec->own_eapd_ctl ||
!(snd_hda_query_pin_caps(codec, pin) & AC_PINCAP_EAPD)) !(snd_hda_query_pin_caps(codec, pin) & AC_PINCAP_EAPD))
return; return;
if (codec->inv_eapd)
enable = !enable;
if (spec->keep_eapd_on && !enable) if (spec->keep_eapd_on && !enable)
return; return;
if (codec->inv_eapd)
enable = !enable;
snd_hda_codec_update_cache(codec, pin, 0, snd_hda_codec_update_cache(codec, pin, 0,
AC_VERB_SET_EAPD_BTLENABLE, AC_VERB_SET_EAPD_BTLENABLE,
enable ? 0x02 : 0x00); enable ? 0x02 : 0x00);
......
...@@ -139,6 +139,18 @@ static int ad198x_suspend(struct hda_codec *codec) ...@@ -139,6 +139,18 @@ static int ad198x_suspend(struct hda_codec *codec)
} }
#endif #endif
/* follow EAPD via vmaster hook */
static void ad_vmaster_eapd_hook(void *private_data, int enabled)
{
struct hda_codec *codec = private_data;
struct ad198x_spec *spec = codec->spec;
if (!spec->eapd_nid)
return;
snd_hda_codec_update_cache(codec, spec->eapd_nid, 0,
AC_VERB_SET_EAPD_BTLENABLE,
enabled ? 0x02 : 0x00);
}
/* /*
* Automatic parse of I/O pins from the BIOS configuration * Automatic parse of I/O pins from the BIOS configuration
...@@ -219,8 +231,14 @@ static int alloc_ad_spec(struct hda_codec *codec) ...@@ -219,8 +231,14 @@ static int alloc_ad_spec(struct hda_codec *codec)
static void ad_fixup_inv_jack_detect(struct hda_codec *codec, static void ad_fixup_inv_jack_detect(struct hda_codec *codec,
const struct hda_fixup *fix, int action) const struct hda_fixup *fix, int action)
{ {
if (action == HDA_FIXUP_ACT_PRE_PROBE) struct ad198x_spec *spec = codec->spec;
if (action == HDA_FIXUP_ACT_PRE_PROBE) {
codec->inv_jack_detect = 1; codec->inv_jack_detect = 1;
spec->gen.keep_eapd_on = 1;
spec->gen.vmaster_mute.hook = ad_vmaster_eapd_hook;
spec->eapd_nid = 0x1b;
}
} }
enum { enum {
...@@ -465,19 +483,6 @@ static int patch_ad1983(struct hda_codec *codec) ...@@ -465,19 +483,6 @@ static int patch_ad1983(struct hda_codec *codec)
* AD1981 HD specific * AD1981 HD specific
*/ */
/* follow EAPD via vmaster hook */
static void ad_vmaster_eapd_hook(void *private_data, int enabled)
{
struct hda_codec *codec = private_data;
struct ad198x_spec *spec = codec->spec;
if (!spec->eapd_nid)
return;
snd_hda_codec_update_cache(codec, spec->eapd_nid, 0,
AC_VERB_SET_EAPD_BTLENABLE,
enabled ? 0x02 : 0x00);
}
static void ad1981_fixup_hp_eapd(struct hda_codec *codec, static void ad1981_fixup_hp_eapd(struct hda_codec *codec,
const struct hda_fixup *fix, int action) const struct hda_fixup *fix, int action)
{ {
......
...@@ -47,6 +47,10 @@ struct cs_spec { ...@@ -47,6 +47,10 @@ struct cs_spec {
unsigned int spdif_present:1; unsigned int spdif_present:1;
unsigned int sense_b:1; unsigned int sense_b:1;
hda_nid_t vendor_nid; hda_nid_t vendor_nid;
/* for MBP SPDIF control */
int (*spdif_sw_put)(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol);
}; };
/* available models with CS420x */ /* available models with CS420x */
...@@ -331,10 +335,21 @@ static int cs_init(struct hda_codec *codec) ...@@ -331,10 +335,21 @@ static int cs_init(struct hda_codec *codec)
return 0; return 0;
} }
static int cs_build_controls(struct hda_codec *codec)
{
int err;
err = snd_hda_gen_build_controls(codec);
if (err < 0)
return err;
snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_BUILD);
return 0;
}
#define cs_free snd_hda_gen_free #define cs_free snd_hda_gen_free
static const struct hda_codec_ops cs_patch_ops = { static const struct hda_codec_ops cs_patch_ops = {
.build_controls = snd_hda_gen_build_controls, .build_controls = cs_build_controls,
.build_pcms = snd_hda_gen_build_pcms, .build_pcms = snd_hda_gen_build_pcms,
.init = cs_init, .init = cs_init,
.free = cs_free, .free = cs_free,
...@@ -599,12 +614,14 @@ static int patch_cs420x(struct hda_codec *codec) ...@@ -599,12 +614,14 @@ static int patch_cs420x(struct hda_codec *codec)
enum { enum {
CS4208_MAC_AUTO, CS4208_MAC_AUTO,
CS4208_MBA6, CS4208_MBA6,
CS4208_MBP11,
CS4208_GPIO0, CS4208_GPIO0,
}; };
static const struct hda_model_fixup cs4208_models[] = { static const struct hda_model_fixup cs4208_models[] = {
{ .id = CS4208_GPIO0, .name = "gpio0" }, { .id = CS4208_GPIO0, .name = "gpio0" },
{ .id = CS4208_MBA6, .name = "mba6" }, { .id = CS4208_MBA6, .name = "mba6" },
{ .id = CS4208_MBP11, .name = "mbp11" },
{} {}
}; };
...@@ -615,6 +632,7 @@ static const struct snd_pci_quirk cs4208_fixup_tbl[] = { ...@@ -615,6 +632,7 @@ static const struct snd_pci_quirk cs4208_fixup_tbl[] = {
/* codec SSID matching */ /* codec SSID matching */
static const struct snd_pci_quirk cs4208_mac_fixup_tbl[] = { static const struct snd_pci_quirk cs4208_mac_fixup_tbl[] = {
SND_PCI_QUIRK(0x106b, 0x5e00, "MacBookPro 11,2", CS4208_MBP11),
SND_PCI_QUIRK(0x106b, 0x7100, "MacBookAir 6,1", CS4208_MBA6), SND_PCI_QUIRK(0x106b, 0x7100, "MacBookAir 6,1", CS4208_MBA6),
SND_PCI_QUIRK(0x106b, 0x7200, "MacBookAir 6,2", CS4208_MBA6), SND_PCI_QUIRK(0x106b, 0x7200, "MacBookAir 6,2", CS4208_MBA6),
{} /* terminator */ {} /* terminator */
...@@ -646,6 +664,36 @@ static void cs4208_fixup_mac(struct hda_codec *codec, ...@@ -646,6 +664,36 @@ static void cs4208_fixup_mac(struct hda_codec *codec,
snd_hda_apply_fixup(codec, action); snd_hda_apply_fixup(codec, action);
} }
static int cs4208_spdif_sw_put(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
struct cs_spec *spec = codec->spec;
hda_nid_t pin = spec->gen.autocfg.dig_out_pins[0];
int pinctl = ucontrol->value.integer.value[0] ? PIN_OUT : 0;
snd_hda_set_pin_ctl_cache(codec, pin, pinctl);
return spec->spdif_sw_put(kcontrol, ucontrol);
}
/* hook the SPDIF switch */
static void cs4208_fixup_spdif_switch(struct hda_codec *codec,
const struct hda_fixup *fix, int action)
{
if (action == HDA_FIXUP_ACT_BUILD) {
struct cs_spec *spec = codec->spec;
struct snd_kcontrol *kctl;
if (!spec->gen.autocfg.dig_out_pins[0])
return;
kctl = snd_hda_find_mixer_ctl(codec, "IEC958 Playback Switch");
if (!kctl)
return;
spec->spdif_sw_put = kctl->put;
kctl->put = cs4208_spdif_sw_put;
}
}
static const struct hda_fixup cs4208_fixups[] = { static const struct hda_fixup cs4208_fixups[] = {
[CS4208_MBA6] = { [CS4208_MBA6] = {
.type = HDA_FIXUP_PINS, .type = HDA_FIXUP_PINS,
...@@ -653,6 +701,12 @@ static const struct hda_fixup cs4208_fixups[] = { ...@@ -653,6 +701,12 @@ static const struct hda_fixup cs4208_fixups[] = {
.chained = true, .chained = true,
.chain_id = CS4208_GPIO0, .chain_id = CS4208_GPIO0,
}, },
[CS4208_MBP11] = {
.type = HDA_FIXUP_FUNC,
.v.func = cs4208_fixup_spdif_switch,
.chained = true,
.chain_id = CS4208_GPIO0,
},
[CS4208_GPIO0] = { [CS4208_GPIO0] = {
.type = HDA_FIXUP_FUNC, .type = HDA_FIXUP_FUNC,
.v.func = cs4208_fixup_gpio0, .v.func = cs4208_fixup_gpio0,
......
...@@ -763,12 +763,12 @@ static struct channel_map_table map_tables[] = { ...@@ -763,12 +763,12 @@ static struct channel_map_table map_tables[] = {
{ SNDRV_CHMAP_RC, RC }, { SNDRV_CHMAP_RC, RC },
{ SNDRV_CHMAP_FLC, FLC }, { SNDRV_CHMAP_FLC, FLC },
{ SNDRV_CHMAP_FRC, FRC }, { SNDRV_CHMAP_FRC, FRC },
{ SNDRV_CHMAP_FLH, FLH }, { SNDRV_CHMAP_TFL, FLH },
{ SNDRV_CHMAP_FRH, FRH }, { SNDRV_CHMAP_TFR, FRH },
{ SNDRV_CHMAP_FLW, FLW }, { SNDRV_CHMAP_FLW, FLW },
{ SNDRV_CHMAP_FRW, FRW }, { SNDRV_CHMAP_FRW, FRW },
{ SNDRV_CHMAP_TC, TC }, { SNDRV_CHMAP_TC, TC },
{ SNDRV_CHMAP_FCH, FCH }, { SNDRV_CHMAP_TFC, FCH },
{} /* terminator */ {} /* terminator */
}; };
...@@ -1247,6 +1247,9 @@ static int hdmi_pin_hbr_setup(struct hda_codec *codec, hda_nid_t pin_nid, ...@@ -1247,6 +1247,9 @@ static int hdmi_pin_hbr_setup(struct hda_codec *codec, hda_nid_t pin_nid,
pinctl = snd_hda_codec_read(codec, pin_nid, 0, pinctl = snd_hda_codec_read(codec, pin_nid, 0,
AC_VERB_GET_PIN_WIDGET_CONTROL, 0); AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
if (pinctl < 0)
return hbr ? -EINVAL : 0;
new_pinctl = pinctl & ~AC_PINCTL_EPT; new_pinctl = pinctl & ~AC_PINCTL_EPT;
if (hbr) if (hbr)
new_pinctl |= AC_PINCTL_EPT_HBR; new_pinctl |= AC_PINCTL_EPT_HBR;
...@@ -3091,7 +3094,7 @@ static int atihdmi_pin_hbr_setup(struct hda_codec *codec, hda_nid_t pin_nid, ...@@ -3091,7 +3094,7 @@ static int atihdmi_pin_hbr_setup(struct hda_codec *codec, hda_nid_t pin_nid,
int hbr_ctl, hbr_ctl_new; int hbr_ctl, hbr_ctl_new;
hbr_ctl = snd_hda_codec_read(codec, pin_nid, 0, ATI_VERB_GET_HBR_CONTROL, 0); hbr_ctl = snd_hda_codec_read(codec, pin_nid, 0, ATI_VERB_GET_HBR_CONTROL, 0);
if (hbr_ctl & ATI_HBR_CAPABLE) { if (hbr_ctl >= 0 && (hbr_ctl & ATI_HBR_CAPABLE)) {
if (hbr) if (hbr)
hbr_ctl_new = hbr_ctl | ATI_HBR_ENABLE; hbr_ctl_new = hbr_ctl | ATI_HBR_ENABLE;
else else
......
...@@ -3344,8 +3344,10 @@ static void alc_update_headset_mode(struct hda_codec *codec) ...@@ -3344,8 +3344,10 @@ static void alc_update_headset_mode(struct hda_codec *codec)
else else
new_headset_mode = ALC_HEADSET_MODE_HEADPHONE; new_headset_mode = ALC_HEADSET_MODE_HEADPHONE;
if (new_headset_mode == spec->current_headset_mode) if (new_headset_mode == spec->current_headset_mode) {
snd_hda_gen_update_outputs(codec);
return; return;
}
switch (new_headset_mode) { switch (new_headset_mode) {
case ALC_HEADSET_MODE_UNPLUGGED: case ALC_HEADSET_MODE_UNPLUGGED:
......
This diff is collapsed.
...@@ -121,6 +121,7 @@ static int bf5xx_i2s_hw_params(struct snd_pcm_substream *substream, ...@@ -121,6 +121,7 @@ static int bf5xx_i2s_hw_params(struct snd_pcm_substream *substream,
bf5xx_i2s->tcr2 |= 7; bf5xx_i2s->tcr2 |= 7;
bf5xx_i2s->rcr2 |= 7; bf5xx_i2s->rcr2 |= 7;
sport_handle->wdsize = 1; sport_handle->wdsize = 1;
break;
case SNDRV_PCM_FORMAT_S16_LE: case SNDRV_PCM_FORMAT_S16_LE:
bf5xx_i2s->tcr2 |= 15; bf5xx_i2s->tcr2 |= 15;
bf5xx_i2s->rcr2 |= 15; bf5xx_i2s->rcr2 |= 15;
......
...@@ -179,7 +179,7 @@ ...@@ -179,7 +179,7 @@
#define CS42L52_MICB_CTL 0x11 #define CS42L52_MICB_CTL 0x11
#define CS42L52_MIC_CTL_MIC_SEL_MASK 0xBF #define CS42L52_MIC_CTL_MIC_SEL_MASK 0xBF
#define CS42L52_MIC_CTL_MIC_SEL_SHIFT 6 #define CS42L52_MIC_CTL_MIC_SEL_SHIFT 6
#define CS42L52_MIC_CTL_TYPE_MASK 0xDF #define CS42L52_MIC_CTL_TYPE_MASK 0x20
#define CS42L52_MIC_CTL_TYPE_SHIFT 5 #define CS42L52_MIC_CTL_TYPE_SHIFT 5
......
...@@ -685,13 +685,13 @@ ARIZONA_MIXER_CONTROLS("EQ2", ARIZONA_EQ2MIX_INPUT_1_SOURCE), ...@@ -685,13 +685,13 @@ ARIZONA_MIXER_CONTROLS("EQ2", ARIZONA_EQ2MIX_INPUT_1_SOURCE),
ARIZONA_MIXER_CONTROLS("EQ3", ARIZONA_EQ3MIX_INPUT_1_SOURCE), ARIZONA_MIXER_CONTROLS("EQ3", ARIZONA_EQ3MIX_INPUT_1_SOURCE),
ARIZONA_MIXER_CONTROLS("EQ4", ARIZONA_EQ4MIX_INPUT_1_SOURCE), ARIZONA_MIXER_CONTROLS("EQ4", ARIZONA_EQ4MIX_INPUT_1_SOURCE),
SND_SOC_BYTES_MASK("EQ1 Coefficeints", ARIZONA_EQ1_1, 21, SND_SOC_BYTES_MASK("EQ1 Coefficients", ARIZONA_EQ1_1, 21,
ARIZONA_EQ1_ENA_MASK), ARIZONA_EQ1_ENA_MASK),
SND_SOC_BYTES_MASK("EQ2 Coefficeints", ARIZONA_EQ2_1, 21, SND_SOC_BYTES_MASK("EQ2 Coefficients", ARIZONA_EQ2_1, 21,
ARIZONA_EQ2_ENA_MASK), ARIZONA_EQ2_ENA_MASK),
SND_SOC_BYTES_MASK("EQ3 Coefficeints", ARIZONA_EQ3_1, 21, SND_SOC_BYTES_MASK("EQ3 Coefficients", ARIZONA_EQ3_1, 21,
ARIZONA_EQ3_ENA_MASK), ARIZONA_EQ3_ENA_MASK),
SND_SOC_BYTES_MASK("EQ4 Coefficeints", ARIZONA_EQ4_1, 21, SND_SOC_BYTES_MASK("EQ4 Coefficients", ARIZONA_EQ4_1, 21,
ARIZONA_EQ4_ENA_MASK), ARIZONA_EQ4_ENA_MASK),
SOC_SINGLE_TLV("EQ1 B1 Volume", ARIZONA_EQ1_1, ARIZONA_EQ1_B1_GAIN_SHIFT, SOC_SINGLE_TLV("EQ1 B1 Volume", ARIZONA_EQ1_1, ARIZONA_EQ1_B1_GAIN_SHIFT,
......
...@@ -101,13 +101,13 @@ ARIZONA_MIXER_CONTROLS("EQ2", ARIZONA_EQ2MIX_INPUT_1_SOURCE), ...@@ -101,13 +101,13 @@ ARIZONA_MIXER_CONTROLS("EQ2", ARIZONA_EQ2MIX_INPUT_1_SOURCE),
ARIZONA_MIXER_CONTROLS("EQ3", ARIZONA_EQ3MIX_INPUT_1_SOURCE), ARIZONA_MIXER_CONTROLS("EQ3", ARIZONA_EQ3MIX_INPUT_1_SOURCE),
ARIZONA_MIXER_CONTROLS("EQ4", ARIZONA_EQ4MIX_INPUT_1_SOURCE), ARIZONA_MIXER_CONTROLS("EQ4", ARIZONA_EQ4MIX_INPUT_1_SOURCE),
SND_SOC_BYTES_MASK("EQ1 Coefficeints", ARIZONA_EQ1_1, 21, SND_SOC_BYTES_MASK("EQ1 Coefficients", ARIZONA_EQ1_1, 21,
ARIZONA_EQ1_ENA_MASK), ARIZONA_EQ1_ENA_MASK),
SND_SOC_BYTES_MASK("EQ2 Coefficeints", ARIZONA_EQ2_1, 21, SND_SOC_BYTES_MASK("EQ2 Coefficients", ARIZONA_EQ2_1, 21,
ARIZONA_EQ2_ENA_MASK), ARIZONA_EQ2_ENA_MASK),
SND_SOC_BYTES_MASK("EQ3 Coefficeints", ARIZONA_EQ3_1, 21, SND_SOC_BYTES_MASK("EQ3 Coefficients", ARIZONA_EQ3_1, 21,
ARIZONA_EQ3_ENA_MASK), ARIZONA_EQ3_ENA_MASK),
SND_SOC_BYTES_MASK("EQ4 Coefficeints", ARIZONA_EQ4_1, 21, SND_SOC_BYTES_MASK("EQ4 Coefficients", ARIZONA_EQ4_1, 21,
ARIZONA_EQ4_ENA_MASK), ARIZONA_EQ4_ENA_MASK),
SOC_SINGLE_TLV("EQ1 B1 Volume", ARIZONA_EQ1_1, ARIZONA_EQ1_B1_GAIN_SHIFT, SOC_SINGLE_TLV("EQ1 B1 Volume", ARIZONA_EQ1_1, ARIZONA_EQ1_B1_GAIN_SHIFT,
......
...@@ -3728,6 +3728,8 @@ static int wm8962_i2c_probe(struct i2c_client *i2c, ...@@ -3728,6 +3728,8 @@ static int wm8962_i2c_probe(struct i2c_client *i2c,
if (ret < 0) if (ret < 0)
goto err_enable; goto err_enable;
regcache_cache_only(wm8962->regmap, true);
/* The drivers should power up as needed */ /* The drivers should power up as needed */
regulator_bulk_disable(ARRAY_SIZE(wm8962->supplies), wm8962->supplies); regulator_bulk_disable(ARRAY_SIZE(wm8962->supplies), wm8962->supplies);
......
...@@ -170,13 +170,13 @@ ARIZONA_MIXER_CONTROLS("EQ2", ARIZONA_EQ2MIX_INPUT_1_SOURCE), ...@@ -170,13 +170,13 @@ ARIZONA_MIXER_CONTROLS("EQ2", ARIZONA_EQ2MIX_INPUT_1_SOURCE),
ARIZONA_MIXER_CONTROLS("EQ3", ARIZONA_EQ3MIX_INPUT_1_SOURCE), ARIZONA_MIXER_CONTROLS("EQ3", ARIZONA_EQ3MIX_INPUT_1_SOURCE),
ARIZONA_MIXER_CONTROLS("EQ4", ARIZONA_EQ4MIX_INPUT_1_SOURCE), ARIZONA_MIXER_CONTROLS("EQ4", ARIZONA_EQ4MIX_INPUT_1_SOURCE),
SND_SOC_BYTES_MASK("EQ1 Coefficeints", ARIZONA_EQ1_1, 21, SND_SOC_BYTES_MASK("EQ1 Coefficients", ARIZONA_EQ1_1, 21,
ARIZONA_EQ1_ENA_MASK), ARIZONA_EQ1_ENA_MASK),
SND_SOC_BYTES_MASK("EQ2 Coefficeints", ARIZONA_EQ2_1, 21, SND_SOC_BYTES_MASK("EQ2 Coefficients", ARIZONA_EQ2_1, 21,
ARIZONA_EQ2_ENA_MASK), ARIZONA_EQ2_ENA_MASK),
SND_SOC_BYTES_MASK("EQ3 Coefficeints", ARIZONA_EQ3_1, 21, SND_SOC_BYTES_MASK("EQ3 Coefficients", ARIZONA_EQ3_1, 21,
ARIZONA_EQ3_ENA_MASK), ARIZONA_EQ3_ENA_MASK),
SND_SOC_BYTES_MASK("EQ4 Coefficeints", ARIZONA_EQ4_1, 21, SND_SOC_BYTES_MASK("EQ4 Coefficients", ARIZONA_EQ4_1, 21,
ARIZONA_EQ4_ENA_MASK), ARIZONA_EQ4_ENA_MASK),
SOC_SINGLE_TLV("EQ1 B1 Volume", ARIZONA_EQ1_1, ARIZONA_EQ1_B1_GAIN_SHIFT, SOC_SINGLE_TLV("EQ1 B1 Volume", ARIZONA_EQ1_1, ARIZONA_EQ1_B1_GAIN_SHIFT,
...@@ -887,7 +887,7 @@ static const struct snd_soc_dapm_route wm8997_dapm_routes[] = { ...@@ -887,7 +887,7 @@ static const struct snd_soc_dapm_route wm8997_dapm_routes[] = {
ARIZONA_MIXER_ROUTES("Mic Mute Mixer", "Mic"), ARIZONA_MIXER_ROUTES("Mic Mute Mixer", "Mic"),
ARIZONA_MUX_ROUTES("ISRC1INT1", "ISRC1INT1"), ARIZONA_MUX_ROUTES("ISRC1INT1", "ISRC1INT1"),
ARIZONA_MUX_ROUTES("ISRC1INT2", "ISRC2INT2"), ARIZONA_MUX_ROUTES("ISRC1INT2", "ISRC1INT2"),
ARIZONA_MUX_ROUTES("ISRC1DEC1", "ISRC1DEC1"), ARIZONA_MUX_ROUTES("ISRC1DEC1", "ISRC1DEC1"),
ARIZONA_MUX_ROUTES("ISRC1DEC2", "ISRC1DEC2"), ARIZONA_MUX_ROUTES("ISRC1DEC2", "ISRC1DEC2"),
......
...@@ -42,7 +42,8 @@ struct imx_pcm_runtime_data { ...@@ -42,7 +42,8 @@ struct imx_pcm_runtime_data {
struct hrtimer hrt; struct hrtimer hrt;
int poll_time_ns; int poll_time_ns;
struct snd_pcm_substream *substream; struct snd_pcm_substream *substream;
atomic_t running; atomic_t playing;
atomic_t capturing;
}; };
static enum hrtimer_restart snd_hrtimer_callback(struct hrtimer *hrt) static enum hrtimer_restart snd_hrtimer_callback(struct hrtimer *hrt)
...@@ -52,7 +53,7 @@ static enum hrtimer_restart snd_hrtimer_callback(struct hrtimer *hrt) ...@@ -52,7 +53,7 @@ static enum hrtimer_restart snd_hrtimer_callback(struct hrtimer *hrt)
struct snd_pcm_substream *substream = iprtd->substream; struct snd_pcm_substream *substream = iprtd->substream;
struct pt_regs regs; struct pt_regs regs;
if (!atomic_read(&iprtd->running)) if (!atomic_read(&iprtd->playing) && !atomic_read(&iprtd->capturing))
return HRTIMER_NORESTART; return HRTIMER_NORESTART;
get_fiq_regs(&regs); get_fiq_regs(&regs);
...@@ -106,7 +107,6 @@ static int snd_imx_pcm_prepare(struct snd_pcm_substream *substream) ...@@ -106,7 +107,6 @@ static int snd_imx_pcm_prepare(struct snd_pcm_substream *substream)
return 0; return 0;
} }
static int fiq_enable;
static int imx_pcm_fiq; static int imx_pcm_fiq;
static int snd_imx_pcm_trigger(struct snd_pcm_substream *substream, int cmd) static int snd_imx_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
...@@ -118,23 +118,27 @@ static int snd_imx_pcm_trigger(struct snd_pcm_substream *substream, int cmd) ...@@ -118,23 +118,27 @@ static int snd_imx_pcm_trigger(struct snd_pcm_substream *substream, int 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:
atomic_set(&iprtd->running, 1); if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
atomic_set(&iprtd->playing, 1);
else
atomic_set(&iprtd->capturing, 1);
hrtimer_start(&iprtd->hrt, ns_to_ktime(iprtd->poll_time_ns), hrtimer_start(&iprtd->hrt, ns_to_ktime(iprtd->poll_time_ns),
HRTIMER_MODE_REL); HRTIMER_MODE_REL);
if (++fiq_enable == 1) enable_fiq(imx_pcm_fiq);
enable_fiq(imx_pcm_fiq);
break; break;
case SNDRV_PCM_TRIGGER_STOP: case SNDRV_PCM_TRIGGER_STOP:
case SNDRV_PCM_TRIGGER_SUSPEND: case SNDRV_PCM_TRIGGER_SUSPEND:
case SNDRV_PCM_TRIGGER_PAUSE_PUSH: case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
atomic_set(&iprtd->running, 0); if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
atomic_set(&iprtd->playing, 0);
if (--fiq_enable == 0) else
atomic_set(&iprtd->capturing, 0);
if (!atomic_read(&iprtd->playing) &&
!atomic_read(&iprtd->capturing))
disable_fiq(imx_pcm_fiq); disable_fiq(imx_pcm_fiq);
break; break;
default: default:
return -EINVAL; return -EINVAL;
} }
...@@ -182,7 +186,8 @@ static int snd_imx_open(struct snd_pcm_substream *substream) ...@@ -182,7 +186,8 @@ static int snd_imx_open(struct snd_pcm_substream *substream)
iprtd->substream = substream; iprtd->substream = substream;
atomic_set(&iprtd->running, 0); atomic_set(&iprtd->playing, 0);
atomic_set(&iprtd->capturing, 0);
hrtimer_init(&iprtd->hrt, CLOCK_MONOTONIC, HRTIMER_MODE_REL); hrtimer_init(&iprtd->hrt, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
iprtd->hrt.function = snd_hrtimer_callback; iprtd->hrt.function = snd_hrtimer_callback;
......
...@@ -907,19 +907,24 @@ static int snd_cs4231_playback_prepare(struct snd_pcm_substream *substream) ...@@ -907,19 +907,24 @@ static int snd_cs4231_playback_prepare(struct snd_pcm_substream *substream)
struct snd_cs4231 *chip = snd_pcm_substream_chip(substream); struct snd_cs4231 *chip = snd_pcm_substream_chip(substream);
struct snd_pcm_runtime *runtime = substream->runtime; struct snd_pcm_runtime *runtime = substream->runtime;
unsigned long flags; unsigned long flags;
int ret = 0;
spin_lock_irqsave(&chip->lock, flags); spin_lock_irqsave(&chip->lock, flags);
chip->image[CS4231_IFACE_CTRL] &= ~(CS4231_PLAYBACK_ENABLE | chip->image[CS4231_IFACE_CTRL] &= ~(CS4231_PLAYBACK_ENABLE |
CS4231_PLAYBACK_PIO); CS4231_PLAYBACK_PIO);
if (WARN_ON(runtime->period_size > 0xffff + 1)) if (WARN_ON(runtime->period_size > 0xffff + 1)) {
return -EINVAL; ret = -EINVAL;
goto out;
}
chip->p_periods_sent = 0; chip->p_periods_sent = 0;
out:
spin_unlock_irqrestore(&chip->lock, flags); spin_unlock_irqrestore(&chip->lock, flags);
return 0; return ret;
} }
static int snd_cs4231_capture_hw_params(struct snd_pcm_substream *substream, static int snd_cs4231_capture_hw_params(struct snd_pcm_substream *substream,
......
...@@ -433,6 +433,89 @@ static void snd_audigy2nx_proc_read(struct snd_info_entry *entry, ...@@ -433,6 +433,89 @@ static void snd_audigy2nx_proc_read(struct snd_info_entry *entry,
} }
} }
/* EMU0204 */
static int snd_emu0204_ch_switch_info(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_info *uinfo)
{
static const char *texts[2] = {"1/2",
"3/4"
};
uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
uinfo->count = 1;
uinfo->value.enumerated.items = 2;
if (uinfo->value.enumerated.item > 1)
uinfo->value.enumerated.item = 1;
strcpy(uinfo->value.enumerated.name,
texts[uinfo->value.enumerated.item]);
return 0;
}
static int snd_emu0204_ch_switch_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
ucontrol->value.enumerated.item[0] = kcontrol->private_value;
return 0;
}
static int snd_emu0204_ch_switch_put(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct usb_mixer_interface *mixer = snd_kcontrol_chip(kcontrol);
unsigned int value = ucontrol->value.enumerated.item[0];
int err, changed;
unsigned char buf[2];
if (value > 1)
return -EINVAL;
buf[0] = 0x01;
buf[1] = value ? 0x02 : 0x01;
changed = value != kcontrol->private_value;
down_read(&mixer->chip->shutdown_rwsem);
if (mixer->chip->shutdown) {
err = -ENODEV;
goto out;
}
err = snd_usb_ctl_msg(mixer->chip->dev,
usb_sndctrlpipe(mixer->chip->dev, 0), UAC_SET_CUR,
USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
0x0400, 0x0e00, buf, 2);
out:
up_read(&mixer->chip->shutdown_rwsem);
if (err < 0)
return err;
kcontrol->private_value = value;
return changed;
}
static struct snd_kcontrol_new snd_emu0204_controls[] = {
{
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
.name = "Front Jack Channels",
.info = snd_emu0204_ch_switch_info,
.get = snd_emu0204_ch_switch_get,
.put = snd_emu0204_ch_switch_put,
.private_value = 0,
},
};
static int snd_emu0204_controls_create(struct usb_mixer_interface *mixer)
{
int i, err;
for (i = 0; i < ARRAY_SIZE(snd_emu0204_controls); ++i) {
err = snd_ctl_add(mixer->chip->card,
snd_ctl_new1(&snd_emu0204_controls[i], mixer));
if (err < 0)
return err;
}
return 0;
}
/* ASUS Xonar U1 / U3 controls */ /* ASUS Xonar U1 / U3 controls */
static int snd_xonar_u1_switch_get(struct snd_kcontrol *kcontrol, static int snd_xonar_u1_switch_get(struct snd_kcontrol *kcontrol,
...@@ -1545,6 +1628,13 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer) ...@@ -1545,6 +1628,13 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
snd_audigy2nx_proc_read); snd_audigy2nx_proc_read);
break; break;
/* EMU0204 */
case USB_ID(0x041e, 0x3f19):
err = snd_emu0204_controls_create(mixer);
if (err < 0)
break;
break;
case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */ case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C400 */ case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C400 */
err = snd_c400_create_mixer(mixer); err = snd_c400_create_mixer(mixer);
......
...@@ -273,8 +273,8 @@ static struct snd_pcm_chmap_elem *convert_chmap(int channels, unsigned int bits, ...@@ -273,8 +273,8 @@ static struct snd_pcm_chmap_elem *convert_chmap(int channels, unsigned int bits,
SNDRV_CHMAP_TSL, /* top side left */ SNDRV_CHMAP_TSL, /* top side left */
SNDRV_CHMAP_TSR, /* top side right */ SNDRV_CHMAP_TSR, /* top side right */
SNDRV_CHMAP_BC, /* bottom center */ SNDRV_CHMAP_BC, /* bottom center */
SNDRV_CHMAP_BLC, /* bottom left center */ SNDRV_CHMAP_RLC, /* back left of center */
SNDRV_CHMAP_BRC, /* bottom right center */ SNDRV_CHMAP_RRC, /* back right of center */
0 /* terminator */ 0 /* terminator */
}; };
struct snd_pcm_chmap_elem *chmap; struct snd_pcm_chmap_elem *chmap;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment