[alsa-devel] [PATCH] Driver for Emagic Audiowerk 2
Takashi Iwai
tiwai at suse.de
Tue Feb 19 18:28:28 CET 2008
At Tue, 19 Feb 2008 18:11:45 +0100,
Cédric Brégardis wrote:
>
> At Tuesday 19 February 2008 11:37:09, Takashi Iwai wrote:
> > At Tue, 19 Feb 2008 00:38:54 +0100,
> >
> > Cédric Brégardis wrote:
> > > Signed-off-by: Cedric Bregardis <cedric.bregardis at free.fr>
> > >
> > > Signed-off-by: Jean-Christian Hassler <jhassler at free.fr>
> >
> > Could you avoid HTML mail? I cannot get the patch properly.
> > If embedding text is difficult, rather use an attachment.
>
>
> Oh ! I am really sorry. I don't understand why my mailer has sent this mail in
> HTML... And as a side effect the mail has been refused by the list (too big).
>
> So, this time you will find the patch in attachment, as suggested.
Thanks. I've checked again right now, and found some remaining
issues.
> + /* check PCI availability (32bit DMA) */
> + if ((pci_set_dma_mask(pci, DMA_32BIT_MASK) < 0) ||
> + (pci_set_consistent_dma_mask(pci, DMA_32BIT_MASK) < 0)) {
> + printk(KERN_ERR "Impossible to set 32bit mask DMA\n");
The error message should have some prefix to indicate the driver
name. Otherwise you'll have no idea who wrote it.
> + if (chip->saa7146.iobase_virt == NULL) {
> + printk(KERN_ERR "unable to remap memory region");
Ditto.
> + if (request_irq(pci->irq, snd_aw2_saa7146_interrupt,
> + IRQF_SHARED, "Audiowerk2", (void *)chip)) {
The cast to void* isn't needed.
> + printk(KERN_ERR "Cannot grab irq %d\n", pci->irq);
Add prefix.
> +/* constructor */
> +static int __devinit snd_aw2_probe(struct pci_dev *pci,
> + const struct pci_device_id *pci_id)
(snip)
> + /* initialize semaphore */
> + init_MUTEX(&(chip->saa7146.sem));
Use struct mutex instead of semaphore. Also, the parenthesis around
'&' isn't needed.
> + /* init spinlock */
> + spin_lock_init(&chip->saa7146.reg_lock);
The spinlock is actually local to aw2-alsa.c, isn't it? Then it
should be outside saa7146.
> + /* initialize wait queue */
> + init_waitqueue_head(&chip->saa7146.wait_iic);
... and I'd suggest to the initializations of struct saa7146 to
aw2-saa7146.c. mutex should be initialized there, too.
> +/* create a pcm device */
> +static int __devinit snd_aw2_new_pcm(struct aw2 *chip)
(snip)
> + /* pre-allocation of buffers */
> + /* Preallocate continuous pages. */
> + err = snd_pcm_lib_preallocate_pages_for_all(pcm_playback_ana,
> + SNDRV_DMA_TYPE_DEV,
> + snd_dma_pci_data
> + (chip->pci),
> + 64 * 1024, 64 * 1024);
> + if (err) {
> + printk(KERN_ERR "snd_pcm_lib_preallocate_pages_for_all error "
> + "(0x%X)\n", err);
> + return err;
> + }
The error from preallocator isn't fatal. You can ignore it.
> +void snd_aw2_saa7146_pcm_trigger_start_playback(struct snd_aw2_saa7146 *chip,
> + int stream_number)
(snip)
> + } else if (stream_number == 1) {
> + WRITEREG((TR_E_A1_OUT << 16) | TR_E_A1_OUT, MC1);
> +
> + /* WS1_CTRL, WS1_SYNC: output TSL1, I2S */
> + acon1 |= 1 * WS1_CTRL;
> + WRITEREG(acon1, ACON1);
> + } else {
> + }
Remove the empty block.
> +void snd_aw2_saa7146_pcm_trigger_stop_playback(struct snd_aw2_saa7146 *chip,
> + int stream_number)
(snip)
> + } else if (stream_number == 1) {
> + /* WS1_CTRL, WS1_SYNC: output TSL1, I2S */
> + acon1 &= ~(3 * WS1_CTRL);
> + WRITEREG(acon1, ACON1);
> +
> + WRITEREG((TR_E_A1_OUT << 16), MC1);
> + } else {
> + }
Ditto.
> +void snd_aw2_saa7146_pcm_trigger_start_capture(struct snd_aw2_saa7146 *chip,
> + int stream_number)
> +{
> + /* In aw8 driver, dma transfert is always active. It is
> + started and stopped in a larger "space" */
> + if (stream_number == 0) {
> + WRITEREG((TR_E_A1_IN << 16) | TR_E_A1_IN, MC1);
> + } else {
> + }
Ditto.
> +void snd_aw2_saa7146_pcm_trigger_stop_capture(struct snd_aw2_saa7146 *chip,
> + int stream_number)
> +{
> + if (stream_number == 0) {
> + WRITEREG((TR_E_A1_IN << 16), MC1);
> + } else {
> + }
Ditto.
> +irqreturn_t snd_aw2_saa7146_interrupt(int irq, void *dev_id)
> +{
> + unsigned int isr;
> + unsigned int iicsta;
> + struct snd_aw2_saa7146 *chip = dev_id;
> +
> + isr = READREG(ISR);
> + if (!isr)
> + return IRQ_NONE;
> +
> + WRITEREG(isr, ISR);
> +
> + if (isr & (IIC_S | IIC_E)) {
> + iicsta = READREG(IICSTA);
> + WRITEREG(0x100, IICSTA);
> + wake_up(&chip->wait_iic);
> + } else if (isr) {
> + }
Ditto.
> +unsigned int snd_aw2_saa7146_get_hw_ptr_playback(struct snd_aw2_saa7146 *chip,
> + int stream_number,
> + unsigned char *start_addr,
> + unsigned int buffer_size)
(snip)
> + if (stream_number == 1) {
> + pci_adp = READREG(PCI_ADP1);
> + ptr = pci_adp - (size_t) start_addr;
> +
> + if (ptr == buffer_size)
> + ptr = 0;
> + } else {
> + }
Ditto.
> +int snd_aw2_saa7146_is_using_digital_input(struct snd_aw2_saa7146 *chip)
> +{
> + unsigned int reg_val = READREG(GPIO_CTRL);
> + if ((reg_val & 0xFF) == 0x40) {
> + return 1;
> + } else {
> + return 0;
> + }
Remove braces around the single if-statement.
Can be found in many other places.
(I thought this should be suggested by checkpatch.pl, but apparently
not perfectly detected...)
Takashi
More information about the Alsa-devel
mailing list