Sound fixes for 3.6-rc3

This update became slightly bigger than usual for rc3, but most of the
 commits are small and trivial.  A large chunk is found for HD-audio
 ca0132 codec, which is mostly a clean up of the specific code, to make
 SPDIF working properly, and also in the new ASoC Arizona driver.
 
 One important fix is for usb-audio Oops fix since 3.5.  We still see
 some EHCI related bandwidth problem, but usb-audio should be more
 stabilized now.
 
 Other than that, a Kconfig fix is spread over files, and various
 HD-audio and ASoC fixes as usual, in addition to Julia's error path
 fixes.
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v2.0.19 (GNU/Linux)
 
 iQIcBAABAgAGBQJQM0KtAAoJEGwxgFQ9KSmkgvkP/ifTaAQAJcuR15G8wHf4awPn
 cy/S7M5I02MRFe2c4IltJiK/y21jSsYLNvq3ISlcVxWrBod4r9ee2/23y/1veI2Z
 MhNXjN5vU/gNN/Ll5GTg/8dKaVTOSp3GqKJrEUDWhld42IZFS2OZwF6Qdx/jqoSS
 eCDEBQnkGj5mxLGC53ZwWURLCBrj8gIaaLXcm3121+/MAM3y8o7HaU45pJCPMVRR
 QdvVCW7FoPQ+S/j4eozElcGuACJTNvJnUhfSk0oAUoiZHfb8UThpexdF4K8l1qNB
 9PP3Pc1X2Fu7Ta1HDFenY3eOqNEOUY1Kj3isxEj0QOZugRpHYsp0k4GakAyDd8Ik
 2xUQumwzuxLEkkoHOVLM3lwppnD15KKm67OXeykNiI1xqlXNiuyhCL/pZIkxluuQ
 dPyG3EP+8yyFIuB709oaGlrMcscPZcxUw2RMeWBGTEUY0ECnrz8pCQRseazcmBP6
 LcyVlT3IWsmsogFU1OLGhl7kpmV3KisAJcUPPNNaq7wYEFtRxfUo0w3oXrn8jGe3
 sPiUhDm6WULJDsQYa9kss1GzXJVsdkCzoPw9vMTb9x9cXFO5XYigY0Qf6ujtjdQy
 WAvOYnuTfa2DAS+YCCFG0rO1H8Fv7SamDKyP4jJpnV7WHbDNOveWjtAC6VMcb9EY
 v+ko6dxRohfjUbvgdLiS
 =d2Si
 -----END PGP SIGNATURE-----

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

Pull sound fixes from Takashi Iwai:
 "This update became slightly bigger than usual for rc3, but most of the
  commits are small and trivial.  A large chunk is found for HD-audio
  ca0132 codec, which is mostly a clean up of the specific code, to make
  SPDIF working properly, and also in the new ASoC Arizona driver.

  One important fix is for usb-audio Oops fix since 3.5.  We still see
  some EHCI related bandwidth problem, but usb-audio should be more
  stabilized now.

  Other than that, a Kconfig fix is spread over files, and various
  HD-audio and ASoC fixes as usual, in addition to Julia's error path
  fixes."

* tag 'sound-3.6' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (42 commits)
  ALSA: snd-als100: fix suspend/resume
  ALSA: hda - Fix leftover codec->power_transition
  ALSA: hda - don't create dysfunctional mixer controls for ca0132
  ALSA: sound/ppc/snd_ps3.c: fix error return code
  ALSA: sound/pci/rme9652/hdspm.c: fix error return code
  ALSA: sound/pci/sis7019.c: fix error return code
  ALSA: sound/pci/ctxfi/ctatc.c: fix error return code
  ALSA: sound/atmel/ac97c.c: fix error return code
  ALSA: sound/atmel/abdac.c: fix error return code
  ALSA: fix pcm.h kernel-doc warning and notation
  sound: oss/sb_audio: prevent divide by zero bug
  ASoC: wm9712: Fix inverted capture volume
  ASoC: wm9712: Fix microphone source selection
  ASoC: wm5102: Remove DRC2
  ALSA: hda - Don't send invalid volume knob command on IDT 92hd75bxx
  ALSA: usb-audio: Fix scheduling-while-atomic bug in PCM capture stream
  ALSA: lx6464es: Add a missing error check
  ALSA: hda - Fix 'Beep Playback Switch' with no underlying mute switch
  ASoC: jack: Always notify full jack status
  ASoC: wm5110: Add missing input PGA routes
  ...
This commit is contained in:
Linus Torvalds 2012-08-21 09:17:05 -07:00
commit 4459f3974a
40 changed files with 261 additions and 237 deletions

View file

@ -7670,23 +7670,28 @@ S: Supported
F: Documentation/hwmon/wm83?? F: Documentation/hwmon/wm83??
F: arch/arm/mach-s3c64xx/mach-crag6410* F: arch/arm/mach-s3c64xx/mach-crag6410*
F: drivers/clk/clk-wm83*.c F: drivers/clk/clk-wm83*.c
F: drivers/extcon/extcon-arizona.c
F: drivers/leds/leds-wm83*.c F: drivers/leds/leds-wm83*.c
F: drivers/gpio/gpio-*wm*.c F: drivers/gpio/gpio-*wm*.c
F: drivers/gpio/gpio-arizona.c
F: drivers/hwmon/wm83??-hwmon.c F: drivers/hwmon/wm83??-hwmon.c
F: drivers/input/misc/wm831x-on.c F: drivers/input/misc/wm831x-on.c
F: drivers/input/touchscreen/wm831x-ts.c F: drivers/input/touchscreen/wm831x-ts.c
F: drivers/input/touchscreen/wm97*.c F: drivers/input/touchscreen/wm97*.c
F: drivers/mfd/wm8*.c F: drivers/mfd/arizona*
F: drivers/mfd/wm*.c
F: drivers/power/wm83*.c F: drivers/power/wm83*.c
F: drivers/rtc/rtc-wm83*.c F: drivers/rtc/rtc-wm83*.c
F: drivers/regulator/wm8*.c F: drivers/regulator/wm8*.c
F: drivers/video/backlight/wm83*_bl.c F: drivers/video/backlight/wm83*_bl.c
F: drivers/watchdog/wm83*_wdt.c F: drivers/watchdog/wm83*_wdt.c
F: include/linux/mfd/arizona/
F: include/linux/mfd/wm831x/ F: include/linux/mfd/wm831x/
F: include/linux/mfd/wm8350/ F: include/linux/mfd/wm8350/
F: include/linux/mfd/wm8400* F: include/linux/mfd/wm8400*
F: include/linux/wm97xx.h F: include/linux/wm97xx.h
F: include/sound/wm????.h F: include/sound/wm????.h
F: sound/soc/codecs/arizona.?
F: sound/soc/codecs/wm* F: sound/soc/codecs/wm*
WORKQUEUE WORKQUEUE

View file

@ -1075,7 +1075,8 @@ static inline void snd_pcm_limit_isa_dma_size(int dma, size_t *max)
const char *snd_pcm_format_name(snd_pcm_format_t format); const char *snd_pcm_format_name(snd_pcm_format_t format);
/** /**
* Get a string naming the direction of a stream * snd_pcm_stream_str - Get a string naming the direction of a stream
* @substream: the pcm substream instance
*/ */
static inline const char *snd_pcm_stream_str(struct snd_pcm_substream *substream) static inline const char *snd_pcm_stream_str(struct snd_pcm_substream *substream)
{ {

View file

@ -106,7 +106,7 @@ static struct pxa2xx_pcm_client pxa2xx_ac97_pcm_client = {
.prepare = pxa2xx_ac97_pcm_prepare, .prepare = pxa2xx_ac97_pcm_prepare,
}; };
#ifdef CONFIG_PM #ifdef CONFIG_PM_SLEEP
static int pxa2xx_ac97_do_suspend(struct snd_card *card) static int pxa2xx_ac97_do_suspend(struct snd_card *card)
{ {
@ -243,7 +243,7 @@ static struct platform_driver pxa2xx_ac97_driver = {
.driver = { .driver = {
.name = "pxa2xx-ac97", .name = "pxa2xx-ac97",
.owner = THIS_MODULE, .owner = THIS_MODULE,
#ifdef CONFIG_PM #ifdef CONFIG_PM_SLEEP
.pm = &pxa2xx_ac97_pm_ops, .pm = &pxa2xx_ac97_pm_ops,
#endif #endif
}, },

View file

@ -452,6 +452,7 @@ static int __devinit atmel_abdac_probe(struct platform_device *pdev)
dac->regs = ioremap(regs->start, resource_size(regs)); dac->regs = ioremap(regs->start, resource_size(regs));
if (!dac->regs) { if (!dac->regs) {
dev_dbg(&pdev->dev, "could not remap register memory\n"); dev_dbg(&pdev->dev, "could not remap register memory\n");
retval = -ENOMEM;
goto out_free_card; goto out_free_card;
} }
@ -534,7 +535,7 @@ static int __devinit atmel_abdac_probe(struct platform_device *pdev)
return retval; return retval;
} }
#ifdef CONFIG_PM #ifdef CONFIG_PM_SLEEP
static int atmel_abdac_suspend(struct device *pdev) static int atmel_abdac_suspend(struct device *pdev)
{ {
struct snd_card *card = dev_get_drvdata(pdev); struct snd_card *card = dev_get_drvdata(pdev);

View file

@ -278,14 +278,9 @@ static int atmel_ac97c_capture_hw_params(struct snd_pcm_substream *substream,
if (retval < 0) if (retval < 0)
return retval; return retval;
/* snd_pcm_lib_malloc_pages returns 1 if buffer is changed. */ /* snd_pcm_lib_malloc_pages returns 1 if buffer is changed. */
if (cpu_is_at32ap7000()) { if (cpu_is_at32ap7000() && retval == 1)
if (retval < 0) if (test_and_clear_bit(DMA_RX_READY, &chip->flags))
return retval; dw_dma_cyclic_free(chip->dma.rx_chan);
/* snd_pcm_lib_malloc_pages returns 1 if buffer is changed. */
if (retval == 1)
if (test_and_clear_bit(DMA_RX_READY, &chip->flags))
dw_dma_cyclic_free(chip->dma.rx_chan);
}
/* Set restrictions to params. */ /* Set restrictions to params. */
mutex_lock(&opened_mutex); mutex_lock(&opened_mutex);
@ -980,6 +975,7 @@ static int __devinit atmel_ac97c_probe(struct platform_device *pdev)
if (!chip->regs) { if (!chip->regs) {
dev_dbg(&pdev->dev, "could not remap register memory\n"); dev_dbg(&pdev->dev, "could not remap register memory\n");
retval = -ENOMEM;
goto err_ioremap; goto err_ioremap;
} }
@ -1134,7 +1130,7 @@ static int __devinit atmel_ac97c_probe(struct platform_device *pdev)
return retval; return retval;
} }
#ifdef CONFIG_PM #ifdef CONFIG_PM_SLEEP
static int atmel_ac97c_suspend(struct device *pdev) static int atmel_ac97c_suspend(struct device *pdev)
{ {
struct snd_card *card = dev_get_drvdata(pdev); struct snd_card *card = dev_get_drvdata(pdev);

View file

@ -1176,7 +1176,7 @@ static int __devexit loopback_remove(struct platform_device *devptr)
return 0; return 0;
} }
#ifdef CONFIG_PM #ifdef CONFIG_PM_SLEEP
static int loopback_suspend(struct device *pdev) static int loopback_suspend(struct device *pdev)
{ {
struct snd_card *card = dev_get_drvdata(pdev); struct snd_card *card = dev_get_drvdata(pdev);

View file

@ -1064,7 +1064,7 @@ static int __devexit snd_dummy_remove(struct platform_device *devptr)
return 0; return 0;
} }
#ifdef CONFIG_PM #ifdef CONFIG_PM_SLEEP
static int snd_dummy_suspend(struct device *pdev) static int snd_dummy_suspend(struct device *pdev)
{ {
struct snd_card *card = dev_get_drvdata(pdev); struct snd_card *card = dev_get_drvdata(pdev);

View file

@ -199,7 +199,7 @@ static void pcsp_stop_beep(struct snd_pcsp *chip)
pcspkr_stop_sound(); pcspkr_stop_sound();
} }
#ifdef CONFIG_PM #ifdef CONFIG_PM_SLEEP
static int pcsp_suspend(struct device *dev) static int pcsp_suspend(struct device *dev)
{ {
struct snd_pcsp *chip = dev_get_drvdata(dev); struct snd_pcsp *chip = dev_get_drvdata(dev);
@ -212,7 +212,7 @@ static SIMPLE_DEV_PM_OPS(pcsp_pm, pcsp_suspend, NULL);
#define PCSP_PM_OPS &pcsp_pm #define PCSP_PM_OPS &pcsp_pm
#else #else
#define PCSP_PM_OPS NULL #define PCSP_PM_OPS NULL
#endif /* CONFIG_PM */ #endif /* CONFIG_PM_SLEEP */
static void pcsp_shutdown(struct platform_device *dev) static void pcsp_shutdown(struct platform_device *dev)
{ {

View file

@ -233,7 +233,7 @@ static int __devinit snd_card_als100_probe(int dev,
irq[dev], dma8[dev], dma16[dev]); irq[dev], dma8[dev], dma16[dev]);
} }
if ((error = snd_sb16dsp_pcm(chip, 0, NULL)) < 0) { if ((error = snd_sb16dsp_pcm(chip, 0, &chip->pcm)) < 0) {
snd_card_free(card); snd_card_free(card);
return error; return error;
} }

View file

@ -575,13 +575,15 @@ static int jazz16_audio_set_speed(int dev, int speed)
if (speed > 0) if (speed > 0)
{ {
int tmp; int tmp;
int s = speed * devc->channels; int s;
if (speed < 5000) if (speed < 5000)
speed = 5000; speed = 5000;
if (speed > 44100) if (speed > 44100)
speed = 44100; speed = 44100;
s = speed * devc->channels;
devc->tconst = (256 - ((1000000 + s / 2) / s)) & 0xff; devc->tconst = (256 - ((1000000 + s / 2) / s)) & 0xff;
tmp = 256 - devc->tconst; tmp = 256 - devc->tconst;

View file

@ -94,7 +94,7 @@ static unsigned short snd_cs46xx_codec_read(struct snd_cs46xx *chip,
if (snd_BUG_ON(codec_index != CS46XX_PRIMARY_CODEC_INDEX && if (snd_BUG_ON(codec_index != CS46XX_PRIMARY_CODEC_INDEX &&
codec_index != CS46XX_SECONDARY_CODEC_INDEX)) codec_index != CS46XX_SECONDARY_CODEC_INDEX))
return -EINVAL; return 0xffff;
chip->active_ctrl(chip, 1); chip->active_ctrl(chip, 1);

View file

@ -1725,8 +1725,10 @@ int __devinit ct_atc_create(struct snd_card *card, struct pci_dev *pci,
atc_connect_resources(atc); atc_connect_resources(atc);
atc->timer = ct_timer_new(atc); atc->timer = ct_timer_new(atc);
if (!atc->timer) if (!atc->timer) {
err = -ENOMEM;
goto error1; goto error1;
}
err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, atc, &ops); err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, atc, &ops);
if (err < 0) if (err < 0)

View file

@ -231,16 +231,22 @@ void snd_hda_detach_beep_device(struct hda_codec *codec)
} }
EXPORT_SYMBOL_HDA(snd_hda_detach_beep_device); EXPORT_SYMBOL_HDA(snd_hda_detach_beep_device);
static bool ctl_has_mute(struct snd_kcontrol *kcontrol)
{
struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
return query_amp_caps(codec, get_amp_nid(kcontrol),
get_amp_direction(kcontrol)) & AC_AMPCAP_MUTE;
}
/* get/put callbacks for beep mute mixer switches */ /* get/put callbacks for beep mute mixer switches */
int snd_hda_mixer_amp_switch_get_beep(struct snd_kcontrol *kcontrol, int snd_hda_mixer_amp_switch_get_beep(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol) struct snd_ctl_elem_value *ucontrol)
{ {
struct hda_codec *codec = snd_kcontrol_chip(kcontrol); struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
struct hda_beep *beep = codec->beep; struct hda_beep *beep = codec->beep;
if (beep) { if (beep && (!beep->enabled || !ctl_has_mute(kcontrol))) {
ucontrol->value.integer.value[0] = ucontrol->value.integer.value[0] =
ucontrol->value.integer.value[1] = ucontrol->value.integer.value[1] = beep->enabled;
beep->enabled;
return 0; return 0;
} }
return snd_hda_mixer_amp_switch_get(kcontrol, ucontrol); return snd_hda_mixer_amp_switch_get(kcontrol, ucontrol);
@ -252,9 +258,20 @@ int snd_hda_mixer_amp_switch_put_beep(struct snd_kcontrol *kcontrol,
{ {
struct hda_codec *codec = snd_kcontrol_chip(kcontrol); struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
struct hda_beep *beep = codec->beep; struct hda_beep *beep = codec->beep;
if (beep) if (beep) {
snd_hda_enable_beep_device(codec, u8 chs = get_amp_channels(kcontrol);
*ucontrol->value.integer.value); int enable = 0;
long *valp = ucontrol->value.integer.value;
if (chs & 1) {
enable |= *valp;
valp++;
}
if (chs & 2)
enable |= *valp;
snd_hda_enable_beep_device(codec, enable);
}
if (!ctl_has_mute(kcontrol))
return 0;
return snd_hda_mixer_amp_switch_put(kcontrol, ucontrol); return snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
} }
EXPORT_SYMBOL_HDA(snd_hda_mixer_amp_switch_put_beep); EXPORT_SYMBOL_HDA(snd_hda_mixer_amp_switch_put_beep);

View file

@ -1386,6 +1386,44 @@ int snd_hda_codec_configure(struct hda_codec *codec)
} }
EXPORT_SYMBOL_HDA(snd_hda_codec_configure); EXPORT_SYMBOL_HDA(snd_hda_codec_configure);
/* update the stream-id if changed */
static void update_pcm_stream_id(struct hda_codec *codec,
struct hda_cvt_setup *p, hda_nid_t nid,
u32 stream_tag, int channel_id)
{
unsigned int oldval, newval;
if (p->stream_tag != stream_tag || p->channel_id != channel_id) {
oldval = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONV, 0);
newval = (stream_tag << 4) | channel_id;
if (oldval != newval)
snd_hda_codec_write(codec, nid, 0,
AC_VERB_SET_CHANNEL_STREAMID,
newval);
p->stream_tag = stream_tag;
p->channel_id = channel_id;
}
}
/* update the format-id if changed */
static void update_pcm_format(struct hda_codec *codec, struct hda_cvt_setup *p,
hda_nid_t nid, int format)
{
unsigned int oldval;
if (p->format_id != format) {
oldval = snd_hda_codec_read(codec, nid, 0,
AC_VERB_GET_STREAM_FORMAT, 0);
if (oldval != format) {
msleep(1);
snd_hda_codec_write(codec, nid, 0,
AC_VERB_SET_STREAM_FORMAT,
format);
}
p->format_id = format;
}
}
/** /**
* snd_hda_codec_setup_stream - set up the codec for streaming * snd_hda_codec_setup_stream - set up the codec for streaming
* @codec: the CODEC to set up * @codec: the CODEC to set up
@ -1400,7 +1438,6 @@ void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid,
{ {
struct hda_codec *c; struct hda_codec *c;
struct hda_cvt_setup *p; struct hda_cvt_setup *p;
unsigned int oldval, newval;
int type; int type;
int i; int i;
@ -1413,29 +1450,13 @@ void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid,
p = get_hda_cvt_setup(codec, nid); p = get_hda_cvt_setup(codec, nid);
if (!p) if (!p)
return; return;
/* update the stream-id if changed */
if (p->stream_tag != stream_tag || p->channel_id != channel_id) { if (codec->pcm_format_first)
oldval = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONV, 0); update_pcm_format(codec, p, nid, format);
newval = (stream_tag << 4) | channel_id; update_pcm_stream_id(codec, p, nid, stream_tag, channel_id);
if (oldval != newval) if (!codec->pcm_format_first)
snd_hda_codec_write(codec, nid, 0, update_pcm_format(codec, p, nid, format);
AC_VERB_SET_CHANNEL_STREAMID,
newval);
p->stream_tag = stream_tag;
p->channel_id = channel_id;
}
/* update the format-id if changed */
if (p->format_id != format) {
oldval = snd_hda_codec_read(codec, nid, 0,
AC_VERB_GET_STREAM_FORMAT, 0);
if (oldval != format) {
msleep(1);
snd_hda_codec_write(codec, nid, 0,
AC_VERB_SET_STREAM_FORMAT,
format);
}
p->format_id = format;
}
p->active = 1; p->active = 1;
p->dirty = 0; p->dirty = 0;
@ -3497,7 +3518,7 @@ static bool snd_hda_codec_get_supported_ps(struct hda_codec *codec, hda_nid_t fg
{ {
int sup = snd_hda_param_read(codec, fg, AC_PAR_POWER_STATE); int sup = snd_hda_param_read(codec, fg, AC_PAR_POWER_STATE);
if (sup < 0) if (sup == -1)
return false; return false;
if (sup & power_state) if (sup & power_state)
return true; return true;
@ -4433,6 +4454,8 @@ static void __snd_hda_power_up(struct hda_codec *codec, bool wait_power_down)
* then there is no need to go through power up here. * then there is no need to go through power up here.
*/ */
if (codec->power_on) { if (codec->power_on) {
if (codec->power_transition < 0)
codec->power_transition = 0;
spin_unlock(&codec->power_lock); spin_unlock(&codec->power_lock);
return; return;
} }

View file

@ -861,6 +861,7 @@ struct hda_codec {
unsigned int no_trigger_sense:1; /* don't trigger at pin-sensing */ unsigned int no_trigger_sense:1; /* don't trigger at pin-sensing */
unsigned int ignore_misc_bit:1; /* ignore MISC_NO_PRESENCE bit */ unsigned int ignore_misc_bit:1; /* ignore MISC_NO_PRESENCE bit */
unsigned int no_jack_detect:1; /* Machine has no jack-detection */ unsigned int no_jack_detect:1; /* Machine has no jack-detection */
unsigned int pcm_format_first:1; /* PCM format must be set first */
#ifdef CONFIG_SND_HDA_POWER_SAVE #ifdef CONFIG_SND_HDA_POWER_SAVE
unsigned int power_on :1; /* current (global) power-state */ unsigned int power_on :1; /* current (global) power-state */
int power_transition; /* power-state in transition */ int power_transition; /* power-state in transition */

View file

@ -151,6 +151,7 @@ MODULE_SUPPORTED_DEVICE("{{Intel, ICH6},"
"{Intel, CPT}," "{Intel, CPT},"
"{Intel, PPT}," "{Intel, PPT},"
"{Intel, LPT}," "{Intel, LPT},"
"{Intel, LPT_LP},"
"{Intel, HPT}," "{Intel, HPT},"
"{Intel, PBG}," "{Intel, PBG},"
"{Intel, SCH}," "{Intel, SCH},"
@ -3270,6 +3271,14 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
{ PCI_DEVICE(0x8086, 0x8c20), { PCI_DEVICE(0x8086, 0x8c20),
.driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP | .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP |
AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_COMBO }, AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_COMBO },
/* Lynx Point-LP */
{ PCI_DEVICE(0x8086, 0x9c20),
.driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP |
AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_COMBO },
/* Lynx Point-LP */
{ PCI_DEVICE(0x8086, 0x9c21),
.driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP |
AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_COMBO },
/* Haswell */ /* Haswell */
{ PCI_DEVICE(0x8086, 0x0c0c), { PCI_DEVICE(0x8086, 0x0c0c),
.driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP | .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP |

View file

@ -412,7 +412,7 @@ static void print_digital_conv(struct snd_info_buffer *buffer,
if (digi1 & AC_DIG1_EMPHASIS) if (digi1 & AC_DIG1_EMPHASIS)
snd_iprintf(buffer, " Preemphasis"); snd_iprintf(buffer, " Preemphasis");
if (digi1 & AC_DIG1_COPYRIGHT) if (digi1 & AC_DIG1_COPYRIGHT)
snd_iprintf(buffer, " Copyright"); snd_iprintf(buffer, " Non-Copyright");
if (digi1 & AC_DIG1_NONAUDIO) if (digi1 & AC_DIG1_NONAUDIO)
snd_iprintf(buffer, " Non-Audio"); snd_iprintf(buffer, " Non-Audio");
if (digi1 & AC_DIG1_PROFESSIONAL) if (digi1 & AC_DIG1_PROFESSIONAL)

View file

@ -246,7 +246,7 @@ static void init_output(struct hda_codec *codec, hda_nid_t pin, hda_nid_t dac)
AC_VERB_SET_AMP_GAIN_MUTE, AC_VERB_SET_AMP_GAIN_MUTE,
AMP_OUT_UNMUTE); AMP_OUT_UNMUTE);
} }
if (dac) if (dac && (get_wcaps(codec, dac) & AC_WCAP_OUT_AMP))
snd_hda_codec_write(codec, dac, 0, snd_hda_codec_write(codec, dac, 0,
AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO); AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO);
} }
@ -261,7 +261,7 @@ static void init_input(struct hda_codec *codec, hda_nid_t pin, hda_nid_t adc)
AC_VERB_SET_AMP_GAIN_MUTE, AC_VERB_SET_AMP_GAIN_MUTE,
AMP_IN_UNMUTE(0)); AMP_IN_UNMUTE(0));
} }
if (adc) if (adc && (get_wcaps(codec, adc) & AC_WCAP_IN_AMP))
snd_hda_codec_write(codec, adc, 0, AC_VERB_SET_AMP_GAIN_MUTE, snd_hda_codec_write(codec, adc, 0, AC_VERB_SET_AMP_GAIN_MUTE,
AMP_IN_UNMUTE(0)); AMP_IN_UNMUTE(0));
} }
@ -275,6 +275,10 @@ static int _add_switch(struct hda_codec *codec, hda_nid_t nid, const char *pfx,
int type = dir ? HDA_INPUT : HDA_OUTPUT; int type = dir ? HDA_INPUT : HDA_OUTPUT;
struct snd_kcontrol_new knew = struct snd_kcontrol_new knew =
HDA_CODEC_MUTE_MONO(namestr, nid, chan, 0, type); HDA_CODEC_MUTE_MONO(namestr, nid, chan, 0, type);
if ((query_amp_caps(codec, nid, type) & AC_AMPCAP_MUTE) == 0) {
snd_printdd("Skipping '%s %s Switch' (no mute on node 0x%x)\n", pfx, dirstr[dir], nid);
return 0;
}
sprintf(namestr, "%s %s Switch", pfx, dirstr[dir]); sprintf(namestr, "%s %s Switch", pfx, dirstr[dir]);
return snd_hda_ctl_add(codec, nid, snd_ctl_new1(&knew, codec)); return snd_hda_ctl_add(codec, nid, snd_ctl_new1(&knew, codec));
} }
@ -286,6 +290,10 @@ static int _add_volume(struct hda_codec *codec, hda_nid_t nid, const char *pfx,
int type = dir ? HDA_INPUT : HDA_OUTPUT; int type = dir ? HDA_INPUT : HDA_OUTPUT;
struct snd_kcontrol_new knew = struct snd_kcontrol_new knew =
HDA_CODEC_VOLUME_MONO(namestr, nid, chan, 0, type); HDA_CODEC_VOLUME_MONO(namestr, nid, chan, 0, type);
if ((query_amp_caps(codec, nid, type) & AC_AMPCAP_NUM_STEPS) == 0) {
snd_printdd("Skipping '%s %s Volume' (no amp on node 0x%x)\n", pfx, dirstr[dir], nid);
return 0;
}
sprintf(namestr, "%s %s Volume", pfx, dirstr[dir]); sprintf(namestr, "%s %s Volume", pfx, dirstr[dir]);
return snd_hda_ctl_add(codec, nid, snd_ctl_new1(&knew, codec)); return snd_hda_ctl_add(codec, nid, snd_ctl_new1(&knew, codec));
} }
@ -463,51 +471,18 @@ static int chipio_read(struct hda_codec *codec,
return err; return err;
} }
/*
* PCM stuffs
*/
static void ca0132_setup_stream(struct hda_codec *codec, hda_nid_t nid,
u32 stream_tag,
int channel_id, int format)
{
unsigned int oldval, newval;
if (!nid)
return;
snd_printdd("ca0132_setup_stream: "
"NID=0x%x, stream=0x%x, channel=%d, format=0x%x\n",
nid, stream_tag, channel_id, format);
/* update the format-id if changed */
oldval = snd_hda_codec_read(codec, nid, 0,
AC_VERB_GET_STREAM_FORMAT,
0);
if (oldval != format) {
msleep(20);
snd_hda_codec_write(codec, nid, 0,
AC_VERB_SET_STREAM_FORMAT,
format);
}
oldval = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONV, 0);
newval = (stream_tag << 4) | channel_id;
if (oldval != newval) {
snd_hda_codec_write(codec, nid, 0,
AC_VERB_SET_CHANNEL_STREAMID,
newval);
}
}
static void ca0132_cleanup_stream(struct hda_codec *codec, hda_nid_t nid)
{
snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_STREAM_FORMAT, 0);
snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CHANNEL_STREAMID, 0);
}
/* /*
* PCM callbacks * PCM callbacks
*/ */
static int ca0132_playback_pcm_open(struct hda_pcm_stream *hinfo,
struct hda_codec *codec,
struct snd_pcm_substream *substream)
{
struct ca0132_spec *spec = codec->spec;
return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream,
hinfo);
}
static int ca0132_playback_pcm_prepare(struct hda_pcm_stream *hinfo, static int ca0132_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
struct hda_codec *codec, struct hda_codec *codec,
unsigned int stream_tag, unsigned int stream_tag,
@ -515,10 +490,8 @@ static int ca0132_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
struct snd_pcm_substream *substream) struct snd_pcm_substream *substream)
{ {
struct ca0132_spec *spec = codec->spec; struct ca0132_spec *spec = codec->spec;
return snd_hda_multi_out_analog_prepare(codec, &spec->multiout,
ca0132_setup_stream(codec, spec->dacs[0], stream_tag, 0, format); stream_tag, format, substream);
return 0;
} }
static int ca0132_playback_pcm_cleanup(struct hda_pcm_stream *hinfo, static int ca0132_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
@ -526,15 +499,20 @@ static int ca0132_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
struct snd_pcm_substream *substream) struct snd_pcm_substream *substream)
{ {
struct ca0132_spec *spec = codec->spec; struct ca0132_spec *spec = codec->spec;
return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
ca0132_cleanup_stream(codec, spec->dacs[0]);
return 0;
} }
/* /*
* Digital out * Digital out
*/ */
static int ca0132_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
struct hda_codec *codec,
struct snd_pcm_substream *substream)
{
struct ca0132_spec *spec = codec->spec;
return snd_hda_multi_out_dig_open(codec, &spec->multiout);
}
static int ca0132_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo, static int ca0132_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
struct hda_codec *codec, struct hda_codec *codec,
unsigned int stream_tag, unsigned int stream_tag,
@ -542,10 +520,8 @@ static int ca0132_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
struct snd_pcm_substream *substream) struct snd_pcm_substream *substream)
{ {
struct ca0132_spec *spec = codec->spec; struct ca0132_spec *spec = codec->spec;
return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
ca0132_setup_stream(codec, spec->dig_out, stream_tag, 0, format); stream_tag, format, substream);
return 0;
} }
static int ca0132_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo, static int ca0132_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
@ -553,65 +529,15 @@ static int ca0132_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
struct snd_pcm_substream *substream) struct snd_pcm_substream *substream)
{ {
struct ca0132_spec *spec = codec->spec; struct ca0132_spec *spec = codec->spec;
return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
ca0132_cleanup_stream(codec, spec->dig_out);
return 0;
} }
/* static int ca0132_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
* Analog capture struct hda_codec *codec,
*/ struct snd_pcm_substream *substream)
static int ca0132_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
struct hda_codec *codec,
unsigned int stream_tag,
unsigned int format,
struct snd_pcm_substream *substream)
{ {
struct ca0132_spec *spec = codec->spec; struct ca0132_spec *spec = codec->spec;
return snd_hda_multi_out_dig_close(codec, &spec->multiout);
ca0132_setup_stream(codec, spec->adcs[substream->number],
stream_tag, 0, format);
return 0;
}
static int ca0132_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
struct hda_codec *codec,
struct snd_pcm_substream *substream)
{
struct ca0132_spec *spec = codec->spec;
ca0132_cleanup_stream(codec, spec->adcs[substream->number]);
return 0;
}
/*
* Digital capture
*/
static int ca0132_dig_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
struct hda_codec *codec,
unsigned int stream_tag,
unsigned int format,
struct snd_pcm_substream *substream)
{
struct ca0132_spec *spec = codec->spec;
ca0132_setup_stream(codec, spec->dig_in, stream_tag, 0, format);
return 0;
}
static int ca0132_dig_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
struct hda_codec *codec,
struct snd_pcm_substream *substream)
{
struct ca0132_spec *spec = codec->spec;
ca0132_cleanup_stream(codec, spec->dig_in);
return 0;
} }
/* /*
@ -621,6 +547,7 @@ static struct hda_pcm_stream ca0132_pcm_analog_playback = {
.channels_min = 2, .channels_min = 2,
.channels_max = 2, .channels_max = 2,
.ops = { .ops = {
.open = ca0132_playback_pcm_open,
.prepare = ca0132_playback_pcm_prepare, .prepare = ca0132_playback_pcm_prepare,
.cleanup = ca0132_playback_pcm_cleanup .cleanup = ca0132_playback_pcm_cleanup
}, },
@ -630,10 +557,6 @@ static struct hda_pcm_stream ca0132_pcm_analog_capture = {
.substreams = 1, .substreams = 1,
.channels_min = 2, .channels_min = 2,
.channels_max = 2, .channels_max = 2,
.ops = {
.prepare = ca0132_capture_pcm_prepare,
.cleanup = ca0132_capture_pcm_cleanup
},
}; };
static struct hda_pcm_stream ca0132_pcm_digital_playback = { static struct hda_pcm_stream ca0132_pcm_digital_playback = {
@ -641,6 +564,8 @@ static struct hda_pcm_stream ca0132_pcm_digital_playback = {
.channels_min = 2, .channels_min = 2,
.channels_max = 2, .channels_max = 2,
.ops = { .ops = {
.open = ca0132_dig_playback_pcm_open,
.close = ca0132_dig_playback_pcm_close,
.prepare = ca0132_dig_playback_pcm_prepare, .prepare = ca0132_dig_playback_pcm_prepare,
.cleanup = ca0132_dig_playback_pcm_cleanup .cleanup = ca0132_dig_playback_pcm_cleanup
}, },
@ -650,10 +575,6 @@ static struct hda_pcm_stream ca0132_pcm_digital_capture = {
.substreams = 1, .substreams = 1,
.channels_min = 2, .channels_min = 2,
.channels_max = 2, .channels_max = 2,
.ops = {
.prepare = ca0132_dig_capture_pcm_prepare,
.cleanup = ca0132_dig_capture_pcm_cleanup
},
}; };
static int ca0132_build_pcms(struct hda_codec *codec) static int ca0132_build_pcms(struct hda_codec *codec)
@ -928,18 +849,16 @@ static int ca0132_build_controls(struct hda_codec *codec)
spec->dig_out); spec->dig_out);
if (err < 0) if (err < 0)
return err; return err;
err = add_out_volume(codec, spec->dig_out, "IEC958"); err = snd_hda_create_spdif_share_sw(codec, &spec->multiout);
if (err < 0) if (err < 0)
return err; return err;
/* spec->multiout.share_spdif = 1; */
} }
if (spec->dig_in) { if (spec->dig_in) {
err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in); err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in);
if (err < 0) if (err < 0)
return err; return err;
err = add_in_volume(codec, spec->dig_in, "IEC958");
if (err < 0)
return err;
} }
return 0; return 0;
} }
@ -961,6 +880,9 @@ static void ca0132_config(struct hda_codec *codec)
struct ca0132_spec *spec = codec->spec; struct ca0132_spec *spec = codec->spec;
struct auto_pin_cfg *cfg = &spec->autocfg; struct auto_pin_cfg *cfg = &spec->autocfg;
codec->pcm_format_first = 1;
codec->no_sticky_stream = 1;
/* line-outs */ /* line-outs */
cfg->line_outs = 1; cfg->line_outs = 1;
cfg->line_out_pins[0] = 0x0b; /* front */ cfg->line_out_pins[0] = 0x0b; /* front */
@ -988,14 +910,24 @@ static void ca0132_config(struct hda_codec *codec)
/* Mic-in */ /* Mic-in */
spec->input_pins[0] = 0x12; spec->input_pins[0] = 0x12;
spec->input_labels[0] = "Mic-In"; spec->input_labels[0] = "Mic";
spec->adcs[0] = 0x07; spec->adcs[0] = 0x07;
/* Line-In */ /* Line-In */
spec->input_pins[1] = 0x11; spec->input_pins[1] = 0x11;
spec->input_labels[1] = "Line-In"; spec->input_labels[1] = "Line";
spec->adcs[1] = 0x08; spec->adcs[1] = 0x08;
spec->num_inputs = 2; spec->num_inputs = 2;
/* SPDIF I/O */
spec->dig_out = 0x05;
spec->multiout.dig_out_nid = spec->dig_out;
cfg->dig_out_pins[0] = 0x0c;
cfg->dig_outs = 1;
cfg->dig_out_type[0] = HDA_PCM_TYPE_SPDIF;
spec->dig_in = 0x09;
cfg->dig_in_pin = 0x0e;
cfg->dig_in_type = HDA_PCM_TYPE_SPDIF;
} }
static void ca0132_init_chip(struct hda_codec *codec) static void ca0132_init_chip(struct hda_codec *codec)

View file

@ -4272,7 +4272,8 @@ static int stac92xx_init(struct hda_codec *codec)
unsigned int gpio; unsigned int gpio;
int i; int i;
snd_hda_sequence_write(codec, spec->init); if (spec->init)
snd_hda_sequence_write(codec, spec->init);
/* power down adcs initially */ /* power down adcs initially */
if (spec->powerdown_adcs) if (spec->powerdown_adcs)
@ -5748,7 +5749,6 @@ static int patch_stac92hd71bxx(struct hda_codec *codec)
/* fallthru */ /* fallthru */
case 0x111d76b4: /* 6 Port without Analog Mixer */ case 0x111d76b4: /* 6 Port without Analog Mixer */
case 0x111d76b5: case 0x111d76b5:
spec->init = stac92hd71bxx_core_init;
codec->slave_dig_outs = stac92hd71bxx_slave_dig_outs; codec->slave_dig_outs = stac92hd71bxx_slave_dig_outs;
spec->num_dmics = stac92xx_connected_ports(codec, spec->num_dmics = stac92xx_connected_ports(codec,
stac92hd71bxx_dmic_nids, stac92hd71bxx_dmic_nids,
@ -5773,7 +5773,6 @@ static int patch_stac92hd71bxx(struct hda_codec *codec)
spec->stream_delay = 40; /* 40 milliseconds */ spec->stream_delay = 40; /* 40 milliseconds */
/* disable VSW */ /* disable VSW */
spec->init = stac92hd71bxx_core_init;
unmute_init++; unmute_init++;
snd_hda_codec_set_pincfg(codec, 0x0f, 0x40f000f0); snd_hda_codec_set_pincfg(codec, 0x0f, 0x40f000f0);
snd_hda_codec_set_pincfg(codec, 0x19, 0x40f000f3); snd_hda_codec_set_pincfg(codec, 0x19, 0x40f000f3);
@ -5788,7 +5787,6 @@ static int patch_stac92hd71bxx(struct hda_codec *codec)
/* fallthru */ /* fallthru */
default: default:
spec->init = stac92hd71bxx_core_init;
codec->slave_dig_outs = stac92hd71bxx_slave_dig_outs; codec->slave_dig_outs = stac92hd71bxx_slave_dig_outs;
spec->num_dmics = stac92xx_connected_ports(codec, spec->num_dmics = stac92xx_connected_ports(codec,
stac92hd71bxx_dmic_nids, stac92hd71bxx_dmic_nids,
@ -5796,6 +5794,9 @@ static int patch_stac92hd71bxx(struct hda_codec *codec)
break; break;
} }
if (get_wcaps_type(get_wcaps(codec, 0x28)) == AC_WID_VOL_KNB)
spec->init = stac92hd71bxx_core_init;
if (get_wcaps(codec, 0xa) & AC_WCAP_IN_AMP) if (get_wcaps(codec, 0xa) & AC_WCAP_IN_AMP)
snd_hda_sequence_write_cache(codec, unmute_init); snd_hda_sequence_write_cache(codec, unmute_init);

View file

@ -1752,6 +1752,14 @@ static int via_suspend(struct hda_codec *codec)
{ {
struct via_spec *spec = codec->spec; struct via_spec *spec = codec->spec;
vt1708_stop_hp_work(spec); vt1708_stop_hp_work(spec);
if (spec->codec_type == VT1802) {
/* Fix pop noise on headphones */
int i;
for (i = 0; i < spec->autocfg.hp_outs; i++)
snd_hda_set_pin_ctl(codec, spec->autocfg.hp_pins[i], 0);
}
return 0; return 0;
} }
#endif #endif

View file

@ -851,6 +851,8 @@ static int __devinit lx_pcm_create(struct lx6464es *chip)
/* hardcoded device name & channel count */ /* hardcoded device name & channel count */
err = snd_pcm_new(chip->card, (char *)card_name, 0, err = snd_pcm_new(chip->card, (char *)card_name, 0,
1, 1, &pcm); 1, 1, &pcm);
if (err < 0)
return err;
pcm->private_data = chip; pcm->private_data = chip;

View file

@ -6585,7 +6585,7 @@ static int __devinit snd_hdspm_create(struct snd_card *card,
snd_printk(KERN_ERR "HDSPM: " snd_printk(KERN_ERR "HDSPM: "
"unable to kmalloc Mixer memory of %d Bytes\n", "unable to kmalloc Mixer memory of %d Bytes\n",
(int)sizeof(struct hdspm_mixer)); (int)sizeof(struct hdspm_mixer));
return err; return -ENOMEM;
} }
hdspm->port_names_in = NULL; hdspm->port_names_in = NULL;

View file

@ -1377,8 +1377,9 @@ static int __devinit sis_chip_create(struct snd_card *card,
if (rc) if (rc)
goto error_out_cleanup; goto error_out_cleanup;
if (request_irq(pci->irq, sis_interrupt, IRQF_SHARED, KBUILD_MODNAME, rc = request_irq(pci->irq, sis_interrupt, IRQF_SHARED, KBUILD_MODNAME,
sis)) { sis);
if (rc) {
dev_err(&pci->dev, "unable to allocate irq %d\n", sis->irq); dev_err(&pci->dev, "unable to allocate irq %d\n", sis->irq);
goto error_out_cleanup; goto error_out_cleanup;
} }

View file

@ -143,7 +143,7 @@ static int __devexit snd_pmac_remove(struct platform_device *devptr)
return 0; return 0;
} }
#ifdef CONFIG_PM #ifdef CONFIG_PM_SLEEP
static int snd_pmac_driver_suspend(struct device *dev) static int snd_pmac_driver_suspend(struct device *dev)
{ {
struct snd_card *card = dev_get_drvdata(dev); struct snd_card *card = dev_get_drvdata(dev);

View file

@ -1040,6 +1040,7 @@ static int __devinit snd_ps3_driver_probe(struct ps3_system_bus_device *dev)
GFP_KERNEL); GFP_KERNEL);
if (!the_card.null_buffer_start_vaddr) { if (!the_card.null_buffer_start_vaddr) {
pr_info("%s: nullbuffer alloc failed\n", __func__); pr_info("%s: nullbuffer alloc failed\n", __func__);
ret = -ENOMEM;
goto clean_preallocate; goto clean_preallocate;
} }
pr_debug("%s: null vaddr=%p dma=%#llx\n", __func__, pr_debug("%s: null vaddr=%p dma=%#llx\n", __func__,

View file

@ -413,7 +413,14 @@ EXPORT_SYMBOL(sport_create);
void sport_delete(struct sport_device *sport) void sport_delete(struct sport_device *sport)
{ {
if (sport->tx_desc)
dma_free_coherent(NULL, sport->tx_desc_size,
sport->tx_desc, 0);
if (sport->rx_desc)
dma_free_coherent(NULL, sport->rx_desc_size,
sport->rx_desc, 0);
sport_free_resource(sport); sport_free_resource(sport);
kfree(sport);
} }
EXPORT_SYMBOL(sport_delete); EXPORT_SYMBOL(sport_delete);

View file

@ -128,13 +128,9 @@ SOC_SINGLE_TLV("EQ4 B5 Volume", ARIZONA_EQ4_2, ARIZONA_EQ4_B5_GAIN_SHIFT,
ARIZONA_MIXER_CONTROLS("DRC1L", ARIZONA_DRC1LMIX_INPUT_1_SOURCE), ARIZONA_MIXER_CONTROLS("DRC1L", ARIZONA_DRC1LMIX_INPUT_1_SOURCE),
ARIZONA_MIXER_CONTROLS("DRC1R", ARIZONA_DRC1RMIX_INPUT_1_SOURCE), ARIZONA_MIXER_CONTROLS("DRC1R", ARIZONA_DRC1RMIX_INPUT_1_SOURCE),
ARIZONA_MIXER_CONTROLS("DRC2L", ARIZONA_DRC2LMIX_INPUT_1_SOURCE),
ARIZONA_MIXER_CONTROLS("DRC2R", ARIZONA_DRC2RMIX_INPUT_1_SOURCE),
SND_SOC_BYTES_MASK("DRC1", ARIZONA_DRC1_CTRL1, 5, SND_SOC_BYTES_MASK("DRC1", ARIZONA_DRC1_CTRL1, 5,
ARIZONA_DRC1R_ENA | ARIZONA_DRC1L_ENA), ARIZONA_DRC1R_ENA | ARIZONA_DRC1L_ENA),
SND_SOC_BYTES_MASK("DRC2", ARIZONA_DRC2_CTRL1, 5,
ARIZONA_DRC2R_ENA | ARIZONA_DRC2L_ENA),
ARIZONA_MIXER_CONTROLS("LHPF1", ARIZONA_HPLP1MIX_INPUT_1_SOURCE), ARIZONA_MIXER_CONTROLS("LHPF1", ARIZONA_HPLP1MIX_INPUT_1_SOURCE),
ARIZONA_MIXER_CONTROLS("LHPF2", ARIZONA_HPLP2MIX_INPUT_1_SOURCE), ARIZONA_MIXER_CONTROLS("LHPF2", ARIZONA_HPLP2MIX_INPUT_1_SOURCE),
@ -236,8 +232,6 @@ ARIZONA_MIXER_ENUMS(EQ4, ARIZONA_EQ4MIX_INPUT_1_SOURCE);
ARIZONA_MIXER_ENUMS(DRC1L, ARIZONA_DRC1LMIX_INPUT_1_SOURCE); ARIZONA_MIXER_ENUMS(DRC1L, ARIZONA_DRC1LMIX_INPUT_1_SOURCE);
ARIZONA_MIXER_ENUMS(DRC1R, ARIZONA_DRC1RMIX_INPUT_1_SOURCE); ARIZONA_MIXER_ENUMS(DRC1R, ARIZONA_DRC1RMIX_INPUT_1_SOURCE);
ARIZONA_MIXER_ENUMS(DRC2L, ARIZONA_DRC2LMIX_INPUT_1_SOURCE);
ARIZONA_MIXER_ENUMS(DRC2R, ARIZONA_DRC2RMIX_INPUT_1_SOURCE);
ARIZONA_MIXER_ENUMS(LHPF1, ARIZONA_HPLP1MIX_INPUT_1_SOURCE); ARIZONA_MIXER_ENUMS(LHPF1, ARIZONA_HPLP1MIX_INPUT_1_SOURCE);
ARIZONA_MIXER_ENUMS(LHPF2, ARIZONA_HPLP2MIX_INPUT_1_SOURCE); ARIZONA_MIXER_ENUMS(LHPF2, ARIZONA_HPLP2MIX_INPUT_1_SOURCE);
@ -349,10 +343,6 @@ SND_SOC_DAPM_PGA("DRC1L", ARIZONA_DRC1_CTRL1, ARIZONA_DRC1L_ENA_SHIFT, 0,
NULL, 0), NULL, 0),
SND_SOC_DAPM_PGA("DRC1R", ARIZONA_DRC1_CTRL1, ARIZONA_DRC1R_ENA_SHIFT, 0, SND_SOC_DAPM_PGA("DRC1R", ARIZONA_DRC1_CTRL1, ARIZONA_DRC1R_ENA_SHIFT, 0,
NULL, 0), NULL, 0),
SND_SOC_DAPM_PGA("DRC2L", ARIZONA_DRC2_CTRL1, ARIZONA_DRC2L_ENA_SHIFT, 0,
NULL, 0),
SND_SOC_DAPM_PGA("DRC2R", ARIZONA_DRC2_CTRL1, ARIZONA_DRC2R_ENA_SHIFT, 0,
NULL, 0),
SND_SOC_DAPM_PGA("LHPF1", ARIZONA_HPLPF1_1, ARIZONA_LHPF1_ENA_SHIFT, 0, SND_SOC_DAPM_PGA("LHPF1", ARIZONA_HPLPF1_1, ARIZONA_LHPF1_ENA_SHIFT, 0,
NULL, 0), NULL, 0),
@ -466,8 +456,6 @@ ARIZONA_MIXER_WIDGETS(EQ4, "EQ4"),
ARIZONA_MIXER_WIDGETS(DRC1L, "DRC1L"), ARIZONA_MIXER_WIDGETS(DRC1L, "DRC1L"),
ARIZONA_MIXER_WIDGETS(DRC1R, "DRC1R"), ARIZONA_MIXER_WIDGETS(DRC1R, "DRC1R"),
ARIZONA_MIXER_WIDGETS(DRC2L, "DRC2L"),
ARIZONA_MIXER_WIDGETS(DRC2R, "DRC2R"),
ARIZONA_MIXER_WIDGETS(LHPF1, "LHPF1"), ARIZONA_MIXER_WIDGETS(LHPF1, "LHPF1"),
ARIZONA_MIXER_WIDGETS(LHPF2, "LHPF2"), ARIZONA_MIXER_WIDGETS(LHPF2, "LHPF2"),
@ -553,8 +541,6 @@ SND_SOC_DAPM_OUTPUT("SPKDAT1R"),
{ name, "EQ4", "EQ4" }, \ { name, "EQ4", "EQ4" }, \
{ name, "DRC1L", "DRC1L" }, \ { name, "DRC1L", "DRC1L" }, \
{ name, "DRC1R", "DRC1R" }, \ { name, "DRC1R", "DRC1R" }, \
{ name, "DRC2L", "DRC2L" }, \
{ name, "DRC2R", "DRC2R" }, \
{ name, "LHPF1", "LHPF1" }, \ { name, "LHPF1", "LHPF1" }, \
{ name, "LHPF2", "LHPF2" }, \ { name, "LHPF2", "LHPF2" }, \
{ name, "LHPF3", "LHPF3" }, \ { name, "LHPF3", "LHPF3" }, \
@ -639,6 +625,15 @@ static const struct snd_soc_dapm_route wm5102_dapm_routes[] = {
{ "AIF2 Capture", NULL, "SYSCLK" }, { "AIF2 Capture", NULL, "SYSCLK" },
{ "AIF3 Capture", NULL, "SYSCLK" }, { "AIF3 Capture", NULL, "SYSCLK" },
{ "IN1L PGA", NULL, "IN1L" },
{ "IN1R PGA", NULL, "IN1R" },
{ "IN2L PGA", NULL, "IN2L" },
{ "IN2R PGA", NULL, "IN2R" },
{ "IN3L PGA", NULL, "IN3L" },
{ "IN3R PGA", NULL, "IN3R" },
ARIZONA_MIXER_ROUTES("OUT1L", "HPOUT1L"), ARIZONA_MIXER_ROUTES("OUT1L", "HPOUT1L"),
ARIZONA_MIXER_ROUTES("OUT1R", "HPOUT1R"), ARIZONA_MIXER_ROUTES("OUT1R", "HPOUT1R"),
ARIZONA_MIXER_ROUTES("OUT2L", "HPOUT2L"), ARIZONA_MIXER_ROUTES("OUT2L", "HPOUT2L"),
@ -675,8 +670,6 @@ static const struct snd_soc_dapm_route wm5102_dapm_routes[] = {
ARIZONA_MIXER_ROUTES("DRC1L", "DRC1L"), ARIZONA_MIXER_ROUTES("DRC1L", "DRC1L"),
ARIZONA_MIXER_ROUTES("DRC1R", "DRC1R"), ARIZONA_MIXER_ROUTES("DRC1R", "DRC1R"),
ARIZONA_MIXER_ROUTES("DRC2L", "DRC2L"),
ARIZONA_MIXER_ROUTES("DRC2R", "DRC2R"),
ARIZONA_MIXER_ROUTES("LHPF1", "LHPF1"), ARIZONA_MIXER_ROUTES("LHPF1", "LHPF1"),
ARIZONA_MIXER_ROUTES("LHPF2", "LHPF2"), ARIZONA_MIXER_ROUTES("LHPF2", "LHPF2"),

View file

@ -681,6 +681,18 @@ static const struct snd_soc_dapm_route wm5110_dapm_routes[] = {
{ "AIF2 Capture", NULL, "SYSCLK" }, { "AIF2 Capture", NULL, "SYSCLK" },
{ "AIF3 Capture", NULL, "SYSCLK" }, { "AIF3 Capture", NULL, "SYSCLK" },
{ "IN1L PGA", NULL, "IN1L" },
{ "IN1R PGA", NULL, "IN1R" },
{ "IN2L PGA", NULL, "IN2L" },
{ "IN2R PGA", NULL, "IN2R" },
{ "IN3L PGA", NULL, "IN3L" },
{ "IN3R PGA", NULL, "IN3R" },
{ "IN4L PGA", NULL, "IN4L" },
{ "IN4R PGA", NULL, "IN4R" },
ARIZONA_MIXER_ROUTES("OUT1L", "HPOUT1L"), ARIZONA_MIXER_ROUTES("OUT1L", "HPOUT1L"),
ARIZONA_MIXER_ROUTES("OUT1R", "HPOUT1R"), ARIZONA_MIXER_ROUTES("OUT1R", "HPOUT1R"),
ARIZONA_MIXER_ROUTES("OUT2L", "HPOUT2L"), ARIZONA_MIXER_ROUTES("OUT2L", "HPOUT2L"),

View file

@ -3733,21 +3733,6 @@ static int wm8962_runtime_resume(struct device *dev)
regcache_sync(wm8962->regmap); regcache_sync(wm8962->regmap);
regmap_update_bits(wm8962->regmap, WM8962_ANTI_POP,
WM8962_STARTUP_BIAS_ENA | WM8962_VMID_BUF_ENA,
WM8962_STARTUP_BIAS_ENA | WM8962_VMID_BUF_ENA);
/* Bias enable at 2*50k for ramp */
regmap_update_bits(wm8962->regmap, WM8962_PWR_MGMT_1,
WM8962_VMID_SEL_MASK | WM8962_BIAS_ENA,
WM8962_BIAS_ENA | 0x180);
msleep(5);
/* VMID back to 2x250k for standby */
regmap_update_bits(wm8962->regmap, WM8962_PWR_MGMT_1,
WM8962_VMID_SEL_MASK, 0x100);
return 0; return 0;
} }

View file

@ -4038,6 +4038,8 @@ static int wm8994_codec_probe(struct snd_soc_codec *codec)
break; break;
case WM8958: case WM8958:
if (wm8994->revision < 1) { if (wm8994->revision < 1) {
snd_soc_dapm_add_routes(dapm, wm8994_intercon,
ARRAY_SIZE(wm8994_intercon));
snd_soc_dapm_add_routes(dapm, wm8994_revd_intercon, snd_soc_dapm_add_routes(dapm, wm8994_revd_intercon,
ARRAY_SIZE(wm8994_revd_intercon)); ARRAY_SIZE(wm8994_revd_intercon));
snd_soc_dapm_add_routes(dapm, wm8994_lateclk_revd_intercon, snd_soc_dapm_add_routes(dapm, wm8994_lateclk_revd_intercon,

View file

@ -148,7 +148,7 @@ SOC_SINGLE("Treble Volume", AC97_MASTER_TONE, 0, 15, 1),
SOC_SINGLE("Capture ADC Switch", AC97_REC_GAIN, 15, 1, 1), SOC_SINGLE("Capture ADC Switch", AC97_REC_GAIN, 15, 1, 1),
SOC_ENUM("Capture Volume Steps", wm9712_enum[6]), SOC_ENUM("Capture Volume Steps", wm9712_enum[6]),
SOC_DOUBLE("Capture Volume", AC97_REC_GAIN, 8, 0, 63, 1), SOC_DOUBLE("Capture Volume", AC97_REC_GAIN, 8, 0, 63, 0),
SOC_SINGLE("Capture ZC Switch", AC97_REC_GAIN, 7, 1, 0), SOC_SINGLE("Capture ZC Switch", AC97_REC_GAIN, 7, 1, 0),
SOC_SINGLE_TLV("Mic 1 Volume", AC97_MIC, 8, 31, 1, main_tlv), SOC_SINGLE_TLV("Mic 1 Volume", AC97_MIC, 8, 31, 1, main_tlv),
@ -272,7 +272,7 @@ SOC_DAPM_ENUM("Route", wm9712_enum[9]);
/* Mic select */ /* Mic select */
static const struct snd_kcontrol_new wm9712_mic_src_controls = static const struct snd_kcontrol_new wm9712_mic_src_controls =
SOC_DAPM_ENUM("Route", wm9712_enum[7]); SOC_DAPM_ENUM("Mic Source Select", wm9712_enum[7]);
/* diff select */ /* diff select */
static const struct snd_kcontrol_new wm9712_diff_sel_controls = static const struct snd_kcontrol_new wm9712_diff_sel_controls =
@ -291,7 +291,9 @@ SND_SOC_DAPM_MUX("Left Capture Select", SND_SOC_NOPM, 0, 0,
&wm9712_capture_selectl_controls), &wm9712_capture_selectl_controls),
SND_SOC_DAPM_MUX("Right Capture Select", SND_SOC_NOPM, 0, 0, SND_SOC_DAPM_MUX("Right Capture Select", SND_SOC_NOPM, 0, 0,
&wm9712_capture_selectr_controls), &wm9712_capture_selectr_controls),
SND_SOC_DAPM_MUX("Mic Select Source", SND_SOC_NOPM, 0, 0, SND_SOC_DAPM_MUX("Left Mic Select Source", SND_SOC_NOPM, 0, 0,
&wm9712_mic_src_controls),
SND_SOC_DAPM_MUX("Right Mic Select Source", SND_SOC_NOPM, 0, 0,
&wm9712_mic_src_controls), &wm9712_mic_src_controls),
SND_SOC_DAPM_MUX("Differential Source", SND_SOC_NOPM, 0, 0, SND_SOC_DAPM_MUX("Differential Source", SND_SOC_NOPM, 0, 0,
&wm9712_diff_sel_controls), &wm9712_diff_sel_controls),
@ -319,6 +321,7 @@ SND_SOC_DAPM_PGA("Out 3 PGA", AC97_INT_PAGING, 5, 1, NULL, 0),
SND_SOC_DAPM_PGA("Line PGA", AC97_INT_PAGING, 2, 1, NULL, 0), SND_SOC_DAPM_PGA("Line PGA", AC97_INT_PAGING, 2, 1, NULL, 0),
SND_SOC_DAPM_PGA("Phone PGA", AC97_INT_PAGING, 1, 1, NULL, 0), SND_SOC_DAPM_PGA("Phone PGA", AC97_INT_PAGING, 1, 1, NULL, 0),
SND_SOC_DAPM_PGA("Mic PGA", AC97_INT_PAGING, 0, 1, NULL, 0), SND_SOC_DAPM_PGA("Mic PGA", AC97_INT_PAGING, 0, 1, NULL, 0),
SND_SOC_DAPM_PGA("Differential Mic", SND_SOC_NOPM, 0, 0, NULL, 0),
SND_SOC_DAPM_MICBIAS("Mic Bias", AC97_INT_PAGING, 10, 1), SND_SOC_DAPM_MICBIAS("Mic Bias", AC97_INT_PAGING, 10, 1),
SND_SOC_DAPM_OUTPUT("MONOOUT"), SND_SOC_DAPM_OUTPUT("MONOOUT"),
SND_SOC_DAPM_OUTPUT("HPOUTL"), SND_SOC_DAPM_OUTPUT("HPOUTL"),
@ -379,6 +382,18 @@ static const struct snd_soc_dapm_route wm9712_audio_map[] = {
{"Mic PGA", NULL, "MIC1"}, {"Mic PGA", NULL, "MIC1"},
{"Mic PGA", NULL, "MIC2"}, {"Mic PGA", NULL, "MIC2"},
/* microphones */
{"Differential Mic", NULL, "MIC1"},
{"Differential Mic", NULL, "MIC2"},
{"Left Mic Select Source", "Mic 1", "MIC1"},
{"Left Mic Select Source", "Mic 2", "MIC2"},
{"Left Mic Select Source", "Stereo", "MIC1"},
{"Left Mic Select Source", "Differential", "Differential Mic"},
{"Right Mic Select Source", "Mic 1", "MIC1"},
{"Right Mic Select Source", "Mic 2", "MIC2"},
{"Right Mic Select Source", "Stereo", "MIC2"},
{"Right Mic Select Source", "Differential", "Differential Mic"},
/* left capture selector */ /* left capture selector */
{"Left Capture Select", "Mic", "MIC1"}, {"Left Capture Select", "Mic", "MIC1"},
{"Left Capture Select", "Speaker Mixer", "Speaker Mixer"}, {"Left Capture Select", "Speaker Mixer", "Speaker Mixer"},

View file

@ -380,14 +380,20 @@ static void mcasp_start_tx(struct davinci_audio_dev *dev)
static void davinci_mcasp_start(struct davinci_audio_dev *dev, int stream) static void davinci_mcasp_start(struct davinci_audio_dev *dev, int stream)
{ {
if (stream == SNDRV_PCM_STREAM_PLAYBACK) { if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
if (dev->txnumevt) /* enable FIFO */ if (dev->txnumevt) { /* enable FIFO */
mcasp_clr_bits(dev->base + DAVINCI_MCASP_WFIFOCTL,
FIFO_ENABLE);
mcasp_set_bits(dev->base + DAVINCI_MCASP_WFIFOCTL, mcasp_set_bits(dev->base + DAVINCI_MCASP_WFIFOCTL,
FIFO_ENABLE); FIFO_ENABLE);
}
mcasp_start_tx(dev); mcasp_start_tx(dev);
} else { } else {
if (dev->rxnumevt) /* enable FIFO */ if (dev->rxnumevt) { /* enable FIFO */
mcasp_clr_bits(dev->base + DAVINCI_MCASP_RFIFOCTL,
FIFO_ENABLE);
mcasp_set_bits(dev->base + DAVINCI_MCASP_RFIFOCTL, mcasp_set_bits(dev->base + DAVINCI_MCASP_RFIFOCTL,
FIFO_ENABLE); FIFO_ENABLE);
}
mcasp_start_rx(dev); mcasp_start_rx(dev);
} }
} }

View file

@ -380,13 +380,14 @@ static int imx_ssi_dai_probe(struct snd_soc_dai *dai)
static struct snd_soc_dai_driver imx_ssi_dai = { static struct snd_soc_dai_driver imx_ssi_dai = {
.probe = imx_ssi_dai_probe, .probe = imx_ssi_dai_probe,
.playback = { .playback = {
.channels_min = 1, /* The SSI does not support monaural audio. */
.channels_min = 2,
.channels_max = 2, .channels_max = 2,
.rates = SNDRV_PCM_RATE_8000_96000, .rates = SNDRV_PCM_RATE_8000_96000,
.formats = SNDRV_PCM_FMTBIT_S16_LE, .formats = SNDRV_PCM_FMTBIT_S16_LE,
}, },
.capture = { .capture = {
.channels_min = 1, .channels_min = 2,
.channels_max = 2, .channels_max = 2,
.rates = SNDRV_PCM_RATE_8000_96000, .rates = SNDRV_PCM_RATE_8000_96000,
.formats = SNDRV_PCM_FMTBIT_S16_LE, .formats = SNDRV_PCM_FMTBIT_S16_LE,

View file

@ -10,7 +10,7 @@ menuconfig SND_MXS_SOC
if SND_MXS_SOC if SND_MXS_SOC
config SND_SOC_MXS_SGTL5000 config SND_SOC_MXS_SGTL5000
tristate "SoC Audio support for i.MX boards with sgtl5000" tristate "SoC Audio support for MXS boards with sgtl5000"
depends on I2C depends on I2C
select SND_SOC_SGTL5000 select SND_SOC_SGTL5000
help help

View file

@ -745,7 +745,7 @@ int omap_mcbsp_6pin_src_mux(struct omap_mcbsp *mcbsp, u8 mux)
{ {
const char *signal, *src; const char *signal, *src;
if (mcbsp->pdata->mux_signal) if (!mcbsp->pdata->mux_signal)
return -EINVAL; return -EINVAL;
switch (mux) { switch (mux) {

View file

@ -20,7 +20,7 @@
#include <sound/pcm_params.h> #include <sound/pcm_params.h>
#include <plat/audio.h> #include <plat/audio.h>
#include <plat/dma.h> #include <mach/dma.h>
#include "dma.h" #include "dma.h"
#include "pcm.h" #include "pcm.h"

View file

@ -826,7 +826,7 @@ static int soc_bind_dai_link(struct snd_soc_card *card, int num)
} }
if (!rtd->cpu_dai) { if (!rtd->cpu_dai) {
dev_dbg(card->dev, "CPU DAI %s not registered\n", dev_err(card->dev, "CPU DAI %s not registered\n",
dai_link->cpu_dai_name); dai_link->cpu_dai_name);
return -EPROBE_DEFER; return -EPROBE_DEFER;
} }
@ -857,14 +857,14 @@ static int soc_bind_dai_link(struct snd_soc_card *card, int num)
} }
if (!rtd->codec_dai) { if (!rtd->codec_dai) {
dev_dbg(card->dev, "CODEC DAI %s not registered\n", dev_err(card->dev, "CODEC DAI %s not registered\n",
dai_link->codec_dai_name); dai_link->codec_dai_name);
return -EPROBE_DEFER; return -EPROBE_DEFER;
} }
} }
if (!rtd->codec) { if (!rtd->codec) {
dev_dbg(card->dev, "CODEC %s not registered\n", dev_err(card->dev, "CODEC %s not registered\n",
dai_link->codec_name); dai_link->codec_name);
return -EPROBE_DEFER; return -EPROBE_DEFER;
} }
@ -888,7 +888,7 @@ static int soc_bind_dai_link(struct snd_soc_card *card, int num)
rtd->platform = platform; rtd->platform = platform;
} }
if (!rtd->platform) { if (!rtd->platform) {
dev_dbg(card->dev, "platform %s not registered\n", dev_err(card->dev, "platform %s not registered\n",
dai_link->platform_name); dai_link->platform_name);
return -EPROBE_DEFER; return -EPROBE_DEFER;
} }
@ -1481,6 +1481,8 @@ static int soc_check_aux_dev(struct snd_soc_card *card, int num)
return 0; return 0;
} }
dev_err(card->dev, "%s not registered\n", aux_dev->codec_name);
return -EPROBE_DEFER; return -EPROBE_DEFER;
} }

View file

@ -103,7 +103,7 @@ void snd_soc_jack_report(struct snd_soc_jack *jack, int status, int mask)
} }
/* Report before the DAPM sync to help users updating micbias status */ /* Report before the DAPM sync to help users updating micbias status */
blocking_notifier_call_chain(&jack->notifier, status, jack); blocking_notifier_call_chain(&jack->notifier, jack->status, jack);
snd_soc_dapm_sync(dapm); snd_soc_dapm_sync(dapm);

View file

@ -821,10 +821,6 @@ int snd_usb_endpoint_start(struct snd_usb_endpoint *ep)
if (++ep->use_count != 1) if (++ep->use_count != 1)
return 0; return 0;
/* just to be sure */
deactivate_urbs(ep, 0, 1);
wait_clear_urbs(ep);
ep->active_mask = 0; ep->active_mask = 0;
ep->unlink_mask = 0; ep->unlink_mask = 0;
ep->phase = 0; ep->phase = 0;

View file

@ -544,6 +544,9 @@ static int snd_usb_pcm_prepare(struct snd_pcm_substream *substream)
subs->last_frame_number = 0; subs->last_frame_number = 0;
runtime->delay = 0; runtime->delay = 0;
/* clear the pending deactivation on the target EPs */
deactivate_endpoints(subs);
/* for playback, submit the URBs now; otherwise, the first hwptr_done /* for playback, submit the URBs now; otherwise, the first hwptr_done
* updates for all URBs would happen at the same time when starting */ * updates for all URBs would happen at the same time when starting */
if (subs->direction == SNDRV_PCM_STREAM_PLAYBACK) if (subs->direction == SNDRV_PCM_STREAM_PLAYBACK)