Lines Matching full:chip
3 ad1816a.c - lowlevel code for Analog Devices AD1816A chip.
20 static inline int snd_ad1816a_busy_wait(struct snd_ad1816a *chip) in snd_ad1816a_busy_wait() argument
28 dev_warn(chip->card->dev, "chip busy.\n"); in snd_ad1816a_busy_wait()
32 static inline unsigned char snd_ad1816a_in(struct snd_ad1816a *chip, unsigned char reg) in snd_ad1816a_in() argument
34 snd_ad1816a_busy_wait(chip); in snd_ad1816a_in()
38 static inline void snd_ad1816a_out(struct snd_ad1816a *chip, unsigned char reg, in snd_ad1816a_out() argument
41 snd_ad1816a_busy_wait(chip); in snd_ad1816a_out()
45 static inline void snd_ad1816a_out_mask(struct snd_ad1816a *chip, unsigned char reg, in snd_ad1816a_out_mask() argument
48 snd_ad1816a_out(chip, reg, in snd_ad1816a_out_mask()
49 (value & mask) | (snd_ad1816a_in(chip, reg) & ~mask)); in snd_ad1816a_out_mask()
52 static unsigned short snd_ad1816a_read(struct snd_ad1816a *chip, unsigned char reg) in snd_ad1816a_read() argument
54 snd_ad1816a_out(chip, AD1816A_INDIR_ADDR, reg & 0x3f); in snd_ad1816a_read()
55 return snd_ad1816a_in(chip, AD1816A_INDIR_DATA_LOW) | in snd_ad1816a_read()
56 (snd_ad1816a_in(chip, AD1816A_INDIR_DATA_HIGH) << 8); in snd_ad1816a_read()
59 static void snd_ad1816a_write(struct snd_ad1816a *chip, unsigned char reg, in snd_ad1816a_write() argument
62 snd_ad1816a_out(chip, AD1816A_INDIR_ADDR, reg & 0x3f); in snd_ad1816a_write()
63 snd_ad1816a_out(chip, AD1816A_INDIR_DATA_LOW, value & 0xff); in snd_ad1816a_write()
64 snd_ad1816a_out(chip, AD1816A_INDIR_DATA_HIGH, (value >> 8) & 0xff); in snd_ad1816a_write()
67 static void snd_ad1816a_write_mask(struct snd_ad1816a *chip, unsigned char reg, in snd_ad1816a_write_mask() argument
70 snd_ad1816a_write(chip, reg, in snd_ad1816a_write_mask()
71 (value & mask) | (snd_ad1816a_read(chip, reg) & ~mask)); in snd_ad1816a_write_mask()
75 static unsigned char snd_ad1816a_get_format(struct snd_ad1816a *chip, in snd_ad1816a_get_format() argument
97 static int snd_ad1816a_open(struct snd_ad1816a *chip, unsigned int mode) in snd_ad1816a_open() argument
101 spin_lock_irqsave(&chip->lock, flags); in snd_ad1816a_open()
103 if (chip->mode & mode) { in snd_ad1816a_open()
104 spin_unlock_irqrestore(&chip->lock, flags); in snd_ad1816a_open()
110 snd_ad1816a_out_mask(chip, AD1816A_INTERRUPT_STATUS, in snd_ad1816a_open()
112 snd_ad1816a_write_mask(chip, AD1816A_INTERRUPT_ENABLE, in snd_ad1816a_open()
116 snd_ad1816a_out_mask(chip, AD1816A_INTERRUPT_STATUS, in snd_ad1816a_open()
118 snd_ad1816a_write_mask(chip, AD1816A_INTERRUPT_ENABLE, in snd_ad1816a_open()
122 snd_ad1816a_out_mask(chip, AD1816A_INTERRUPT_STATUS, in snd_ad1816a_open()
124 snd_ad1816a_write_mask(chip, AD1816A_INTERRUPT_ENABLE, in snd_ad1816a_open()
127 chip->mode |= mode; in snd_ad1816a_open()
129 spin_unlock_irqrestore(&chip->lock, flags); in snd_ad1816a_open()
133 static void snd_ad1816a_close(struct snd_ad1816a *chip, unsigned int mode) in snd_ad1816a_close() argument
137 spin_lock_irqsave(&chip->lock, flags); in snd_ad1816a_close()
141 snd_ad1816a_out_mask(chip, AD1816A_INTERRUPT_STATUS, in snd_ad1816a_close()
143 snd_ad1816a_write_mask(chip, AD1816A_INTERRUPT_ENABLE, in snd_ad1816a_close()
147 snd_ad1816a_out_mask(chip, AD1816A_INTERRUPT_STATUS, in snd_ad1816a_close()
149 snd_ad1816a_write_mask(chip, AD1816A_INTERRUPT_ENABLE, in snd_ad1816a_close()
153 snd_ad1816a_out_mask(chip, AD1816A_INTERRUPT_STATUS, in snd_ad1816a_close()
155 snd_ad1816a_write_mask(chip, AD1816A_INTERRUPT_ENABLE, in snd_ad1816a_close()
158 chip->mode &= ~mode; in snd_ad1816a_close()
159 if (!(chip->mode & AD1816A_MODE_OPEN)) in snd_ad1816a_close()
160 chip->mode = 0; in snd_ad1816a_close()
162 spin_unlock_irqrestore(&chip->lock, flags); in snd_ad1816a_close()
166 static int snd_ad1816a_trigger(struct snd_ad1816a *chip, unsigned char what, in snd_ad1816a_trigger() argument
174 spin_lock(&chip->lock); in snd_ad1816a_trigger()
181 snd_ad1816a_out_mask(chip, AD1816A_PLAYBACK_CONFIG, in snd_ad1816a_trigger()
184 snd_ad1816a_out_mask(chip, AD1816A_CAPTURE_CONFIG, in snd_ad1816a_trigger()
186 spin_unlock(&chip->lock); in snd_ad1816a_trigger()
189 dev_warn(chip->card->dev, "invalid trigger mode 0x%x.\n", what); in snd_ad1816a_trigger()
198 struct snd_ad1816a *chip = snd_pcm_substream_chip(substream); in snd_ad1816a_playback_trigger() local
199 return snd_ad1816a_trigger(chip, AD1816A_PLAYBACK_ENABLE, in snd_ad1816a_playback_trigger()
205 struct snd_ad1816a *chip = snd_pcm_substream_chip(substream); in snd_ad1816a_capture_trigger() local
206 return snd_ad1816a_trigger(chip, AD1816A_CAPTURE_ENABLE, in snd_ad1816a_capture_trigger()
212 struct snd_ad1816a *chip = snd_pcm_substream_chip(substream); in snd_ad1816a_playback_prepare() local
217 spin_lock_irqsave(&chip->lock, flags); in snd_ad1816a_playback_prepare()
219 chip->p_dma_size = size = snd_pcm_lib_buffer_bytes(substream); in snd_ad1816a_playback_prepare()
220 snd_ad1816a_out_mask(chip, AD1816A_PLAYBACK_CONFIG, in snd_ad1816a_playback_prepare()
223 snd_dma_program(chip->dma1, runtime->dma_addr, size, in snd_ad1816a_playback_prepare()
227 if (chip->clock_freq) in snd_ad1816a_playback_prepare()
228 rate = (rate * 33000) / chip->clock_freq; in snd_ad1816a_playback_prepare()
229 snd_ad1816a_write(chip, AD1816A_PLAYBACK_SAMPLE_RATE, rate); in snd_ad1816a_playback_prepare()
230 snd_ad1816a_out_mask(chip, AD1816A_PLAYBACK_CONFIG, in snd_ad1816a_playback_prepare()
232 snd_ad1816a_get_format(chip, runtime->format, in snd_ad1816a_playback_prepare()
235 snd_ad1816a_write(chip, AD1816A_PLAYBACK_BASE_COUNT, in snd_ad1816a_playback_prepare()
238 spin_unlock_irqrestore(&chip->lock, flags); in snd_ad1816a_playback_prepare()
244 struct snd_ad1816a *chip = snd_pcm_substream_chip(substream); in snd_ad1816a_capture_prepare() local
249 spin_lock_irqsave(&chip->lock, flags); in snd_ad1816a_capture_prepare()
251 chip->c_dma_size = size = snd_pcm_lib_buffer_bytes(substream); in snd_ad1816a_capture_prepare()
252 snd_ad1816a_out_mask(chip, AD1816A_CAPTURE_CONFIG, in snd_ad1816a_capture_prepare()
255 snd_dma_program(chip->dma2, runtime->dma_addr, size, in snd_ad1816a_capture_prepare()
259 if (chip->clock_freq) in snd_ad1816a_capture_prepare()
260 rate = (rate * 33000) / chip->clock_freq; in snd_ad1816a_capture_prepare()
261 snd_ad1816a_write(chip, AD1816A_CAPTURE_SAMPLE_RATE, rate); in snd_ad1816a_capture_prepare()
262 snd_ad1816a_out_mask(chip, AD1816A_CAPTURE_CONFIG, in snd_ad1816a_capture_prepare()
264 snd_ad1816a_get_format(chip, runtime->format, in snd_ad1816a_capture_prepare()
267 snd_ad1816a_write(chip, AD1816A_CAPTURE_BASE_COUNT, in snd_ad1816a_capture_prepare()
270 spin_unlock_irqrestore(&chip->lock, flags); in snd_ad1816a_capture_prepare()
277 struct snd_ad1816a *chip = snd_pcm_substream_chip(substream); in snd_ad1816a_playback_pointer() local
279 if (!(chip->mode & AD1816A_MODE_PLAYBACK)) in snd_ad1816a_playback_pointer()
281 ptr = snd_dma_pointer(chip->dma1, chip->p_dma_size); in snd_ad1816a_playback_pointer()
287 struct snd_ad1816a *chip = snd_pcm_substream_chip(substream); in snd_ad1816a_capture_pointer() local
289 if (!(chip->mode & AD1816A_MODE_CAPTURE)) in snd_ad1816a_capture_pointer()
291 ptr = snd_dma_pointer(chip->dma2, chip->c_dma_size); in snd_ad1816a_capture_pointer()
298 struct snd_ad1816a *chip = dev_id; in snd_ad1816a_interrupt() local
301 spin_lock(&chip->lock); in snd_ad1816a_interrupt()
302 status = snd_ad1816a_in(chip, AD1816A_INTERRUPT_STATUS); in snd_ad1816a_interrupt()
303 spin_unlock(&chip->lock); in snd_ad1816a_interrupt()
305 if ((status & AD1816A_PLAYBACK_IRQ_PENDING) && chip->playback_substream) in snd_ad1816a_interrupt()
306 snd_pcm_period_elapsed(chip->playback_substream); in snd_ad1816a_interrupt()
308 if ((status & AD1816A_CAPTURE_IRQ_PENDING) && chip->capture_substream) in snd_ad1816a_interrupt()
309 snd_pcm_period_elapsed(chip->capture_substream); in snd_ad1816a_interrupt()
311 if ((status & AD1816A_TIMER_IRQ_PENDING) && chip->timer) in snd_ad1816a_interrupt()
312 snd_timer_interrupt(chip->timer, chip->timer->sticks); in snd_ad1816a_interrupt()
314 spin_lock(&chip->lock); in snd_ad1816a_interrupt()
315 snd_ad1816a_out(chip, AD1816A_INTERRUPT_STATUS, 0x00); in snd_ad1816a_interrupt()
316 spin_unlock(&chip->lock); in snd_ad1816a_interrupt()
361 struct snd_ad1816a *chip = snd_timer_chip(timer); in snd_ad1816a_timer_close() local
362 snd_ad1816a_close(chip, AD1816A_MODE_TIMER); in snd_ad1816a_timer_close()
368 struct snd_ad1816a *chip = snd_timer_chip(timer); in snd_ad1816a_timer_open() local
369 snd_ad1816a_open(chip, AD1816A_MODE_TIMER); in snd_ad1816a_timer_open()
385 struct snd_ad1816a *chip = snd_timer_chip(timer); in snd_ad1816a_timer_start() local
386 spin_lock_irqsave(&chip->lock, flags); in snd_ad1816a_timer_start()
387 bits = snd_ad1816a_read(chip, AD1816A_INTERRUPT_ENABLE); in snd_ad1816a_timer_start()
390 snd_ad1816a_write(chip, AD1816A_TIMER_BASE_COUNT, in snd_ad1816a_timer_start()
393 snd_ad1816a_write_mask(chip, AD1816A_INTERRUPT_ENABLE, in snd_ad1816a_timer_start()
396 spin_unlock_irqrestore(&chip->lock, flags); in snd_ad1816a_timer_start()
403 struct snd_ad1816a *chip = snd_timer_chip(timer); in snd_ad1816a_timer_stop() local
404 spin_lock_irqsave(&chip->lock, flags); in snd_ad1816a_timer_stop()
406 snd_ad1816a_write_mask(chip, AD1816A_INTERRUPT_ENABLE, in snd_ad1816a_timer_stop()
409 spin_unlock_irqrestore(&chip->lock, flags); in snd_ad1816a_timer_stop()
426 struct snd_ad1816a *chip = snd_pcm_substream_chip(substream); in snd_ad1816a_playback_open() local
430 error = snd_ad1816a_open(chip, AD1816A_MODE_PLAYBACK); in snd_ad1816a_playback_open()
434 snd_pcm_limit_isa_dma_size(chip->dma1, &runtime->hw.buffer_bytes_max); in snd_ad1816a_playback_open()
435 snd_pcm_limit_isa_dma_size(chip->dma1, &runtime->hw.period_bytes_max); in snd_ad1816a_playback_open()
436 chip->playback_substream = substream; in snd_ad1816a_playback_open()
442 struct snd_ad1816a *chip = snd_pcm_substream_chip(substream); in snd_ad1816a_capture_open() local
446 error = snd_ad1816a_open(chip, AD1816A_MODE_CAPTURE); in snd_ad1816a_capture_open()
450 snd_pcm_limit_isa_dma_size(chip->dma2, &runtime->hw.buffer_bytes_max); in snd_ad1816a_capture_open()
451 snd_pcm_limit_isa_dma_size(chip->dma2, &runtime->hw.period_bytes_max); in snd_ad1816a_capture_open()
452 chip->capture_substream = substream; in snd_ad1816a_capture_open()
458 struct snd_ad1816a *chip = snd_pcm_substream_chip(substream); in snd_ad1816a_playback_close() local
460 chip->playback_substream = NULL; in snd_ad1816a_playback_close()
461 snd_ad1816a_close(chip, AD1816A_MODE_PLAYBACK); in snd_ad1816a_playback_close()
467 struct snd_ad1816a *chip = snd_pcm_substream_chip(substream); in snd_ad1816a_capture_close() local
469 chip->capture_substream = NULL; in snd_ad1816a_capture_close()
470 snd_ad1816a_close(chip, AD1816A_MODE_CAPTURE); in snd_ad1816a_capture_close()
475 static void snd_ad1816a_init(struct snd_ad1816a *chip) in snd_ad1816a_init() argument
479 spin_lock_irqsave(&chip->lock, flags); in snd_ad1816a_init()
481 snd_ad1816a_out(chip, AD1816A_INTERRUPT_STATUS, 0x00); in snd_ad1816a_init()
482 snd_ad1816a_out_mask(chip, AD1816A_PLAYBACK_CONFIG, in snd_ad1816a_init()
484 snd_ad1816a_out_mask(chip, AD1816A_CAPTURE_CONFIG, in snd_ad1816a_init()
486 snd_ad1816a_write(chip, AD1816A_INTERRUPT_ENABLE, 0x0000); in snd_ad1816a_init()
487 snd_ad1816a_write_mask(chip, AD1816A_CHIP_CONFIG, in snd_ad1816a_init()
489 snd_ad1816a_write(chip, AD1816A_DSP_CONFIG, 0x0000); in snd_ad1816a_init()
490 snd_ad1816a_write(chip, AD1816A_POWERDOWN_CTRL, 0x0000); in snd_ad1816a_init()
492 spin_unlock_irqrestore(&chip->lock, flags); in snd_ad1816a_init()
496 void snd_ad1816a_suspend(struct snd_ad1816a *chip) in snd_ad1816a_suspend() argument
501 spin_lock_irqsave(&chip->lock, flags); in snd_ad1816a_suspend()
503 chip->image[reg] = snd_ad1816a_read(chip, reg); in snd_ad1816a_suspend()
504 spin_unlock_irqrestore(&chip->lock, flags); in snd_ad1816a_suspend()
507 void snd_ad1816a_resume(struct snd_ad1816a *chip) in snd_ad1816a_resume() argument
512 snd_ad1816a_init(chip); in snd_ad1816a_resume()
513 spin_lock_irqsave(&chip->lock, flags); in snd_ad1816a_resume()
515 snd_ad1816a_write(chip, reg, chip->image[reg]); in snd_ad1816a_resume()
516 spin_unlock_irqrestore(&chip->lock, flags); in snd_ad1816a_resume()
520 static int snd_ad1816a_probe(struct snd_ad1816a *chip) in snd_ad1816a_probe() argument
524 spin_lock_irqsave(&chip->lock, flags); in snd_ad1816a_probe()
526 switch (chip->version = snd_ad1816a_read(chip, AD1816A_VERSION_ID)) { in snd_ad1816a_probe()
528 chip->hardware = AD1816A_HW_AD1815; in snd_ad1816a_probe()
531 chip->hardware = AD1816A_HW_AD18MAX10; in snd_ad1816a_probe()
534 chip->hardware = AD1816A_HW_AD1816A; in snd_ad1816a_probe()
537 chip->hardware = AD1816A_HW_AUTO; in snd_ad1816a_probe()
540 spin_unlock_irqrestore(&chip->lock, flags); in snd_ad1816a_probe()
544 static const char *snd_ad1816a_chip_id(struct snd_ad1816a *chip) in snd_ad1816a_chip_id() argument
546 switch (chip->hardware) { in snd_ad1816a_chip_id()
551 dev_warn(chip->card->dev, "Unknown chip version %d:%d.\n", in snd_ad1816a_chip_id()
552 chip->version, chip->hardware); in snd_ad1816a_chip_id()
559 struct snd_ad1816a *chip) in snd_ad1816a_create() argument
563 chip->irq = -1; in snd_ad1816a_create()
564 chip->dma1 = -1; in snd_ad1816a_create()
565 chip->dma2 = -1; in snd_ad1816a_create()
567 chip->res_port = devm_request_region(card->dev, port, 16, "AD1816A"); in snd_ad1816a_create()
568 if (!chip->res_port) { in snd_ad1816a_create()
573 "AD1816A", (void *) chip)) { in snd_ad1816a_create()
577 chip->irq = irq; in snd_ad1816a_create()
578 card->sync_irq = chip->irq; in snd_ad1816a_create()
583 chip->dma1 = dma1; in snd_ad1816a_create()
588 chip->dma2 = dma2; in snd_ad1816a_create()
590 chip->card = card; in snd_ad1816a_create()
591 chip->port = port; in snd_ad1816a_create()
592 spin_lock_init(&chip->lock); in snd_ad1816a_create()
594 error = snd_ad1816a_probe(chip); in snd_ad1816a_create()
598 snd_ad1816a_init(chip); in snd_ad1816a_create()
619 int snd_ad1816a_pcm(struct snd_ad1816a *chip, int device) in snd_ad1816a_pcm() argument
624 error = snd_pcm_new(chip->card, "AD1816A", device, 1, 1, &pcm); in snd_ad1816a_pcm()
631 pcm->private_data = chip; in snd_ad1816a_pcm()
632 pcm->info_flags = (chip->dma1 == chip->dma2 ) ? SNDRV_PCM_INFO_JOINT_DUPLEX : 0; in snd_ad1816a_pcm()
634 strcpy(pcm->name, snd_ad1816a_chip_id(chip)); in snd_ad1816a_pcm()
635 snd_ad1816a_init(chip); in snd_ad1816a_pcm()
637 snd_pcm_set_managed_buffer_all(pcm, SNDRV_DMA_TYPE_DEV, chip->card->dev, in snd_ad1816a_pcm()
638 64*1024, chip->dma1 > 3 || chip->dma2 > 3 ? 128*1024 : 64*1024); in snd_ad1816a_pcm()
640 chip->pcm = pcm; in snd_ad1816a_pcm()
644 int snd_ad1816a_timer(struct snd_ad1816a *chip, int device) in snd_ad1816a_timer() argument
652 tid.card = chip->card->number; in snd_ad1816a_timer()
655 error = snd_timer_new(chip->card, "AD1816A", &tid, &timer); in snd_ad1816a_timer()
658 strcpy(timer->name, snd_ad1816a_chip_id(chip)); in snd_ad1816a_timer()
659 timer->private_data = chip; in snd_ad1816a_timer()
660 chip->timer = timer; in snd_ad1816a_timer()
681 struct snd_ad1816a *chip = snd_kcontrol_chip(kcontrol); in snd_ad1816a_get_mux() local
685 spin_lock_irqsave(&chip->lock, flags); in snd_ad1816a_get_mux()
686 val = snd_ad1816a_read(chip, AD1816A_ADC_SOURCE_SEL); in snd_ad1816a_get_mux()
687 spin_unlock_irqrestore(&chip->lock, flags); in snd_ad1816a_get_mux()
695 struct snd_ad1816a *chip = snd_kcontrol_chip(kcontrol); in snd_ad1816a_put_mux() local
705 spin_lock_irqsave(&chip->lock, flags); in snd_ad1816a_put_mux()
706 change = snd_ad1816a_read(chip, AD1816A_ADC_SOURCE_SEL) != val; in snd_ad1816a_put_mux()
707 snd_ad1816a_write(chip, AD1816A_ADC_SOURCE_SEL, val); in snd_ad1816a_put_mux()
708 spin_unlock_irqrestore(&chip->lock, flags); in snd_ad1816a_put_mux()
737 struct snd_ad1816a *chip = snd_kcontrol_chip(kcontrol); in snd_ad1816a_get_single() local
744 spin_lock_irqsave(&chip->lock, flags); in snd_ad1816a_get_single()
745 ucontrol->value.integer.value[0] = (snd_ad1816a_read(chip, reg) >> shift) & mask; in snd_ad1816a_get_single()
746 spin_unlock_irqrestore(&chip->lock, flags); in snd_ad1816a_get_single()
754 struct snd_ad1816a *chip = snd_kcontrol_chip(kcontrol); in snd_ad1816a_put_single() local
767 spin_lock_irqsave(&chip->lock, flags); in snd_ad1816a_put_single()
768 old_val = snd_ad1816a_read(chip, reg); in snd_ad1816a_put_single()
771 snd_ad1816a_write(chip, reg, val); in snd_ad1816a_put_single()
772 spin_unlock_irqrestore(&chip->lock, flags); in snd_ad1816a_put_single()
802 struct snd_ad1816a *chip = snd_kcontrol_chip(kcontrol); in snd_ad1816a_get_double() local
811 spin_lock_irqsave(&chip->lock, flags); in snd_ad1816a_get_double()
812 val = snd_ad1816a_read(chip, reg); in snd_ad1816a_get_double()
815 spin_unlock_irqrestore(&chip->lock, flags); in snd_ad1816a_get_double()
825 struct snd_ad1816a *chip = snd_kcontrol_chip(kcontrol); in snd_ad1816a_put_double() local
843 spin_lock_irqsave(&chip->lock, flags); in snd_ad1816a_put_double()
844 old_val = snd_ad1816a_read(chip, reg); in snd_ad1816a_put_double()
847 snd_ad1816a_write(chip, reg, val1); in snd_ad1816a_put_double()
848 spin_unlock_irqrestore(&chip->lock, flags); in snd_ad1816a_put_double()
904 int snd_ad1816a_mixer(struct snd_ad1816a *chip) in snd_ad1816a_mixer() argument
910 if (snd_BUG_ON(!chip || !chip->card)) in snd_ad1816a_mixer()
913 card = chip->card; in snd_ad1816a_mixer()
915 strcpy(card->mixername, snd_ad1816a_chip_id(chip)); in snd_ad1816a_mixer()
918 err = snd_ctl_add(card, snd_ctl_new1(&snd_ad1816a_controls[idx], chip)); in snd_ad1816a_mixer()