blob: 332a71de9673f3d5ed15cb3ad31f58ef9d1cc25d [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * ALSA driver for ATI IXP 150/200/250/300 AC97 controllers
3 *
4 * Copyright (c) 2004 Takashi Iwai <tiwai@suse.de>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 *
20 */
21
22#include <sound/driver.h>
23#include <asm/io.h>
24#include <linux/delay.h>
25#include <linux/interrupt.h>
26#include <linux/init.h>
27#include <linux/pci.h>
28#include <linux/slab.h>
29#include <linux/moduleparam.h>
30#include <sound/core.h>
31#include <sound/pcm.h>
32#include <sound/pcm_params.h>
33#include <sound/info.h>
34#include <sound/ac97_codec.h>
35#include <sound/initval.h>
36
37MODULE_AUTHOR("Takashi Iwai <tiwai@suse.de>");
38MODULE_DESCRIPTION("ATI IXP AC97 controller");
39MODULE_LICENSE("GPL");
40MODULE_SUPPORTED_DEVICE("{{ATI,IXP150/200/250/300/400}}");
41
Clemens Ladischb7fe4622005-10-04 08:46:51 +020042static int index = SNDRV_DEFAULT_IDX1; /* Index 0-MAX */
43static char *id = SNDRV_DEFAULT_STR1; /* ID for this card */
44static int ac97_clock = 48000;
45static char *ac97_quirk;
46static int spdif_aclink = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -070047
Clemens Ladischb7fe4622005-10-04 08:46:51 +020048module_param(index, int, 0444);
Linus Torvalds1da177e2005-04-16 15:20:36 -070049MODULE_PARM_DESC(index, "Index value for ATI IXP controller.");
Clemens Ladischb7fe4622005-10-04 08:46:51 +020050module_param(id, charp, 0444);
Linus Torvalds1da177e2005-04-16 15:20:36 -070051MODULE_PARM_DESC(id, "ID string for ATI IXP controller.");
Clemens Ladischb7fe4622005-10-04 08:46:51 +020052module_param(ac97_clock, int, 0444);
Linus Torvalds1da177e2005-04-16 15:20:36 -070053MODULE_PARM_DESC(ac97_clock, "AC'97 codec clock (default 48000Hz).");
Clemens Ladischb7fe4622005-10-04 08:46:51 +020054module_param(ac97_quirk, charp, 0444);
Linus Torvalds1da177e2005-04-16 15:20:36 -070055MODULE_PARM_DESC(ac97_quirk, "AC'97 workaround for strange hardware.");
Clemens Ladischb7fe4622005-10-04 08:46:51 +020056module_param(spdif_aclink, bool, 0444);
Linus Torvalds1da177e2005-04-16 15:20:36 -070057MODULE_PARM_DESC(spdif_aclink, "S/PDIF over AC-link.");
58
59
60/*
61 */
62
63#define ATI_REG_ISR 0x00 /* interrupt source */
64#define ATI_REG_ISR_IN_XRUN (1U<<0)
65#define ATI_REG_ISR_IN_STATUS (1U<<1)
66#define ATI_REG_ISR_OUT_XRUN (1U<<2)
67#define ATI_REG_ISR_OUT_STATUS (1U<<3)
68#define ATI_REG_ISR_SPDF_XRUN (1U<<4)
69#define ATI_REG_ISR_SPDF_STATUS (1U<<5)
70#define ATI_REG_ISR_PHYS_INTR (1U<<8)
71#define ATI_REG_ISR_PHYS_MISMATCH (1U<<9)
72#define ATI_REG_ISR_CODEC0_NOT_READY (1U<<10)
73#define ATI_REG_ISR_CODEC1_NOT_READY (1U<<11)
74#define ATI_REG_ISR_CODEC2_NOT_READY (1U<<12)
75#define ATI_REG_ISR_NEW_FRAME (1U<<13)
76
77#define ATI_REG_IER 0x04 /* interrupt enable */
78#define ATI_REG_IER_IN_XRUN_EN (1U<<0)
79#define ATI_REG_IER_IO_STATUS_EN (1U<<1)
80#define ATI_REG_IER_OUT_XRUN_EN (1U<<2)
81#define ATI_REG_IER_OUT_XRUN_COND (1U<<3)
82#define ATI_REG_IER_SPDF_XRUN_EN (1U<<4)
83#define ATI_REG_IER_SPDF_STATUS_EN (1U<<5)
84#define ATI_REG_IER_PHYS_INTR_EN (1U<<8)
85#define ATI_REG_IER_PHYS_MISMATCH_EN (1U<<9)
86#define ATI_REG_IER_CODEC0_INTR_EN (1U<<10)
87#define ATI_REG_IER_CODEC1_INTR_EN (1U<<11)
88#define ATI_REG_IER_CODEC2_INTR_EN (1U<<12)
89#define ATI_REG_IER_NEW_FRAME_EN (1U<<13) /* (RO */
90#define ATI_REG_IER_SET_BUS_BUSY (1U<<14) /* (WO) audio is running */
91
92#define ATI_REG_CMD 0x08 /* command */
93#define ATI_REG_CMD_POWERDOWN (1U<<0)
94#define ATI_REG_CMD_RECEIVE_EN (1U<<1)
95#define ATI_REG_CMD_SEND_EN (1U<<2)
96#define ATI_REG_CMD_STATUS_MEM (1U<<3)
97#define ATI_REG_CMD_SPDF_OUT_EN (1U<<4)
98#define ATI_REG_CMD_SPDF_STATUS_MEM (1U<<5)
99#define ATI_REG_CMD_SPDF_THRESHOLD (3U<<6)
100#define ATI_REG_CMD_SPDF_THRESHOLD_SHIFT 6
101#define ATI_REG_CMD_IN_DMA_EN (1U<<8)
102#define ATI_REG_CMD_OUT_DMA_EN (1U<<9)
103#define ATI_REG_CMD_SPDF_DMA_EN (1U<<10)
104#define ATI_REG_CMD_SPDF_OUT_STOPPED (1U<<11)
105#define ATI_REG_CMD_SPDF_CONFIG_MASK (7U<<12)
106#define ATI_REG_CMD_SPDF_CONFIG_34 (1U<<12)
107#define ATI_REG_CMD_SPDF_CONFIG_78 (2U<<12)
108#define ATI_REG_CMD_SPDF_CONFIG_69 (3U<<12)
109#define ATI_REG_CMD_SPDF_CONFIG_01 (4U<<12)
110#define ATI_REG_CMD_INTERLEAVE_SPDF (1U<<16)
111#define ATI_REG_CMD_AUDIO_PRESENT (1U<<20)
112#define ATI_REG_CMD_INTERLEAVE_IN (1U<<21)
113#define ATI_REG_CMD_INTERLEAVE_OUT (1U<<22)
114#define ATI_REG_CMD_LOOPBACK_EN (1U<<23)
115#define ATI_REG_CMD_PACKED_DIS (1U<<24)
116#define ATI_REG_CMD_BURST_EN (1U<<25)
117#define ATI_REG_CMD_PANIC_EN (1U<<26)
118#define ATI_REG_CMD_MODEM_PRESENT (1U<<27)
119#define ATI_REG_CMD_ACLINK_ACTIVE (1U<<28)
120#define ATI_REG_CMD_AC_SOFT_RESET (1U<<29)
121#define ATI_REG_CMD_AC_SYNC (1U<<30)
122#define ATI_REG_CMD_AC_RESET (1U<<31)
123
124#define ATI_REG_PHYS_OUT_ADDR 0x0c
125#define ATI_REG_PHYS_OUT_CODEC_MASK (3U<<0)
126#define ATI_REG_PHYS_OUT_RW (1U<<2)
127#define ATI_REG_PHYS_OUT_ADDR_EN (1U<<8)
128#define ATI_REG_PHYS_OUT_ADDR_SHIFT 9
129#define ATI_REG_PHYS_OUT_DATA_SHIFT 16
130
131#define ATI_REG_PHYS_IN_ADDR 0x10
132#define ATI_REG_PHYS_IN_READ_FLAG (1U<<8)
133#define ATI_REG_PHYS_IN_ADDR_SHIFT 9
134#define ATI_REG_PHYS_IN_DATA_SHIFT 16
135
136#define ATI_REG_SLOTREQ 0x14
137
138#define ATI_REG_COUNTER 0x18
139#define ATI_REG_COUNTER_SLOT (3U<<0) /* slot # */
140#define ATI_REG_COUNTER_BITCLOCK (31U<<8)
141
142#define ATI_REG_IN_FIFO_THRESHOLD 0x1c
143
144#define ATI_REG_IN_DMA_LINKPTR 0x20
145#define ATI_REG_IN_DMA_DT_START 0x24 /* RO */
146#define ATI_REG_IN_DMA_DT_NEXT 0x28 /* RO */
147#define ATI_REG_IN_DMA_DT_CUR 0x2c /* RO */
148#define ATI_REG_IN_DMA_DT_SIZE 0x30
149
150#define ATI_REG_OUT_DMA_SLOT 0x34
151#define ATI_REG_OUT_DMA_SLOT_BIT(x) (1U << ((x) - 3))
152#define ATI_REG_OUT_DMA_SLOT_MASK 0x1ff
153#define ATI_REG_OUT_DMA_THRESHOLD_MASK 0xf800
154#define ATI_REG_OUT_DMA_THRESHOLD_SHIFT 11
155
156#define ATI_REG_OUT_DMA_LINKPTR 0x38
157#define ATI_REG_OUT_DMA_DT_START 0x3c /* RO */
158#define ATI_REG_OUT_DMA_DT_NEXT 0x40 /* RO */
159#define ATI_REG_OUT_DMA_DT_CUR 0x44 /* RO */
160#define ATI_REG_OUT_DMA_DT_SIZE 0x48
161
162#define ATI_REG_SPDF_CMD 0x4c
163#define ATI_REG_SPDF_CMD_LFSR (1U<<4)
164#define ATI_REG_SPDF_CMD_SINGLE_CH (1U<<5)
165#define ATI_REG_SPDF_CMD_LFSR_ACC (0xff<<8) /* RO */
166
167#define ATI_REG_SPDF_DMA_LINKPTR 0x50
168#define ATI_REG_SPDF_DMA_DT_START 0x54 /* RO */
169#define ATI_REG_SPDF_DMA_DT_NEXT 0x58 /* RO */
170#define ATI_REG_SPDF_DMA_DT_CUR 0x5c /* RO */
171#define ATI_REG_SPDF_DMA_DT_SIZE 0x60
172
173#define ATI_REG_MODEM_MIRROR 0x7c
174#define ATI_REG_AUDIO_MIRROR 0x80
175
176#define ATI_REG_6CH_REORDER 0x84 /* reorder slots for 6ch */
177#define ATI_REG_6CH_REORDER_EN (1U<<0) /* 3,4,7,8,6,9 -> 3,4,6,9,7,8 */
178
179#define ATI_REG_FIFO_FLUSH 0x88
180#define ATI_REG_FIFO_OUT_FLUSH (1U<<0)
181#define ATI_REG_FIFO_IN_FLUSH (1U<<1)
182
183/* LINKPTR */
184#define ATI_REG_LINKPTR_EN (1U<<0)
185
186/* [INT|OUT|SPDIF]_DMA_DT_SIZE */
187#define ATI_REG_DMA_DT_SIZE (0xffffU<<0)
188#define ATI_REG_DMA_FIFO_USED (0x1fU<<16)
189#define ATI_REG_DMA_FIFO_FREE (0x1fU<<21)
190#define ATI_REG_DMA_STATE (7U<<26)
191
192
193#define ATI_MAX_DESCRIPTORS 256 /* max number of descriptor packets */
194
195
196/*
197 */
198
199typedef struct snd_atiixp atiixp_t;
200typedef struct snd_atiixp_dma atiixp_dma_t;
201typedef struct snd_atiixp_dma_ops atiixp_dma_ops_t;
202
203
204/*
205 * DMA packate descriptor
206 */
207
208typedef struct atiixp_dma_desc {
209 u32 addr; /* DMA buffer address */
210 u16 status; /* status bits */
211 u16 size; /* size of the packet in dwords */
212 u32 next; /* address of the next packet descriptor */
213} atiixp_dma_desc_t;
214
215/*
216 * stream enum
217 */
218enum { ATI_DMA_PLAYBACK, ATI_DMA_CAPTURE, ATI_DMA_SPDIF, NUM_ATI_DMAS }; /* DMAs */
219enum { ATI_PCM_OUT, ATI_PCM_IN, ATI_PCM_SPDIF, NUM_ATI_PCMS }; /* AC97 pcm slots */
220enum { ATI_PCMDEV_ANALOG, ATI_PCMDEV_DIGITAL, NUM_ATI_PCMDEVS }; /* pcm devices */
221
222#define NUM_ATI_CODECS 3
223
224
225/*
226 * constants and callbacks for each DMA type
227 */
228struct snd_atiixp_dma_ops {
229 int type; /* ATI_DMA_XXX */
230 unsigned int llp_offset; /* LINKPTR offset */
231 unsigned int dt_cur; /* DT_CUR offset */
232 void (*enable_dma)(atiixp_t *chip, int on); /* called from open callback */
233 void (*enable_transfer)(atiixp_t *chip, int on); /* called from trigger (START/STOP) */
234 void (*flush_dma)(atiixp_t *chip); /* called from trigger (STOP only) */
235};
236
237/*
238 * DMA stream
239 */
240struct snd_atiixp_dma {
241 const atiixp_dma_ops_t *ops;
242 struct snd_dma_buffer desc_buf;
243 snd_pcm_substream_t *substream; /* assigned PCM substream */
244 unsigned int buf_addr, buf_bytes; /* DMA buffer address, bytes */
245 unsigned int period_bytes, periods;
246 int opened;
247 int running;
Jaroslav Kysela41e48452005-08-18 13:43:12 +0200248 int suspended;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700249 int pcm_open_flag;
250 int ac97_pcm_type; /* index # of ac97_pcm to access, -1 = not used */
251 unsigned int saved_curptr;
252};
253
254/*
255 * ATI IXP chip
256 */
257struct snd_atiixp {
258 snd_card_t *card;
259 struct pci_dev *pci;
260
261 unsigned long addr;
262 void __iomem *remap_addr;
263 int irq;
264
265 ac97_bus_t *ac97_bus;
266 ac97_t *ac97[NUM_ATI_CODECS];
267
268 spinlock_t reg_lock;
269
270 atiixp_dma_t dmas[NUM_ATI_DMAS];
271 struct ac97_pcm *pcms[NUM_ATI_PCMS];
272 snd_pcm_t *pcmdevs[NUM_ATI_PCMDEVS];
273
274 int max_channels; /* max. channels for PCM out */
275
276 unsigned int codec_not_ready_bits; /* for codec detection */
277
278 int spdif_over_aclink; /* passed from the module option */
279 struct semaphore open_mutex; /* playback open mutex */
280};
281
282
283/*
284 */
285static struct pci_device_id snd_atiixp_ids[] = {
286 { 0x1002, 0x4341, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* SB200 */
287 { 0x1002, 0x4361, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* SB300 */
288 { 0x1002, 0x4370, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* SB400 */
289 { 0, }
290};
291
292MODULE_DEVICE_TABLE(pci, snd_atiixp_ids);
293
294
295/*
296 * lowlevel functions
297 */
298
299/*
300 * update the bits of the given register.
301 * return 1 if the bits changed.
302 */
303static int snd_atiixp_update_bits(atiixp_t *chip, unsigned int reg,
304 unsigned int mask, unsigned int value)
305{
306 void __iomem *addr = chip->remap_addr + reg;
307 unsigned int data, old_data;
308 old_data = data = readl(addr);
309 data &= ~mask;
310 data |= value;
311 if (old_data == data)
312 return 0;
313 writel(data, addr);
314 return 1;
315}
316
317/*
318 * macros for easy use
319 */
320#define atiixp_write(chip,reg,value) \
321 writel(value, chip->remap_addr + ATI_REG_##reg)
322#define atiixp_read(chip,reg) \
323 readl(chip->remap_addr + ATI_REG_##reg)
324#define atiixp_update(chip,reg,mask,val) \
325 snd_atiixp_update_bits(chip, ATI_REG_##reg, mask, val)
326
327/* delay for one tick */
328#define do_delay() do { \
329 set_current_state(TASK_UNINTERRUPTIBLE); \
330 schedule_timeout(1); \
331} while (0)
332
333
334/*
335 * handling DMA packets
336 *
337 * we allocate a linear buffer for the DMA, and split it to each packet.
338 * in a future version, a scatter-gather buffer should be implemented.
339 */
340
341#define ATI_DESC_LIST_SIZE \
342 PAGE_ALIGN(ATI_MAX_DESCRIPTORS * sizeof(atiixp_dma_desc_t))
343
344/*
345 * build packets ring for the given buffer size.
346 *
347 * IXP handles the buffer descriptors, which are connected as a linked
348 * list. although we can change the list dynamically, in this version,
349 * a static RING of buffer descriptors is used.
350 *
351 * the ring is built in this function, and is set up to the hardware.
352 */
353static int atiixp_build_dma_packets(atiixp_t *chip, atiixp_dma_t *dma,
354 snd_pcm_substream_t *substream,
355 unsigned int periods,
356 unsigned int period_bytes)
357{
358 unsigned int i;
359 u32 addr, desc_addr;
360 unsigned long flags;
361
362 if (periods > ATI_MAX_DESCRIPTORS)
363 return -ENOMEM;
364
365 if (dma->desc_buf.area == NULL) {
366 if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(chip->pci),
367 ATI_DESC_LIST_SIZE, &dma->desc_buf) < 0)
368 return -ENOMEM;
369 dma->period_bytes = dma->periods = 0; /* clear */
370 }
371
372 if (dma->periods == periods && dma->period_bytes == period_bytes)
373 return 0;
374
375 /* reset DMA before changing the descriptor table */
376 spin_lock_irqsave(&chip->reg_lock, flags);
377 writel(0, chip->remap_addr + dma->ops->llp_offset);
378 dma->ops->enable_dma(chip, 0);
379 dma->ops->enable_dma(chip, 1);
380 spin_unlock_irqrestore(&chip->reg_lock, flags);
381
382 /* fill the entries */
383 addr = (u32)substream->runtime->dma_addr;
384 desc_addr = (u32)dma->desc_buf.addr;
385 for (i = 0; i < periods; i++) {
386 atiixp_dma_desc_t *desc = &((atiixp_dma_desc_t *)dma->desc_buf.area)[i];
387 desc->addr = cpu_to_le32(addr);
388 desc->status = 0;
389 desc->size = period_bytes >> 2; /* in dwords */
390 desc_addr += sizeof(atiixp_dma_desc_t);
391 if (i == periods - 1)
392 desc->next = cpu_to_le32((u32)dma->desc_buf.addr);
393 else
394 desc->next = cpu_to_le32(desc_addr);
395 addr += period_bytes;
396 }
397
398 writel((u32)dma->desc_buf.addr | ATI_REG_LINKPTR_EN,
399 chip->remap_addr + dma->ops->llp_offset);
400
401 dma->period_bytes = period_bytes;
402 dma->periods = periods;
403
404 return 0;
405}
406
407/*
408 * remove the ring buffer and release it if assigned
409 */
410static void atiixp_clear_dma_packets(atiixp_t *chip, atiixp_dma_t *dma, snd_pcm_substream_t *substream)
411{
412 if (dma->desc_buf.area) {
413 writel(0, chip->remap_addr + dma->ops->llp_offset);
414 snd_dma_free_pages(&dma->desc_buf);
415 dma->desc_buf.area = NULL;
416 }
417}
418
419/*
420 * AC97 interface
421 */
422static int snd_atiixp_acquire_codec(atiixp_t *chip)
423{
424 int timeout = 1000;
425
426 while (atiixp_read(chip, PHYS_OUT_ADDR) & ATI_REG_PHYS_OUT_ADDR_EN) {
427 if (! timeout--) {
428 snd_printk(KERN_WARNING "atiixp: codec acquire timeout\n");
429 return -EBUSY;
430 }
431 udelay(1);
432 }
433 return 0;
434}
435
436static unsigned short snd_atiixp_codec_read(atiixp_t *chip, unsigned short codec, unsigned short reg)
437{
438 unsigned int data;
439 int timeout;
440
441 if (snd_atiixp_acquire_codec(chip) < 0)
442 return 0xffff;
443 data = (reg << ATI_REG_PHYS_OUT_ADDR_SHIFT) |
444 ATI_REG_PHYS_OUT_ADDR_EN |
445 ATI_REG_PHYS_OUT_RW |
446 codec;
447 atiixp_write(chip, PHYS_OUT_ADDR, data);
448 if (snd_atiixp_acquire_codec(chip) < 0)
449 return 0xffff;
450 timeout = 1000;
451 do {
452 data = atiixp_read(chip, PHYS_IN_ADDR);
453 if (data & ATI_REG_PHYS_IN_READ_FLAG)
454 return data >> ATI_REG_PHYS_IN_DATA_SHIFT;
455 udelay(1);
456 } while (--timeout);
457 /* time out may happen during reset */
458 if (reg < 0x7c)
459 snd_printk(KERN_WARNING "atiixp: codec read timeout (reg %x)\n", reg);
460 return 0xffff;
461}
462
463
464static void snd_atiixp_codec_write(atiixp_t *chip, unsigned short codec, unsigned short reg, unsigned short val)
465{
466 unsigned int data;
467
468 if (snd_atiixp_acquire_codec(chip) < 0)
469 return;
470 data = ((unsigned int)val << ATI_REG_PHYS_OUT_DATA_SHIFT) |
471 ((unsigned int)reg << ATI_REG_PHYS_OUT_ADDR_SHIFT) |
472 ATI_REG_PHYS_OUT_ADDR_EN | codec;
473 atiixp_write(chip, PHYS_OUT_ADDR, data);
474}
475
476
477static unsigned short snd_atiixp_ac97_read(ac97_t *ac97, unsigned short reg)
478{
479 atiixp_t *chip = ac97->private_data;
480 return snd_atiixp_codec_read(chip, ac97->num, reg);
481
482}
483
484static void snd_atiixp_ac97_write(ac97_t *ac97, unsigned short reg, unsigned short val)
485{
486 atiixp_t *chip = ac97->private_data;
487 snd_atiixp_codec_write(chip, ac97->num, reg, val);
488}
489
490/*
491 * reset AC link
492 */
493static int snd_atiixp_aclink_reset(atiixp_t *chip)
494{
495 int timeout;
496
497 /* reset powerdoewn */
498 if (atiixp_update(chip, CMD, ATI_REG_CMD_POWERDOWN, 0))
499 udelay(10);
500
501 /* perform a software reset */
502 atiixp_update(chip, CMD, ATI_REG_CMD_AC_SOFT_RESET, ATI_REG_CMD_AC_SOFT_RESET);
503 atiixp_read(chip, CMD);
504 udelay(10);
505 atiixp_update(chip, CMD, ATI_REG_CMD_AC_SOFT_RESET, 0);
506
507 timeout = 10;
508 while (! (atiixp_read(chip, CMD) & ATI_REG_CMD_ACLINK_ACTIVE)) {
509 /* do a hard reset */
510 atiixp_update(chip, CMD, ATI_REG_CMD_AC_SYNC|ATI_REG_CMD_AC_RESET,
511 ATI_REG_CMD_AC_SYNC);
512 atiixp_read(chip, CMD);
513 do_delay();
514 atiixp_update(chip, CMD, ATI_REG_CMD_AC_RESET, ATI_REG_CMD_AC_RESET);
515 if (--timeout) {
516 snd_printk(KERN_ERR "atiixp: codec reset timeout\n");
517 break;
518 }
519 }
520
521 /* deassert RESET and assert SYNC to make sure */
522 atiixp_update(chip, CMD, ATI_REG_CMD_AC_SYNC|ATI_REG_CMD_AC_RESET,
523 ATI_REG_CMD_AC_SYNC|ATI_REG_CMD_AC_RESET);
524
525 return 0;
526}
527
528#ifdef CONFIG_PM
529static int snd_atiixp_aclink_down(atiixp_t *chip)
530{
531 // if (atiixp_read(chip, MODEM_MIRROR) & 0x1) /* modem running, too? */
532 // return -EBUSY;
533 atiixp_update(chip, CMD,
534 ATI_REG_CMD_POWERDOWN | ATI_REG_CMD_AC_RESET,
535 ATI_REG_CMD_POWERDOWN);
536 return 0;
537}
538#endif
539
540/*
541 * auto-detection of codecs
542 *
543 * the IXP chip can generate interrupts for the non-existing codecs.
544 * NEW_FRAME interrupt is used to make sure that the interrupt is generated
545 * even if all three codecs are connected.
546 */
547
548#define ALL_CODEC_NOT_READY \
549 (ATI_REG_ISR_CODEC0_NOT_READY |\
550 ATI_REG_ISR_CODEC1_NOT_READY |\
551 ATI_REG_ISR_CODEC2_NOT_READY)
552#define CODEC_CHECK_BITS (ALL_CODEC_NOT_READY|ATI_REG_ISR_NEW_FRAME)
553
554static int snd_atiixp_codec_detect(atiixp_t *chip)
555{
556 int timeout;
557
558 chip->codec_not_ready_bits = 0;
559 atiixp_write(chip, IER, CODEC_CHECK_BITS);
560 /* wait for the interrupts */
561 timeout = HZ / 10;
562 while (timeout-- > 0) {
563 do_delay();
564 if (chip->codec_not_ready_bits)
565 break;
566 }
567 atiixp_write(chip, IER, 0); /* disable irqs */
568
569 if ((chip->codec_not_ready_bits & ALL_CODEC_NOT_READY) == ALL_CODEC_NOT_READY) {
570 snd_printk(KERN_ERR "atiixp: no codec detected!\n");
571 return -ENXIO;
572 }
573 return 0;
574}
575
576
577/*
578 * enable DMA and irqs
579 */
580static int snd_atiixp_chip_start(atiixp_t *chip)
581{
582 unsigned int reg;
583
584 /* set up spdif, enable burst mode */
585 reg = atiixp_read(chip, CMD);
586 reg |= 0x02 << ATI_REG_CMD_SPDF_THRESHOLD_SHIFT;
587 reg |= ATI_REG_CMD_BURST_EN;
588 atiixp_write(chip, CMD, reg);
589
590 reg = atiixp_read(chip, SPDF_CMD);
591 reg &= ~(ATI_REG_SPDF_CMD_LFSR|ATI_REG_SPDF_CMD_SINGLE_CH);
592 atiixp_write(chip, SPDF_CMD, reg);
593
594 /* clear all interrupt source */
595 atiixp_write(chip, ISR, 0xffffffff);
596 /* enable irqs */
597 atiixp_write(chip, IER,
598 ATI_REG_IER_IO_STATUS_EN |
599 ATI_REG_IER_IN_XRUN_EN |
600 ATI_REG_IER_OUT_XRUN_EN |
601 ATI_REG_IER_SPDF_XRUN_EN |
602 ATI_REG_IER_SPDF_STATUS_EN);
603 return 0;
604}
605
606
607/*
608 * disable DMA and IRQs
609 */
610static int snd_atiixp_chip_stop(atiixp_t *chip)
611{
612 /* clear interrupt source */
613 atiixp_write(chip, ISR, atiixp_read(chip, ISR));
614 /* disable irqs */
615 atiixp_write(chip, IER, 0);
616 return 0;
617}
618
619
620/*
621 * PCM section
622 */
623
624/*
625 * pointer callback simplly reads XXX_DMA_DT_CUR register as the current
626 * position. when SG-buffer is implemented, the offset must be calculated
627 * correctly...
628 */
629static snd_pcm_uframes_t snd_atiixp_pcm_pointer(snd_pcm_substream_t *substream)
630{
631 atiixp_t *chip = snd_pcm_substream_chip(substream);
632 snd_pcm_runtime_t *runtime = substream->runtime;
633 atiixp_dma_t *dma = (atiixp_dma_t *)runtime->private_data;
634 unsigned int curptr;
635 int timeout = 1000;
636
637 while (timeout--) {
638 curptr = readl(chip->remap_addr + dma->ops->dt_cur);
639 if (curptr < dma->buf_addr)
640 continue;
641 curptr -= dma->buf_addr;
642 if (curptr >= dma->buf_bytes)
643 continue;
644 return bytes_to_frames(runtime, curptr);
645 }
646 snd_printd("atiixp: invalid DMA pointer read 0x%x (buf=%x)\n",
647 readl(chip->remap_addr + dma->ops->dt_cur), dma->buf_addr);
648 return 0;
649}
650
651/*
652 * XRUN detected, and stop the PCM substream
653 */
654static void snd_atiixp_xrun_dma(atiixp_t *chip, atiixp_dma_t *dma)
655{
656 if (! dma->substream || ! dma->running)
657 return;
658 snd_printdd("atiixp: XRUN detected (DMA %d)\n", dma->ops->type);
659 snd_pcm_stop(dma->substream, SNDRV_PCM_STATE_XRUN);
660}
661
662/*
663 * the period ack. update the substream.
664 */
665static void snd_atiixp_update_dma(atiixp_t *chip, atiixp_dma_t *dma)
666{
667 if (! dma->substream || ! dma->running)
668 return;
669 snd_pcm_period_elapsed(dma->substream);
670}
671
672/* set BUS_BUSY interrupt bit if any DMA is running */
673/* call with spinlock held */
674static void snd_atiixp_check_bus_busy(atiixp_t *chip)
675{
676 unsigned int bus_busy;
677 if (atiixp_read(chip, CMD) & (ATI_REG_CMD_SEND_EN |
678 ATI_REG_CMD_RECEIVE_EN |
679 ATI_REG_CMD_SPDF_OUT_EN))
680 bus_busy = ATI_REG_IER_SET_BUS_BUSY;
681 else
682 bus_busy = 0;
683 atiixp_update(chip, IER, ATI_REG_IER_SET_BUS_BUSY, bus_busy);
684}
685
686/* common trigger callback
687 * calling the lowlevel callbacks in it
688 */
689static int snd_atiixp_pcm_trigger(snd_pcm_substream_t *substream, int cmd)
690{
691 atiixp_t *chip = snd_pcm_substream_chip(substream);
692 atiixp_dma_t *dma = (atiixp_dma_t *)substream->runtime->private_data;
693 int err = 0;
694
695 snd_assert(dma->ops->enable_transfer && dma->ops->flush_dma, return -EINVAL);
696
697 spin_lock(&chip->reg_lock);
698 switch (cmd) {
699 case SNDRV_PCM_TRIGGER_START:
Jaroslav Kysela41e48452005-08-18 13:43:12 +0200700 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
701 case SNDRV_PCM_TRIGGER_RESUME:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700702 dma->ops->enable_transfer(chip, 1);
703 dma->running = 1;
Jaroslav Kysela41e48452005-08-18 13:43:12 +0200704 dma->suspended = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700705 break;
706 case SNDRV_PCM_TRIGGER_STOP:
Jaroslav Kysela41e48452005-08-18 13:43:12 +0200707 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
708 case SNDRV_PCM_TRIGGER_SUSPEND:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700709 dma->ops->enable_transfer(chip, 0);
710 dma->running = 0;
Jaroslav Kysela41e48452005-08-18 13:43:12 +0200711 dma->suspended = cmd == SNDRV_PCM_TRIGGER_SUSPEND;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700712 break;
713 default:
714 err = -EINVAL;
715 break;
716 }
717 if (! err) {
718 snd_atiixp_check_bus_busy(chip);
719 if (cmd == SNDRV_PCM_TRIGGER_STOP) {
720 dma->ops->flush_dma(chip);
721 snd_atiixp_check_bus_busy(chip);
722 }
723 }
724 spin_unlock(&chip->reg_lock);
725 return err;
726}
727
728
729/*
730 * lowlevel callbacks for each DMA type
731 *
732 * every callback is supposed to be called in chip->reg_lock spinlock
733 */
734
735/* flush FIFO of analog OUT DMA */
736static void atiixp_out_flush_dma(atiixp_t *chip)
737{
738 atiixp_write(chip, FIFO_FLUSH, ATI_REG_FIFO_OUT_FLUSH);
739}
740
741/* enable/disable analog OUT DMA */
742static void atiixp_out_enable_dma(atiixp_t *chip, int on)
743{
744 unsigned int data;
745 data = atiixp_read(chip, CMD);
746 if (on) {
747 if (data & ATI_REG_CMD_OUT_DMA_EN)
748 return;
749 atiixp_out_flush_dma(chip);
750 data |= ATI_REG_CMD_OUT_DMA_EN;
751 } else
752 data &= ~ATI_REG_CMD_OUT_DMA_EN;
753 atiixp_write(chip, CMD, data);
754}
755
756/* start/stop transfer over OUT DMA */
757static void atiixp_out_enable_transfer(atiixp_t *chip, int on)
758{
759 atiixp_update(chip, CMD, ATI_REG_CMD_SEND_EN,
760 on ? ATI_REG_CMD_SEND_EN : 0);
761}
762
763/* enable/disable analog IN DMA */
764static void atiixp_in_enable_dma(atiixp_t *chip, int on)
765{
766 atiixp_update(chip, CMD, ATI_REG_CMD_IN_DMA_EN,
767 on ? ATI_REG_CMD_IN_DMA_EN : 0);
768}
769
770/* start/stop analog IN DMA */
771static void atiixp_in_enable_transfer(atiixp_t *chip, int on)
772{
773 if (on) {
774 unsigned int data = atiixp_read(chip, CMD);
775 if (! (data & ATI_REG_CMD_RECEIVE_EN)) {
776 data |= ATI_REG_CMD_RECEIVE_EN;
777#if 0 /* FIXME: this causes the endless loop */
778 /* wait until slot 3/4 are finished */
779 while ((atiixp_read(chip, COUNTER) &
780 ATI_REG_COUNTER_SLOT) != 5)
781 ;
782#endif
783 atiixp_write(chip, CMD, data);
784 }
785 } else
786 atiixp_update(chip, CMD, ATI_REG_CMD_RECEIVE_EN, 0);
787}
788
789/* flush FIFO of analog IN DMA */
790static void atiixp_in_flush_dma(atiixp_t *chip)
791{
792 atiixp_write(chip, FIFO_FLUSH, ATI_REG_FIFO_IN_FLUSH);
793}
794
795/* enable/disable SPDIF OUT DMA */
796static void atiixp_spdif_enable_dma(atiixp_t *chip, int on)
797{
798 atiixp_update(chip, CMD, ATI_REG_CMD_SPDF_DMA_EN,
799 on ? ATI_REG_CMD_SPDF_DMA_EN : 0);
800}
801
802/* start/stop SPDIF OUT DMA */
803static void atiixp_spdif_enable_transfer(atiixp_t *chip, int on)
804{
805 unsigned int data;
806 data = atiixp_read(chip, CMD);
807 if (on)
808 data |= ATI_REG_CMD_SPDF_OUT_EN;
809 else
810 data &= ~ATI_REG_CMD_SPDF_OUT_EN;
811 atiixp_write(chip, CMD, data);
812}
813
814/* flush FIFO of SPDIF OUT DMA */
815static void atiixp_spdif_flush_dma(atiixp_t *chip)
816{
817 int timeout;
818
819 /* DMA off, transfer on */
820 atiixp_spdif_enable_dma(chip, 0);
821 atiixp_spdif_enable_transfer(chip, 1);
822
823 timeout = 100;
824 do {
825 if (! (atiixp_read(chip, SPDF_DMA_DT_SIZE) & ATI_REG_DMA_FIFO_USED))
826 break;
827 udelay(1);
828 } while (timeout-- > 0);
829
830 atiixp_spdif_enable_transfer(chip, 0);
831}
832
833/* set up slots and formats for SPDIF OUT */
834static int snd_atiixp_spdif_prepare(snd_pcm_substream_t *substream)
835{
836 atiixp_t *chip = snd_pcm_substream_chip(substream);
837
838 spin_lock_irq(&chip->reg_lock);
839 if (chip->spdif_over_aclink) {
840 unsigned int data;
841 /* enable slots 10/11 */
842 atiixp_update(chip, CMD, ATI_REG_CMD_SPDF_CONFIG_MASK,
843 ATI_REG_CMD_SPDF_CONFIG_01);
844 data = atiixp_read(chip, OUT_DMA_SLOT) & ~ATI_REG_OUT_DMA_SLOT_MASK;
845 data |= ATI_REG_OUT_DMA_SLOT_BIT(10) |
846 ATI_REG_OUT_DMA_SLOT_BIT(11);
847 data |= 0x04 << ATI_REG_OUT_DMA_THRESHOLD_SHIFT;
848 atiixp_write(chip, OUT_DMA_SLOT, data);
849 atiixp_update(chip, CMD, ATI_REG_CMD_INTERLEAVE_OUT,
850 substream->runtime->format == SNDRV_PCM_FORMAT_S16_LE ?
851 ATI_REG_CMD_INTERLEAVE_OUT : 0);
852 } else {
853 atiixp_update(chip, CMD, ATI_REG_CMD_SPDF_CONFIG_MASK, 0);
854 atiixp_update(chip, CMD, ATI_REG_CMD_INTERLEAVE_SPDF, 0);
855 }
856 spin_unlock_irq(&chip->reg_lock);
857 return 0;
858}
859
860/* set up slots and formats for analog OUT */
861static int snd_atiixp_playback_prepare(snd_pcm_substream_t *substream)
862{
863 atiixp_t *chip = snd_pcm_substream_chip(substream);
864 unsigned int data;
865
866 spin_lock_irq(&chip->reg_lock);
867 data = atiixp_read(chip, OUT_DMA_SLOT) & ~ATI_REG_OUT_DMA_SLOT_MASK;
868 switch (substream->runtime->channels) {
869 case 8:
870 data |= ATI_REG_OUT_DMA_SLOT_BIT(10) |
871 ATI_REG_OUT_DMA_SLOT_BIT(11);
872 /* fallthru */
873 case 6:
874 data |= ATI_REG_OUT_DMA_SLOT_BIT(7) |
875 ATI_REG_OUT_DMA_SLOT_BIT(8);
876 /* fallthru */
877 case 4:
878 data |= ATI_REG_OUT_DMA_SLOT_BIT(6) |
879 ATI_REG_OUT_DMA_SLOT_BIT(9);
880 /* fallthru */
881 default:
882 data |= ATI_REG_OUT_DMA_SLOT_BIT(3) |
883 ATI_REG_OUT_DMA_SLOT_BIT(4);
884 break;
885 }
886
887 /* set output threshold */
888 data |= 0x04 << ATI_REG_OUT_DMA_THRESHOLD_SHIFT;
889 atiixp_write(chip, OUT_DMA_SLOT, data);
890
891 atiixp_update(chip, CMD, ATI_REG_CMD_INTERLEAVE_OUT,
892 substream->runtime->format == SNDRV_PCM_FORMAT_S16_LE ?
893 ATI_REG_CMD_INTERLEAVE_OUT : 0);
894
895 /*
896 * enable 6 channel re-ordering bit if needed
897 */
898 atiixp_update(chip, 6CH_REORDER, ATI_REG_6CH_REORDER_EN,
899 substream->runtime->channels >= 6 ? ATI_REG_6CH_REORDER_EN: 0);
900
901 spin_unlock_irq(&chip->reg_lock);
902 return 0;
903}
904
905/* set up slots and formats for analog IN */
906static int snd_atiixp_capture_prepare(snd_pcm_substream_t *substream)
907{
908 atiixp_t *chip = snd_pcm_substream_chip(substream);
909
910 spin_lock_irq(&chip->reg_lock);
911 atiixp_update(chip, CMD, ATI_REG_CMD_INTERLEAVE_IN,
912 substream->runtime->format == SNDRV_PCM_FORMAT_S16_LE ?
913 ATI_REG_CMD_INTERLEAVE_IN : 0);
914 spin_unlock_irq(&chip->reg_lock);
915 return 0;
916}
917
918/*
919 * hw_params - allocate the buffer and set up buffer descriptors
920 */
921static int snd_atiixp_pcm_hw_params(snd_pcm_substream_t *substream,
922 snd_pcm_hw_params_t *hw_params)
923{
924 atiixp_t *chip = snd_pcm_substream_chip(substream);
925 atiixp_dma_t *dma = (atiixp_dma_t *)substream->runtime->private_data;
926 int err;
927
928 err = snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params));
929 if (err < 0)
930 return err;
931 dma->buf_addr = substream->runtime->dma_addr;
932 dma->buf_bytes = params_buffer_bytes(hw_params);
933
934 err = atiixp_build_dma_packets(chip, dma, substream,
935 params_periods(hw_params),
936 params_period_bytes(hw_params));
937 if (err < 0)
938 return err;
939
940 if (dma->ac97_pcm_type >= 0) {
941 struct ac97_pcm *pcm = chip->pcms[dma->ac97_pcm_type];
942 /* PCM is bound to AC97 codec(s)
943 * set up the AC97 codecs
944 */
945 if (dma->pcm_open_flag) {
946 snd_ac97_pcm_close(pcm);
947 dma->pcm_open_flag = 0;
948 }
949 err = snd_ac97_pcm_open(pcm, params_rate(hw_params),
950 params_channels(hw_params),
951 pcm->r[0].slots);
952 if (err >= 0)
953 dma->pcm_open_flag = 1;
954 }
955
956 return err;
957}
958
959static int snd_atiixp_pcm_hw_free(snd_pcm_substream_t * substream)
960{
961 atiixp_t *chip = snd_pcm_substream_chip(substream);
962 atiixp_dma_t *dma = (atiixp_dma_t *)substream->runtime->private_data;
963
964 if (dma->pcm_open_flag) {
965 struct ac97_pcm *pcm = chip->pcms[dma->ac97_pcm_type];
966 snd_ac97_pcm_close(pcm);
967 dma->pcm_open_flag = 0;
968 }
969 atiixp_clear_dma_packets(chip, dma, substream);
970 snd_pcm_lib_free_pages(substream);
971 return 0;
972}
973
974
975/*
976 * pcm hardware definition, identical for all DMA types
977 */
978static snd_pcm_hardware_t snd_atiixp_pcm_hw =
979{
980 .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
981 SNDRV_PCM_INFO_BLOCK_TRANSFER |
Jaroslav Kysela41e48452005-08-18 13:43:12 +0200982 SNDRV_PCM_INFO_PAUSE |
Linus Torvalds1da177e2005-04-16 15:20:36 -0700983 SNDRV_PCM_INFO_RESUME |
984 SNDRV_PCM_INFO_MMAP_VALID),
985 .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S32_LE,
986 .rates = SNDRV_PCM_RATE_48000,
987 .rate_min = 48000,
988 .rate_max = 48000,
989 .channels_min = 2,
990 .channels_max = 2,
991 .buffer_bytes_max = 256 * 1024,
992 .period_bytes_min = 32,
993 .period_bytes_max = 128 * 1024,
994 .periods_min = 2,
995 .periods_max = ATI_MAX_DESCRIPTORS,
996};
997
998static int snd_atiixp_pcm_open(snd_pcm_substream_t *substream, atiixp_dma_t *dma, int pcm_type)
999{
1000 atiixp_t *chip = snd_pcm_substream_chip(substream);
1001 snd_pcm_runtime_t *runtime = substream->runtime;
1002 int err;
1003
1004 snd_assert(dma->ops && dma->ops->enable_dma, return -EINVAL);
1005
1006 if (dma->opened)
1007 return -EBUSY;
1008 dma->substream = substream;
1009 runtime->hw = snd_atiixp_pcm_hw;
1010 dma->ac97_pcm_type = pcm_type;
1011 if (pcm_type >= 0) {
1012 runtime->hw.rates = chip->pcms[pcm_type]->rates;
1013 snd_pcm_limit_hw_rates(runtime);
1014 } else {
1015 /* direct SPDIF */
1016 runtime->hw.formats = SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE;
1017 }
1018 if ((err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS)) < 0)
1019 return err;
1020 runtime->private_data = dma;
1021
1022 /* enable DMA bits */
1023 spin_lock_irq(&chip->reg_lock);
1024 dma->ops->enable_dma(chip, 1);
1025 spin_unlock_irq(&chip->reg_lock);
1026 dma->opened = 1;
1027
1028 return 0;
1029}
1030
1031static int snd_atiixp_pcm_close(snd_pcm_substream_t *substream, atiixp_dma_t *dma)
1032{
1033 atiixp_t *chip = snd_pcm_substream_chip(substream);
1034 /* disable DMA bits */
1035 snd_assert(dma->ops && dma->ops->enable_dma, return -EINVAL);
1036 spin_lock_irq(&chip->reg_lock);
1037 dma->ops->enable_dma(chip, 0);
1038 spin_unlock_irq(&chip->reg_lock);
1039 dma->substream = NULL;
1040 dma->opened = 0;
1041 return 0;
1042}
1043
1044/*
1045 */
1046static int snd_atiixp_playback_open(snd_pcm_substream_t *substream)
1047{
1048 atiixp_t *chip = snd_pcm_substream_chip(substream);
1049 int err;
1050
1051 down(&chip->open_mutex);
1052 err = snd_atiixp_pcm_open(substream, &chip->dmas[ATI_DMA_PLAYBACK], 0);
1053 up(&chip->open_mutex);
1054 if (err < 0)
1055 return err;
1056 substream->runtime->hw.channels_max = chip->max_channels;
1057 if (chip->max_channels > 2)
1058 /* channels must be even */
1059 snd_pcm_hw_constraint_step(substream->runtime, 0,
1060 SNDRV_PCM_HW_PARAM_CHANNELS, 2);
1061 return 0;
1062}
1063
1064static int snd_atiixp_playback_close(snd_pcm_substream_t *substream)
1065{
1066 atiixp_t *chip = snd_pcm_substream_chip(substream);
1067 int err;
1068 down(&chip->open_mutex);
1069 err = snd_atiixp_pcm_close(substream, &chip->dmas[ATI_DMA_PLAYBACK]);
1070 up(&chip->open_mutex);
1071 return err;
1072}
1073
1074static int snd_atiixp_capture_open(snd_pcm_substream_t *substream)
1075{
1076 atiixp_t *chip = snd_pcm_substream_chip(substream);
1077 return snd_atiixp_pcm_open(substream, &chip->dmas[ATI_DMA_CAPTURE], 1);
1078}
1079
1080static int snd_atiixp_capture_close(snd_pcm_substream_t *substream)
1081{
1082 atiixp_t *chip = snd_pcm_substream_chip(substream);
1083 return snd_atiixp_pcm_close(substream, &chip->dmas[ATI_DMA_CAPTURE]);
1084}
1085
1086static int snd_atiixp_spdif_open(snd_pcm_substream_t *substream)
1087{
1088 atiixp_t *chip = snd_pcm_substream_chip(substream);
1089 int err;
1090 down(&chip->open_mutex);
1091 if (chip->spdif_over_aclink) /* share DMA_PLAYBACK */
1092 err = snd_atiixp_pcm_open(substream, &chip->dmas[ATI_DMA_PLAYBACK], 2);
1093 else
1094 err = snd_atiixp_pcm_open(substream, &chip->dmas[ATI_DMA_SPDIF], -1);
1095 up(&chip->open_mutex);
1096 return err;
1097}
1098
1099static int snd_atiixp_spdif_close(snd_pcm_substream_t *substream)
1100{
1101 atiixp_t *chip = snd_pcm_substream_chip(substream);
1102 int err;
1103 down(&chip->open_mutex);
1104 if (chip->spdif_over_aclink)
1105 err = snd_atiixp_pcm_close(substream, &chip->dmas[ATI_DMA_PLAYBACK]);
1106 else
1107 err = snd_atiixp_pcm_close(substream, &chip->dmas[ATI_DMA_SPDIF]);
1108 up(&chip->open_mutex);
1109 return err;
1110}
1111
1112/* AC97 playback */
1113static snd_pcm_ops_t snd_atiixp_playback_ops = {
1114 .open = snd_atiixp_playback_open,
1115 .close = snd_atiixp_playback_close,
1116 .ioctl = snd_pcm_lib_ioctl,
1117 .hw_params = snd_atiixp_pcm_hw_params,
1118 .hw_free = snd_atiixp_pcm_hw_free,
1119 .prepare = snd_atiixp_playback_prepare,
1120 .trigger = snd_atiixp_pcm_trigger,
1121 .pointer = snd_atiixp_pcm_pointer,
1122};
1123
1124/* AC97 capture */
1125static snd_pcm_ops_t snd_atiixp_capture_ops = {
1126 .open = snd_atiixp_capture_open,
1127 .close = snd_atiixp_capture_close,
1128 .ioctl = snd_pcm_lib_ioctl,
1129 .hw_params = snd_atiixp_pcm_hw_params,
1130 .hw_free = snd_atiixp_pcm_hw_free,
1131 .prepare = snd_atiixp_capture_prepare,
1132 .trigger = snd_atiixp_pcm_trigger,
1133 .pointer = snd_atiixp_pcm_pointer,
1134};
1135
1136/* SPDIF playback */
1137static snd_pcm_ops_t snd_atiixp_spdif_ops = {
1138 .open = snd_atiixp_spdif_open,
1139 .close = snd_atiixp_spdif_close,
1140 .ioctl = snd_pcm_lib_ioctl,
1141 .hw_params = snd_atiixp_pcm_hw_params,
1142 .hw_free = snd_atiixp_pcm_hw_free,
1143 .prepare = snd_atiixp_spdif_prepare,
1144 .trigger = snd_atiixp_pcm_trigger,
1145 .pointer = snd_atiixp_pcm_pointer,
1146};
1147
1148static struct ac97_pcm atiixp_pcm_defs[] __devinitdata = {
1149 /* front PCM */
1150 {
1151 .exclusive = 1,
1152 .r = { {
1153 .slots = (1 << AC97_SLOT_PCM_LEFT) |
1154 (1 << AC97_SLOT_PCM_RIGHT) |
1155 (1 << AC97_SLOT_PCM_CENTER) |
1156 (1 << AC97_SLOT_PCM_SLEFT) |
1157 (1 << AC97_SLOT_PCM_SRIGHT) |
1158 (1 << AC97_SLOT_LFE)
1159 }
1160 }
1161 },
1162 /* PCM IN #1 */
1163 {
1164 .stream = 1,
1165 .exclusive = 1,
1166 .r = { {
1167 .slots = (1 << AC97_SLOT_PCM_LEFT) |
1168 (1 << AC97_SLOT_PCM_RIGHT)
1169 }
1170 }
1171 },
1172 /* S/PDIF OUT (optional) */
1173 {
1174 .exclusive = 1,
1175 .spdif = 1,
1176 .r = { {
1177 .slots = (1 << AC97_SLOT_SPDIF_LEFT2) |
1178 (1 << AC97_SLOT_SPDIF_RIGHT2)
1179 }
1180 }
1181 },
1182};
1183
1184static atiixp_dma_ops_t snd_atiixp_playback_dma_ops = {
1185 .type = ATI_DMA_PLAYBACK,
1186 .llp_offset = ATI_REG_OUT_DMA_LINKPTR,
1187 .dt_cur = ATI_REG_OUT_DMA_DT_CUR,
1188 .enable_dma = atiixp_out_enable_dma,
1189 .enable_transfer = atiixp_out_enable_transfer,
1190 .flush_dma = atiixp_out_flush_dma,
1191};
1192
1193static atiixp_dma_ops_t snd_atiixp_capture_dma_ops = {
1194 .type = ATI_DMA_CAPTURE,
1195 .llp_offset = ATI_REG_IN_DMA_LINKPTR,
1196 .dt_cur = ATI_REG_IN_DMA_DT_CUR,
1197 .enable_dma = atiixp_in_enable_dma,
1198 .enable_transfer = atiixp_in_enable_transfer,
1199 .flush_dma = atiixp_in_flush_dma,
1200};
1201
1202static atiixp_dma_ops_t snd_atiixp_spdif_dma_ops = {
1203 .type = ATI_DMA_SPDIF,
1204 .llp_offset = ATI_REG_SPDF_DMA_LINKPTR,
1205 .dt_cur = ATI_REG_SPDF_DMA_DT_CUR,
1206 .enable_dma = atiixp_spdif_enable_dma,
1207 .enable_transfer = atiixp_spdif_enable_transfer,
1208 .flush_dma = atiixp_spdif_flush_dma,
1209};
1210
1211
1212static int __devinit snd_atiixp_pcm_new(atiixp_t *chip)
1213{
1214 snd_pcm_t *pcm;
1215 ac97_bus_t *pbus = chip->ac97_bus;
1216 int err, i, num_pcms;
1217
1218 /* initialize constants */
1219 chip->dmas[ATI_DMA_PLAYBACK].ops = &snd_atiixp_playback_dma_ops;
1220 chip->dmas[ATI_DMA_CAPTURE].ops = &snd_atiixp_capture_dma_ops;
1221 if (! chip->spdif_over_aclink)
1222 chip->dmas[ATI_DMA_SPDIF].ops = &snd_atiixp_spdif_dma_ops;
1223
1224 /* assign AC97 pcm */
1225 if (chip->spdif_over_aclink)
1226 num_pcms = 3;
1227 else
1228 num_pcms = 2;
1229 err = snd_ac97_pcm_assign(pbus, num_pcms, atiixp_pcm_defs);
1230 if (err < 0)
1231 return err;
1232 for (i = 0; i < num_pcms; i++)
1233 chip->pcms[i] = &pbus->pcms[i];
1234
1235 chip->max_channels = 2;
1236 if (pbus->pcms[ATI_PCM_OUT].r[0].slots & (1 << AC97_SLOT_PCM_SLEFT)) {
1237 if (pbus->pcms[ATI_PCM_OUT].r[0].slots & (1 << AC97_SLOT_LFE))
1238 chip->max_channels = 6;
1239 else
1240 chip->max_channels = 4;
1241 }
1242
1243 /* PCM #0: analog I/O */
1244 err = snd_pcm_new(chip->card, "ATI IXP AC97", ATI_PCMDEV_ANALOG, 1, 1, &pcm);
1245 if (err < 0)
1246 return err;
1247 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_atiixp_playback_ops);
1248 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_atiixp_capture_ops);
1249 pcm->private_data = chip;
1250 strcpy(pcm->name, "ATI IXP AC97");
1251 chip->pcmdevs[ATI_PCMDEV_ANALOG] = pcm;
1252
1253 snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
1254 snd_dma_pci_data(chip->pci), 64*1024, 128*1024);
1255
1256 /* no SPDIF support on codec? */
1257 if (chip->pcms[ATI_PCM_SPDIF] && ! chip->pcms[ATI_PCM_SPDIF]->rates)
1258 return 0;
1259
1260 /* FIXME: non-48k sample rate doesn't work on my test machine with AD1888 */
1261 if (chip->pcms[ATI_PCM_SPDIF])
1262 chip->pcms[ATI_PCM_SPDIF]->rates = SNDRV_PCM_RATE_48000;
1263
1264 /* PCM #1: spdif playback */
1265 err = snd_pcm_new(chip->card, "ATI IXP IEC958", ATI_PCMDEV_DIGITAL, 1, 0, &pcm);
1266 if (err < 0)
1267 return err;
1268 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_atiixp_spdif_ops);
1269 pcm->private_data = chip;
1270 if (chip->spdif_over_aclink)
1271 strcpy(pcm->name, "ATI IXP IEC958 (AC97)");
1272 else
1273 strcpy(pcm->name, "ATI IXP IEC958 (Direct)");
1274 chip->pcmdevs[ATI_PCMDEV_DIGITAL] = pcm;
1275
1276 snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
1277 snd_dma_pci_data(chip->pci), 64*1024, 128*1024);
1278
1279 /* pre-select AC97 SPDIF slots 10/11 */
1280 for (i = 0; i < NUM_ATI_CODECS; i++) {
1281 if (chip->ac97[i])
1282 snd_ac97_update_bits(chip->ac97[i], AC97_EXTENDED_STATUS, 0x03 << 4, 0x03 << 4);
1283 }
1284
1285 return 0;
1286}
1287
1288
1289
1290/*
1291 * interrupt handler
1292 */
1293static irqreturn_t snd_atiixp_interrupt(int irq, void *dev_id, struct pt_regs *regs)
1294{
1295 atiixp_t *chip = dev_id;
1296 unsigned int status;
1297
1298 status = atiixp_read(chip, ISR);
1299
1300 if (! status)
1301 return IRQ_NONE;
1302
1303 /* process audio DMA */
1304 if (status & ATI_REG_ISR_OUT_XRUN)
1305 snd_atiixp_xrun_dma(chip, &chip->dmas[ATI_DMA_PLAYBACK]);
1306 else if (status & ATI_REG_ISR_OUT_STATUS)
1307 snd_atiixp_update_dma(chip, &chip->dmas[ATI_DMA_PLAYBACK]);
1308 if (status & ATI_REG_ISR_IN_XRUN)
1309 snd_atiixp_xrun_dma(chip, &chip->dmas[ATI_DMA_CAPTURE]);
1310 else if (status & ATI_REG_ISR_IN_STATUS)
1311 snd_atiixp_update_dma(chip, &chip->dmas[ATI_DMA_CAPTURE]);
1312 if (! chip->spdif_over_aclink) {
1313 if (status & ATI_REG_ISR_SPDF_XRUN)
1314 snd_atiixp_xrun_dma(chip, &chip->dmas[ATI_DMA_SPDIF]);
1315 else if (status & ATI_REG_ISR_SPDF_STATUS)
1316 snd_atiixp_update_dma(chip, &chip->dmas[ATI_DMA_SPDIF]);
1317 }
1318
1319 /* for codec detection */
1320 if (status & CODEC_CHECK_BITS) {
1321 unsigned int detected;
1322 detected = status & CODEC_CHECK_BITS;
1323 spin_lock(&chip->reg_lock);
1324 chip->codec_not_ready_bits |= detected;
1325 atiixp_update(chip, IER, detected, 0); /* disable the detected irqs */
1326 spin_unlock(&chip->reg_lock);
1327 }
1328
1329 /* ack */
1330 atiixp_write(chip, ISR, status);
1331
1332 return IRQ_HANDLED;
1333}
1334
1335
1336/*
1337 * ac97 mixer section
1338 */
1339
1340static struct ac97_quirk ac97_quirks[] __devinitdata = {
1341 {
Jaroslav Kysela69ad07c2005-05-30 14:48:16 +02001342 .subvendor = 0x103c,
1343 .subdevice = 0x006b,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001344 .name = "HP Pavilion ZV5030US",
1345 .type = AC97_TUNE_MUTE_LED
1346 },
1347 { } /* terminator */
1348};
1349
1350static int __devinit snd_atiixp_mixer_new(atiixp_t *chip, int clock, const char *quirk_override)
1351{
1352 ac97_bus_t *pbus;
1353 ac97_template_t ac97;
1354 int i, err;
1355 int codec_count;
1356 static ac97_bus_ops_t ops = {
1357 .write = snd_atiixp_ac97_write,
1358 .read = snd_atiixp_ac97_read,
1359 };
1360 static unsigned int codec_skip[NUM_ATI_CODECS] = {
1361 ATI_REG_ISR_CODEC0_NOT_READY,
1362 ATI_REG_ISR_CODEC1_NOT_READY,
1363 ATI_REG_ISR_CODEC2_NOT_READY,
1364 };
1365
1366 if (snd_atiixp_codec_detect(chip) < 0)
1367 return -ENXIO;
1368
1369 if ((err = snd_ac97_bus(chip->card, 0, &ops, chip, &pbus)) < 0)
1370 return err;
1371 pbus->clock = clock;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001372 chip->ac97_bus = pbus;
1373
1374 codec_count = 0;
1375 for (i = 0; i < NUM_ATI_CODECS; i++) {
1376 if (chip->codec_not_ready_bits & codec_skip[i])
1377 continue;
1378 memset(&ac97, 0, sizeof(ac97));
1379 ac97.private_data = chip;
1380 ac97.pci = chip->pci;
1381 ac97.num = i;
1382 ac97.scaps = AC97_SCAP_SKIP_MODEM;
1383 if (! chip->spdif_over_aclink)
1384 ac97.scaps |= AC97_SCAP_NO_SPDIF;
1385 if ((err = snd_ac97_mixer(pbus, &ac97, &chip->ac97[i])) < 0) {
1386 chip->ac97[i] = NULL; /* to be sure */
1387 snd_printdd("atiixp: codec %d not available for audio\n", i);
1388 continue;
1389 }
1390 codec_count++;
1391 }
1392
1393 if (! codec_count) {
1394 snd_printk(KERN_ERR "atiixp: no codec available\n");
1395 return -ENODEV;
1396 }
1397
1398 snd_ac97_tune_hardware(chip->ac97[0], ac97_quirks, quirk_override);
1399
1400 return 0;
1401}
1402
1403
1404#ifdef CONFIG_PM
1405/*
1406 * power management
1407 */
1408static int snd_atiixp_suspend(snd_card_t *card, pm_message_t state)
1409{
1410 atiixp_t *chip = card->pm_private_data;
1411 int i;
1412
1413 for (i = 0; i < NUM_ATI_PCMDEVS; i++)
1414 if (chip->pcmdevs[i]) {
1415 atiixp_dma_t *dma = &chip->dmas[i];
1416 if (dma->substream && dma->running)
1417 dma->saved_curptr = readl(chip->remap_addr + dma->ops->dt_cur);
1418 snd_pcm_suspend_all(chip->pcmdevs[i]);
1419 }
1420 for (i = 0; i < NUM_ATI_CODECS; i++)
1421 if (chip->ac97[i])
1422 snd_ac97_suspend(chip->ac97[i]);
1423 snd_atiixp_aclink_down(chip);
1424 snd_atiixp_chip_stop(chip);
1425
Pavel Machek829ca9a2005-09-03 15:56:56 -07001426 pci_set_power_state(chip->pci, PCI_D3hot);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001427 pci_disable_device(chip->pci);
1428 return 0;
1429}
1430
1431static int snd_atiixp_resume(snd_card_t *card)
1432{
1433 atiixp_t *chip = card->pm_private_data;
1434 int i;
1435
1436 pci_enable_device(chip->pci);
Pavel Machek829ca9a2005-09-03 15:56:56 -07001437 pci_set_power_state(chip->pci, PCI_D0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001438 pci_set_master(chip->pci);
1439
1440 snd_atiixp_aclink_reset(chip);
1441 snd_atiixp_chip_start(chip);
1442
1443 for (i = 0; i < NUM_ATI_CODECS; i++)
1444 if (chip->ac97[i])
1445 snd_ac97_resume(chip->ac97[i]);
1446
1447 for (i = 0; i < NUM_ATI_PCMDEVS; i++)
1448 if (chip->pcmdevs[i]) {
1449 atiixp_dma_t *dma = &chip->dmas[i];
Jaroslav Kysela41e48452005-08-18 13:43:12 +02001450 if (dma->substream && dma->suspended) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001451 dma->ops->enable_dma(chip, 1);
Takashi Iwai8e3d7592005-09-01 11:56:34 +02001452 dma->substream->ops->prepare(dma->substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001453 writel((u32)dma->desc_buf.addr | ATI_REG_LINKPTR_EN,
1454 chip->remap_addr + dma->ops->llp_offset);
1455 writel(dma->saved_curptr, chip->remap_addr + dma->ops->dt_cur);
1456 }
1457 }
1458
1459 return 0;
1460}
1461#endif /* CONFIG_PM */
1462
1463
1464/*
1465 * proc interface for register dump
1466 */
1467
1468static void snd_atiixp_proc_read(snd_info_entry_t *entry, snd_info_buffer_t *buffer)
1469{
1470 atiixp_t *chip = entry->private_data;
1471 int i;
1472
1473 for (i = 0; i < 256; i += 4)
1474 snd_iprintf(buffer, "%02x: %08x\n", i, readl(chip->remap_addr + i));
1475}
1476
1477static void __devinit snd_atiixp_proc_init(atiixp_t *chip)
1478{
1479 snd_info_entry_t *entry;
1480
1481 if (! snd_card_proc_new(chip->card, "atiixp", &entry))
1482 snd_info_set_text_ops(entry, chip, 1024, snd_atiixp_proc_read);
1483}
1484
1485
1486
1487/*
1488 * destructor
1489 */
1490
1491static int snd_atiixp_free(atiixp_t *chip)
1492{
1493 if (chip->irq < 0)
1494 goto __hw_end;
1495 snd_atiixp_chip_stop(chip);
1496 synchronize_irq(chip->irq);
1497 __hw_end:
1498 if (chip->irq >= 0)
1499 free_irq(chip->irq, (void *)chip);
1500 if (chip->remap_addr)
1501 iounmap(chip->remap_addr);
1502 pci_release_regions(chip->pci);
1503 pci_disable_device(chip->pci);
1504 kfree(chip);
1505 return 0;
1506}
1507
1508static int snd_atiixp_dev_free(snd_device_t *device)
1509{
1510 atiixp_t *chip = device->device_data;
1511 return snd_atiixp_free(chip);
1512}
1513
1514/*
1515 * constructor for chip instance
1516 */
1517static int __devinit snd_atiixp_create(snd_card_t *card,
1518 struct pci_dev *pci,
1519 atiixp_t **r_chip)
1520{
1521 static snd_device_ops_t ops = {
1522 .dev_free = snd_atiixp_dev_free,
1523 };
1524 atiixp_t *chip;
1525 int err;
1526
1527 if ((err = pci_enable_device(pci)) < 0)
1528 return err;
1529
Takashi Iwaie560d8d2005-09-09 14:21:46 +02001530 chip = kzalloc(sizeof(*chip), GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001531 if (chip == NULL) {
1532 pci_disable_device(pci);
1533 return -ENOMEM;
1534 }
1535
1536 spin_lock_init(&chip->reg_lock);
1537 init_MUTEX(&chip->open_mutex);
1538 chip->card = card;
1539 chip->pci = pci;
1540 chip->irq = -1;
1541 if ((err = pci_request_regions(pci, "ATI IXP AC97")) < 0) {
1542 pci_disable_device(pci);
1543 kfree(chip);
1544 return err;
1545 }
1546 chip->addr = pci_resource_start(pci, 0);
1547 chip->remap_addr = ioremap_nocache(chip->addr, pci_resource_len(pci, 0));
1548 if (chip->remap_addr == NULL) {
1549 snd_printk(KERN_ERR "AC'97 space ioremap problem\n");
1550 snd_atiixp_free(chip);
1551 return -EIO;
1552 }
1553
1554 if (request_irq(pci->irq, snd_atiixp_interrupt, SA_INTERRUPT|SA_SHIRQ, card->shortname, (void *)chip)) {
1555 snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq);
1556 snd_atiixp_free(chip);
1557 return -EBUSY;
1558 }
1559 chip->irq = pci->irq;
1560 pci_set_master(pci);
1561 synchronize_irq(chip->irq);
1562
1563 if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) {
1564 snd_atiixp_free(chip);
1565 return err;
1566 }
1567
1568 snd_card_set_dev(card, &pci->dev);
1569
1570 *r_chip = chip;
1571 return 0;
1572}
1573
1574
1575static int __devinit snd_atiixp_probe(struct pci_dev *pci,
1576 const struct pci_device_id *pci_id)
1577{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001578 snd_card_t *card;
1579 atiixp_t *chip;
1580 unsigned char revision;
1581 int err;
1582
Clemens Ladischb7fe4622005-10-04 08:46:51 +02001583 card = snd_card_new(index, id, THIS_MODULE, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001584 if (card == NULL)
1585 return -ENOMEM;
1586
1587 pci_read_config_byte(pci, PCI_REVISION_ID, &revision);
1588
Clemens Ladischb7fe4622005-10-04 08:46:51 +02001589 strcpy(card->driver, spdif_aclink ? "ATIIXP" : "ATIIXP-SPDMA");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001590 strcpy(card->shortname, "ATI IXP");
1591 if ((err = snd_atiixp_create(card, pci, &chip)) < 0)
1592 goto __error;
1593
1594 if ((err = snd_atiixp_aclink_reset(chip)) < 0)
1595 goto __error;
1596
Clemens Ladischb7fe4622005-10-04 08:46:51 +02001597 chip->spdif_over_aclink = spdif_aclink;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001598
Clemens Ladischb7fe4622005-10-04 08:46:51 +02001599 if ((err = snd_atiixp_mixer_new(chip, ac97_clock, ac97_quirk)) < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001600 goto __error;
1601
1602 if ((err = snd_atiixp_pcm_new(chip)) < 0)
1603 goto __error;
1604
1605 snd_atiixp_proc_init(chip);
1606
1607 snd_atiixp_chip_start(chip);
1608
1609 snprintf(card->longname, sizeof(card->longname),
1610 "%s rev %x with %s at %#lx, irq %i", card->shortname, revision,
1611 chip->ac97[0] ? snd_ac97_get_short_name(chip->ac97[0]) : "?",
1612 chip->addr, chip->irq);
1613
1614 snd_card_set_pm_callback(card, snd_atiixp_suspend, snd_atiixp_resume, chip);
1615
1616 if ((err = snd_card_register(card)) < 0)
1617 goto __error;
1618
1619 pci_set_drvdata(pci, card);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001620 return 0;
1621
1622 __error:
1623 snd_card_free(card);
1624 return err;
1625}
1626
1627static void __devexit snd_atiixp_remove(struct pci_dev *pci)
1628{
1629 snd_card_free(pci_get_drvdata(pci));
1630 pci_set_drvdata(pci, NULL);
1631}
1632
1633static struct pci_driver driver = {
1634 .name = "ATI IXP AC97 controller",
Clemens Ladisch3bcd4642005-09-12 08:20:54 +02001635 .owner = THIS_MODULE,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001636 .id_table = snd_atiixp_ids,
1637 .probe = snd_atiixp_probe,
1638 .remove = __devexit_p(snd_atiixp_remove),
1639 SND_PCI_PM_CALLBACKS
1640};
1641
1642
1643static int __init alsa_card_atiixp_init(void)
1644{
Takashi Iwai01d25d42005-04-11 16:58:24 +02001645 return pci_register_driver(&driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001646}
1647
1648static void __exit alsa_card_atiixp_exit(void)
1649{
1650 pci_unregister_driver(&driver);
1651}
1652
1653module_init(alsa_card_atiixp_init)
1654module_exit(alsa_card_atiixp_exit)