mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-24 12:44:11 +08:00
sound fixes for 4.1-rc2
One nice fix is Peter's patch to make the old good SB Audigy PCI to work with 32bit DMA instead of 31bit. This allows the MIDI synth running on modern machines again. Along with it, a few fixes for emu10k1 have merged. In ASoC side, there is one fix in the common code, but it's just trivial additions of static inline functions for CONFIG_PM=n. The rest are various device-specific small fixes. Last but not least, a few HD-audio fixes are included, as usual, too. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAABCAAGBQJVQnLAAAoJEGwxgFQ9KSmkVFUQALdopBcnUofyIYk2juS9HWoM tpQKg6sDcFCpB89/iukJXYnDHesExIsUeINjs+oxbcEyGZUGRZhAmKz/VkKbTEtv aRKq6o7DJAnUBwDPVBvE5lFM7fWrydPwgZ/OVoh4a8nIIGaklDm2jHb6mspnPSH7 W1kylVHJUW3/GozzF4QM3iWbfsI2ikqwV9TdcC64xdEwEKrKXsjpArOeQc6GIsD3 nOVh00kA+XwjbegwRnsrO8pjVNKg7VvEXxKK+THj1eJjxRsNS0FTHk0Qk9imc04g ztT4a8T2EtKmQJfv1B+g/ONFK2SWo9UvB8O3q2UN0PdT6DEoAd85B6vnsWHbF8fd 9ktzCwiANVlcZZtRf8rAYAK5r0S5vNrXNRCga6dWzHJIh8mqMPqu8ZzcqMXx8Usg Ou7dHKjmzqvMP6y3HkU9MDK95xWHLU/fSzjMkyIpmkal/Ut8Xzmra+e6NMykYOTH FjJNNIH+u++joorOQKu1W34uNP9oqa3MSDALvfs8oqzffiKaNNK/spJ8glJY2N4M Pe9d5pKXyAptGtzQculDaM7UUB9+6zvHhXEN6jAT8I6NmKgGOXK/KKvgPRcikIBs AMoSrn9iUpadV07CxwxUa9mkHrxyg6dIBYYEO9qMwWxeMQ05QQ8GDgbqUarytptq LvKSI+poAjvaEe79Ik5+ =Ao64 -----END PGP SIGNATURE----- Merge tag 'sound-4.1-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "One nice fix is Peter's patch to make the old good SB Audigy PCI to work with 32bit DMA instead of 31bit. This allows the MIDI synth running on modern machines again. Along with it, a few fixes for emu10k1 have merged. In ASoC side, there is one fix in the common code, but it's just trivial additions of static inline functions for CONFIG_PM=n. The rest are various device-specific small fixes. Last but not least, a few HD-audio fixes are included, as usual, too" * tag 'sound-4.1-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (23 commits) ASoC: rt5677: fixed wrong DMIC ref clock ALSA: emu10k1: Emu10k2 32 bit DMA mode ALSA: emux: Fix mutex deadlock in OSS emulation ASoC: Update email-id of Rajeev Kumar ASoC: rt5645: Fix mask for setting RT5645_DMIC_2_DP_GPIO12 bit ALSA: hda - Fix missing va_end() call in snd_hda_codec_pcm_new() ALSA: emux: Fix mutex deadlock at unloading ALSA: emu10k1: Fix card shortname string buffer overflow ALSA: hda - Add mute-LED mode control to Thinkpad ALSA: hda - Fix mute-LED fixed mode ALSA: hda - Fix click noise at start on Dell XPS13 ASoC: rt5645: Add ACPI match ID ASoC: rt5677: add register patch for PLL ASoC: Intel: fix the makefile for atom code ASoC: dapm: Enable autodisable on SOC_DAPM_SINGLE_TLV_AUTODISABLE ASoC: add static inline funcs to fix a compiling issue ASoC: Intel: sst_byt: remove kfree for memory allocated with devm_kzalloc ASoC: samsung: s3c24xx-i2s: Fix return value check in s3c24xx_iis_dev_probe() ASoC: tfa9879: Fix return value check in tfa9879_i2c_probe() ASoC: fsl_ssi: Fix platform_get_irq() error handling ...
This commit is contained in:
commit
5a2e73b281
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (ST) 2012 Rajeev Kumar (rajeev-dlh.kumar@st.com)
|
* Copyright (ST) 2012 Rajeev Kumar (rajeevkumar.linux@gmail.com)
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -41,7 +41,8 @@
|
|||||||
|
|
||||||
#define EMUPAGESIZE 4096
|
#define EMUPAGESIZE 4096
|
||||||
#define MAXREQVOICES 8
|
#define MAXREQVOICES 8
|
||||||
#define MAXPAGES 8192
|
#define MAXPAGES0 4096 /* 32 bit mode */
|
||||||
|
#define MAXPAGES1 8192 /* 31 bit mode */
|
||||||
#define RESERVED 0
|
#define RESERVED 0
|
||||||
#define NUM_MIDI 16
|
#define NUM_MIDI 16
|
||||||
#define NUM_G 64 /* use all channels */
|
#define NUM_G 64 /* use all channels */
|
||||||
@ -50,8 +51,7 @@
|
|||||||
|
|
||||||
/* FIXME? - according to the OSS driver the EMU10K1 needs a 29 bit DMA mask */
|
/* FIXME? - according to the OSS driver the EMU10K1 needs a 29 bit DMA mask */
|
||||||
#define EMU10K1_DMA_MASK 0x7fffffffUL /* 31bit */
|
#define EMU10K1_DMA_MASK 0x7fffffffUL /* 31bit */
|
||||||
#define AUDIGY_DMA_MASK 0x7fffffffUL /* 31bit FIXME - 32 should work? */
|
#define AUDIGY_DMA_MASK 0xffffffffUL /* 32bit mode */
|
||||||
/* See ALSA bug #1276 - rlrevell */
|
|
||||||
|
|
||||||
#define TMEMSIZE 256*1024
|
#define TMEMSIZE 256*1024
|
||||||
#define TMEMSIZEREG 4
|
#define TMEMSIZEREG 4
|
||||||
@ -466,8 +466,11 @@
|
|||||||
|
|
||||||
#define MAPB 0x0d /* Cache map B */
|
#define MAPB 0x0d /* Cache map B */
|
||||||
|
|
||||||
#define MAP_PTE_MASK 0xffffe000 /* The 19 MSBs of the PTE indexed by the PTI */
|
#define MAP_PTE_MASK0 0xfffff000 /* The 20 MSBs of the PTE indexed by the PTI */
|
||||||
#define MAP_PTI_MASK 0x00001fff /* The 13 bit index to one of the 8192 PTE dwords */
|
#define MAP_PTI_MASK0 0x00000fff /* The 12 bit index to one of the 4096 PTE dwords */
|
||||||
|
|
||||||
|
#define MAP_PTE_MASK1 0xffffe000 /* The 19 MSBs of the PTE indexed by the PTI */
|
||||||
|
#define MAP_PTI_MASK1 0x00001fff /* The 13 bit index to one of the 8192 PTE dwords */
|
||||||
|
|
||||||
/* 0x0e, 0x0f: Not used */
|
/* 0x0e, 0x0f: Not used */
|
||||||
|
|
||||||
@ -1704,6 +1707,7 @@ struct snd_emu10k1 {
|
|||||||
unsigned short model; /* subsystem id */
|
unsigned short model; /* subsystem id */
|
||||||
unsigned int card_type; /* EMU10K1_CARD_* */
|
unsigned int card_type; /* EMU10K1_CARD_* */
|
||||||
unsigned int ecard_ctrl; /* ecard control bits */
|
unsigned int ecard_ctrl; /* ecard control bits */
|
||||||
|
unsigned int address_mode; /* address mode */
|
||||||
unsigned long dma_mask; /* PCI DMA mask */
|
unsigned long dma_mask; /* PCI DMA mask */
|
||||||
unsigned int delay_pcm_irq; /* in samples */
|
unsigned int delay_pcm_irq; /* in samples */
|
||||||
int max_cache_pages; /* max memory size / PAGE_SIZE */
|
int max_cache_pages; /* max memory size / PAGE_SIZE */
|
||||||
|
@ -287,7 +287,7 @@ struct device;
|
|||||||
.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | SNDRV_CTL_ELEM_ACCESS_READWRITE,\
|
.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | SNDRV_CTL_ELEM_ACCESS_READWRITE,\
|
||||||
.tlv.p = (tlv_array), \
|
.tlv.p = (tlv_array), \
|
||||||
.get = snd_soc_dapm_get_volsw, .put = snd_soc_dapm_put_volsw, \
|
.get = snd_soc_dapm_get_volsw, .put = snd_soc_dapm_put_volsw, \
|
||||||
.private_value = SOC_SINGLE_VALUE(reg, shift, max, invert, 0) }
|
.private_value = SOC_SINGLE_VALUE(reg, shift, max, invert, 1) }
|
||||||
#define SOC_DAPM_SINGLE_TLV_VIRT(xname, max, tlv_array) \
|
#define SOC_DAPM_SINGLE_TLV_VIRT(xname, max, tlv_array) \
|
||||||
SOC_DAPM_SINGLE(xname, SND_SOC_NOPM, 0, max, 0, tlv_array)
|
SOC_DAPM_SINGLE(xname, SND_SOC_NOPM, 0, max, 0, tlv_array)
|
||||||
#define SOC_DAPM_ENUM(xname, xenum) \
|
#define SOC_DAPM_ENUM(xname, xenum) \
|
||||||
|
@ -387,8 +387,20 @@ int snd_soc_codec_set_pll(struct snd_soc_codec *codec, int pll_id, int source,
|
|||||||
int snd_soc_register_card(struct snd_soc_card *card);
|
int snd_soc_register_card(struct snd_soc_card *card);
|
||||||
int snd_soc_unregister_card(struct snd_soc_card *card);
|
int snd_soc_unregister_card(struct snd_soc_card *card);
|
||||||
int devm_snd_soc_register_card(struct device *dev, struct snd_soc_card *card);
|
int devm_snd_soc_register_card(struct device *dev, struct snd_soc_card *card);
|
||||||
|
#ifdef CONFIG_PM_SLEEP
|
||||||
int snd_soc_suspend(struct device *dev);
|
int snd_soc_suspend(struct device *dev);
|
||||||
int snd_soc_resume(struct device *dev);
|
int snd_soc_resume(struct device *dev);
|
||||||
|
#else
|
||||||
|
static inline int snd_soc_suspend(struct device *dev)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int snd_soc_resume(struct device *dev)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
int snd_soc_poweroff(struct device *dev);
|
int snd_soc_poweroff(struct device *dev);
|
||||||
int snd_soc_register_platform(struct device *dev,
|
int snd_soc_register_platform(struct device *dev,
|
||||||
const struct snd_soc_platform_driver *platform_drv);
|
const struct snd_soc_platform_driver *platform_drv);
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* linux/spear_dma.h
|
* linux/spear_dma.h
|
||||||
*
|
*
|
||||||
* Copyright (ST) 2012 Rajeev Kumar (rajeev-dlh.kumar@st.com)
|
* Copyright (ST) 2012 Rajeev Kumar (rajeevkumar.linux@gmail.com)
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -183,8 +183,10 @@ static int snd_card_emu10k1_probe(struct pci_dev *pci,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
strcpy(card->driver, emu->card_capabilities->driver);
|
strlcpy(card->driver, emu->card_capabilities->driver,
|
||||||
strcpy(card->shortname, emu->card_capabilities->name);
|
sizeof(card->driver));
|
||||||
|
strlcpy(card->shortname, emu->card_capabilities->name,
|
||||||
|
sizeof(card->shortname));
|
||||||
snprintf(card->longname, sizeof(card->longname),
|
snprintf(card->longname, sizeof(card->longname),
|
||||||
"%s (rev.%d, serial:0x%x) at 0x%lx, irq %i",
|
"%s (rev.%d, serial:0x%x) at 0x%lx, irq %i",
|
||||||
card->shortname, emu->revision, emu->serial, emu->port, emu->irq);
|
card->shortname, emu->revision, emu->serial, emu->port, emu->irq);
|
||||||
|
@ -415,7 +415,7 @@ start_voice(struct snd_emux_voice *vp)
|
|||||||
snd_emu10k1_ptr_write(hw, Z2, ch, 0);
|
snd_emu10k1_ptr_write(hw, Z2, ch, 0);
|
||||||
|
|
||||||
/* invalidate maps */
|
/* invalidate maps */
|
||||||
temp = (hw->silent_page.addr << 1) | MAP_PTI_MASK;
|
temp = (hw->silent_page.addr << hw->address_mode) | (hw->address_mode ? MAP_PTI_MASK1 : MAP_PTI_MASK0);
|
||||||
snd_emu10k1_ptr_write(hw, MAPA, ch, temp);
|
snd_emu10k1_ptr_write(hw, MAPA, ch, temp);
|
||||||
snd_emu10k1_ptr_write(hw, MAPB, ch, temp);
|
snd_emu10k1_ptr_write(hw, MAPB, ch, temp);
|
||||||
#if 0
|
#if 0
|
||||||
@ -436,7 +436,7 @@ start_voice(struct snd_emux_voice *vp)
|
|||||||
snd_emu10k1_ptr_write(hw, CDF, ch, sample);
|
snd_emu10k1_ptr_write(hw, CDF, ch, sample);
|
||||||
|
|
||||||
/* invalidate maps */
|
/* invalidate maps */
|
||||||
temp = ((unsigned int)hw->silent_page.addr << 1) | MAP_PTI_MASK;
|
temp = ((unsigned int)hw->silent_page.addr << hw_address_mode) | (hw->address_mode ? MAP_PTI_MASK1 : MAP_PTI_MASK0);
|
||||||
snd_emu10k1_ptr_write(hw, MAPA, ch, temp);
|
snd_emu10k1_ptr_write(hw, MAPA, ch, temp);
|
||||||
snd_emu10k1_ptr_write(hw, MAPB, ch, temp);
|
snd_emu10k1_ptr_write(hw, MAPB, ch, temp);
|
||||||
|
|
||||||
|
@ -282,7 +282,7 @@ static int snd_emu10k1_init(struct snd_emu10k1 *emu, int enable_ir, int resume)
|
|||||||
snd_emu10k1_ptr_write(emu, TCB, 0, 0); /* taken from original driver */
|
snd_emu10k1_ptr_write(emu, TCB, 0, 0); /* taken from original driver */
|
||||||
snd_emu10k1_ptr_write(emu, TCBS, 0, 4); /* taken from original driver */
|
snd_emu10k1_ptr_write(emu, TCBS, 0, 4); /* taken from original driver */
|
||||||
|
|
||||||
silent_page = (emu->silent_page.addr << 1) | MAP_PTI_MASK;
|
silent_page = (emu->silent_page.addr << emu->address_mode) | (emu->address_mode ? MAP_PTI_MASK1 : MAP_PTI_MASK0);
|
||||||
for (ch = 0; ch < NUM_G; ch++) {
|
for (ch = 0; ch < NUM_G; ch++) {
|
||||||
snd_emu10k1_ptr_write(emu, MAPA, ch, silent_page);
|
snd_emu10k1_ptr_write(emu, MAPA, ch, silent_page);
|
||||||
snd_emu10k1_ptr_write(emu, MAPB, ch, silent_page);
|
snd_emu10k1_ptr_write(emu, MAPB, ch, silent_page);
|
||||||
@ -348,6 +348,11 @@ static int snd_emu10k1_init(struct snd_emu10k1 *emu, int enable_ir, int resume)
|
|||||||
outl(reg | A_IOCFG_GPOUT0, emu->port + A_IOCFG);
|
outl(reg | A_IOCFG_GPOUT0, emu->port + A_IOCFG);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (emu->address_mode == 0) {
|
||||||
|
/* use 16M in 4G */
|
||||||
|
outl(inl(emu->port + HCFG) | HCFG_EXPANDED_MEM, emu->port + HCFG);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1446,7 +1451,7 @@ static struct snd_emu_chip_details emu_chip_details[] = {
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
{.vendor = 0x1102, .device = 0x0008, .subsystem = 0x20011102,
|
{.vendor = 0x1102, .device = 0x0008, .subsystem = 0x20011102,
|
||||||
.driver = "Audigy2", .name = "SB Audigy 2 ZS Notebook [SB0530]",
|
.driver = "Audigy2", .name = "Audigy 2 ZS Notebook [SB0530]",
|
||||||
.id = "Audigy2",
|
.id = "Audigy2",
|
||||||
.emu10k2_chip = 1,
|
.emu10k2_chip = 1,
|
||||||
.ca0108_chip = 1,
|
.ca0108_chip = 1,
|
||||||
@ -1596,7 +1601,7 @@ static struct snd_emu_chip_details emu_chip_details[] = {
|
|||||||
.adc_1361t = 1, /* 24 bit capture instead of 16bit */
|
.adc_1361t = 1, /* 24 bit capture instead of 16bit */
|
||||||
.ac97_chip = 1} ,
|
.ac97_chip = 1} ,
|
||||||
{.vendor = 0x1102, .device = 0x0004, .subsystem = 0x10051102,
|
{.vendor = 0x1102, .device = 0x0004, .subsystem = 0x10051102,
|
||||||
.driver = "Audigy2", .name = "SB Audigy 2 Platinum EX [SB0280]",
|
.driver = "Audigy2", .name = "Audigy 2 Platinum EX [SB0280]",
|
||||||
.id = "Audigy2",
|
.id = "Audigy2",
|
||||||
.emu10k2_chip = 1,
|
.emu10k2_chip = 1,
|
||||||
.ca0102_chip = 1,
|
.ca0102_chip = 1,
|
||||||
@ -1902,8 +1907,10 @@ int snd_emu10k1_create(struct snd_card *card,
|
|||||||
|
|
||||||
is_audigy = emu->audigy = c->emu10k2_chip;
|
is_audigy = emu->audigy = c->emu10k2_chip;
|
||||||
|
|
||||||
|
/* set addressing mode */
|
||||||
|
emu->address_mode = is_audigy ? 0 : 1;
|
||||||
/* set the DMA transfer mask */
|
/* set the DMA transfer mask */
|
||||||
emu->dma_mask = is_audigy ? AUDIGY_DMA_MASK : EMU10K1_DMA_MASK;
|
emu->dma_mask = emu->address_mode ? EMU10K1_DMA_MASK : AUDIGY_DMA_MASK;
|
||||||
if (pci_set_dma_mask(pci, emu->dma_mask) < 0 ||
|
if (pci_set_dma_mask(pci, emu->dma_mask) < 0 ||
|
||||||
pci_set_consistent_dma_mask(pci, emu->dma_mask) < 0) {
|
pci_set_consistent_dma_mask(pci, emu->dma_mask) < 0) {
|
||||||
dev_err(card->dev,
|
dev_err(card->dev,
|
||||||
@ -1928,7 +1935,7 @@ int snd_emu10k1_create(struct snd_card *card,
|
|||||||
|
|
||||||
emu->max_cache_pages = max_cache_bytes >> PAGE_SHIFT;
|
emu->max_cache_pages = max_cache_bytes >> PAGE_SHIFT;
|
||||||
if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(pci),
|
if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(pci),
|
||||||
32 * 1024, &emu->ptb_pages) < 0) {
|
(emu->address_mode ? 32 : 16) * 1024, &emu->ptb_pages) < 0) {
|
||||||
err = -ENOMEM;
|
err = -ENOMEM;
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
@ -2027,8 +2034,8 @@ int snd_emu10k1_create(struct snd_card *card,
|
|||||||
|
|
||||||
/* Clear silent pages and set up pointers */
|
/* Clear silent pages and set up pointers */
|
||||||
memset(emu->silent_page.area, 0, PAGE_SIZE);
|
memset(emu->silent_page.area, 0, PAGE_SIZE);
|
||||||
silent_page = emu->silent_page.addr << 1;
|
silent_page = emu->silent_page.addr << emu->address_mode;
|
||||||
for (idx = 0; idx < MAXPAGES; idx++)
|
for (idx = 0; idx < (emu->address_mode ? MAXPAGES1 : MAXPAGES0); idx++)
|
||||||
((u32 *)emu->ptb_pages.area)[idx] = cpu_to_le32(silent_page | idx);
|
((u32 *)emu->ptb_pages.area)[idx] = cpu_to_le32(silent_page | idx);
|
||||||
|
|
||||||
/* set up voice indices */
|
/* set up voice indices */
|
||||||
|
@ -380,7 +380,7 @@ static void snd_emu10k1_pcm_init_voice(struct snd_emu10k1 *emu,
|
|||||||
snd_emu10k1_ptr_write(emu, Z1, voice, 0);
|
snd_emu10k1_ptr_write(emu, Z1, voice, 0);
|
||||||
snd_emu10k1_ptr_write(emu, Z2, voice, 0);
|
snd_emu10k1_ptr_write(emu, Z2, voice, 0);
|
||||||
/* invalidate maps */
|
/* invalidate maps */
|
||||||
silent_page = ((unsigned int)emu->silent_page.addr << 1) | MAP_PTI_MASK;
|
silent_page = ((unsigned int)emu->silent_page.addr << emu->address_mode) | (emu->address_mode ? MAP_PTI_MASK1 : MAP_PTI_MASK0);
|
||||||
snd_emu10k1_ptr_write(emu, MAPA, voice, silent_page);
|
snd_emu10k1_ptr_write(emu, MAPA, voice, silent_page);
|
||||||
snd_emu10k1_ptr_write(emu, MAPB, voice, silent_page);
|
snd_emu10k1_ptr_write(emu, MAPB, voice, silent_page);
|
||||||
/* modulation envelope */
|
/* modulation envelope */
|
||||||
|
@ -34,10 +34,11 @@
|
|||||||
* aligned pages in others
|
* aligned pages in others
|
||||||
*/
|
*/
|
||||||
#define __set_ptb_entry(emu,page,addr) \
|
#define __set_ptb_entry(emu,page,addr) \
|
||||||
(((u32 *)(emu)->ptb_pages.area)[page] = cpu_to_le32(((addr) << 1) | (page)))
|
(((u32 *)(emu)->ptb_pages.area)[page] = cpu_to_le32(((addr) << (emu->address_mode)) | (page)))
|
||||||
|
|
||||||
#define UNIT_PAGES (PAGE_SIZE / EMUPAGESIZE)
|
#define UNIT_PAGES (PAGE_SIZE / EMUPAGESIZE)
|
||||||
#define MAX_ALIGN_PAGES (MAXPAGES / UNIT_PAGES)
|
#define MAX_ALIGN_PAGES0 (MAXPAGES0 / UNIT_PAGES)
|
||||||
|
#define MAX_ALIGN_PAGES1 (MAXPAGES1 / UNIT_PAGES)
|
||||||
/* get aligned page from offset address */
|
/* get aligned page from offset address */
|
||||||
#define get_aligned_page(offset) ((offset) >> PAGE_SHIFT)
|
#define get_aligned_page(offset) ((offset) >> PAGE_SHIFT)
|
||||||
/* get offset address from aligned page */
|
/* get offset address from aligned page */
|
||||||
@ -124,7 +125,7 @@ static int search_empty_map_area(struct snd_emu10k1 *emu, int npages, struct lis
|
|||||||
}
|
}
|
||||||
page = blk->mapped_page + blk->pages;
|
page = blk->mapped_page + blk->pages;
|
||||||
}
|
}
|
||||||
size = MAX_ALIGN_PAGES - page;
|
size = (emu->address_mode ? MAX_ALIGN_PAGES1 : MAX_ALIGN_PAGES0) - page;
|
||||||
if (size >= max_size) {
|
if (size >= max_size) {
|
||||||
*nextp = pos;
|
*nextp = pos;
|
||||||
return page;
|
return page;
|
||||||
@ -181,7 +182,7 @@ static int unmap_memblk(struct snd_emu10k1 *emu, struct snd_emu10k1_memblk *blk)
|
|||||||
q = get_emu10k1_memblk(p, mapped_link);
|
q = get_emu10k1_memblk(p, mapped_link);
|
||||||
end_page = q->mapped_page;
|
end_page = q->mapped_page;
|
||||||
} else
|
} else
|
||||||
end_page = MAX_ALIGN_PAGES;
|
end_page = (emu->address_mode ? MAX_ALIGN_PAGES1 : MAX_ALIGN_PAGES0);
|
||||||
|
|
||||||
/* remove links */
|
/* remove links */
|
||||||
list_del(&blk->mapped_link);
|
list_del(&blk->mapped_link);
|
||||||
@ -307,7 +308,7 @@ snd_emu10k1_alloc_pages(struct snd_emu10k1 *emu, struct snd_pcm_substream *subst
|
|||||||
if (snd_BUG_ON(!emu))
|
if (snd_BUG_ON(!emu))
|
||||||
return NULL;
|
return NULL;
|
||||||
if (snd_BUG_ON(runtime->dma_bytes <= 0 ||
|
if (snd_BUG_ON(runtime->dma_bytes <= 0 ||
|
||||||
runtime->dma_bytes >= MAXPAGES * EMUPAGESIZE))
|
runtime->dma_bytes >= (emu->address_mode ? MAXPAGES1 : MAXPAGES0) * EMUPAGESIZE))
|
||||||
return NULL;
|
return NULL;
|
||||||
hdr = emu->memhdr;
|
hdr = emu->memhdr;
|
||||||
if (snd_BUG_ON(!hdr))
|
if (snd_BUG_ON(!hdr))
|
||||||
|
@ -873,14 +873,15 @@ struct hda_pcm *snd_hda_codec_pcm_new(struct hda_codec *codec,
|
|||||||
struct hda_pcm *pcm;
|
struct hda_pcm *pcm;
|
||||||
va_list args;
|
va_list args;
|
||||||
|
|
||||||
va_start(args, fmt);
|
|
||||||
pcm = kzalloc(sizeof(*pcm), GFP_KERNEL);
|
pcm = kzalloc(sizeof(*pcm), GFP_KERNEL);
|
||||||
if (!pcm)
|
if (!pcm)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
pcm->codec = codec;
|
pcm->codec = codec;
|
||||||
kref_init(&pcm->kref);
|
kref_init(&pcm->kref);
|
||||||
|
va_start(args, fmt);
|
||||||
pcm->name = kvasprintf(GFP_KERNEL, fmt, args);
|
pcm->name = kvasprintf(GFP_KERNEL, fmt, args);
|
||||||
|
va_end(args);
|
||||||
if (!pcm->name) {
|
if (!pcm->name) {
|
||||||
kfree(pcm);
|
kfree(pcm);
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -2082,6 +2083,16 @@ static struct snd_kcontrol_new vmaster_mute_mode = {
|
|||||||
.put = vmaster_mute_mode_put,
|
.put = vmaster_mute_mode_put,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* meta hook to call each driver's vmaster hook */
|
||||||
|
static void vmaster_hook(void *private_data, int enabled)
|
||||||
|
{
|
||||||
|
struct hda_vmaster_mute_hook *hook = private_data;
|
||||||
|
|
||||||
|
if (hook->mute_mode != HDA_VMUTE_FOLLOW_MASTER)
|
||||||
|
enabled = hook->mute_mode;
|
||||||
|
hook->hook(hook->codec, enabled);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* snd_hda_add_vmaster_hook - Add a vmaster hook for mute-LED
|
* snd_hda_add_vmaster_hook - Add a vmaster hook for mute-LED
|
||||||
* @codec: the HDA codec
|
* @codec: the HDA codec
|
||||||
@ -2100,9 +2111,9 @@ int snd_hda_add_vmaster_hook(struct hda_codec *codec,
|
|||||||
|
|
||||||
if (!hook->hook || !hook->sw_kctl)
|
if (!hook->hook || !hook->sw_kctl)
|
||||||
return 0;
|
return 0;
|
||||||
snd_ctl_add_vmaster_hook(hook->sw_kctl, hook->hook, codec);
|
|
||||||
hook->codec = codec;
|
hook->codec = codec;
|
||||||
hook->mute_mode = HDA_VMUTE_FOLLOW_MASTER;
|
hook->mute_mode = HDA_VMUTE_FOLLOW_MASTER;
|
||||||
|
snd_ctl_add_vmaster_hook(hook->sw_kctl, vmaster_hook, hook);
|
||||||
if (!expose_enum_ctl)
|
if (!expose_enum_ctl)
|
||||||
return 0;
|
return 0;
|
||||||
kctl = snd_ctl_new1(&vmaster_mute_mode, hook);
|
kctl = snd_ctl_new1(&vmaster_mute_mode, hook);
|
||||||
@ -2128,14 +2139,7 @@ void snd_hda_sync_vmaster_hook(struct hda_vmaster_mute_hook *hook)
|
|||||||
*/
|
*/
|
||||||
if (hook->codec->bus->shutdown)
|
if (hook->codec->bus->shutdown)
|
||||||
return;
|
return;
|
||||||
switch (hook->mute_mode) {
|
snd_ctl_sync_vmaster_hook(hook->sw_kctl);
|
||||||
case HDA_VMUTE_FOLLOW_MASTER:
|
|
||||||
snd_ctl_sync_vmaster_hook(hook->sw_kctl);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
hook->hook(hook->codec, hook->mute_mode);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(snd_hda_sync_vmaster_hook);
|
EXPORT_SYMBOL_GPL(snd_hda_sync_vmaster_hook);
|
||||||
|
|
||||||
|
@ -3259,7 +3259,8 @@ static int create_input_ctls(struct hda_codec *codec)
|
|||||||
val = PIN_IN;
|
val = PIN_IN;
|
||||||
if (cfg->inputs[i].type == AUTO_PIN_MIC)
|
if (cfg->inputs[i].type == AUTO_PIN_MIC)
|
||||||
val |= snd_hda_get_default_vref(codec, pin);
|
val |= snd_hda_get_default_vref(codec, pin);
|
||||||
if (pin != spec->hp_mic_pin)
|
if (pin != spec->hp_mic_pin &&
|
||||||
|
!snd_hda_codec_get_pin_target(codec, pin))
|
||||||
set_pin_target(codec, pin, val, false);
|
set_pin_target(codec, pin, val, false);
|
||||||
|
|
||||||
if (mixer) {
|
if (mixer) {
|
||||||
|
@ -4190,11 +4190,18 @@ static void alc_shutup_dell_xps13(struct hda_codec *codec)
|
|||||||
static void alc_fixup_dell_xps13(struct hda_codec *codec,
|
static void alc_fixup_dell_xps13(struct hda_codec *codec,
|
||||||
const struct hda_fixup *fix, int action)
|
const struct hda_fixup *fix, int action)
|
||||||
{
|
{
|
||||||
if (action == HDA_FIXUP_ACT_PROBE) {
|
struct alc_spec *spec = codec->spec;
|
||||||
struct alc_spec *spec = codec->spec;
|
struct hda_input_mux *imux = &spec->gen.input_mux;
|
||||||
struct hda_input_mux *imux = &spec->gen.input_mux;
|
int i;
|
||||||
int i;
|
|
||||||
|
|
||||||
|
switch (action) {
|
||||||
|
case HDA_FIXUP_ACT_PRE_PROBE:
|
||||||
|
/* mic pin 0x19 must be initialized with Vref Hi-Z, otherwise
|
||||||
|
* it causes a click noise at start up
|
||||||
|
*/
|
||||||
|
snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
|
||||||
|
break;
|
||||||
|
case HDA_FIXUP_ACT_PROBE:
|
||||||
spec->shutup = alc_shutup_dell_xps13;
|
spec->shutup = alc_shutup_dell_xps13;
|
||||||
|
|
||||||
/* Make the internal mic the default input source. */
|
/* Make the internal mic the default input source. */
|
||||||
@ -4204,6 +4211,7 @@ static void alc_fixup_dell_xps13(struct hda_codec *codec,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -72,6 +72,7 @@ static void hda_fixup_thinkpad_acpi(struct hda_codec *codec,
|
|||||||
if (led_set_func(TPACPI_LED_MUTE, false) >= 0) {
|
if (led_set_func(TPACPI_LED_MUTE, false) >= 0) {
|
||||||
old_vmaster_hook = spec->vmaster_mute.hook;
|
old_vmaster_hook = spec->vmaster_mute.hook;
|
||||||
spec->vmaster_mute.hook = update_tpacpi_mute_led;
|
spec->vmaster_mute.hook = update_tpacpi_mute_led;
|
||||||
|
spec->vmaster_mute_enum = 1;
|
||||||
removefunc = false;
|
removefunc = false;
|
||||||
}
|
}
|
||||||
if (led_set_func(TPACPI_LED_MICMUTE, false) >= 0) {
|
if (led_set_func(TPACPI_LED_MICMUTE, false) >= 0) {
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/spi/spi.h>
|
#include <linux/spi/spi.h>
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
|
#include <linux/acpi.h>
|
||||||
#include <sound/core.h>
|
#include <sound/core.h>
|
||||||
#include <sound/pcm.h>
|
#include <sound/pcm.h>
|
||||||
#include <sound/pcm_params.h>
|
#include <sound/pcm_params.h>
|
||||||
@ -2656,6 +2657,15 @@ static const struct i2c_device_id rt5645_i2c_id[] = {
|
|||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(i2c, rt5645_i2c_id);
|
MODULE_DEVICE_TABLE(i2c, rt5645_i2c_id);
|
||||||
|
|
||||||
|
#ifdef CONFIG_ACPI
|
||||||
|
static struct acpi_device_id rt5645_acpi_match[] = {
|
||||||
|
{ "10EC5645", 0 },
|
||||||
|
{ "10EC5650", 0 },
|
||||||
|
{},
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(acpi, rt5645_acpi_match);
|
||||||
|
#endif
|
||||||
|
|
||||||
static int rt5645_i2c_probe(struct i2c_client *i2c,
|
static int rt5645_i2c_probe(struct i2c_client *i2c,
|
||||||
const struct i2c_device_id *id)
|
const struct i2c_device_id *id)
|
||||||
{
|
{
|
||||||
@ -2770,7 +2780,7 @@ static int rt5645_i2c_probe(struct i2c_client *i2c,
|
|||||||
|
|
||||||
case RT5645_DMIC_DATA_GPIO12:
|
case RT5645_DMIC_DATA_GPIO12:
|
||||||
regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1,
|
regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1,
|
||||||
RT5645_DMIC_1_DP_MASK, RT5645_DMIC_2_DP_GPIO12);
|
RT5645_DMIC_2_DP_MASK, RT5645_DMIC_2_DP_GPIO12);
|
||||||
regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1,
|
regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1,
|
||||||
RT5645_GP12_PIN_MASK,
|
RT5645_GP12_PIN_MASK,
|
||||||
RT5645_GP12_PIN_DMIC2_SDA);
|
RT5645_GP12_PIN_DMIC2_SDA);
|
||||||
@ -2872,6 +2882,7 @@ static struct i2c_driver rt5645_i2c_driver = {
|
|||||||
.driver = {
|
.driver = {
|
||||||
.name = "rt5645",
|
.name = "rt5645",
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
|
.acpi_match_table = ACPI_PTR(rt5645_acpi_match),
|
||||||
},
|
},
|
||||||
.probe = rt5645_i2c_probe,
|
.probe = rt5645_i2c_probe,
|
||||||
.remove = rt5645_i2c_remove,
|
.remove = rt5645_i2c_remove,
|
||||||
|
@ -62,6 +62,9 @@ static const struct reg_default init_list[] = {
|
|||||||
{RT5677_PR_BASE + 0x1e, 0x0000},
|
{RT5677_PR_BASE + 0x1e, 0x0000},
|
||||||
{RT5677_PR_BASE + 0x12, 0x0eaa},
|
{RT5677_PR_BASE + 0x12, 0x0eaa},
|
||||||
{RT5677_PR_BASE + 0x14, 0x018a},
|
{RT5677_PR_BASE + 0x14, 0x018a},
|
||||||
|
{RT5677_PR_BASE + 0x15, 0x0490},
|
||||||
|
{RT5677_PR_BASE + 0x38, 0x0f71},
|
||||||
|
{RT5677_PR_BASE + 0x39, 0x0f71},
|
||||||
};
|
};
|
||||||
#define RT5677_INIT_REG_LEN ARRAY_SIZE(init_list)
|
#define RT5677_INIT_REG_LEN ARRAY_SIZE(init_list)
|
||||||
|
|
||||||
@ -914,7 +917,7 @@ static int set_dmic_clk(struct snd_soc_dapm_widget *w,
|
|||||||
{
|
{
|
||||||
struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
|
struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
|
||||||
struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec);
|
struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec);
|
||||||
int idx = rl6231_calc_dmic_clk(rt5677->sysclk);
|
int idx = rl6231_calc_dmic_clk(rt5677->lrck[RT5677_AIF1] << 8);
|
||||||
|
|
||||||
if (idx < 0)
|
if (idx < 0)
|
||||||
dev_err(codec->dev, "Failed to set DMIC clock\n");
|
dev_err(codec->dev, "Failed to set DMIC clock\n");
|
||||||
|
@ -280,8 +280,8 @@ static int tfa9879_i2c_probe(struct i2c_client *i2c,
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
tfa9879 = devm_kzalloc(&i2c->dev, sizeof(*tfa9879), GFP_KERNEL);
|
tfa9879 = devm_kzalloc(&i2c->dev, sizeof(*tfa9879), GFP_KERNEL);
|
||||||
if (IS_ERR(tfa9879))
|
if (!tfa9879)
|
||||||
return PTR_ERR(tfa9879);
|
return -ENOMEM;
|
||||||
|
|
||||||
i2c_set_clientdata(i2c, tfa9879);
|
i2c_set_clientdata(i2c, tfa9879);
|
||||||
|
|
||||||
|
@ -1357,7 +1357,7 @@ static int fsl_ssi_probe(struct platform_device *pdev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ssi_private->irq = platform_get_irq(pdev, 0);
|
ssi_private->irq = platform_get_irq(pdev, 0);
|
||||||
if (!ssi_private->irq) {
|
if (ssi_private->irq < 0) {
|
||||||
dev_err(&pdev->dev, "no irq for node %s\n", pdev->name);
|
dev_err(&pdev->dev, "no irq for node %s\n", pdev->name);
|
||||||
return ssi_private->irq;
|
return ssi_private->irq;
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@ obj-$(CONFIG_SND_SOC_INTEL_SST) += common/
|
|||||||
# Platform Support
|
# Platform Support
|
||||||
obj-$(CONFIG_SND_SOC_INTEL_HASWELL) += haswell/
|
obj-$(CONFIG_SND_SOC_INTEL_HASWELL) += haswell/
|
||||||
obj-$(CONFIG_SND_SOC_INTEL_BAYTRAIL) += baytrail/
|
obj-$(CONFIG_SND_SOC_INTEL_BAYTRAIL) += baytrail/
|
||||||
obj-$(CONFIG_SND_SOC_INTEL_BAYTRAIL) += atom/
|
obj-$(CONFIG_SND_SST_MFLD_PLATFORM) += atom/
|
||||||
|
|
||||||
# Machine support
|
# Machine support
|
||||||
obj-$(CONFIG_SND_SOC_INTEL_SST) += boards/
|
obj-$(CONFIG_SND_SOC_INTEL_SST) += boards/
|
||||||
|
@ -759,7 +759,6 @@ fw_err:
|
|||||||
dsp_new_err:
|
dsp_new_err:
|
||||||
sst_ipc_fini(ipc);
|
sst_ipc_fini(ipc);
|
||||||
ipc_init_err:
|
ipc_init_err:
|
||||||
kfree(byt);
|
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
@ -2201,7 +2201,6 @@ dma_err:
|
|||||||
dsp_new_err:
|
dsp_new_err:
|
||||||
sst_ipc_fini(ipc);
|
sst_ipc_fini(ipc);
|
||||||
ipc_init_err:
|
ipc_init_err:
|
||||||
kfree(hsw);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(sst_hsw_dsp_init);
|
EXPORT_SYMBOL_GPL(sst_hsw_dsp_init);
|
||||||
|
@ -194,7 +194,7 @@ static int lpass_cpu_daiops_trigger(struct snd_pcm_substream *substream,
|
|||||||
int cmd, struct snd_soc_dai *dai)
|
int cmd, struct snd_soc_dai *dai)
|
||||||
{
|
{
|
||||||
struct lpass_data *drvdata = snd_soc_dai_get_drvdata(dai);
|
struct lpass_data *drvdata = snd_soc_dai_get_drvdata(dai);
|
||||||
int ret;
|
int ret = -EINVAL;
|
||||||
|
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case SNDRV_PCM_TRIGGER_START:
|
case SNDRV_PCM_TRIGGER_START:
|
||||||
|
@ -461,8 +461,8 @@ static int s3c24xx_iis_dev_probe(struct platform_device *pdev)
|
|||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
s3c24xx_i2s.regs = devm_ioremap_resource(&pdev->dev, res);
|
s3c24xx_i2s.regs = devm_ioremap_resource(&pdev->dev, res);
|
||||||
if (s3c24xx_i2s.regs == NULL)
|
if (IS_ERR(s3c24xx_i2s.regs))
|
||||||
return -ENXIO;
|
return PTR_ERR(s3c24xx_i2s.regs);
|
||||||
|
|
||||||
s3c24xx_i2s_pcm_stereo_out.dma_addr = res->start + S3C2410_IISFIFO;
|
s3c24xx_i2s_pcm_stereo_out.dma_addr = res->start + S3C2410_IISFIFO;
|
||||||
s3c24xx_i2s_pcm_stereo_in.dma_addr = res->start + S3C2410_IISFIFO;
|
s3c24xx_i2s_pcm_stereo_in.dma_addr = res->start + S3C2410_IISFIFO;
|
||||||
|
@ -156,6 +156,7 @@ static int rsnd_dmaen_init(struct rsnd_priv *priv, struct rsnd_dma *dma, int id,
|
|||||||
(void *)id);
|
(void *)id);
|
||||||
}
|
}
|
||||||
if (IS_ERR_OR_NULL(dmaen->chan)) {
|
if (IS_ERR_OR_NULL(dmaen->chan)) {
|
||||||
|
dmaen->chan = NULL;
|
||||||
dev_err(dev, "can't get dma channel\n");
|
dev_err(dev, "can't get dma channel\n");
|
||||||
goto rsnd_dma_channel_err;
|
goto rsnd_dma_channel_err;
|
||||||
}
|
}
|
||||||
|
@ -118,12 +118,8 @@ snd_emux_open_seq_oss(struct snd_seq_oss_arg *arg, void *closure)
|
|||||||
if (snd_BUG_ON(!arg || !emu))
|
if (snd_BUG_ON(!arg || !emu))
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
|
|
||||||
mutex_lock(&emu->register_mutex);
|
if (!snd_emux_inc_count(emu))
|
||||||
|
|
||||||
if (!snd_emux_inc_count(emu)) {
|
|
||||||
mutex_unlock(&emu->register_mutex);
|
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
}
|
|
||||||
|
|
||||||
memset(&callback, 0, sizeof(callback));
|
memset(&callback, 0, sizeof(callback));
|
||||||
callback.owner = THIS_MODULE;
|
callback.owner = THIS_MODULE;
|
||||||
@ -135,7 +131,6 @@ snd_emux_open_seq_oss(struct snd_seq_oss_arg *arg, void *closure)
|
|||||||
if (p == NULL) {
|
if (p == NULL) {
|
||||||
snd_printk(KERN_ERR "can't create port\n");
|
snd_printk(KERN_ERR "can't create port\n");
|
||||||
snd_emux_dec_count(emu);
|
snd_emux_dec_count(emu);
|
||||||
mutex_unlock(&emu->register_mutex);
|
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -148,8 +143,6 @@ snd_emux_open_seq_oss(struct snd_seq_oss_arg *arg, void *closure)
|
|||||||
reset_port_mode(p, arg->seq_mode);
|
reset_port_mode(p, arg->seq_mode);
|
||||||
|
|
||||||
snd_emux_reset_port(p);
|
snd_emux_reset_port(p);
|
||||||
|
|
||||||
mutex_unlock(&emu->register_mutex);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -195,13 +188,11 @@ snd_emux_close_seq_oss(struct snd_seq_oss_arg *arg)
|
|||||||
if (snd_BUG_ON(!emu))
|
if (snd_BUG_ON(!emu))
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
|
|
||||||
mutex_lock(&emu->register_mutex);
|
|
||||||
snd_emux_sounds_off_all(p);
|
snd_emux_sounds_off_all(p);
|
||||||
snd_soundfont_close_check(emu->sflist, SF_CLIENT_NO(p->chset.port));
|
snd_soundfont_close_check(emu->sflist, SF_CLIENT_NO(p->chset.port));
|
||||||
snd_seq_event_port_detach(p->chset.client, p->chset.port);
|
snd_seq_event_port_detach(p->chset.client, p->chset.port);
|
||||||
snd_emux_dec_count(emu);
|
snd_emux_dec_count(emu);
|
||||||
|
|
||||||
mutex_unlock(&emu->register_mutex);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -124,12 +124,10 @@ snd_emux_detach_seq(struct snd_emux *emu)
|
|||||||
if (emu->voices)
|
if (emu->voices)
|
||||||
snd_emux_terminate_all(emu);
|
snd_emux_terminate_all(emu);
|
||||||
|
|
||||||
mutex_lock(&emu->register_mutex);
|
|
||||||
if (emu->client >= 0) {
|
if (emu->client >= 0) {
|
||||||
snd_seq_delete_kernel_client(emu->client);
|
snd_seq_delete_kernel_client(emu->client);
|
||||||
emu->client = -1;
|
emu->client = -1;
|
||||||
}
|
}
|
||||||
mutex_unlock(&emu->register_mutex);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -269,8 +267,8 @@ snd_emux_event_input(struct snd_seq_event *ev, int direct, void *private_data,
|
|||||||
/*
|
/*
|
||||||
* increment usage count
|
* increment usage count
|
||||||
*/
|
*/
|
||||||
int
|
static int
|
||||||
snd_emux_inc_count(struct snd_emux *emu)
|
__snd_emux_inc_count(struct snd_emux *emu)
|
||||||
{
|
{
|
||||||
emu->used++;
|
emu->used++;
|
||||||
if (!try_module_get(emu->ops.owner))
|
if (!try_module_get(emu->ops.owner))
|
||||||
@ -284,12 +282,21 @@ snd_emux_inc_count(struct snd_emux *emu)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int snd_emux_inc_count(struct snd_emux *emu)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
mutex_lock(&emu->register_mutex);
|
||||||
|
ret = __snd_emux_inc_count(emu);
|
||||||
|
mutex_unlock(&emu->register_mutex);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* decrease usage count
|
* decrease usage count
|
||||||
*/
|
*/
|
||||||
void
|
static void
|
||||||
snd_emux_dec_count(struct snd_emux *emu)
|
__snd_emux_dec_count(struct snd_emux *emu)
|
||||||
{
|
{
|
||||||
module_put(emu->card->module);
|
module_put(emu->card->module);
|
||||||
emu->used--;
|
emu->used--;
|
||||||
@ -298,6 +305,12 @@ snd_emux_dec_count(struct snd_emux *emu)
|
|||||||
module_put(emu->ops.owner);
|
module_put(emu->ops.owner);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void snd_emux_dec_count(struct snd_emux *emu)
|
||||||
|
{
|
||||||
|
mutex_lock(&emu->register_mutex);
|
||||||
|
__snd_emux_dec_count(emu);
|
||||||
|
mutex_unlock(&emu->register_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Routine that is called upon a first use of a particular port
|
* Routine that is called upon a first use of a particular port
|
||||||
@ -317,7 +330,7 @@ snd_emux_use(void *private_data, struct snd_seq_port_subscribe *info)
|
|||||||
|
|
||||||
mutex_lock(&emu->register_mutex);
|
mutex_lock(&emu->register_mutex);
|
||||||
snd_emux_init_port(p);
|
snd_emux_init_port(p);
|
||||||
snd_emux_inc_count(emu);
|
__snd_emux_inc_count(emu);
|
||||||
mutex_unlock(&emu->register_mutex);
|
mutex_unlock(&emu->register_mutex);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -340,7 +353,7 @@ snd_emux_unuse(void *private_data, struct snd_seq_port_subscribe *info)
|
|||||||
|
|
||||||
mutex_lock(&emu->register_mutex);
|
mutex_lock(&emu->register_mutex);
|
||||||
snd_emux_sounds_off_all(p);
|
snd_emux_sounds_off_all(p);
|
||||||
snd_emux_dec_count(emu);
|
__snd_emux_dec_count(emu);
|
||||||
mutex_unlock(&emu->register_mutex);
|
mutex_unlock(&emu->register_mutex);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user