Commit 81a6cff6 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6:
  ASoC: tpa6130a2: Get rid of compile warning from tpa6130a2_power
  ALSA: hda - MacBookAir3,1(3,2) alsa support
  ASoC: fix the building issue of missing codec field in 'struct snd_soc_card'
  ALSA: usb-audio - Support for Power/Status LED on Creative USB X-Fi S51
  ALSA: asihpi - Unsafe memory management when allocating control cache
  ASoC: Update WARN uses in wm_hubs
  ASoC: Include cx20442 to SND_SOC_ALL_CODECS
  ASoC: Fix SND_SOC_ALL_CODECS typo for jz4740
  ASoC: Remove volatility from WM8900 POWER1 register
  ALSA: lx6464es - make 1 bit signed bitfield unsigned
  ALSA: cs46xx memory management fixes for cs46xx_dsp_spos_create()
  ALSA: usb - driver neglects kmalloc return value check and may deref NULL
  ASoC: tpa6130a2: Fix unbalanced regulator disables
  ASoC: tlv320dac33: Mode1 FIFO auto configuration fix
  ASoC: tlv320dac33: Limit the US_TO_SAMPLES macro
  ASoC: tlv320dac33: Error handling for broken chip
  ASoC: Check return value of struct_strtoul() in pmdown_time_set()
parents d88c0922 69dbdd81
...@@ -625,6 +625,8 @@ static short create_adapter_obj(struct hpi_adapter_obj *pao, ...@@ -625,6 +625,8 @@ static short create_adapter_obj(struct hpi_adapter_obj *pao,
control_cache_size, (struct hpi_control_cache_info *) control_cache_size, (struct hpi_control_cache_info *)
&phw->control_cache[0] &phw->control_cache[0]
); );
if (!phw->p_cache)
pao->has_control_cache = 0;
} else } else
pao->has_control_cache = 0; pao->has_control_cache = 0;
......
...@@ -644,6 +644,8 @@ static u16 create_adapter_obj(struct hpi_adapter_obj *pao, ...@@ -644,6 +644,8 @@ static u16 create_adapter_obj(struct hpi_adapter_obj *pao,
interface->control_cache.size_in_bytes, interface->control_cache.size_in_bytes,
(struct hpi_control_cache_info *) (struct hpi_control_cache_info *)
p_control_cache_virtual); p_control_cache_virtual);
if (!phw->p_cache)
err = HPI_ERROR_MEMORY_ALLOC;
} }
if (!err) { if (!err) {
err = hpios_locked_mem_get_phys_addr(&phw-> err = hpios_locked_mem_get_phys_addr(&phw->
......
...@@ -571,14 +571,20 @@ struct hpi_control_cache *hpi_alloc_control_cache(const u32 ...@@ -571,14 +571,20 @@ struct hpi_control_cache *hpi_alloc_control_cache(const u32
{ {
struct hpi_control_cache *p_cache = struct hpi_control_cache *p_cache =
kmalloc(sizeof(*p_cache), GFP_KERNEL); kmalloc(sizeof(*p_cache), GFP_KERNEL);
if (!p_cache)
return NULL;
p_cache->p_info =
kmalloc(sizeof(*p_cache->p_info) * number_of_controls,
GFP_KERNEL);
if (!p_cache->p_info) {
kfree(p_cache);
return NULL;
}
p_cache->cache_size_in_bytes = size_in_bytes; p_cache->cache_size_in_bytes = size_in_bytes;
p_cache->control_count = number_of_controls; p_cache->control_count = number_of_controls;
p_cache->p_cache = p_cache->p_cache =
(struct hpi_control_cache_single *)pDSP_control_buffer; (struct hpi_control_cache_single *)pDSP_control_buffer;
p_cache->init = 0; p_cache->init = 0;
p_cache->p_info =
kmalloc(sizeof(*p_cache->p_info) * p_cache->control_count,
GFP_KERNEL);
return p_cache; return p_cache;
} }
......
...@@ -225,39 +225,25 @@ struct dsp_spos_instance *cs46xx_dsp_spos_create (struct snd_cs46xx * chip) ...@@ -225,39 +225,25 @@ struct dsp_spos_instance *cs46xx_dsp_spos_create (struct snd_cs46xx * chip)
{ {
struct dsp_spos_instance * ins = kzalloc(sizeof(struct dsp_spos_instance), GFP_KERNEL); struct dsp_spos_instance * ins = kzalloc(sizeof(struct dsp_spos_instance), GFP_KERNEL);
if (ins == NULL) if (ins == NULL)
return NULL; return NULL;
/* better to use vmalloc for this big table */ /* better to use vmalloc for this big table */
ins->symbol_table.nsymbols = 0;
ins->symbol_table.symbols = vmalloc(sizeof(struct dsp_symbol_entry) * ins->symbol_table.symbols = vmalloc(sizeof(struct dsp_symbol_entry) *
DSP_MAX_SYMBOLS); DSP_MAX_SYMBOLS);
ins->symbol_table.highest_frag_index = 0; ins->code.data = kmalloc(DSP_CODE_BYTE_SIZE, GFP_KERNEL);
ins->modules = kmalloc(sizeof(struct dsp_module_desc) * DSP_MAX_MODULES, GFP_KERNEL);
if (ins->symbol_table.symbols == NULL) { if (!ins->symbol_table.symbols || !ins->code.data || !ins->modules) {
cs46xx_dsp_spos_destroy(chip); cs46xx_dsp_spos_destroy(chip);
goto error; goto error;
} }
ins->symbol_table.nsymbols = 0;
ins->symbol_table.highest_frag_index = 0;
ins->code.offset = 0; ins->code.offset = 0;
ins->code.size = 0; ins->code.size = 0;
ins->code.data = kmalloc(DSP_CODE_BYTE_SIZE, GFP_KERNEL);
if (ins->code.data == NULL) {
cs46xx_dsp_spos_destroy(chip);
goto error;
}
ins->nscb = 0; ins->nscb = 0;
ins->ntask = 0; ins->ntask = 0;
ins->nmodules = 0; ins->nmodules = 0;
ins->modules = kmalloc(sizeof(struct dsp_module_desc) * DSP_MAX_MODULES, GFP_KERNEL);
if (ins->modules == NULL) {
cs46xx_dsp_spos_destroy(chip);
goto error;
}
/* default SPDIF input sample rate /* default SPDIF input sample rate
to 48000 khz */ to 48000 khz */
...@@ -271,8 +257,8 @@ struct dsp_spos_instance *cs46xx_dsp_spos_create (struct snd_cs46xx * chip) ...@@ -271,8 +257,8 @@ struct dsp_spos_instance *cs46xx_dsp_spos_create (struct snd_cs46xx * chip)
/* set left and right validity bits and /* set left and right validity bits and
default channel status */ default channel status */
ins->spdif_csuv_default = ins->spdif_csuv_default =
ins->spdif_csuv_stream = ins->spdif_csuv_stream =
/* byte 0 */ ((unsigned int)_wrap_all_bits( (SNDRV_PCM_DEFAULT_CON_SPDIF & 0xff)) << 24) | /* byte 0 */ ((unsigned int)_wrap_all_bits( (SNDRV_PCM_DEFAULT_CON_SPDIF & 0xff)) << 24) |
/* byte 1 */ ((unsigned int)_wrap_all_bits( ((SNDRV_PCM_DEFAULT_CON_SPDIF >> 8) & 0xff)) << 16) | /* byte 1 */ ((unsigned int)_wrap_all_bits( ((SNDRV_PCM_DEFAULT_CON_SPDIF >> 8) & 0xff)) << 16) |
/* byte 3 */ (unsigned int)_wrap_all_bits( (SNDRV_PCM_DEFAULT_CON_SPDIF >> 24) & 0xff) | /* byte 3 */ (unsigned int)_wrap_all_bits( (SNDRV_PCM_DEFAULT_CON_SPDIF >> 24) & 0xff) |
...@@ -281,6 +267,9 @@ struct dsp_spos_instance *cs46xx_dsp_spos_create (struct snd_cs46xx * chip) ...@@ -281,6 +267,9 @@ struct dsp_spos_instance *cs46xx_dsp_spos_create (struct snd_cs46xx * chip)
return ins; return ins;
error: error:
kfree(ins->modules);
kfree(ins->code.data);
vfree(ins->symbol_table.symbols);
kfree(ins); kfree(ins);
return NULL; return NULL;
} }
......
...@@ -1166,6 +1166,7 @@ static const char *cs420x_models[CS420X_MODELS] = { ...@@ -1166,6 +1166,7 @@ static const char *cs420x_models[CS420X_MODELS] = {
static struct snd_pci_quirk cs420x_cfg_tbl[] = { static struct snd_pci_quirk cs420x_cfg_tbl[] = {
SND_PCI_QUIRK(0x10de, 0x0ac0, "MacBookPro 5,3", CS420X_MBP53), SND_PCI_QUIRK(0x10de, 0x0ac0, "MacBookPro 5,3", CS420X_MBP53),
SND_PCI_QUIRK(0x10de, 0x0d94, "MacBookAir 3,1(2)", CS420X_MBP55),
SND_PCI_QUIRK(0x10de, 0xcb79, "MacBookPro 5,5", CS420X_MBP55), SND_PCI_QUIRK(0x10de, 0xcb79, "MacBookPro 5,5", CS420X_MBP55),
SND_PCI_QUIRK(0x10de, 0xcb89, "MacBookPro 7,1", CS420X_MBP55), SND_PCI_QUIRK(0x10de, 0xcb89, "MacBookPro 7,1", CS420X_MBP55),
SND_PCI_QUIRK(0x8086, 0x7270, "IMac 27 Inch", CS420X_IMAC27), SND_PCI_QUIRK(0x8086, 0x7270, "IMac 27 Inch", CS420X_IMAC27),
......
...@@ -425,7 +425,7 @@ static int lx_pcm_hw_free(struct snd_pcm_substream *substream) ...@@ -425,7 +425,7 @@ static int lx_pcm_hw_free(struct snd_pcm_substream *substream)
static void lx_trigger_start(struct lx6464es *chip, struct lx_stream *lx_stream) static void lx_trigger_start(struct lx6464es *chip, struct lx_stream *lx_stream)
{ {
struct snd_pcm_substream *substream = lx_stream->stream; struct snd_pcm_substream *substream = lx_stream->stream;
const int is_capture = lx_stream->is_capture; const unsigned int is_capture = lx_stream->is_capture;
int err; int err;
...@@ -473,7 +473,7 @@ static void lx_trigger_start(struct lx6464es *chip, struct lx_stream *lx_stream) ...@@ -473,7 +473,7 @@ static void lx_trigger_start(struct lx6464es *chip, struct lx_stream *lx_stream)
static void lx_trigger_stop(struct lx6464es *chip, struct lx_stream *lx_stream) static void lx_trigger_stop(struct lx6464es *chip, struct lx_stream *lx_stream)
{ {
const int is_capture = lx_stream->is_capture; const unsigned int is_capture = lx_stream->is_capture;
int err; int err;
snd_printd(LXP "stopping: stopping stream\n"); snd_printd(LXP "stopping: stopping stream\n");
......
...@@ -60,7 +60,7 @@ struct lx_stream { ...@@ -60,7 +60,7 @@ struct lx_stream {
snd_pcm_uframes_t frame_pos; snd_pcm_uframes_t frame_pos;
enum lx_stream_status status; /* free, open, running, draining enum lx_stream_status status; /* free, open, running, draining
* pause */ * pause */
int is_capture:1; unsigned int is_capture:1;
}; };
......
...@@ -1152,7 +1152,7 @@ static int lx_interrupt_request_new_buffer(struct lx6464es *chip, ...@@ -1152,7 +1152,7 @@ static int lx_interrupt_request_new_buffer(struct lx6464es *chip,
struct lx_stream *lx_stream) struct lx_stream *lx_stream)
{ {
struct snd_pcm_substream *substream = lx_stream->stream; struct snd_pcm_substream *substream = lx_stream->stream;
int is_capture = lx_stream->is_capture; const unsigned int is_capture = lx_stream->is_capture;
int err; int err;
unsigned long flags; unsigned long flags;
......
...@@ -25,8 +25,9 @@ config SND_SOC_ALL_CODECS ...@@ -25,8 +25,9 @@ config SND_SOC_ALL_CODECS
select SND_SOC_CQ0093VC if MFD_DAVINCI_VOICECODEC select SND_SOC_CQ0093VC if MFD_DAVINCI_VOICECODEC
select SND_SOC_CS42L51 if I2C select SND_SOC_CS42L51 if I2C
select SND_SOC_CS4270 if I2C select SND_SOC_CS4270 if I2C
select SND_SOC_CX20442
select SND_SOC_DA7210 if I2C select SND_SOC_DA7210 if I2C
select SND_SOC_JZ4740 if SOC_JZ4740 select SND_SOC_JZ4740_CODEC if SOC_JZ4740
select SND_SOC_MAX98088 if I2C select SND_SOC_MAX98088 if I2C
select SND_SOC_MAX9877 if I2C select SND_SOC_MAX9877 if I2C
select SND_SOC_PCM3008 select SND_SOC_PCM3008
......
...@@ -58,7 +58,7 @@ ...@@ -58,7 +58,7 @@
(1000000000 / ((rate * 1000) / samples)) (1000000000 / ((rate * 1000) / samples))
#define US_TO_SAMPLES(rate, us) \ #define US_TO_SAMPLES(rate, us) \
(rate / (1000000 / us)) (rate / (1000000 / (us < 1000000 ? us : 1000000)))
#define UTHR_FROM_PERIOD_SIZE(samples, playrate, burstrate) \ #define UTHR_FROM_PERIOD_SIZE(samples, playrate, burstrate) \
((samples * 5000) / ((burstrate * 5000) / (burstrate - playrate))) ((samples * 5000) / ((burstrate * 5000) / (burstrate - playrate)))
...@@ -200,7 +200,7 @@ static int dac33_read(struct snd_soc_codec *codec, unsigned int reg, ...@@ -200,7 +200,7 @@ static int dac33_read(struct snd_soc_codec *codec, unsigned int reg,
u8 *value) u8 *value)
{ {
struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec); struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec);
int val; int val, ret = 0;
*value = reg & 0xff; *value = reg & 0xff;
...@@ -210,6 +210,7 @@ static int dac33_read(struct snd_soc_codec *codec, unsigned int reg, ...@@ -210,6 +210,7 @@ static int dac33_read(struct snd_soc_codec *codec, unsigned int reg,
if (val < 0) { if (val < 0) {
dev_err(codec->dev, "Read failed (%d)\n", val); dev_err(codec->dev, "Read failed (%d)\n", val);
value[0] = dac33_read_reg_cache(codec, reg); value[0] = dac33_read_reg_cache(codec, reg);
ret = val;
} else { } else {
value[0] = val; value[0] = val;
dac33_write_reg_cache(codec, reg, val); dac33_write_reg_cache(codec, reg, val);
...@@ -218,7 +219,7 @@ static int dac33_read(struct snd_soc_codec *codec, unsigned int reg, ...@@ -218,7 +219,7 @@ static int dac33_read(struct snd_soc_codec *codec, unsigned int reg,
value[0] = dac33_read_reg_cache(codec, reg); value[0] = dac33_read_reg_cache(codec, reg);
} }
return 0; return ret;
} }
static int dac33_write(struct snd_soc_codec *codec, unsigned int reg, static int dac33_write(struct snd_soc_codec *codec, unsigned int reg,
...@@ -329,13 +330,18 @@ static void dac33_init_chip(struct snd_soc_codec *codec) ...@@ -329,13 +330,18 @@ static void dac33_init_chip(struct snd_soc_codec *codec)
dac33_read_reg_cache(codec, DAC33_LINER_TO_RLO_VOL)); dac33_read_reg_cache(codec, DAC33_LINER_TO_RLO_VOL));
} }
static inline void dac33_read_id(struct snd_soc_codec *codec) static inline int dac33_read_id(struct snd_soc_codec *codec)
{ {
int i, ret = 0;
u8 reg; u8 reg;
dac33_read(codec, DAC33_DEVICE_ID_MSB, &reg); for (i = 0; i < 3; i++) {
dac33_read(codec, DAC33_DEVICE_ID_LSB, &reg); ret = dac33_read(codec, DAC33_DEVICE_ID_MSB + i, &reg);
dac33_read(codec, DAC33_DEVICE_REV_ID, &reg); if (ret < 0)
break;
}
return ret;
} }
static inline void dac33_soft_power(struct snd_soc_codec *codec, int power) static inline void dac33_soft_power(struct snd_soc_codec *codec, int power)
...@@ -1076,6 +1082,9 @@ static void dac33_calculate_times(struct snd_pcm_substream *substream) ...@@ -1076,6 +1082,9 @@ static void dac33_calculate_times(struct snd_pcm_substream *substream)
/* Number of samples under i2c latency */ /* Number of samples under i2c latency */
dac33->alarm_threshold = US_TO_SAMPLES(rate, dac33->alarm_threshold = US_TO_SAMPLES(rate,
dac33->mode1_latency); dac33->mode1_latency);
nsample_limit = DAC33_BUFFER_SIZE_SAMPLES -
dac33->alarm_threshold;
if (dac33->auto_fifo_config) { if (dac33->auto_fifo_config) {
if (period_size <= dac33->alarm_threshold) if (period_size <= dac33->alarm_threshold)
/* /*
...@@ -1086,6 +1095,8 @@ static void dac33_calculate_times(struct snd_pcm_substream *substream) ...@@ -1086,6 +1095,8 @@ static void dac33_calculate_times(struct snd_pcm_substream *substream)
((dac33->alarm_threshold / period_size) + ((dac33->alarm_threshold / period_size) +
(dac33->alarm_threshold % period_size ? (dac33->alarm_threshold % period_size ?
1 : 0)); 1 : 0));
else if (period_size > nsample_limit)
dac33->nsample = nsample_limit;
else else
dac33->nsample = period_size; dac33->nsample = period_size;
} else { } else {
...@@ -1097,8 +1108,7 @@ static void dac33_calculate_times(struct snd_pcm_substream *substream) ...@@ -1097,8 +1108,7 @@ static void dac33_calculate_times(struct snd_pcm_substream *substream)
*/ */
dac33->nsample_max = substream->runtime->buffer_size - dac33->nsample_max = substream->runtime->buffer_size -
period_size; period_size;
nsample_limit = DAC33_BUFFER_SIZE_SAMPLES -
dac33->alarm_threshold;
if (dac33->nsample_max > nsample_limit) if (dac33->nsample_max > nsample_limit)
dac33->nsample_max = nsample_limit; dac33->nsample_max = nsample_limit;
...@@ -1414,9 +1424,15 @@ static int dac33_soc_probe(struct snd_soc_codec *codec) ...@@ -1414,9 +1424,15 @@ static int dac33_soc_probe(struct snd_soc_codec *codec)
dev_err(codec->dev, "Failed to power up codec: %d\n", ret); dev_err(codec->dev, "Failed to power up codec: %d\n", ret);
goto err_power; goto err_power;
} }
dac33_read_id(codec); ret = dac33_read_id(codec);
dac33_hard_power(codec, 0); dac33_hard_power(codec, 0);
if (ret < 0) {
dev_err(codec->dev, "Failed to read chip ID: %d\n", ret);
ret = -ENODEV;
goto err_power;
}
/* Check if the IRQ number is valid and request it */ /* Check if the IRQ number is valid and request it */
if (dac33->irq >= 0) { if (dac33->irq >= 0) {
ret = request_irq(dac33->irq, dac33_interrupt_handler, ret = request_irq(dac33->irq, dac33_interrupt_handler,
......
...@@ -119,13 +119,13 @@ static int tpa6130a2_power(int power) ...@@ -119,13 +119,13 @@ static int tpa6130a2_power(int power)
{ {
struct tpa6130a2_data *data; struct tpa6130a2_data *data;
u8 val; u8 val;
int ret; int ret = 0;
BUG_ON(tpa6130a2_client == NULL); BUG_ON(tpa6130a2_client == NULL);
data = i2c_get_clientdata(tpa6130a2_client); data = i2c_get_clientdata(tpa6130a2_client);
mutex_lock(&data->mutex); mutex_lock(&data->mutex);
if (power) { if (power && !data->power_state) {
/* Power on */ /* Power on */
if (data->power_gpio >= 0) if (data->power_gpio >= 0)
gpio_set_value(data->power_gpio, 1); gpio_set_value(data->power_gpio, 1);
...@@ -153,7 +153,7 @@ static int tpa6130a2_power(int power) ...@@ -153,7 +153,7 @@ static int tpa6130a2_power(int power)
val = tpa6130a2_read(TPA6130A2_REG_CONTROL); val = tpa6130a2_read(TPA6130A2_REG_CONTROL);
val &= ~TPA6130A2_SWS; val &= ~TPA6130A2_SWS;
tpa6130a2_i2c_write(TPA6130A2_REG_CONTROL, val); tpa6130a2_i2c_write(TPA6130A2_REG_CONTROL, val);
} else { } else if (!power && data->power_state) {
/* set SWS */ /* set SWS */
val = tpa6130a2_read(TPA6130A2_REG_CONTROL); val = tpa6130a2_read(TPA6130A2_REG_CONTROL);
val |= TPA6130A2_SWS; val |= TPA6130A2_SWS;
......
...@@ -186,7 +186,6 @@ static int wm8900_volatile_register(unsigned int reg) ...@@ -186,7 +186,6 @@ static int wm8900_volatile_register(unsigned int reg)
{ {
switch (reg) { switch (reg) {
case WM8900_REG_ID: case WM8900_REG_ID:
case WM8900_REG_POWER1:
return 1; return 1;
default: default:
return 0; return 0;
...@@ -1200,11 +1199,6 @@ static int wm8900_probe(struct snd_soc_codec *codec) ...@@ -1200,11 +1199,6 @@ static int wm8900_probe(struct snd_soc_codec *codec)
return -ENODEV; return -ENODEV;
} }
/* Read back from the chip */
reg = snd_soc_read(codec, WM8900_REG_POWER1);
reg = (reg >> 12) & 0xf;
dev_info(codec->dev, "WM8900 revision %d\n", reg);
wm8900_reset(codec); wm8900_reset(codec);
/* Turn the chip on */ /* Turn the chip on */
......
...@@ -123,7 +123,7 @@ static void calibrate_dc_servo(struct snd_soc_codec *codec) ...@@ -123,7 +123,7 @@ static void calibrate_dc_servo(struct snd_soc_codec *codec)
reg_r = reg & WM8993_DCS_DAC_WR_VAL_0_MASK; reg_r = reg & WM8993_DCS_DAC_WR_VAL_0_MASK;
break; break;
default: default:
WARN(1, "Unknown DCS readback method"); WARN(1, "Unknown DCS readback method\n");
break; break;
} }
......
...@@ -79,7 +79,7 @@ static void tosa_ext_control(struct snd_soc_codec *codec) ...@@ -79,7 +79,7 @@ static void tosa_ext_control(struct snd_soc_codec *codec)
static int tosa_startup(struct snd_pcm_substream *substream) static int tosa_startup(struct snd_pcm_substream *substream)
{ {
struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_pcm_runtime *rtd = substream->private_data;
struct snd_soc_codec *codec = rtd->card->codec; struct snd_soc_codec *codec = rtd->codec;
/* check the jack status at stream startup */ /* check the jack status at stream startup */
tosa_ext_control(codec); tosa_ext_control(codec);
......
...@@ -165,8 +165,11 @@ static ssize_t pmdown_time_set(struct device *dev, ...@@ -165,8 +165,11 @@ static ssize_t pmdown_time_set(struct device *dev,
{ {
struct snd_soc_pcm_runtime *rtd = struct snd_soc_pcm_runtime *rtd =
container_of(dev, struct snd_soc_pcm_runtime, dev); container_of(dev, struct snd_soc_pcm_runtime, dev);
int ret;
strict_strtol(buf, 10, &rtd->pmdown_time); ret = strict_strtol(buf, 10, &rtd->pmdown_time);
if (ret)
return ret;
return count; return count;
} }
......
...@@ -60,7 +60,7 @@ static const struct rc_config { ...@@ -60,7 +60,7 @@ static const struct rc_config {
{ USB_ID(0x041e, 0x3000), 0, 1, 2, 1, 18, 0x0013 }, /* Extigy */ { USB_ID(0x041e, 0x3000), 0, 1, 2, 1, 18, 0x0013 }, /* Extigy */
{ USB_ID(0x041e, 0x3020), 2, 1, 6, 6, 18, 0x0013 }, /* Audigy 2 NX */ { USB_ID(0x041e, 0x3020), 2, 1, 6, 6, 18, 0x0013 }, /* Audigy 2 NX */
{ USB_ID(0x041e, 0x3040), 2, 2, 6, 6, 2, 0x6e91 }, /* Live! 24-bit */ { USB_ID(0x041e, 0x3040), 2, 2, 6, 6, 2, 0x6e91 }, /* Live! 24-bit */
{ USB_ID(0x041e, 0x3042), 0, 1, 1, 1, 1, 0x000d }, /* Usb X-Fi */ { USB_ID(0x041e, 0x3042), 0, 1, 1, 1, 1, 0x000d }, /* Usb X-Fi S51 */
{ USB_ID(0x041e, 0x3048), 2, 2, 6, 6, 2, 0x6e91 }, /* Toshiba SB0500 */ { USB_ID(0x041e, 0x3048), 2, 2, 6, 6, 2, 0x6e91 }, /* Toshiba SB0500 */
}; };
...@@ -183,7 +183,13 @@ static int snd_audigy2nx_led_put(struct snd_kcontrol *kcontrol, struct snd_ctl_e ...@@ -183,7 +183,13 @@ static int snd_audigy2nx_led_put(struct snd_kcontrol *kcontrol, struct snd_ctl_e
if (value > 1) if (value > 1)
return -EINVAL; return -EINVAL;
changed = value != mixer->audigy2nx_leds[index]; changed = value != mixer->audigy2nx_leds[index];
err = snd_usb_ctl_msg(mixer->chip->dev, if (mixer->chip->usb_id == USB_ID(0x041e, 0x3042))
err = snd_usb_ctl_msg(mixer->chip->dev,
usb_sndctrlpipe(mixer->chip->dev, 0), 0x24,
USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
!value, 0, NULL, 0, 100);
else
err = snd_usb_ctl_msg(mixer->chip->dev,
usb_sndctrlpipe(mixer->chip->dev, 0), 0x24, usb_sndctrlpipe(mixer->chip->dev, 0), 0x24,
USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER, USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
value, index + 2, NULL, 0, 100); value, index + 2, NULL, 0, 100);
...@@ -225,8 +231,12 @@ static int snd_audigy2nx_controls_create(struct usb_mixer_interface *mixer) ...@@ -225,8 +231,12 @@ static int snd_audigy2nx_controls_create(struct usb_mixer_interface *mixer)
int i, err; int i, err;
for (i = 0; i < ARRAY_SIZE(snd_audigy2nx_controls); ++i) { for (i = 0; i < ARRAY_SIZE(snd_audigy2nx_controls); ++i) {
/* USB X-Fi S51 doesn't have a CMSS LED */
if ((mixer->chip->usb_id == USB_ID(0x041e, 0x3042)) && i == 0)
continue;
if (i > 1 && /* Live24ext has 2 LEDs only */ if (i > 1 && /* Live24ext has 2 LEDs only */
(mixer->chip->usb_id == USB_ID(0x041e, 0x3040) || (mixer->chip->usb_id == USB_ID(0x041e, 0x3040) ||
mixer->chip->usb_id == USB_ID(0x041e, 0x3042) ||
mixer->chip->usb_id == USB_ID(0x041e, 0x3048))) mixer->chip->usb_id == USB_ID(0x041e, 0x3048)))
break; break;
err = snd_ctl_add(mixer->chip->card, err = snd_ctl_add(mixer->chip->card,
...@@ -365,6 +375,7 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer) ...@@ -365,6 +375,7 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
if (mixer->chip->usb_id == USB_ID(0x041e, 0x3020) || if (mixer->chip->usb_id == USB_ID(0x041e, 0x3020) ||
mixer->chip->usb_id == USB_ID(0x041e, 0x3040) || mixer->chip->usb_id == USB_ID(0x041e, 0x3040) ||
mixer->chip->usb_id == USB_ID(0x041e, 0x3042) ||
mixer->chip->usb_id == USB_ID(0x041e, 0x3048)) { mixer->chip->usb_id == USB_ID(0x041e, 0x3048)) {
if ((err = snd_audigy2nx_controls_create(mixer)) < 0) if ((err = snd_audigy2nx_controls_create(mixer)) < 0)
return err; return err;
......
...@@ -676,8 +676,10 @@ static int snd_usb_pcm_check_knot(struct snd_pcm_runtime *runtime, ...@@ -676,8 +676,10 @@ static int snd_usb_pcm_check_knot(struct snd_pcm_runtime *runtime,
if (!needs_knot) if (!needs_knot)
return 0; return 0;
subs->rate_list.count = count;
subs->rate_list.list = kmalloc(sizeof(int) * count, GFP_KERNEL); subs->rate_list.list = kmalloc(sizeof(int) * count, GFP_KERNEL);
if (!subs->rate_list.list)
return -ENOMEM;
subs->rate_list.count = count;
subs->rate_list.mask = 0; subs->rate_list.mask = 0;
count = 0; count = 0;
list_for_each_entry(fp, &subs->fmt_list, list) { list_for_each_entry(fp, &subs->fmt_list, list) {
......
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