Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6: sound: do not set DEVNAME for OSS devices ALSA: hda - Add sanity check in PCM open callback ALSA: hda - Call snd_pcm_lib_hw_rates() again after codec open callback ALSA: hda - Avoid invalid formats and rates with shared SPDIF ALSA: hda - Improve ASUS eeePC 1000 mixer ALSA: hda - Add GPIO1 control at muting with HP laptops ALSA: usx2y - reparent sound device ALSA: snd_usb_caiaq: reparent sound device sound: virtuoso: fix Xonar D1/DX silence after resume ASoC: Only disable pxa2xx-i2s clocks if we enabled them ALSA: hda - Add quirk for HP 6930p ALSA: hda - Add missing static to patch_ca0110() ASoC: OMAP: fix OMAP1510 broken PCM pointer callback ASoC: remove BROKEN from Efika and pcm030 fabric drivers ASoC: Fix typo in MPC5200 PSC AC97 driver Kconfig
This commit is contained in:
commit
f1a745710f
13 changed files with 80 additions and 40 deletions
|
@ -3470,10 +3470,16 @@ int snd_hda_multi_out_analog_open(struct hda_codec *codec,
|
|||
}
|
||||
mutex_lock(&codec->spdif_mutex);
|
||||
if (mout->share_spdif) {
|
||||
runtime->hw.rates &= mout->spdif_rates;
|
||||
runtime->hw.formats &= mout->spdif_formats;
|
||||
if (mout->spdif_maxbps < hinfo->maxbps)
|
||||
hinfo->maxbps = mout->spdif_maxbps;
|
||||
if ((runtime->hw.rates & mout->spdif_rates) &&
|
||||
(runtime->hw.formats & mout->spdif_formats)) {
|
||||
runtime->hw.rates &= mout->spdif_rates;
|
||||
runtime->hw.formats &= mout->spdif_formats;
|
||||
if (mout->spdif_maxbps < hinfo->maxbps)
|
||||
hinfo->maxbps = mout->spdif_maxbps;
|
||||
} else {
|
||||
mout->share_spdif = 0;
|
||||
/* FIXME: need notify? */
|
||||
}
|
||||
}
|
||||
mutex_unlock(&codec->spdif_mutex);
|
||||
}
|
||||
|
|
|
@ -1454,6 +1454,7 @@ static int azx_pcm_open(struct snd_pcm_substream *substream)
|
|||
mutex_unlock(&chip->open_mutex);
|
||||
return err;
|
||||
}
|
||||
snd_pcm_limit_hw_rates(runtime);
|
||||
spin_lock_irqsave(&chip->reg_lock, flags);
|
||||
azx_dev->substream = substream;
|
||||
azx_dev->running = 0;
|
||||
|
@ -1463,6 +1464,12 @@ static int azx_pcm_open(struct snd_pcm_substream *substream)
|
|||
snd_pcm_set_sync(substream);
|
||||
mutex_unlock(&chip->open_mutex);
|
||||
|
||||
if (snd_BUG_ON(!runtime->hw.channels_min || !runtime->hw.channels_max))
|
||||
return -EINVAL;
|
||||
if (snd_BUG_ON(!runtime->hw.formats))
|
||||
return -EINVAL;
|
||||
if (snd_BUG_ON(!runtime->hw.rates))
|
||||
return -EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -3746,9 +3746,30 @@ static struct snd_kcontrol_new ad1884a_laptop_mixers[] = {
|
|||
{ } /* end */
|
||||
};
|
||||
|
||||
static int ad1884a_mobile_master_sw_put(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
|
||||
int ret = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
|
||||
int mute = (!ucontrol->value.integer.value[0] &&
|
||||
!ucontrol->value.integer.value[1]);
|
||||
/* toggle GPIO1 according to the mute state */
|
||||
snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA,
|
||||
mute ? 0x02 : 0x0);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct snd_kcontrol_new ad1884a_mobile_mixers[] = {
|
||||
HDA_CODEC_VOLUME("Master Playback Volume", 0x21, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_MUTE("Master Playback Switch", 0x21, 0x0, HDA_OUTPUT),
|
||||
/*HDA_CODEC_MUTE("Master Playback Switch", 0x21, 0x0, HDA_OUTPUT),*/
|
||||
{
|
||||
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
||||
.name = "Master Playback Switch",
|
||||
.info = snd_hda_mixer_amp_switch_info,
|
||||
.get = snd_hda_mixer_amp_switch_get,
|
||||
.put = ad1884a_mobile_master_sw_put,
|
||||
.private_value = HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
|
||||
},
|
||||
HDA_CODEC_VOLUME("PCM Playback Volume", 0x20, 0x5, HDA_INPUT),
|
||||
HDA_CODEC_MUTE("PCM Playback Switch", 0x20, 0x5, HDA_INPUT),
|
||||
HDA_CODEC_VOLUME("Mic Capture Volume", 0x14, 0x0, HDA_INPUT),
|
||||
|
@ -3869,6 +3890,10 @@ static struct hda_verb ad1884a_mobile_verbs[] = {
|
|||
/* unsolicited event for pin-sense */
|
||||
{0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1884A_HP_EVENT},
|
||||
{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1884A_MIC_EVENT},
|
||||
/* allow to touch GPIO1 (for mute control) */
|
||||
{0x01, AC_VERB_SET_GPIO_MASK, 0x02},
|
||||
{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x02},
|
||||
{0x01, AC_VERB_SET_GPIO_DATA, 0x02}, /* first muted */
|
||||
{ } /* end */
|
||||
};
|
||||
|
||||
|
@ -3978,6 +4003,7 @@ static struct snd_pci_quirk ad1884a_cfg_tbl[] = {
|
|||
SND_PCI_QUIRK(0x103c, 0x3037, "HP 2230s", AD1884A_LAPTOP),
|
||||
SND_PCI_QUIRK(0x103c, 0x3056, "HP", AD1884A_MOBILE),
|
||||
SND_PCI_QUIRK_MASK(0x103c, 0xfff0, 0x3070, "HP", AD1884A_MOBILE),
|
||||
SND_PCI_QUIRK_MASK(0x103c, 0xfff0, 0x30d0, "HP laptop", AD1884A_LAPTOP),
|
||||
SND_PCI_QUIRK_MASK(0x103c, 0xfff0, 0x30e0, "HP laptop", AD1884A_LAPTOP),
|
||||
SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x3600, "HP laptop", AD1884A_LAPTOP),
|
||||
SND_PCI_QUIRK(0x17aa, 0x20ac, "Thinkpad X300", AD1884A_THINKPAD),
|
||||
|
|
|
@ -510,7 +510,7 @@ static int ca0110_parse_auto_config(struct hda_codec *codec)
|
|||
}
|
||||
|
||||
|
||||
int patch_ca0110(struct hda_codec *codec)
|
||||
static int patch_ca0110(struct hda_codec *codec)
|
||||
{
|
||||
struct ca0110_spec *spec;
|
||||
int err;
|
||||
|
|
|
@ -12876,20 +12876,11 @@ static struct snd_kcontrol_new alc269_lifebook_mixer[] = {
|
|||
{ }
|
||||
};
|
||||
|
||||
/* bind volumes of both NID 0x0c and 0x0d */
|
||||
static struct hda_bind_ctls alc269_epc_bind_vol = {
|
||||
.ops = &snd_hda_bind_vol,
|
||||
.values = {
|
||||
HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
|
||||
HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
|
||||
0
|
||||
},
|
||||
};
|
||||
|
||||
static struct snd_kcontrol_new alc269_eeepc_mixer[] = {
|
||||
HDA_CODEC_MUTE("iSpeaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
|
||||
HDA_BIND_VOL("LineOut Playback Volume", &alc269_epc_bind_vol),
|
||||
HDA_CODEC_MUTE("LineOut Playback Switch", 0x15, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_MUTE("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_MUTE("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
|
||||
{ } /* end */
|
||||
};
|
||||
|
||||
|
@ -12902,12 +12893,7 @@ static struct snd_kcontrol_new alc269_epc_capture_mixer[] = {
|
|||
};
|
||||
|
||||
/* FSC amilo */
|
||||
static struct snd_kcontrol_new alc269_fujitsu_mixer[] = {
|
||||
HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
|
||||
HDA_BIND_VOL("PCM Playback Volume", &alc269_epc_bind_vol),
|
||||
{ } /* end */
|
||||
};
|
||||
#define alc269_fujitsu_mixer alc269_eeepc_mixer
|
||||
|
||||
static struct hda_verb alc269_quanta_fl1_verbs[] = {
|
||||
{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
|
||||
|
|
|
@ -635,6 +635,8 @@ static void xonar_d2_resume(struct oxygen *chip)
|
|||
|
||||
static void xonar_d1_resume(struct oxygen *chip)
|
||||
{
|
||||
oxygen_set_bits8(chip, OXYGEN_FUNCTION, OXYGEN_FUNCTION_RESET_CODEC);
|
||||
msleep(1);
|
||||
cs43xx_init(chip);
|
||||
xonar_enable_output(chip);
|
||||
}
|
||||
|
|
|
@ -33,7 +33,7 @@ config SND_SOC_MPC5200_I2S
|
|||
config SND_SOC_MPC5200_AC97
|
||||
tristate "Freescale MPC5200 PSC in AC97 mode driver"
|
||||
depends on PPC_MPC52xx && PPC_BESTCOMM
|
||||
select AC97_BUS
|
||||
select SND_SOC_AC97_BUS
|
||||
select SND_MPC52xx_DMA
|
||||
select PPC_BESTCOMM_GEN_BD
|
||||
help
|
||||
|
@ -41,7 +41,7 @@ config SND_SOC_MPC5200_AC97
|
|||
|
||||
config SND_MPC52xx_SOC_PCM030
|
||||
tristate "SoC AC97 Audio support for Phytec pcm030 and WM9712"
|
||||
depends on PPC_MPC5200_SIMPLE && BROKEN
|
||||
depends on PPC_MPC5200_SIMPLE
|
||||
select SND_SOC_MPC5200_AC97
|
||||
select SND_SOC_WM9712
|
||||
help
|
||||
|
@ -50,7 +50,7 @@ config SND_MPC52xx_SOC_PCM030
|
|||
|
||||
config SND_MPC52xx_SOC_EFIKA
|
||||
tristate "SoC AC97 Audio support for bbplan Efika and STAC9766"
|
||||
depends on PPC_EFIKA && BROKEN
|
||||
depends on PPC_EFIKA
|
||||
select SND_SOC_MPC5200_AC97
|
||||
select SND_SOC_STAC9766
|
||||
help
|
||||
|
|
|
@ -216,12 +216,15 @@ static snd_pcm_uframes_t omap_pcm_pointer(struct snd_pcm_substream *substream)
|
|||
dma_addr_t ptr;
|
||||
snd_pcm_uframes_t offset;
|
||||
|
||||
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
|
||||
ptr = omap_get_dma_src_pos(prtd->dma_ch);
|
||||
else
|
||||
if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
|
||||
ptr = omap_get_dma_dst_pos(prtd->dma_ch);
|
||||
offset = bytes_to_frames(runtime, ptr - runtime->dma_addr);
|
||||
} else if (!(cpu_is_omap1510())) {
|
||||
ptr = omap_get_dma_src_pos(prtd->dma_ch);
|
||||
offset = bytes_to_frames(runtime, ptr - runtime->dma_addr);
|
||||
} else
|
||||
offset = prtd->period_index * runtime->period_size;
|
||||
|
||||
offset = bytes_to_frames(runtime, ptr - runtime->dma_addr);
|
||||
if (offset >= runtime->buffer_size)
|
||||
offset = 0;
|
||||
|
||||
|
|
|
@ -167,6 +167,7 @@ static int pxa2xx_i2s_hw_params(struct snd_pcm_substream *substream,
|
|||
|
||||
BUG_ON(IS_ERR(clk_i2s));
|
||||
clk_enable(clk_i2s);
|
||||
dai->private_data = dai;
|
||||
pxa_i2s_wait();
|
||||
|
||||
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
|
||||
|
@ -255,7 +256,10 @@ static void pxa2xx_i2s_shutdown(struct snd_pcm_substream *substream,
|
|||
if ((SACR1 & (SACR1_DREC | SACR1_DRPL)) == (SACR1_DREC | SACR1_DRPL)) {
|
||||
SACR0 &= ~SACR0_ENB;
|
||||
pxa_i2s_wait();
|
||||
clk_disable(clk_i2s);
|
||||
if (dai->private_data != NULL) {
|
||||
clk_disable(clk_i2s);
|
||||
dai->private_data = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -336,6 +340,7 @@ static int pxa2xx_i2s_probe(struct platform_device *dev)
|
|||
return PTR_ERR(clk_i2s);
|
||||
|
||||
pxa_i2s_dai.dev = &dev->dev;
|
||||
pxa_i2s_dai.private_data = NULL;
|
||||
ret = snd_soc_register_dai(&pxa_i2s_dai);
|
||||
if (ret != 0)
|
||||
clk_put(clk_i2s);
|
||||
|
|
|
@ -10,6 +10,8 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/kdev_t.h>
|
||||
#include <linux/major.h>
|
||||
#include <sound/core.h>
|
||||
|
||||
#ifdef CONFIG_SOUND_OSS_CORE
|
||||
|
@ -29,6 +31,8 @@ MODULE_LICENSE("GPL");
|
|||
|
||||
static char *sound_nodename(struct device *dev)
|
||||
{
|
||||
if (MAJOR(dev->devt) == SOUND_MAJOR)
|
||||
return NULL;
|
||||
return kasprintf(GFP_KERNEL, "snd/%s", dev_name(dev));
|
||||
}
|
||||
|
||||
|
@ -104,7 +108,6 @@ module_exit(cleanup_soundcore);
|
|||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/sound.h>
|
||||
#include <linux/major.h>
|
||||
#include <linux/kmod.h>
|
||||
|
||||
#define SOUND_STEP 16
|
||||
|
|
|
@ -35,7 +35,7 @@
|
|||
#include "input.h"
|
||||
|
||||
MODULE_AUTHOR("Daniel Mack <daniel@caiaq.de>");
|
||||
MODULE_DESCRIPTION("caiaq USB audio, version 1.3.17");
|
||||
MODULE_DESCRIPTION("caiaq USB audio, version 1.3.18");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_SUPPORTED_DEVICE("{{Native Instruments, RigKontrol2},"
|
||||
"{Native Instruments, RigKontrol3},"
|
||||
|
@ -349,7 +349,9 @@ static void __devinit setup_card(struct snd_usb_caiaqdev *dev)
|
|||
log("Unable to set up control system (ret=%d)\n", ret);
|
||||
}
|
||||
|
||||
static int create_card(struct usb_device* usb_dev, struct snd_card **cardp)
|
||||
static int create_card(struct usb_device *usb_dev,
|
||||
struct usb_interface *intf,
|
||||
struct snd_card **cardp)
|
||||
{
|
||||
int devnum;
|
||||
int err;
|
||||
|
@ -374,7 +376,7 @@ static int create_card(struct usb_device* usb_dev, struct snd_card **cardp)
|
|||
dev->chip.usb_id = USB_ID(le16_to_cpu(usb_dev->descriptor.idVendor),
|
||||
le16_to_cpu(usb_dev->descriptor.idProduct));
|
||||
spin_lock_init(&dev->spinlock);
|
||||
snd_card_set_dev(card, &usb_dev->dev);
|
||||
snd_card_set_dev(card, &intf->dev);
|
||||
|
||||
*cardp = card;
|
||||
return 0;
|
||||
|
@ -461,7 +463,7 @@ static int __devinit snd_probe(struct usb_interface *intf,
|
|||
struct snd_card *card;
|
||||
struct usb_device *device = interface_to_usbdev(intf);
|
||||
|
||||
ret = create_card(device, &card);
|
||||
ret = create_card(device, intf, &card);
|
||||
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
|
|
@ -514,7 +514,6 @@ static int usx2y_create_card(struct usb_device *device, struct snd_card **cardp)
|
|||
US122L(card)->chip.dev->bus->busnum,
|
||||
US122L(card)->chip.dev->devnum
|
||||
);
|
||||
snd_card_set_dev(card, &device->dev);
|
||||
*cardp = card;
|
||||
return 0;
|
||||
}
|
||||
|
@ -531,6 +530,7 @@ static int us122l_usb_probe(struct usb_interface *intf,
|
|||
if (err < 0)
|
||||
return err;
|
||||
|
||||
snd_card_set_dev(card, &intf->dev);
|
||||
if (!us122l_create_card(card)) {
|
||||
snd_card_free(card);
|
||||
return -EINVAL;
|
||||
|
|
|
@ -364,7 +364,6 @@ static int usX2Y_create_card(struct usb_device *device, struct snd_card **cardp)
|
|||
0,//us428(card)->usbmidi.ifnum,
|
||||
usX2Y(card)->chip.dev->bus->busnum, usX2Y(card)->chip.dev->devnum
|
||||
);
|
||||
snd_card_set_dev(card, &device->dev);
|
||||
*cardp = card;
|
||||
return 0;
|
||||
}
|
||||
|
@ -388,6 +387,7 @@ static int usX2Y_usb_probe(struct usb_device *device,
|
|||
err = usX2Y_create_card(device, &card);
|
||||
if (err < 0)
|
||||
return err;
|
||||
snd_card_set_dev(card, &intf->dev);
|
||||
if ((err = usX2Y_hwdep_new(card, device)) < 0 ||
|
||||
(err = snd_card_register(card)) < 0) {
|
||||
snd_card_free(card);
|
||||
|
|
Loading…
Reference in a new issue