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()
This commit is contained in:
commit
81a6cff678
17 changed files with 82 additions and 55 deletions
|
@ -625,6 +625,8 @@ static short create_adapter_obj(struct hpi_adapter_obj *pao,
|
|||
control_cache_size, (struct hpi_control_cache_info *)
|
||||
&phw->control_cache[0]
|
||||
);
|
||||
if (!phw->p_cache)
|
||||
pao->has_control_cache = 0;
|
||||
} else
|
||||
pao->has_control_cache = 0;
|
||||
|
||||
|
|
|
@ -644,6 +644,8 @@ static u16 create_adapter_obj(struct hpi_adapter_obj *pao,
|
|||
interface->control_cache.size_in_bytes,
|
||||
(struct hpi_control_cache_info *)
|
||||
p_control_cache_virtual);
|
||||
if (!phw->p_cache)
|
||||
err = HPI_ERROR_MEMORY_ALLOC;
|
||||
}
|
||||
if (!err) {
|
||||
err = hpios_locked_mem_get_phys_addr(&phw->
|
||||
|
|
|
@ -571,14 +571,20 @@ struct hpi_control_cache *hpi_alloc_control_cache(const u32
|
|||
{
|
||||
struct hpi_control_cache *p_cache =
|
||||
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->control_count = number_of_controls;
|
||||
p_cache->p_cache =
|
||||
(struct hpi_control_cache_single *)pDSP_control_buffer;
|
||||
p_cache->init = 0;
|
||||
p_cache->p_info =
|
||||
kmalloc(sizeof(*p_cache->p_info) * p_cache->control_count,
|
||||
GFP_KERNEL);
|
||||
return p_cache;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
if (ins == NULL)
|
||||
if (ins == NULL)
|
||||
return NULL;
|
||||
|
||||
/* better to use vmalloc for this big table */
|
||||
ins->symbol_table.nsymbols = 0;
|
||||
ins->symbol_table.symbols = vmalloc(sizeof(struct dsp_symbol_entry) *
|
||||
DSP_MAX_SYMBOLS);
|
||||
ins->symbol_table.highest_frag_index = 0;
|
||||
|
||||
if (ins->symbol_table.symbols == NULL) {
|
||||
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 || !ins->code.data || !ins->modules) {
|
||||
cs46xx_dsp_spos_destroy(chip);
|
||||
goto error;
|
||||
}
|
||||
|
||||
ins->symbol_table.nsymbols = 0;
|
||||
ins->symbol_table.highest_frag_index = 0;
|
||||
ins->code.offset = 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->ntask = 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
|
||||
to 48000 khz */
|
||||
|
@ -271,8 +257,8 @@ struct dsp_spos_instance *cs46xx_dsp_spos_create (struct snd_cs46xx * chip)
|
|||
|
||||
/* set left and right validity bits and
|
||||
default channel status */
|
||||
ins->spdif_csuv_default =
|
||||
ins->spdif_csuv_stream =
|
||||
ins->spdif_csuv_default =
|
||||
ins->spdif_csuv_stream =
|
||||
/* 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 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)
|
|||
return ins;
|
||||
|
||||
error:
|
||||
kfree(ins->modules);
|
||||
kfree(ins->code.data);
|
||||
vfree(ins->symbol_table.symbols);
|
||||
kfree(ins);
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
@ -1166,6 +1166,7 @@ static const char *cs420x_models[CS420X_MODELS] = {
|
|||
|
||||
static struct snd_pci_quirk cs420x_cfg_tbl[] = {
|
||||
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, 0xcb89, "MacBookPro 7,1", CS420X_MBP55),
|
||||
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)
|
|||
static void lx_trigger_start(struct lx6464es *chip, struct lx_stream *lx_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;
|
||||
|
||||
|
@ -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)
|
||||
{
|
||||
const int is_capture = lx_stream->is_capture;
|
||||
const unsigned int is_capture = lx_stream->is_capture;
|
||||
int err;
|
||||
|
||||
snd_printd(LXP "stopping: stopping stream\n");
|
||||
|
|
|
@ -60,7 +60,7 @@ struct lx_stream {
|
|||
snd_pcm_uframes_t frame_pos;
|
||||
enum lx_stream_status status; /* free, open, running, draining
|
||||
* pause */
|
||||
int is_capture:1;
|
||||
unsigned int is_capture:1;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -1152,7 +1152,7 @@ static int lx_interrupt_request_new_buffer(struct lx6464es *chip,
|
|||
struct lx_stream *lx_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;
|
||||
unsigned long flags;
|
||||
|
||||
|
|
|
@ -25,8 +25,9 @@ config SND_SOC_ALL_CODECS
|
|||
select SND_SOC_CQ0093VC if MFD_DAVINCI_VOICECODEC
|
||||
select SND_SOC_CS42L51 if I2C
|
||||
select SND_SOC_CS4270 if I2C
|
||||
select SND_SOC_CX20442
|
||||
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_MAX9877 if I2C
|
||||
select SND_SOC_PCM3008
|
||||
|
|
|
@ -58,7 +58,7 @@
|
|||
(1000000000 / ((rate * 1000) / samples))
|
||||
|
||||
#define US_TO_SAMPLES(rate, us) \
|
||||
(rate / (1000000 / us))
|
||||
(rate / (1000000 / (us < 1000000 ? us : 1000000)))
|
||||
|
||||
#define UTHR_FROM_PERIOD_SIZE(samples, playrate, burstrate) \
|
||||
((samples * 5000) / ((burstrate * 5000) / (burstrate - playrate)))
|
||||
|
@ -200,7 +200,7 @@ static int dac33_read(struct snd_soc_codec *codec, unsigned int reg,
|
|||
u8 *value)
|
||||
{
|
||||
struct tlv320dac33_priv *dac33 = snd_soc_codec_get_drvdata(codec);
|
||||
int val;
|
||||
int val, ret = 0;
|
||||
|
||||
*value = reg & 0xff;
|
||||
|
||||
|
@ -210,6 +210,7 @@ static int dac33_read(struct snd_soc_codec *codec, unsigned int reg,
|
|||
if (val < 0) {
|
||||
dev_err(codec->dev, "Read failed (%d)\n", val);
|
||||
value[0] = dac33_read_reg_cache(codec, reg);
|
||||
ret = val;
|
||||
} else {
|
||||
value[0] = val;
|
||||
dac33_write_reg_cache(codec, reg, val);
|
||||
|
@ -218,7 +219,7 @@ static int dac33_read(struct snd_soc_codec *codec, unsigned int 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,
|
||||
|
@ -329,13 +330,18 @@ static void dac33_init_chip(struct snd_soc_codec *codec)
|
|||
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;
|
||||
|
||||
dac33_read(codec, DAC33_DEVICE_ID_MSB, ®);
|
||||
dac33_read(codec, DAC33_DEVICE_ID_LSB, ®);
|
||||
dac33_read(codec, DAC33_DEVICE_REV_ID, ®);
|
||||
for (i = 0; i < 3; i++) {
|
||||
ret = dac33_read(codec, DAC33_DEVICE_ID_MSB + i, ®);
|
||||
if (ret < 0)
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
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)
|
|||
/* Number of samples under i2c latency */
|
||||
dac33->alarm_threshold = US_TO_SAMPLES(rate,
|
||||
dac33->mode1_latency);
|
||||
nsample_limit = DAC33_BUFFER_SIZE_SAMPLES -
|
||||
dac33->alarm_threshold;
|
||||
|
||||
if (dac33->auto_fifo_config) {
|
||||
if (period_size <= dac33->alarm_threshold)
|
||||
/*
|
||||
|
@ -1086,6 +1095,8 @@ static void dac33_calculate_times(struct snd_pcm_substream *substream)
|
|||
((dac33->alarm_threshold / period_size) +
|
||||
(dac33->alarm_threshold % period_size ?
|
||||
1 : 0));
|
||||
else if (period_size > nsample_limit)
|
||||
dac33->nsample = nsample_limit;
|
||||
else
|
||||
dac33->nsample = period_size;
|
||||
} else {
|
||||
|
@ -1097,8 +1108,7 @@ static void dac33_calculate_times(struct snd_pcm_substream *substream)
|
|||
*/
|
||||
dac33->nsample_max = substream->runtime->buffer_size -
|
||||
period_size;
|
||||
nsample_limit = DAC33_BUFFER_SIZE_SAMPLES -
|
||||
dac33->alarm_threshold;
|
||||
|
||||
if (dac33->nsample_max > nsample_limit)
|
||||
dac33->nsample_max = nsample_limit;
|
||||
|
||||
|
@ -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);
|
||||
goto err_power;
|
||||
}
|
||||
dac33_read_id(codec);
|
||||
ret = dac33_read_id(codec);
|
||||
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 */
|
||||
if (dac33->irq >= 0) {
|
||||
ret = request_irq(dac33->irq, dac33_interrupt_handler,
|
||||
|
|
|
@ -119,13 +119,13 @@ static int tpa6130a2_power(int power)
|
|||
{
|
||||
struct tpa6130a2_data *data;
|
||||
u8 val;
|
||||
int ret;
|
||||
int ret = 0;
|
||||
|
||||
BUG_ON(tpa6130a2_client == NULL);
|
||||
data = i2c_get_clientdata(tpa6130a2_client);
|
||||
|
||||
mutex_lock(&data->mutex);
|
||||
if (power) {
|
||||
if (power && !data->power_state) {
|
||||
/* Power on */
|
||||
if (data->power_gpio >= 0)
|
||||
gpio_set_value(data->power_gpio, 1);
|
||||
|
@ -153,7 +153,7 @@ static int tpa6130a2_power(int power)
|
|||
val = tpa6130a2_read(TPA6130A2_REG_CONTROL);
|
||||
val &= ~TPA6130A2_SWS;
|
||||
tpa6130a2_i2c_write(TPA6130A2_REG_CONTROL, val);
|
||||
} else {
|
||||
} else if (!power && data->power_state) {
|
||||
/* set SWS */
|
||||
val = tpa6130a2_read(TPA6130A2_REG_CONTROL);
|
||||
val |= TPA6130A2_SWS;
|
||||
|
|
|
@ -186,7 +186,6 @@ static int wm8900_volatile_register(unsigned int reg)
|
|||
{
|
||||
switch (reg) {
|
||||
case WM8900_REG_ID:
|
||||
case WM8900_REG_POWER1:
|
||||
return 1;
|
||||
default:
|
||||
return 0;
|
||||
|
@ -1200,11 +1199,6 @@ static int wm8900_probe(struct snd_soc_codec *codec)
|
|||
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);
|
||||
|
||||
/* Turn the chip on */
|
||||
|
|
|
@ -123,7 +123,7 @@ static void calibrate_dc_servo(struct snd_soc_codec *codec)
|
|||
reg_r = reg & WM8993_DCS_DAC_WR_VAL_0_MASK;
|
||||
break;
|
||||
default:
|
||||
WARN(1, "Unknown DCS readback method");
|
||||
WARN(1, "Unknown DCS readback method\n");
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -79,7 +79,7 @@ static void tosa_ext_control(struct snd_soc_codec *codec)
|
|||
static int tosa_startup(struct snd_pcm_substream *substream)
|
||||
{
|
||||
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 */
|
||||
tosa_ext_control(codec);
|
||||
|
|
|
@ -165,8 +165,11 @@ static ssize_t pmdown_time_set(struct device *dev,
|
|||
{
|
||||
struct snd_soc_pcm_runtime *rtd =
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -60,7 +60,7 @@ static const struct rc_config {
|
|||
{ 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, 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 */
|
||||
};
|
||||
|
||||
|
@ -183,7 +183,13 @@ static int snd_audigy2nx_led_put(struct snd_kcontrol *kcontrol, struct snd_ctl_e
|
|||
if (value > 1)
|
||||
return -EINVAL;
|
||||
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_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER,
|
||||
value, index + 2, NULL, 0, 100);
|
||||
|
@ -225,8 +231,12 @@ static int snd_audigy2nx_controls_create(struct usb_mixer_interface *mixer)
|
|||
int i, err;
|
||||
|
||||
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 */
|
||||
(mixer->chip->usb_id == USB_ID(0x041e, 0x3040) ||
|
||||
mixer->chip->usb_id == USB_ID(0x041e, 0x3042) ||
|
||||
mixer->chip->usb_id == USB_ID(0x041e, 0x3048)))
|
||||
break;
|
||||
err = snd_ctl_add(mixer->chip->card,
|
||||
|
@ -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) ||
|
||||
mixer->chip->usb_id == USB_ID(0x041e, 0x3040) ||
|
||||
mixer->chip->usb_id == USB_ID(0x041e, 0x3042) ||
|
||||
mixer->chip->usb_id == USB_ID(0x041e, 0x3048)) {
|
||||
if ((err = snd_audigy2nx_controls_create(mixer)) < 0)
|
||||
return err;
|
||||
|
|
|
@ -676,8 +676,10 @@ static int snd_usb_pcm_check_knot(struct snd_pcm_runtime *runtime,
|
|||
if (!needs_knot)
|
||||
return 0;
|
||||
|
||||
subs->rate_list.count = count;
|
||||
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;
|
||||
count = 0;
|
||||
list_for_each_entry(fp, &subs->fmt_list, list) {
|
||||
|
|
Loading…
Reference in a new issue