Commit f40759e7 authored by Linus Torvalds's avatar Linus Torvalds

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

Pull sound fixes from Takashi Iwai:
 "Most of changes are fairly small and driver-specific.

  A remaining regression fix for USB-audio sync pipe check, a fix for
  HD-audio power-up sequence, fixes for ASoC pxa-ssp compile issues, and
  bunch of ASoC codec and trivial fix patches."

* tag 'sound-3.5' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound:
  ALSA: 6fire: use NULL instead of 0 for pointer assignment
  ALSA: hda - Handle open while transitioning to D3.
  ALSA: snd-usb: make snd_usb_substream_capture_trigger static
  ALSA: snd-usb: fix sync pipe check
  ASoC: tegra+wm8903: turn of mic detect when card is removed
  ASoC: wm8996: Mark the CODEC as cache only when powering off on boot
  ASoC: wm8996: Move reset before the initial regulator disable
  ASoC: wm8996: Remove spurious regulator_bulk_free()
  ASoC: wm8904: Fix cache only management
  ASoC: wm8904: Fix GPIO and MICBIAS initialisation for regmap conversion
  ASoC: fix pxa-ssp compiling issue under mach-mmp
  ARM: MMP: add pxa910-ssp into ssp_id_table
parents 2fe8ac60 0b1d8e09
...@@ -193,6 +193,7 @@ static const struct platform_device_id ssp_id_table[] = { ...@@ -193,6 +193,7 @@ static const struct platform_device_id ssp_id_table[] = {
{ "pxa25x-nssp", PXA25x_NSSP }, { "pxa25x-nssp", PXA25x_NSSP },
{ "pxa27x-ssp", PXA27x_SSP }, { "pxa27x-ssp", PXA27x_SSP },
{ "pxa168-ssp", PXA168_SSP }, { "pxa168-ssp", PXA168_SSP },
{ "pxa910-ssp", PXA910_SSP },
{ }, { },
}; };
......
...@@ -160,7 +160,9 @@ enum pxa_ssp_type { ...@@ -160,7 +160,9 @@ enum pxa_ssp_type {
PXA25x_SSP, /* pxa 210, 250, 255, 26x */ PXA25x_SSP, /* pxa 210, 250, 255, 26x */
PXA25x_NSSP, /* pxa 255, 26x (including ASSP) */ PXA25x_NSSP, /* pxa 255, 26x (including ASSP) */
PXA27x_SSP, PXA27x_SSP,
PXA3xx_SSP,
PXA168_SSP, PXA168_SSP,
PXA910_SSP,
CE4100_SSP, CE4100_SSP,
}; };
......
...@@ -43,7 +43,7 @@ struct pxa2xx_spi_chip { ...@@ -43,7 +43,7 @@ struct pxa2xx_spi_chip {
void (*cs_control)(u32 command); void (*cs_control)(u32 command);
}; };
#ifdef CONFIG_ARCH_PXA #if defined(CONFIG_ARCH_PXA) || defined(CONFIG_ARCH_MMP)
#include <linux/clk.h> #include <linux/clk.h>
#include <mach/dma.h> #include <mach/dma.h>
......
...@@ -4393,20 +4393,19 @@ void snd_hda_update_power_acct(struct hda_codec *codec) ...@@ -4393,20 +4393,19 @@ void snd_hda_update_power_acct(struct hda_codec *codec)
codec->power_jiffies += delta; codec->power_jiffies += delta;
} }
/** /* Transition to powered up, if wait_power_down then wait for a pending
* snd_hda_power_up - Power-up the codec * transition to D3 to complete. A pending D3 transition is indicated
* @codec: HD-audio codec * with power_transition == -1. */
* static void __snd_hda_power_up(struct hda_codec *codec, bool wait_power_down)
* Increment the power-up counter and power up the hardware really when
* not turned on yet.
*/
void snd_hda_power_up(struct hda_codec *codec)
{ {
struct hda_bus *bus = codec->bus; struct hda_bus *bus = codec->bus;
spin_lock(&codec->power_lock); spin_lock(&codec->power_lock);
codec->power_count++; codec->power_count++;
if (codec->power_on || codec->power_transition > 0) { /* Return if power_on or transitioning to power_on, unless currently
* powering down. */
if ((codec->power_on || codec->power_transition > 0) &&
!(wait_power_down && codec->power_transition < 0)) {
spin_unlock(&codec->power_lock); spin_unlock(&codec->power_lock);
return; return;
} }
...@@ -4430,8 +4429,37 @@ void snd_hda_power_up(struct hda_codec *codec) ...@@ -4430,8 +4429,37 @@ void snd_hda_power_up(struct hda_codec *codec)
codec->power_transition = 0; codec->power_transition = 0;
spin_unlock(&codec->power_lock); spin_unlock(&codec->power_lock);
} }
/**
* snd_hda_power_up - Power-up the codec
* @codec: HD-audio codec
*
* Increment the power-up counter and power up the hardware really when
* not turned on yet.
*/
void snd_hda_power_up(struct hda_codec *codec)
{
__snd_hda_power_up(codec, false);
}
EXPORT_SYMBOL_HDA(snd_hda_power_up); EXPORT_SYMBOL_HDA(snd_hda_power_up);
/**
* snd_hda_power_up_d3wait - Power-up the codec after waiting for any pending
* D3 transition to complete. This differs from snd_hda_power_up() when
* power_transition == -1. snd_hda_power_up sees this case as a nop,
* snd_hda_power_up_d3wait waits for the D3 transition to complete then powers
* back up.
* @codec: HD-audio codec
*
* Cancel any power down operation hapenning on the work queue, then power up.
*/
void snd_hda_power_up_d3wait(struct hda_codec *codec)
{
/* This will cancel and wait for pending power_work to complete. */
__snd_hda_power_up(codec, true);
}
EXPORT_SYMBOL_HDA(snd_hda_power_up_d3wait);
#define power_save(codec) \ #define power_save(codec) \
((codec)->bus->power_save ? *(codec)->bus->power_save : 0) ((codec)->bus->power_save ? *(codec)->bus->power_save : 0)
......
...@@ -1056,10 +1056,12 @@ const char *snd_hda_get_jack_location(u32 cfg); ...@@ -1056,10 +1056,12 @@ const char *snd_hda_get_jack_location(u32 cfg);
*/ */
#ifdef CONFIG_SND_HDA_POWER_SAVE #ifdef CONFIG_SND_HDA_POWER_SAVE
void snd_hda_power_up(struct hda_codec *codec); void snd_hda_power_up(struct hda_codec *codec);
void snd_hda_power_up_d3wait(struct hda_codec *codec);
void snd_hda_power_down(struct hda_codec *codec); void snd_hda_power_down(struct hda_codec *codec);
void snd_hda_update_power_acct(struct hda_codec *codec); void snd_hda_update_power_acct(struct hda_codec *codec);
#else #else
static inline void snd_hda_power_up(struct hda_codec *codec) {} static inline void snd_hda_power_up(struct hda_codec *codec) {}
static inline void snd_hda_power_up_d3wait(struct hda_codec *codec) {}
static inline void snd_hda_power_down(struct hda_codec *codec) {} static inline void snd_hda_power_down(struct hda_codec *codec) {}
#endif #endif
......
...@@ -1766,7 +1766,7 @@ static int azx_pcm_open(struct snd_pcm_substream *substream) ...@@ -1766,7 +1766,7 @@ static int azx_pcm_open(struct snd_pcm_substream *substream)
buff_step); buff_step);
snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES, snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES,
buff_step); buff_step);
snd_hda_power_up(apcm->codec); snd_hda_power_up_d3wait(apcm->codec);
err = hinfo->ops.open(hinfo, apcm->codec, substream); err = hinfo->ops.open(hinfo, apcm->codec, substream);
if (err < 0) { if (err < 0) {
azx_release_device(azx_dev); azx_release_device(azx_dev);
......
...@@ -1863,6 +1863,7 @@ static int wm8904_set_bias_level(struct snd_soc_codec *codec, ...@@ -1863,6 +1863,7 @@ static int wm8904_set_bias_level(struct snd_soc_codec *codec,
return ret; return ret;
} }
regcache_cache_only(wm8904->regmap, false);
regcache_sync(wm8904->regmap); regcache_sync(wm8904->regmap);
/* Enable bias */ /* Enable bias */
...@@ -1899,14 +1900,8 @@ static int wm8904_set_bias_level(struct snd_soc_codec *codec, ...@@ -1899,14 +1900,8 @@ static int wm8904_set_bias_level(struct snd_soc_codec *codec,
snd_soc_update_bits(codec, WM8904_BIAS_CONTROL_0, snd_soc_update_bits(codec, WM8904_BIAS_CONTROL_0,
WM8904_BIAS_ENA, 0); WM8904_BIAS_ENA, 0);
#ifdef CONFIG_REGULATOR regcache_cache_only(wm8904->regmap, true);
/* Post 2.6.34 we will be able to get a callback when regcache_mark_dirty(wm8904->regmap);
* the regulators are disabled which we can use but
* for now just assume that the power will be cut if
* the regulator API is in use.
*/
codec->cache_sync = 1;
#endif
regulator_bulk_disable(ARRAY_SIZE(wm8904->supplies), regulator_bulk_disable(ARRAY_SIZE(wm8904->supplies),
wm8904->supplies); wm8904->supplies);
...@@ -2084,10 +2079,8 @@ static int wm8904_probe(struct snd_soc_codec *codec) ...@@ -2084,10 +2079,8 @@ static int wm8904_probe(struct snd_soc_codec *codec)
{ {
struct wm8904_priv *wm8904 = snd_soc_codec_get_drvdata(codec); struct wm8904_priv *wm8904 = snd_soc_codec_get_drvdata(codec);
struct wm8904_pdata *pdata = wm8904->pdata; struct wm8904_pdata *pdata = wm8904->pdata;
u16 *reg_cache = codec->reg_cache;
int ret, i; int ret, i;
codec->cache_sync = 1;
codec->control_data = wm8904->regmap; codec->control_data = wm8904->regmap;
switch (wm8904->devtype) { switch (wm8904->devtype) {
...@@ -2150,6 +2143,7 @@ static int wm8904_probe(struct snd_soc_codec *codec) ...@@ -2150,6 +2143,7 @@ static int wm8904_probe(struct snd_soc_codec *codec)
goto err_enable; goto err_enable;
} }
regcache_cache_only(wm8904->regmap, true);
/* Change some default settings - latch VU and enable ZC */ /* Change some default settings - latch VU and enable ZC */
snd_soc_update_bits(codec, WM8904_ADC_DIGITAL_VOLUME_LEFT, snd_soc_update_bits(codec, WM8904_ADC_DIGITAL_VOLUME_LEFT,
WM8904_ADC_VU, WM8904_ADC_VU); WM8904_ADC_VU, WM8904_ADC_VU);
...@@ -2180,14 +2174,18 @@ static int wm8904_probe(struct snd_soc_codec *codec) ...@@ -2180,14 +2174,18 @@ static int wm8904_probe(struct snd_soc_codec *codec)
if (!pdata->gpio_cfg[i]) if (!pdata->gpio_cfg[i])
continue; continue;
reg_cache[WM8904_GPIO_CONTROL_1 + i] regmap_update_bits(wm8904->regmap,
= pdata->gpio_cfg[i] & 0xffff; WM8904_GPIO_CONTROL_1 + i,
0xffff,
pdata->gpio_cfg[i]);
} }
/* Zero is the default value for these anyway */ /* Zero is the default value for these anyway */
for (i = 0; i < WM8904_MIC_REGS; i++) for (i = 0; i < WM8904_MIC_REGS; i++)
reg_cache[WM8904_MIC_BIAS_CONTROL_0 + i] regmap_update_bits(wm8904->regmap,
= pdata->mic_cfg[i]; WM8904_MIC_BIAS_CONTROL_0 + i,
0xffff,
pdata->mic_cfg[i]);
} }
/* Set Class W by default - this will be managed by the Class /* Set Class W by default - this will be managed by the Class
......
...@@ -2837,8 +2837,6 @@ static int wm8996_probe(struct snd_soc_codec *codec) ...@@ -2837,8 +2837,6 @@ static int wm8996_probe(struct snd_soc_codec *codec)
} }
} }
regcache_cache_only(codec->control_data, true);
/* Apply platform data settings */ /* Apply platform data settings */
snd_soc_update_bits(codec, WM8996_LINE_INPUT_CONTROL, snd_soc_update_bits(codec, WM8996_LINE_INPUT_CONTROL,
WM8996_INL_MODE_MASK | WM8996_INR_MODE_MASK, WM8996_INL_MODE_MASK | WM8996_INR_MODE_MASK,
...@@ -3051,7 +3049,6 @@ static int wm8996_remove(struct snd_soc_codec *codec) ...@@ -3051,7 +3049,6 @@ static int wm8996_remove(struct snd_soc_codec *codec)
for (i = 0; i < ARRAY_SIZE(wm8996->supplies); i++) for (i = 0; i < ARRAY_SIZE(wm8996->supplies); i++)
regulator_unregister_notifier(wm8996->supplies[i].consumer, regulator_unregister_notifier(wm8996->supplies[i].consumer,
&wm8996->disable_nb[i]); &wm8996->disable_nb[i]);
regulator_bulk_free(ARRAY_SIZE(wm8996->supplies), wm8996->supplies);
return 0; return 0;
} }
...@@ -3206,14 +3203,15 @@ static __devinit int wm8996_i2c_probe(struct i2c_client *i2c, ...@@ -3206,14 +3203,15 @@ static __devinit int wm8996_i2c_probe(struct i2c_client *i2c,
dev_info(&i2c->dev, "revision %c\n", dev_info(&i2c->dev, "revision %c\n",
(reg & WM8996_CHIP_REV_MASK) + 'A'); (reg & WM8996_CHIP_REV_MASK) + 'A');
regulator_bulk_disable(ARRAY_SIZE(wm8996->supplies), wm8996->supplies);
ret = wm8996_reset(wm8996); ret = wm8996_reset(wm8996);
if (ret < 0) { if (ret < 0) {
dev_err(&i2c->dev, "Failed to issue reset\n"); dev_err(&i2c->dev, "Failed to issue reset\n");
goto err_regmap; goto err_regmap;
} }
regcache_cache_only(wm8996->regmap, true);
regulator_bulk_disable(ARRAY_SIZE(wm8996->supplies), wm8996->supplies);
wm8996_init_gpio(wm8996); wm8996_init_gpio(wm8996);
ret = snd_soc_register_codec(&i2c->dev, ret = snd_soc_register_codec(&i2c->dev,
......
...@@ -33,7 +33,6 @@ ...@@ -33,7 +33,6 @@
#include <mach/hardware.h> #include <mach/hardware.h>
#include <mach/dma.h> #include <mach/dma.h>
#include <mach/audio.h>
#include "../../arm/pxa2xx-pcm.h" #include "../../arm/pxa2xx-pcm.h"
#include "pxa-ssp.h" #include "pxa-ssp.h"
...@@ -194,7 +193,7 @@ static void pxa_ssp_set_scr(struct ssp_device *ssp, u32 div) ...@@ -194,7 +193,7 @@ static void pxa_ssp_set_scr(struct ssp_device *ssp, u32 div)
{ {
u32 sscr0 = pxa_ssp_read_reg(ssp, SSCR0); u32 sscr0 = pxa_ssp_read_reg(ssp, SSCR0);
if (cpu_is_pxa25x() && ssp->type == PXA25x_SSP) { if (ssp->type == PXA25x_SSP) {
sscr0 &= ~0x0000ff00; sscr0 &= ~0x0000ff00;
sscr0 |= ((div - 2)/2) << 8; /* 2..512 */ sscr0 |= ((div - 2)/2) << 8; /* 2..512 */
} else { } else {
...@@ -212,7 +211,7 @@ static u32 pxa_ssp_get_scr(struct ssp_device *ssp) ...@@ -212,7 +211,7 @@ static u32 pxa_ssp_get_scr(struct ssp_device *ssp)
u32 sscr0 = pxa_ssp_read_reg(ssp, SSCR0); u32 sscr0 = pxa_ssp_read_reg(ssp, SSCR0);
u32 div; u32 div;
if (cpu_is_pxa25x() && ssp->type == PXA25x_SSP) if (ssp->type == PXA25x_SSP)
div = ((sscr0 >> 8) & 0xff) * 2 + 2; div = ((sscr0 >> 8) & 0xff) * 2 + 2;
else else
div = ((sscr0 >> 8) & 0xfff) + 1; div = ((sscr0 >> 8) & 0xfff) + 1;
...@@ -242,7 +241,7 @@ static int pxa_ssp_set_dai_sysclk(struct snd_soc_dai *cpu_dai, ...@@ -242,7 +241,7 @@ static int pxa_ssp_set_dai_sysclk(struct snd_soc_dai *cpu_dai,
break; break;
case PXA_SSP_CLK_PLL: case PXA_SSP_CLK_PLL:
/* Internal PLL is fixed */ /* Internal PLL is fixed */
if (cpu_is_pxa25x()) if (ssp->type == PXA25x_SSP)
priv->sysclk = 1843200; priv->sysclk = 1843200;
else else
priv->sysclk = 13000000; priv->sysclk = 13000000;
...@@ -266,11 +265,11 @@ static int pxa_ssp_set_dai_sysclk(struct snd_soc_dai *cpu_dai, ...@@ -266,11 +265,11 @@ static int pxa_ssp_set_dai_sysclk(struct snd_soc_dai *cpu_dai,
/* The SSP clock must be disabled when changing SSP clock mode /* The SSP clock must be disabled when changing SSP clock mode
* on PXA2xx. On PXA3xx it must be enabled when doing so. */ * on PXA2xx. On PXA3xx it must be enabled when doing so. */
if (!cpu_is_pxa3xx()) if (ssp->type != PXA3xx_SSP)
clk_disable(ssp->clk); clk_disable(ssp->clk);
val = pxa_ssp_read_reg(ssp, SSCR0) | sscr0; val = pxa_ssp_read_reg(ssp, SSCR0) | sscr0;
pxa_ssp_write_reg(ssp, SSCR0, val); pxa_ssp_write_reg(ssp, SSCR0, val);
if (!cpu_is_pxa3xx()) if (ssp->type != PXA3xx_SSP)
clk_enable(ssp->clk); clk_enable(ssp->clk);
return 0; return 0;
...@@ -294,24 +293,20 @@ static int pxa_ssp_set_dai_clkdiv(struct snd_soc_dai *cpu_dai, ...@@ -294,24 +293,20 @@ static int pxa_ssp_set_dai_clkdiv(struct snd_soc_dai *cpu_dai,
case PXA_SSP_AUDIO_DIV_SCDB: case PXA_SSP_AUDIO_DIV_SCDB:
val = pxa_ssp_read_reg(ssp, SSACD); val = pxa_ssp_read_reg(ssp, SSACD);
val &= ~SSACD_SCDB; val &= ~SSACD_SCDB;
#if defined(CONFIG_PXA3xx) if (ssp->type == PXA3xx_SSP)
if (cpu_is_pxa3xx())
val &= ~SSACD_SCDX8; val &= ~SSACD_SCDX8;
#endif
switch (div) { switch (div) {
case PXA_SSP_CLK_SCDB_1: case PXA_SSP_CLK_SCDB_1:
val |= SSACD_SCDB; val |= SSACD_SCDB;
break; break;
case PXA_SSP_CLK_SCDB_4: case PXA_SSP_CLK_SCDB_4:
break; break;
#if defined(CONFIG_PXA3xx)
case PXA_SSP_CLK_SCDB_8: case PXA_SSP_CLK_SCDB_8:
if (cpu_is_pxa3xx()) if (ssp->type == PXA3xx_SSP)
val |= SSACD_SCDX8; val |= SSACD_SCDX8;
else else
return -EINVAL; return -EINVAL;
break; break;
#endif
default: default:
return -EINVAL; return -EINVAL;
} }
...@@ -337,10 +332,8 @@ static int pxa_ssp_set_dai_pll(struct snd_soc_dai *cpu_dai, int pll_id, ...@@ -337,10 +332,8 @@ static int pxa_ssp_set_dai_pll(struct snd_soc_dai *cpu_dai, int pll_id,
struct ssp_device *ssp = priv->ssp; struct ssp_device *ssp = priv->ssp;
u32 ssacd = pxa_ssp_read_reg(ssp, SSACD) & ~0x70; u32 ssacd = pxa_ssp_read_reg(ssp, SSACD) & ~0x70;
#if defined(CONFIG_PXA3xx) if (ssp->type == PXA3xx_SSP)
if (cpu_is_pxa3xx())
pxa_ssp_write_reg(ssp, SSACDD, 0); pxa_ssp_write_reg(ssp, SSACDD, 0);
#endif
switch (freq_out) { switch (freq_out) {
case 5622000: case 5622000:
...@@ -365,11 +358,10 @@ static int pxa_ssp_set_dai_pll(struct snd_soc_dai *cpu_dai, int pll_id, ...@@ -365,11 +358,10 @@ static int pxa_ssp_set_dai_pll(struct snd_soc_dai *cpu_dai, int pll_id,
break; break;
default: default:
#ifdef CONFIG_PXA3xx
/* PXA3xx has a clock ditherer which can be used to generate /* PXA3xx has a clock ditherer which can be used to generate
* a wider range of frequencies - calculate a value for it. * a wider range of frequencies - calculate a value for it.
*/ */
if (cpu_is_pxa3xx()) { if (ssp->type == PXA3xx_SSP) {
u32 val; u32 val;
u64 tmp = 19968; u64 tmp = 19968;
tmp *= 1000000; tmp *= 1000000;
...@@ -386,7 +378,6 @@ static int pxa_ssp_set_dai_pll(struct snd_soc_dai *cpu_dai, int pll_id, ...@@ -386,7 +378,6 @@ static int pxa_ssp_set_dai_pll(struct snd_soc_dai *cpu_dai, int pll_id,
val, freq_out); val, freq_out);
break; break;
} }
#endif
return -EINVAL; return -EINVAL;
} }
...@@ -590,10 +581,8 @@ static int pxa_ssp_hw_params(struct snd_pcm_substream *substream, ...@@ -590,10 +581,8 @@ static int pxa_ssp_hw_params(struct snd_pcm_substream *substream,
/* bit size */ /* bit size */
switch (params_format(params)) { switch (params_format(params)) {
case SNDRV_PCM_FORMAT_S16_LE: case SNDRV_PCM_FORMAT_S16_LE:
#ifdef CONFIG_PXA3xx if (ssp->type == PXA3xx_SSP)
if (cpu_is_pxa3xx())
sscr0 |= SSCR0_FPCKE; sscr0 |= SSCR0_FPCKE;
#endif
sscr0 |= SSCR0_DataSize(16); sscr0 |= SSCR0_DataSize(16);
break; break;
case SNDRV_PCM_FORMAT_S24_LE: case SNDRV_PCM_FORMAT_S24_LE:
...@@ -618,9 +607,7 @@ static int pxa_ssp_hw_params(struct snd_pcm_substream *substream, ...@@ -618,9 +607,7 @@ static int pxa_ssp_hw_params(struct snd_pcm_substream *substream,
* trying and failing a lot; some of the registers * trying and failing a lot; some of the registers
* needed for that mode are only available on PXA3xx. * needed for that mode are only available on PXA3xx.
*/ */
if (ssp->type != PXA3xx_SSP)
#ifdef CONFIG_PXA3xx
if (!cpu_is_pxa3xx())
return -EINVAL; return -EINVAL;
sspsp |= SSPSP_SFRMWDTH(width * 2); sspsp |= SSPSP_SFRMWDTH(width * 2);
...@@ -628,9 +615,6 @@ static int pxa_ssp_hw_params(struct snd_pcm_substream *substream, ...@@ -628,9 +615,6 @@ static int pxa_ssp_hw_params(struct snd_pcm_substream *substream,
sspsp |= SSPSP_EDMYSTOP(3); sspsp |= SSPSP_EDMYSTOP(3);
sspsp |= SSPSP_DMYSTOP(3); sspsp |= SSPSP_DMYSTOP(3);
sspsp |= SSPSP_DMYSTRT(1); sspsp |= SSPSP_DMYSTRT(1);
#else
return -EINVAL;
#endif
} else { } else {
/* The frame width is the width the LRCLK is /* The frame width is the width the LRCLK is
* asserted for; the delay is expressed in * asserted for; the delay is expressed in
......
...@@ -346,6 +346,17 @@ static int tegra_wm8903_init(struct snd_soc_pcm_runtime *rtd) ...@@ -346,6 +346,17 @@ static int tegra_wm8903_init(struct snd_soc_pcm_runtime *rtd)
return 0; return 0;
} }
static int tegra_wm8903_remove(struct snd_soc_card *card)
{
struct snd_soc_pcm_runtime *rtd = &(card->rtd[0]);
struct snd_soc_dai *codec_dai = rtd->codec_dai;
struct snd_soc_codec *codec = codec_dai->codec;
wm8903_mic_detect(codec, NULL, 0, 0);
return 0;
}
static struct snd_soc_dai_link tegra_wm8903_dai = { static struct snd_soc_dai_link tegra_wm8903_dai = {
.name = "WM8903", .name = "WM8903",
.stream_name = "WM8903 PCM", .stream_name = "WM8903 PCM",
...@@ -363,6 +374,8 @@ static struct snd_soc_card snd_soc_tegra_wm8903 = { ...@@ -363,6 +374,8 @@ static struct snd_soc_card snd_soc_tegra_wm8903 = {
.dai_link = &tegra_wm8903_dai, .dai_link = &tegra_wm8903_dai,
.num_links = 1, .num_links = 1,
.remove = tegra_wm8903_remove,
.controls = tegra_wm8903_controls, .controls = tegra_wm8903_controls,
.num_controls = ARRAY_SIZE(tegra_wm8903_controls), .num_controls = ARRAY_SIZE(tegra_wm8903_controls),
.dapm_widgets = tegra_wm8903_dapm_widgets, .dapm_widgets = tegra_wm8903_dapm_widgets,
......
...@@ -209,7 +209,7 @@ static int usb6fire_fw_ezusb_upload( ...@@ -209,7 +209,7 @@ static int usb6fire_fw_ezusb_upload(
int ret; int ret;
u8 data; u8 data;
struct usb_device *device = interface_to_usbdev(intf); struct usb_device *device = interface_to_usbdev(intf);
const struct firmware *fw = 0; const struct firmware *fw = NULL;
struct ihex_record *rec = kmalloc(sizeof(struct ihex_record), struct ihex_record *rec = kmalloc(sizeof(struct ihex_record),
GFP_KERNEL); GFP_KERNEL);
......
...@@ -354,17 +354,21 @@ static int set_format(struct snd_usb_substream *subs, struct audioformat *fmt) ...@@ -354,17 +354,21 @@ static int set_format(struct snd_usb_substream *subs, struct audioformat *fmt)
(get_endpoint(alts, 1)->bLength >= USB_DT_ENDPOINT_AUDIO_SIZE && (get_endpoint(alts, 1)->bLength >= USB_DT_ENDPOINT_AUDIO_SIZE &&
get_endpoint(alts, 1)->bSynchAddress != 0 && get_endpoint(alts, 1)->bSynchAddress != 0 &&
!implicit_fb)) { !implicit_fb)) {
snd_printk(KERN_ERR "%d:%d:%d : invalid synch pipe\n", snd_printk(KERN_ERR "%d:%d:%d : invalid sync pipe. bmAttributes %02x, bLength %d, bSynchAddress %02x\n",
dev->devnum, fmt->iface, fmt->altsetting); dev->devnum, fmt->iface, fmt->altsetting,
get_endpoint(alts, 1)->bmAttributes,
get_endpoint(alts, 1)->bLength,
get_endpoint(alts, 1)->bSynchAddress);
return -EINVAL; return -EINVAL;
} }
ep = get_endpoint(alts, 1)->bEndpointAddress; ep = get_endpoint(alts, 1)->bEndpointAddress;
if (get_endpoint(alts, 0)->bLength >= USB_DT_ENDPOINT_AUDIO_SIZE && if (!implicit_fb &&
get_endpoint(alts, 0)->bLength >= USB_DT_ENDPOINT_AUDIO_SIZE &&
(( is_playback && ep != (unsigned int)(get_endpoint(alts, 0)->bSynchAddress | USB_DIR_IN)) || (( is_playback && ep != (unsigned int)(get_endpoint(alts, 0)->bSynchAddress | USB_DIR_IN)) ||
(!is_playback && ep != (unsigned int)(get_endpoint(alts, 0)->bSynchAddress & ~USB_DIR_IN)) || (!is_playback && ep != (unsigned int)(get_endpoint(alts, 0)->bSynchAddress & ~USB_DIR_IN)))) {
( is_playback && !implicit_fb))) { snd_printk(KERN_ERR "%d:%d:%d : invalid sync pipe. is_playback %d, ep %02x, bSynchAddress %02x\n",
snd_printk(KERN_ERR "%d:%d:%d : invalid synch pipe\n", dev->devnum, fmt->iface, fmt->altsetting,
dev->devnum, fmt->iface, fmt->altsetting); is_playback, ep, get_endpoint(alts, 0)->bSynchAddress);
return -EINVAL; return -EINVAL;
} }
...@@ -1147,7 +1151,8 @@ static int snd_usb_substream_playback_trigger(struct snd_pcm_substream *substrea ...@@ -1147,7 +1151,8 @@ static int snd_usb_substream_playback_trigger(struct snd_pcm_substream *substrea
return -EINVAL; return -EINVAL;
} }
int snd_usb_substream_capture_trigger(struct snd_pcm_substream *substream, int cmd) static int snd_usb_substream_capture_trigger(struct snd_pcm_substream *substream,
int cmd)
{ {
int err; int err;
struct snd_usb_substream *subs = substream->runtime->private_data; struct snd_usb_substream *subs = substream->runtime->private_data;
......
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