Commit 5a2e73b2 authored by Linus Torvalds's avatar Linus Torvalds

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
  ...
parents 9dbbe3cf 0ae3aba2
/* /*
* 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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 { ...@@ -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; ...@@ -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, ...@@ -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);
......
/* /*
* 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, ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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[] = { ...@@ -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[] = { ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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 @@ ...@@ -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 ...@@ -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) ...@@ -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 ...@@ -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, ...@@ -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 = { ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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 @@ ...@@ -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[] = { ...@@ -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, ...@@ -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 = { ...@@ -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[] = { ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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/ ...@@ -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 @@ int sst_byt_dsp_init(struct device *dev, struct sst_pdata *pdata) ...@@ -759,7 +759,6 @@ int sst_byt_dsp_init(struct device *dev, struct sst_pdata *pdata)
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 @@ int sst_hsw_dsp_init(struct device *dev, struct sst_pdata *pdata) ...@@ -2201,7 +2201,6 @@ int sst_hsw_dsp_init(struct device *dev, struct sst_pdata *pdata)
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, ...@@ -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) ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment