Merge branch 'fix/misc' into topic/misc

This commit is contained in:
Takashi Iwai 2010-11-22 08:11:10 +01:00
commit d2b88e4c10
23 changed files with 121 additions and 65 deletions

View File

@ -420,7 +420,7 @@ static int __devinit atmel_abdac_probe(struct platform_device *pdev)
return PTR_ERR(pclk); return PTR_ERR(pclk);
} }
sample_clk = clk_get(&pdev->dev, "sample_clk"); sample_clk = clk_get(&pdev->dev, "sample_clk");
if (IS_ERR(pclk)) { if (IS_ERR(sample_clk)) {
dev_dbg(&pdev->dev, "no sample clock\n"); dev_dbg(&pdev->dev, "no sample clock\n");
retval = PTR_ERR(pclk); retval = PTR_ERR(pclk);
goto out_put_pclk; goto out_put_pclk;

View File

@ -223,7 +223,7 @@ static void xrun_log(struct snd_pcm_substream *substream,
entry->jiffies = jiffies; entry->jiffies = jiffies;
entry->pos = pos; entry->pos = pos;
entry->period_size = runtime->period_size; entry->period_size = runtime->period_size;
entry->buffer_size = runtime->buffer_size;; entry->buffer_size = runtime->buffer_size;
entry->old_hw_ptr = runtime->status->hw_ptr; entry->old_hw_ptr = runtime->status->hw_ptr;
entry->hw_ptr_base = runtime->hw_ptr_base; entry->hw_ptr_base = runtime->hw_ptr_base;
log->idx = (log->idx + 1) % XRUN_LOG_CNT; log->idx = (log->idx + 1) % XRUN_LOG_CNT;

View File

@ -71,7 +71,7 @@ int sound_install_audiodrv(int vers, char *name, struct audio_driver *driver,
if (sound_nblocks >= MAX_MEM_BLOCKS) if (sound_nblocks >= MAX_MEM_BLOCKS)
sound_nblocks = MAX_MEM_BLOCKS - 1; sound_nblocks = MAX_MEM_BLOCKS - 1;
op = (struct audio_operations *) (sound_mem_blocks[sound_nblocks] = vmalloc(sizeof(struct audio_operations))); op = (struct audio_operations *) (sound_mem_blocks[sound_nblocks] = vzalloc(sizeof(struct audio_operations)));
sound_nblocks++; sound_nblocks++;
if (sound_nblocks >= MAX_MEM_BLOCKS) if (sound_nblocks >= MAX_MEM_BLOCKS)
sound_nblocks = MAX_MEM_BLOCKS - 1; sound_nblocks = MAX_MEM_BLOCKS - 1;
@ -81,7 +81,6 @@ int sound_install_audiodrv(int vers, char *name, struct audio_driver *driver,
sound_unload_audiodev(num); sound_unload_audiodev(num);
return -(ENOMEM); return -(ENOMEM);
} }
memset((char *) op, 0, sizeof(struct audio_operations));
init_waitqueue_head(&op->in_sleeper); init_waitqueue_head(&op->in_sleeper);
init_waitqueue_head(&op->out_sleeper); init_waitqueue_head(&op->out_sleeper);
init_waitqueue_head(&op->poll_sleeper); init_waitqueue_head(&op->poll_sleeper);
@ -128,7 +127,7 @@ int sound_install_mixer(int vers, char *name, struct mixer_operations *driver,
/* FIXME: This leaks a mixer_operations struct every time its called /* FIXME: This leaks a mixer_operations struct every time its called
until you unload sound! */ until you unload sound! */
op = (struct mixer_operations *) (sound_mem_blocks[sound_nblocks] = vmalloc(sizeof(struct mixer_operations))); op = (struct mixer_operations *) (sound_mem_blocks[sound_nblocks] = vzalloc(sizeof(struct mixer_operations)));
sound_nblocks++; sound_nblocks++;
if (sound_nblocks >= MAX_MEM_BLOCKS) if (sound_nblocks >= MAX_MEM_BLOCKS)
sound_nblocks = MAX_MEM_BLOCKS - 1; sound_nblocks = MAX_MEM_BLOCKS - 1;
@ -137,7 +136,6 @@ int sound_install_mixer(int vers, char *name, struct mixer_operations *driver,
printk(KERN_ERR "Sound: Can't allocate mixer driver for (%s)\n", name); printk(KERN_ERR "Sound: Can't allocate mixer driver for (%s)\n", name);
return -ENOMEM; return -ENOMEM;
} }
memset((char *) op, 0, sizeof(struct mixer_operations));
memcpy((char *) op, (char *) driver, driver_size); memcpy((char *) op, (char *) driver, driver_size);
strlcpy(op->name, name, sizeof(op->name)); strlcpy(op->name, name, sizeof(op->name));

View File

@ -178,7 +178,7 @@ int MIDIbuf_open(int dev, struct file *file)
return err; return err;
parms[dev].prech_timeout = MAX_SCHEDULE_TIMEOUT; parms[dev].prech_timeout = MAX_SCHEDULE_TIMEOUT;
midi_in_buf[dev] = (struct midi_buf *) vmalloc(sizeof(struct midi_buf)); midi_in_buf[dev] = vmalloc(sizeof(struct midi_buf));
if (midi_in_buf[dev] == NULL) if (midi_in_buf[dev] == NULL)
{ {
@ -188,7 +188,7 @@ int MIDIbuf_open(int dev, struct file *file)
} }
midi_in_buf[dev]->len = midi_in_buf[dev]->head = midi_in_buf[dev]->tail = 0; midi_in_buf[dev]->len = midi_in_buf[dev]->head = midi_in_buf[dev]->tail = 0;
midi_out_buf[dev] = (struct midi_buf *) vmalloc(sizeof(struct midi_buf)); midi_out_buf[dev] = vmalloc(sizeof(struct midi_buf));
if (midi_out_buf[dev] == NULL) if (midi_out_buf[dev] == NULL)
{ {

View File

@ -859,7 +859,7 @@ static int pss_coproc_ioctl(void *dev_info, unsigned int cmd, void __user *arg,
return 0; return 0;
case SNDCTL_COPR_LOAD: case SNDCTL_COPR_LOAD:
buf = (copr_buffer *) vmalloc(sizeof(copr_buffer)); buf = vmalloc(sizeof(copr_buffer));
if (buf == NULL) if (buf == NULL)
return -ENOSPC; return -ENOSPC;
if (copy_from_user(buf, arg, sizeof(copr_buffer))) { if (copy_from_user(buf, arg, sizeof(copr_buffer))) {
@ -871,7 +871,7 @@ static int pss_coproc_ioctl(void *dev_info, unsigned int cmd, void __user *arg,
return err; return err;
case SNDCTL_COPR_SENDMSG: case SNDCTL_COPR_SENDMSG:
mbuf = (copr_msg *)vmalloc(sizeof(copr_msg)); mbuf = vmalloc(sizeof(copr_msg));
if (mbuf == NULL) if (mbuf == NULL)
return -ENOSPC; return -ENOSPC;
if (copy_from_user(mbuf, arg, sizeof(copr_msg))) { if (copy_from_user(mbuf, arg, sizeof(copr_msg))) {
@ -895,7 +895,7 @@ static int pss_coproc_ioctl(void *dev_info, unsigned int cmd, void __user *arg,
case SNDCTL_COPR_RCVMSG: case SNDCTL_COPR_RCVMSG:
err = 0; err = 0;
mbuf = (copr_msg *)vmalloc(sizeof(copr_msg)); mbuf = vmalloc(sizeof(copr_msg));
if (mbuf == NULL) if (mbuf == NULL)
return -ENOSPC; return -ENOSPC;
data = (unsigned short *)mbuf->data; data = (unsigned short *)mbuf->data;

View File

@ -1646,13 +1646,13 @@ void sequencer_init(void)
{ {
if (sequencer_ok) if (sequencer_ok)
return; return;
queue = (unsigned char *)vmalloc(SEQ_MAX_QUEUE * EV_SZ); queue = vmalloc(SEQ_MAX_QUEUE * EV_SZ);
if (queue == NULL) if (queue == NULL)
{ {
printk(KERN_ERR "sequencer: Can't allocate memory for sequencer output queue\n"); printk(KERN_ERR "sequencer: Can't allocate memory for sequencer output queue\n");
return; return;
} }
iqueue = (unsigned char *)vmalloc(SEQ_MAX_QUEUE * IEV_SZ); iqueue = vmalloc(SEQ_MAX_QUEUE * IEV_SZ);
if (iqueue == NULL) if (iqueue == NULL)
{ {
printk(KERN_ERR "sequencer: Can't allocate memory for sequencer input queue\n"); printk(KERN_ERR "sequencer: Can't allocate memory for sequencer input queue\n");

View File

@ -435,7 +435,7 @@ void __devexit asihpi_adapter_remove(struct pci_dev *pci_dev)
struct hpi_message hm; struct hpi_message hm;
struct hpi_response hr; struct hpi_response hr;
struct hpi_adapter *pa; struct hpi_adapter *pa;
pa = (struct hpi_adapter *)pci_get_drvdata(pci_dev); pa = pci_get_drvdata(pci_dev);
hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM, hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM,
HPI_SUBSYS_DELETE_ADAPTER); HPI_SUBSYS_DELETE_ADAPTER);

View File

@ -1129,10 +1129,11 @@ snd_azf3328_codec_setdmaa(struct snd_azf3328 *chip,
count_areas = size/2; count_areas = size/2;
addr_area2 = addr+count_areas; addr_area2 = addr+count_areas;
count_areas--; /* max. index */
snd_azf3328_dbgcodec("setdma: buffers %08lx[%u] / %08lx[%u]\n", snd_azf3328_dbgcodec("setdma: buffers %08lx[%u] / %08lx[%u]\n",
addr, count_areas, addr_area2, count_areas); addr, count_areas, addr_area2, count_areas);
count_areas--; /* max. index */
/* build combined I/O buffer length word */ /* build combined I/O buffer length word */
lengths = (count_areas << 16) | (count_areas); lengths = (count_areas << 16) | (count_areas);
spin_lock_irqsave(&chip->reg_lock, flags); spin_lock_irqsave(&chip->reg_lock, flags);
@ -1740,11 +1741,15 @@ static const struct snd_pcm_hardware snd_azf3328_hardware =
.rate_max = AZF_FREQ_66200, .rate_max = AZF_FREQ_66200,
.channels_min = 1, .channels_min = 1,
.channels_max = 2, .channels_max = 2,
.buffer_bytes_max = 65536, .buffer_bytes_max = (64*1024),
.period_bytes_min = 64, .period_bytes_min = 1024,
.period_bytes_max = 65536, .period_bytes_max = (32*1024),
.periods_min = 1, /* We simply have two DMA areas (instead of a list of descriptors
.periods_max = 1024, such as other cards); I believe that this is a fixed hardware
attribute and there isn't much driver magic to be done to expand it.
Thus indicate that we have at least and at most 2 periods. */
.periods_min = 2,
.periods_max = 2,
/* FIXME: maybe that card actually has a FIFO? /* FIXME: maybe that card actually has a FIFO?
* Hmm, it seems newer revisions do have one, but we still don't know * Hmm, it seems newer revisions do have one, but we still don't know
* its size... */ * its size... */
@ -1980,8 +1985,13 @@ snd_azf3328_timer_stop(struct snd_timer *timer)
chip = snd_timer_chip(timer); chip = snd_timer_chip(timer);
spin_lock_irqsave(&chip->reg_lock, flags); spin_lock_irqsave(&chip->reg_lock, flags);
/* disable timer countdown and interrupt */ /* disable timer countdown and interrupt */
/* FIXME: should we write TIMER_IRQ_ACK here? */ /* Hmm, should we write TIMER_IRQ_ACK here?
snd_azf3328_ctrl_outb(chip, IDX_IO_TIMER_VALUE + 3, 0); YES indeed, otherwise a rogue timer operation - which prompts
ALSA(?) to call repeated stop() in vain, but NOT start() -
will never end (value 0x03 is kept shown in control byte).
Simply manually poking 0x04 _once_ immediately successfully stops
the hardware/ALSA interrupt activity. */
snd_azf3328_ctrl_outb(chip, IDX_IO_TIMER_VALUE + 3, 0x04);
spin_unlock_irqrestore(&chip->reg_lock, flags); spin_unlock_irqrestore(&chip->reg_lock, flags);
snd_azf3328_dbgcallleave(); snd_azf3328_dbgcallleave();
return 0; return 0;

View File

@ -129,8 +129,6 @@ static int ct_pcm_playback_open(struct snd_pcm_substream *substream)
apcm->substream = substream; apcm->substream = substream;
apcm->interrupt = ct_atc_pcm_interrupt; apcm->interrupt = ct_atc_pcm_interrupt;
runtime->private_data = apcm;
runtime->private_free = ct_atc_pcm_free_substream;
if (IEC958 == substream->pcm->device) { if (IEC958 == substream->pcm->device) {
runtime->hw = ct_spdif_passthru_playback_hw; runtime->hw = ct_spdif_passthru_playback_hw;
atc->spdif_out_passthru(atc, 1); atc->spdif_out_passthru(atc, 1);
@ -155,8 +153,12 @@ static int ct_pcm_playback_open(struct snd_pcm_substream *substream)
} }
apcm->timer = ct_timer_instance_new(atc->timer, apcm); apcm->timer = ct_timer_instance_new(atc->timer, apcm);
if (!apcm->timer) if (!apcm->timer) {
kfree(apcm);
return -ENOMEM; return -ENOMEM;
}
runtime->private_data = apcm;
runtime->private_free = ct_atc_pcm_free_substream;
return 0; return 0;
} }
@ -278,8 +280,6 @@ static int ct_pcm_capture_open(struct snd_pcm_substream *substream)
apcm->started = 0; apcm->started = 0;
apcm->substream = substream; apcm->substream = substream;
apcm->interrupt = ct_atc_pcm_interrupt; apcm->interrupt = ct_atc_pcm_interrupt;
runtime->private_data = apcm;
runtime->private_free = ct_atc_pcm_free_substream;
runtime->hw = ct_pcm_capture_hw; runtime->hw = ct_pcm_capture_hw;
runtime->hw.rate_max = atc->rsr * atc->msr; runtime->hw.rate_max = atc->rsr * atc->msr;
@ -298,8 +298,12 @@ static int ct_pcm_capture_open(struct snd_pcm_substream *substream)
} }
apcm->timer = ct_timer_instance_new(atc->timer, apcm); apcm->timer = ct_timer_instance_new(atc->timer, apcm);
if (!apcm->timer) if (!apcm->timer) {
kfree(apcm);
return -ENOMEM; return -ENOMEM;
}
runtime->private_data = apcm;
runtime->private_free = ct_atc_pcm_free_substream;
return 0; return 0;
} }

View File

@ -3100,6 +3100,7 @@ static struct snd_pci_quirk cxt5066_cfg_tbl[] = {
SND_PCI_QUIRK(0x1028, 0x0402, "Dell Vostro", CXT5066_DELL_VOSTRO), SND_PCI_QUIRK(0x1028, 0x0402, "Dell Vostro", CXT5066_DELL_VOSTRO),
SND_PCI_QUIRK(0x1028, 0x0408, "Dell Inspiron One 19T", CXT5066_IDEAPAD), SND_PCI_QUIRK(0x1028, 0x0408, "Dell Inspiron One 19T", CXT5066_IDEAPAD),
SND_PCI_QUIRK(0x103c, 0x360b, "HP G60", CXT5066_HP_LAPTOP), SND_PCI_QUIRK(0x103c, 0x360b, "HP G60", CXT5066_HP_LAPTOP),
SND_PCI_QUIRK(0x1043, 0x13f3, "Asus A52J", CXT5066_HP_LAPTOP),
SND_PCI_QUIRK(0x1179, 0xff1e, "Toshiba Satellite C650D", CXT5066_IDEAPAD), SND_PCI_QUIRK(0x1179, 0xff1e, "Toshiba Satellite C650D", CXT5066_IDEAPAD),
SND_PCI_QUIRK(0x1179, 0xff50, "Toshiba Satellite P500-PSPGSC-01800T", CXT5066_OLPC_XO_1_5), SND_PCI_QUIRK(0x1179, 0xff50, "Toshiba Satellite P500-PSPGSC-01800T", CXT5066_OLPC_XO_1_5),
SND_PCI_QUIRK(0x1179, 0xffe0, "Toshiba Satellite Pro T130-15F", CXT5066_OLPC_XO_1_5), SND_PCI_QUIRK(0x1179, 0xffe0, "Toshiba Satellite Pro T130-15F", CXT5066_OLPC_XO_1_5),

View File

@ -10816,6 +10816,9 @@ static int alc_auto_add_mic_boost(struct hda_codec *codec)
return 0; return 0;
} }
static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec,
const struct auto_pin_cfg *cfg);
/* almost identical with ALC880 parser... */ /* almost identical with ALC880 parser... */
static int alc882_parse_auto_config(struct hda_codec *codec) static int alc882_parse_auto_config(struct hda_codec *codec)
{ {
@ -10833,7 +10836,10 @@ static int alc882_parse_auto_config(struct hda_codec *codec)
err = alc880_auto_fill_dac_nids(spec, &spec->autocfg); err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
if (err < 0) if (err < 0)
return err; return err;
err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg); if (codec->vendor_id == 0x10ec0887)
err = alc861vd_auto_create_multi_out_ctls(spec, &spec->autocfg);
else
err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
if (err < 0) if (err < 0)
return err; return err;
err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0], err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
@ -16963,7 +16969,7 @@ static void alc861vd_auto_init_analog_input(struct hda_codec *codec)
#define alc861vd_idx_to_mixer_switch(nid) ((nid) + 0x0c) #define alc861vd_idx_to_mixer_switch(nid) ((nid) + 0x0c)
/* add playback controls from the parsed DAC table */ /* add playback controls from the parsed DAC table */
/* Based on ALC880 version. But ALC861VD has separate, /* Based on ALC880 version. But ALC861VD and ALC887 have separate,
* different NIDs for mute/unmute switch and volume control */ * different NIDs for mute/unmute switch and volume control */
static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec, static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec,
const struct auto_pin_cfg *cfg) const struct auto_pin_cfg *cfg)
@ -19298,6 +19304,7 @@ static const struct alc_fixup alc662_fixups[] = {
static struct snd_pci_quirk alc662_fixup_tbl[] = { static struct snd_pci_quirk alc662_fixup_tbl[] = {
SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE), SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE),
SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD),
SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD), SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD),
SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD), SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD),
{} {}

View File

@ -389,6 +389,11 @@ static hda_nid_t stac92hd83xxx_dmic_nids[STAC92HD83XXX_NUM_DMICS + 1] = {
0x11, 0x20, 0 0x11, 0x20, 0
}; };
#define STAC92HD87B_NUM_DMICS 1
static hda_nid_t stac92hd87b_dmic_nids[STAC92HD87B_NUM_DMICS + 1] = {
0x11, 0
};
#define STAC92HD83XXX_NUM_CAPS 2 #define STAC92HD83XXX_NUM_CAPS 2
static unsigned long stac92hd83xxx_capvols[] = { static unsigned long stac92hd83xxx_capvols[] = {
HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_OUTPUT), HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_OUTPUT),
@ -5452,12 +5457,17 @@ again:
stac92hd83xxx_brd_tbl[spec->board_config]); stac92hd83xxx_brd_tbl[spec->board_config]);
switch (codec->vendor_id) { switch (codec->vendor_id) {
case 0x111d76d1:
case 0x111d76d9:
spec->dmic_nids = stac92hd87b_dmic_nids;
spec->num_dmics = stac92xx_connected_ports(codec,
stac92hd87b_dmic_nids,
STAC92HD87B_NUM_DMICS);
/* Fall through */
case 0x111d7666: case 0x111d7666:
case 0x111d7667: case 0x111d7667:
case 0x111d7668: case 0x111d7668:
case 0x111d7669: case 0x111d7669:
case 0x111d76d1:
case 0x111d76d9:
spec->num_pins = ARRAY_SIZE(stac92hd88xxx_pin_nids); spec->num_pins = ARRAY_SIZE(stac92hd88xxx_pin_nids);
spec->pin_nids = stac92hd88xxx_pin_nids; spec->pin_nids = stac92hd88xxx_pin_nids;
spec->mono_nid = 0; spec->mono_nid = 0;

View File

@ -1864,6 +1864,12 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = {
.name = "Dell Inspiron 8600", /* STAC9750/51 */ .name = "Dell Inspiron 8600", /* STAC9750/51 */
.type = AC97_TUNE_HP_ONLY .type = AC97_TUNE_HP_ONLY
}, },
{
.subvendor = 0x1028,
.subdevice = 0x0182,
.name = "Dell Latitude D610", /* STAC9750/51 */
.type = AC97_TUNE_HP_ONLY
},
{ {
.subvendor = 0x1028, .subvendor = 0x1028,
.subdevice = 0x0186, .subdevice = 0x0186,

View File

@ -25,11 +25,21 @@
#include <sound/hwdep.h> #include <sound/hwdep.h>
#ifndef readl_be
#define readl_be(x) be32_to_cpu(__raw_readl(x)) #define readl_be(x) be32_to_cpu(__raw_readl(x))
#define writel_be(data,addr) __raw_writel(cpu_to_be32(data),addr) #endif
#ifndef writel_be
#define writel_be(data,addr) __raw_writel(cpu_to_be32(data),addr)
#endif
#ifndef readl_le
#define readl_le(x) le32_to_cpu(__raw_readl(x)) #define readl_le(x) le32_to_cpu(__raw_readl(x))
#endif
#ifndef writel_le
#define writel_le(data,addr) __raw_writel(cpu_to_le32(data),addr) #define writel_le(data,addr) __raw_writel(cpu_to_le32(data),addr)
#endif
#define MIXART_MEM(mgr,x) ((mgr)->mem[0].virt + (x)) #define MIXART_MEM(mgr,x) ((mgr)->mem[0].virt + (x))
#define MIXART_REG(mgr,x) ((mgr)->mem[1].virt + (x)) #define MIXART_REG(mgr,x) ((mgr)->mem[1].virt + (x))

View File

@ -1228,10 +1228,8 @@ int __devinit snd_pmac_new(struct snd_card *card, struct snd_pmac **chip_return)
chip->rsrc[i].start + 1, chip->rsrc[i].start + 1,
rnames[i]) == NULL) { rnames[i]) == NULL) {
printk(KERN_ERR "snd: can't request rsrc " printk(KERN_ERR "snd: can't request rsrc "
" %d (%s: 0x%016llx:%016llx)\n", " %d (%s: %pR)\n",
i, rnames[i], i, rnames[i], &chip->rsrc[i]);
(unsigned long long)chip->rsrc[i].start,
(unsigned long long)chip->rsrc[i].end);
err = -ENODEV; err = -ENODEV;
goto __error; goto __error;
} }
@ -1256,10 +1254,8 @@ int __devinit snd_pmac_new(struct snd_card *card, struct snd_pmac **chip_return)
chip->rsrc[i].start + 1, chip->rsrc[i].start + 1,
rnames[i]) == NULL) { rnames[i]) == NULL) {
printk(KERN_ERR "snd: can't request rsrc " printk(KERN_ERR "snd: can't request rsrc "
" %d (%s: 0x%016llx:%016llx)\n", " %d (%s: %pR)\n",
i, rnames[i], i, rnames[i], &chip->rsrc[i]);
(unsigned long long)chip->rsrc[i].start,
(unsigned long long)chip->rsrc[i].end);
err = -ENODEV; err = -ENODEV;
goto __error; goto __error;
} }

View File

@ -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

View File

@ -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,
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,
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,
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)
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)
/* 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)
((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)
*/ */
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)
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,

View File

@ -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)
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;

View File

@ -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)
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 */

View File

@ -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;
} }

View File

@ -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);

View File

@ -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;
} }

View File

@ -155,7 +155,7 @@ static int snd_at73c213_set_bitrate(struct snd_at73c213 *chip)
if (max_tries < 1) if (max_tries < 1)
max_tries = 1; max_tries = 1;
/* ssc_div must be a power of 2. */ /* ssc_div must be even. */
ssc_div = (ssc_div + 1) & ~1UL; ssc_div = (ssc_div + 1) & ~1UL;
if ((ssc_rate / (ssc_div * 2 * 16)) < BITRATE_MIN) { if ((ssc_rate / (ssc_div * 2 * 16)) < BITRATE_MIN) {