Lines Matching +full:ls +full:- +full:audio +full:- +full:card
1 // SPDX-License-Identifier: GPL-2.0-or-later
43 static char *id = SNDRV_DEFAULT_STR1; /* ID for this card */
64 MODULE_PARM_DESC(buffer_top, "Set the top address of audio buffer for " CARD_NAME " soundcard.");
148 /* Mutes the audio output. */
180 u32 buf; /* offset from chip->buffer */
195 struct snd_card *card; member
268 return readb(chip->cport + offset); in snd_nm256_readb()
274 return readw(chip->cport + offset); in snd_nm256_readw()
280 return readl(chip->cport + offset); in snd_nm256_readl()
286 writeb(val, chip->cport + offset); in snd_nm256_writeb()
292 writew(val, chip->cport + offset); in snd_nm256_writew()
298 writel(val, chip->cport + offset); in snd_nm256_writel()
304 offset -= chip->buffer_start; in snd_nm256_write_buffer()
306 if (offset < 0 || offset >= chip->buffer_size) { in snd_nm256_write_buffer()
307 dev_err(chip->card->dev, in snd_nm256_write_buffer()
313 memcpy_toio(chip->buffer + offset, src, size); in snd_nm256_write_buffer()
317 * coefficient handlers -- what a magic!
324 while (which-- > 0) in snd_nm256_get_start_offset()
332 u32 coeff_buf = chip->coeff_buf[stream]; in snd_nm256_load_one_coefficient()
340 size--; in snd_nm256_load_one_coefficient()
356 dev_dbg(chip->card->dev, in snd_nm256_load_coefficient()
361 /* The recording engine uses coefficient values 8-15. */ in snd_nm256_load_coefficient()
366 if (! chip->use_cache) { in snd_nm256_load_coefficient()
370 if (! chip->coeffs_current) { in snd_nm256_load_coefficient()
371 snd_nm256_write_buffer(chip, coefficients, chip->all_coeff_buf, in snd_nm256_load_coefficient()
373 chip->coeffs_current = 1; in snd_nm256_load_coefficient()
375 u32 base = chip->all_coeff_buf; in snd_nm256_load_coefficient()
380 end_offset--; in snd_nm256_load_coefficient()
386 /* The actual rates supported by the card. */
418 struct snd_pcm_runtime *runtime = substream->runtime; in snd_nm256_set_format()
419 int rate_index = snd_nm256_fixed_rate(runtime->rate); in snd_nm256_set_format()
422 s->shift = 0; in snd_nm256_set_format()
423 if (snd_pcm_format_width(runtime->format) == 16) { in snd_nm256_set_format()
425 s->shift++; in snd_nm256_set_format()
427 if (runtime->channels > 1) { in snd_nm256_set_format()
429 s->shift++; in snd_nm256_set_format()
432 runtime->rate = samplerates[rate_index]; in snd_nm256_set_format()
434 switch (substream->stream) { in snd_nm256_set_format()
453 mutex_lock(&chip->irq_mutex); in snd_nm256_acquire_irq()
454 if (chip->irq < 0) { in snd_nm256_acquire_irq()
455 if (request_irq(chip->pci->irq, chip->interrupt, IRQF_SHARED, in snd_nm256_acquire_irq()
457 dev_err(chip->card->dev, in snd_nm256_acquire_irq()
458 "unable to grab IRQ %d\n", chip->pci->irq); in snd_nm256_acquire_irq()
459 mutex_unlock(&chip->irq_mutex); in snd_nm256_acquire_irq()
460 return -EBUSY; in snd_nm256_acquire_irq()
462 chip->irq = chip->pci->irq; in snd_nm256_acquire_irq()
463 chip->card->sync_irq = chip->irq; in snd_nm256_acquire_irq()
465 chip->irq_acks++; in snd_nm256_acquire_irq()
466 mutex_unlock(&chip->irq_mutex); in snd_nm256_acquire_irq()
473 mutex_lock(&chip->irq_mutex); in snd_nm256_release_irq()
474 if (chip->irq_acks > 0) in snd_nm256_release_irq()
475 chip->irq_acks--; in snd_nm256_release_irq()
476 if (chip->irq_acks == 0 && chip->irq >= 0) { in snd_nm256_release_irq()
477 free_irq(chip->irq, chip); in snd_nm256_release_irq()
478 chip->irq = -1; in snd_nm256_release_irq()
479 chip->card->sync_irq = -1; in snd_nm256_release_irq()
481 mutex_unlock(&chip->irq_mutex); in snd_nm256_release_irq()
491 s->cur_period++; in snd_nm256_pcm_mark()
492 s->cur_period %= s->periods; in snd_nm256_pcm_mark()
493 snd_nm256_writel(chip, reg, s->buf + s->cur_period * s->period_size); in snd_nm256_pcm_mark()
504 snd_nm256_writel(chip, NM_PBUFFER_START, s->buf); in snd_nm256_playback_start()
505 snd_nm256_writel(chip, NM_PBUFFER_END, s->buf + s->dma_size - (1 << s->shift)); in snd_nm256_playback_start()
506 snd_nm256_writel(chip, NM_PBUFFER_CURRP, s->buf); in snd_nm256_playback_start()
521 snd_nm256_writel(chip, NM_RBUFFER_START, s->buf); in snd_nm256_capture_start()
522 snd_nm256_writel(chip, NM_RBUFFER_END, s->buf + s->dma_size); in snd_nm256_capture_start()
523 snd_nm256_writel(chip, NM_RBUFFER_CURRP, s->buf); in snd_nm256_capture_start()
553 struct nm256_stream *s = substream->runtime->private_data; in snd_nm256_playback_trigger()
557 return -ENXIO; in snd_nm256_playback_trigger()
559 spin_lock(&chip->reg_lock); in snd_nm256_playback_trigger()
562 s->suspended = 0; in snd_nm256_playback_trigger()
565 if (! s->running) { in snd_nm256_playback_trigger()
567 s->running = 1; in snd_nm256_playback_trigger()
571 s->suspended = 1; in snd_nm256_playback_trigger()
574 if (s->running) { in snd_nm256_playback_trigger()
576 s->running = 0; in snd_nm256_playback_trigger()
580 err = -EINVAL; in snd_nm256_playback_trigger()
583 spin_unlock(&chip->reg_lock); in snd_nm256_playback_trigger()
591 struct nm256_stream *s = substream->runtime->private_data; in snd_nm256_capture_trigger()
595 return -ENXIO; in snd_nm256_capture_trigger()
597 spin_lock(&chip->reg_lock); in snd_nm256_capture_trigger()
601 if (! s->running) { in snd_nm256_capture_trigger()
603 s->running = 1; in snd_nm256_capture_trigger()
608 if (s->running) { in snd_nm256_capture_trigger()
610 s->running = 0; in snd_nm256_capture_trigger()
614 err = -EINVAL; in snd_nm256_capture_trigger()
617 spin_unlock(&chip->reg_lock); in snd_nm256_capture_trigger()
628 struct snd_pcm_runtime *runtime = substream->runtime; in snd_nm256_pcm_prepare()
629 struct nm256_stream *s = runtime->private_data; in snd_nm256_pcm_prepare()
632 return -ENXIO; in snd_nm256_pcm_prepare()
633 s->dma_size = frames_to_bytes(runtime, substream->runtime->buffer_size); in snd_nm256_pcm_prepare()
634 s->period_size = frames_to_bytes(runtime, substream->runtime->period_size); in snd_nm256_pcm_prepare()
635 s->periods = substream->runtime->periods; in snd_nm256_pcm_prepare()
636 s->cur_period = 0; in snd_nm256_pcm_prepare()
638 spin_lock_irq(&chip->reg_lock); in snd_nm256_pcm_prepare()
639 s->running = 0; in snd_nm256_pcm_prepare()
641 spin_unlock_irq(&chip->reg_lock); in snd_nm256_pcm_prepare()
654 struct nm256_stream *s = substream->runtime->private_data; in snd_nm256_playback_pointer()
659 curp = snd_nm256_readl(chip, NM_PBUFFER_CURRP) - (unsigned long)s->buf; in snd_nm256_playback_pointer()
660 curp %= s->dma_size; in snd_nm256_playback_pointer()
661 return bytes_to_frames(substream->runtime, curp); in snd_nm256_playback_pointer()
668 struct nm256_stream *s = substream->runtime->private_data; in snd_nm256_capture_pointer()
673 curp = snd_nm256_readl(chip, NM_RBUFFER_CURRP) - (unsigned long)s->buf; in snd_nm256_capture_pointer()
674 curp %= s->dma_size; in snd_nm256_capture_pointer()
675 return bytes_to_frames(substream->runtime, curp); in snd_nm256_capture_pointer()
688 struct snd_pcm_runtime *runtime = substream->runtime; in snd_nm256_playback_silence()
689 struct nm256_stream *s = runtime->private_data; in snd_nm256_playback_silence()
691 memset_io(s->bufptr + pos, 0, count); in snd_nm256_playback_silence()
700 struct snd_pcm_runtime *runtime = substream->runtime; in snd_nm256_playback_copy()
701 struct nm256_stream *s = runtime->private_data; in snd_nm256_playback_copy()
703 if (copy_from_user_toio(s->bufptr + pos, src, count)) in snd_nm256_playback_copy()
704 return -EFAULT; in snd_nm256_playback_copy()
713 struct snd_pcm_runtime *runtime = substream->runtime; in snd_nm256_playback_copy_kernel()
714 struct nm256_stream *s = runtime->private_data; in snd_nm256_playback_copy_kernel()
716 memcpy_toio(s->bufptr + pos, src, count); in snd_nm256_playback_copy_kernel()
728 struct snd_pcm_runtime *runtime = substream->runtime; in snd_nm256_capture_copy()
729 struct nm256_stream *s = runtime->private_data; in snd_nm256_capture_copy()
731 if (copy_to_user_fromio(dst, s->bufptr + pos, count)) in snd_nm256_capture_copy()
732 return -EFAULT; in snd_nm256_capture_copy()
741 struct snd_pcm_runtime *runtime = substream->runtime; in snd_nm256_capture_copy_kernel()
742 struct nm256_stream *s = runtime->private_data; in snd_nm256_capture_copy_kernel()
744 memcpy_fromio(dst, s->bufptr + pos, count); in snd_nm256_capture_copy_kernel()
761 s = &chip->streams[SNDRV_PCM_STREAM_PLAYBACK]; in snd_nm256_playback_update()
762 if (s->running && s->substream) { in snd_nm256_playback_update()
763 spin_unlock(&chip->reg_lock); in snd_nm256_playback_update()
764 snd_pcm_period_elapsed(s->substream); in snd_nm256_playback_update()
765 spin_lock(&chip->reg_lock); in snd_nm256_playback_update()
776 s = &chip->streams[SNDRV_PCM_STREAM_CAPTURE]; in snd_nm256_capture_update()
777 if (s->running && s->substream) { in snd_nm256_capture_update()
778 spin_unlock(&chip->reg_lock); in snd_nm256_capture_update()
779 snd_pcm_period_elapsed(s->substream); in snd_nm256_capture_update()
780 spin_lock(&chip->reg_lock); in snd_nm256_capture_update()
832 substream->runtime->dma_bytes = params_buffer_bytes(hw_params); in snd_nm256_pcm_hw_params()
843 struct snd_pcm_runtime *runtime = substream->runtime; in snd_nm256_setup_stream()
845 s->running = 0; in snd_nm256_setup_stream()
846 runtime->hw = *hw_ptr; in snd_nm256_setup_stream()
847 runtime->hw.buffer_bytes_max = s->bufsize; in snd_nm256_setup_stream()
848 runtime->hw.period_bytes_max = s->bufsize / 2; in snd_nm256_setup_stream()
849 runtime->dma_area = (void __force *) s->bufptr; in snd_nm256_setup_stream()
850 runtime->dma_addr = s->bufptr_addr; in snd_nm256_setup_stream()
851 runtime->dma_bytes = s->bufsize; in snd_nm256_setup_stream()
852 runtime->private_data = s; in snd_nm256_setup_stream()
853 s->substream = substream; in snd_nm256_setup_stream()
865 return -EBUSY; in snd_nm256_playback_open()
866 snd_nm256_setup_stream(chip, &chip->streams[SNDRV_PCM_STREAM_PLAYBACK], in snd_nm256_playback_open()
877 return -EBUSY; in snd_nm256_capture_open()
878 snd_nm256_setup_stream(chip, &chip->streams[SNDRV_PCM_STREAM_CAPTURE], in snd_nm256_capture_open()
884 * close - we don't have to do special..
944 struct nm256_stream *s = &chip->streams[i]; in snd_nm256_pcm()
945 s->bufptr = chip->buffer + (s->buf - chip->buffer_start); in snd_nm256_pcm()
946 s->bufptr_addr = chip->buffer_addr + (s->buf - chip->buffer_start); in snd_nm256_pcm()
949 err = snd_pcm_new(chip->card, chip->card->driver, device, in snd_nm256_pcm()
957 pcm->private_data = chip; in snd_nm256_pcm()
958 pcm->info_flags = 0; in snd_nm256_pcm()
959 chip->pcm = pcm; in snd_nm256_pcm()
983 if (chip->badintrcount++ > 1000) { in snd_nm256_intr_check()
985 * I'm not sure if the best thing is to stop the card from in snd_nm256_intr_check()
990 * I worry about the card engine continuing to play noise in snd_nm256_intr_check()
991 * over and over, however--that could become a very in snd_nm256_intr_check()
994 * inserted a PCMCIA card and someone's spamming us with IRQ 9s. in snd_nm256_intr_check()
996 if (chip->streams[SNDRV_PCM_STREAM_PLAYBACK].running) in snd_nm256_intr_check()
998 if (chip->streams[SNDRV_PCM_STREAM_CAPTURE].running) in snd_nm256_intr_check()
1000 chip->badintrcount = 0; in snd_nm256_intr_check()
1009 * I don't like the cut-n-paste job here either between the two routines,
1028 chip->badintrcount = 0; in snd_nm256_interrupt()
1032 spin_lock(&chip->reg_lock); in snd_nm256_interrupt()
1048 dev_dbg(chip->card->dev, "NM256: Got misc interrupt #1\n"); in snd_nm256_interrupt()
1057 dev_dbg(chip->card->dev, "NM256: Got misc interrupt #2\n"); in snd_nm256_interrupt()
1064 dev_dbg(chip->card->dev, in snd_nm256_interrupt()
1071 spin_unlock(&chip->reg_lock); in snd_nm256_interrupt()
1077 * This handler is for the 256ZX, and is very similar to the non-ZX
1094 chip->badintrcount = 0; in snd_nm256_interrupt_zx()
1098 spin_lock(&chip->reg_lock); in snd_nm256_interrupt_zx()
1114 dev_dbg(chip->card->dev, "NM256: Got misc interrupt #1\n"); in snd_nm256_interrupt_zx()
1122 dev_dbg(chip->card->dev, "NM256: Got misc interrupt #2\n"); in snd_nm256_interrupt_zx()
1129 dev_dbg(chip->card->dev, in snd_nm256_interrupt_zx()
1136 spin_unlock(&chip->reg_lock); in snd_nm256_interrupt_zx()
1155 testaddr = chip->mixer_status_offset; in snd_nm256_ac97_ready()
1156 testb = chip->mixer_status_mask; in snd_nm256_ac97_ready()
1161 while (timeout-- > 0) { in snd_nm256_ac97_ready()
1172 * so that we have most of the register contents cached--this avoids
1209 return -1; in nm256_ac97_idx()
1214 * thus we're treating it as a write-only mixer and cache the
1220 struct nm256 *chip = ac97->private_data; in snd_nm256_ac97_read()
1225 return chip->ac97_regs[idx]; in snd_nm256_ac97_read()
1234 struct nm256 *chip = ac97->private_data; in snd_nm256_ac97_write()
1242 base = chip->mixer_base; in snd_nm256_ac97_write()
1247 while (tries-- > 0) { in snd_nm256_ac97_write()
1252 chip->ac97_regs[idx] = val; in snd_nm256_ac97_write()
1256 dev_dbg(chip->card->dev, "nm256: ac97 codec not ready..\n"); in snd_nm256_ac97_write()
1280 struct nm256 *chip = ac97->private_data; in snd_nm256_ac97_reset()
1284 if (! chip->reset_workaround) { in snd_nm256_ac97_reset()
1285 /* Dell latitude LS will lock up by this */ in snd_nm256_ac97_reset()
1288 if (! chip->reset_workaround_2) { in snd_nm256_ac97_reset()
1293 if (! chip->in_resume) { in snd_nm256_ac97_reset()
1318 chip->ac97_regs = kcalloc(ARRAY_SIZE(nm256_ac97_init_val), in snd_nm256_mixer()
1320 if (! chip->ac97_regs) in snd_nm256_mixer()
1321 return -ENOMEM; in snd_nm256_mixer()
1323 if ((err = snd_ac97_bus(chip->card, 0, &ops, NULL, &pbus)) < 0) in snd_nm256_mixer()
1327 ac97.scaps = AC97_SCAP_AUDIO; /* we support audio! */ in snd_nm256_mixer()
1330 pbus->no_vra = 1; in snd_nm256_mixer()
1331 err = snd_ac97_mixer(pbus, &ac97, &chip->ac97); in snd_nm256_mixer()
1334 if (! (chip->ac97->id & (0xf0000000))) { in snd_nm256_mixer()
1336 sprintf(chip->card->mixername, "%s AC97", chip->card->driver); in snd_nm256_mixer()
1343 * the associated address as the end of our audio buffer in the video
1353 unsigned long pointer_found = chip->buffer_end - 0x1400; in snd_nm256_peek_for_sig()
1356 temp = ioremap(chip->buffer_addr + chip->buffer_end - 0x400, 16); in snd_nm256_peek_for_sig()
1358 dev_err(chip->card->dev, in snd_nm256_peek_for_sig()
1359 "Unable to scan for card signature in video RAM\n"); in snd_nm256_peek_for_sig()
1360 return -EBUSY; in snd_nm256_peek_for_sig()
1371 pointer < chip->buffer_size || in snd_nm256_peek_for_sig()
1372 pointer > chip->buffer_end) { in snd_nm256_peek_for_sig()
1373 dev_err(chip->card->dev, in snd_nm256_peek_for_sig()
1376 return -ENODEV; in snd_nm256_peek_for_sig()
1379 dev_info(chip->card->dev, in snd_nm256_peek_for_sig()
1380 "found card signature in video RAM: 0x%x\n", in snd_nm256_peek_for_sig()
1386 chip->buffer_end = pointer_found; in snd_nm256_peek_for_sig()
1393 * APM event handler, so the card is properly reinitialized after a power
1398 struct snd_card *card = dev_get_drvdata(dev); in nm256_suspend() local
1399 struct nm256 *chip = card->private_data; in nm256_suspend()
1401 snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); in nm256_suspend()
1402 snd_ac97_suspend(chip->ac97); in nm256_suspend()
1403 chip->coeffs_current = 0; in nm256_suspend()
1409 struct snd_card *card = dev_get_drvdata(dev); in nm256_resume() local
1410 struct nm256 *chip = card->private_data; in nm256_resume()
1414 chip->in_resume = 1; in nm256_resume()
1419 snd_ac97_resume(chip->ac97); in nm256_resume()
1422 struct nm256_stream *s = &chip->streams[i]; in nm256_resume()
1423 if (s->substream && s->suspended) { in nm256_resume()
1424 spin_lock_irq(&chip->reg_lock); in nm256_resume()
1425 snd_nm256_set_format(chip, s, s->substream); in nm256_resume()
1426 spin_unlock_irq(&chip->reg_lock); in nm256_resume()
1430 snd_power_change_state(card, SNDRV_CTL_POWER_D0); in nm256_resume()
1431 chip->in_resume = 0; in nm256_resume()
1443 if (chip->streams[SNDRV_PCM_STREAM_PLAYBACK].running) in snd_nm256_free()
1445 if (chip->streams[SNDRV_PCM_STREAM_CAPTURE].running) in snd_nm256_free()
1448 if (chip->irq >= 0) in snd_nm256_free()
1449 free_irq(chip->irq, chip); in snd_nm256_free()
1451 iounmap(chip->cport); in snd_nm256_free()
1452 iounmap(chip->buffer); in snd_nm256_free()
1453 release_and_free_resource(chip->res_cport); in snd_nm256_free()
1454 release_and_free_resource(chip->res_buffer); in snd_nm256_free()
1456 pci_disable_device(chip->pci); in snd_nm256_free()
1457 kfree(chip->ac97_regs); in snd_nm256_free()
1464 struct nm256 *chip = device->device_data; in snd_nm256_dev_free()
1469 snd_nm256_create(struct snd_card *card, struct pci_dev *pci, in snd_nm256_create() argument
1487 return -ENOMEM; in snd_nm256_create()
1490 chip->card = card; in snd_nm256_create()
1491 chip->pci = pci; in snd_nm256_create()
1492 chip->use_cache = use_cache; in snd_nm256_create()
1493 spin_lock_init(&chip->reg_lock); in snd_nm256_create()
1494 chip->irq = -1; in snd_nm256_create()
1495 mutex_init(&chip->irq_mutex); in snd_nm256_create()
1498 chip->streams[SNDRV_PCM_STREAM_PLAYBACK].bufsize = playback_bufsize * 1024; in snd_nm256_create()
1499 chip->streams[SNDRV_PCM_STREAM_CAPTURE].bufsize = capture_bufsize * 1024; in snd_nm256_create()
1508 chip->buffer_addr = pci_resource_start(pci, 0); in snd_nm256_create()
1509 chip->cport_addr = pci_resource_start(pci, 1); in snd_nm256_create()
1513 chip->res_cport = request_mem_region(chip->cport_addr, NM_PORT2_SIZE, in snd_nm256_create()
1514 card->driver); in snd_nm256_create()
1515 if (chip->res_cport == NULL) { in snd_nm256_create()
1516 dev_err(card->dev, "memory region 0x%lx (size 0x%x) busy\n", in snd_nm256_create()
1517 chip->cport_addr, NM_PORT2_SIZE); in snd_nm256_create()
1518 err = -EBUSY; in snd_nm256_create()
1521 chip->cport = ioremap(chip->cport_addr, NM_PORT2_SIZE); in snd_nm256_create()
1522 if (chip->cport == NULL) { in snd_nm256_create()
1523 dev_err(card->dev, "unable to map control port %lx\n", in snd_nm256_create()
1524 chip->cport_addr); in snd_nm256_create()
1525 err = -ENOMEM; in snd_nm256_create()
1529 if (!strcmp(card->driver, "NM256AV")) { in snd_nm256_create()
1530 /* Ok, try to see if this is a non-AC97 version of the hardware. */ in snd_nm256_create()
1534 dev_err(card->dev, in snd_nm256_create()
1536 dev_err(card->dev, in snd_nm256_create()
1538 dev_err(card->dev, in snd_nm256_create()
1540 dev_err(card->dev, in snd_nm256_create()
1542 err = -ENXIO; in snd_nm256_create()
1546 chip->buffer_end = 2560 * 1024; in snd_nm256_create()
1547 chip->interrupt = snd_nm256_interrupt; in snd_nm256_create()
1548 chip->mixer_status_offset = NM_MIXER_STATUS_OFFSET; in snd_nm256_create()
1549 chip->mixer_status_mask = NM_MIXER_READY_MASK; in snd_nm256_create()
1553 chip->buffer_end = 6144 * 1024; in snd_nm256_create()
1555 chip->buffer_end = 4096 * 1024; in snd_nm256_create()
1557 chip->interrupt = snd_nm256_interrupt_zx; in snd_nm256_create()
1558 chip->mixer_status_offset = NM2_MIXER_STATUS_OFFSET; in snd_nm256_create()
1559 chip->mixer_status_mask = NM2_MIXER_READY_MASK; in snd_nm256_create()
1562 chip->buffer_size = chip->streams[SNDRV_PCM_STREAM_PLAYBACK].bufsize + in snd_nm256_create()
1563 chip->streams[SNDRV_PCM_STREAM_CAPTURE].bufsize; in snd_nm256_create()
1564 if (chip->use_cache) in snd_nm256_create()
1565 chip->buffer_size += NM_TOTAL_COEFF_COUNT * 4; in snd_nm256_create()
1567 chip->buffer_size += NM_MAX_PLAYBACK_COEF_SIZE + NM_MAX_RECORD_COEF_SIZE; in snd_nm256_create()
1569 if (buffer_top >= chip->buffer_size && buffer_top < chip->buffer_end) in snd_nm256_create()
1570 chip->buffer_end = buffer_top; in snd_nm256_create()
1577 chip->buffer_start = chip->buffer_end - chip->buffer_size; in snd_nm256_create()
1578 chip->buffer_addr += chip->buffer_start; in snd_nm256_create()
1580 dev_info(card->dev, "Mapping port 1 from 0x%x - 0x%x\n", in snd_nm256_create()
1581 chip->buffer_start, chip->buffer_end); in snd_nm256_create()
1583 chip->res_buffer = request_mem_region(chip->buffer_addr, in snd_nm256_create()
1584 chip->buffer_size, in snd_nm256_create()
1585 card->driver); in snd_nm256_create()
1586 if (chip->res_buffer == NULL) { in snd_nm256_create()
1587 dev_err(card->dev, "buffer 0x%lx (size 0x%x) busy\n", in snd_nm256_create()
1588 chip->buffer_addr, chip->buffer_size); in snd_nm256_create()
1589 err = -EBUSY; in snd_nm256_create()
1592 chip->buffer = ioremap(chip->buffer_addr, chip->buffer_size); in snd_nm256_create()
1593 if (chip->buffer == NULL) { in snd_nm256_create()
1594 err = -ENOMEM; in snd_nm256_create()
1595 dev_err(card->dev, "unable to map ring buffer at %lx\n", in snd_nm256_create()
1596 chip->buffer_addr); in snd_nm256_create()
1601 addr = chip->buffer_start; in snd_nm256_create()
1602 chip->streams[SNDRV_PCM_STREAM_PLAYBACK].buf = addr; in snd_nm256_create()
1603 addr += chip->streams[SNDRV_PCM_STREAM_PLAYBACK].bufsize; in snd_nm256_create()
1604 chip->streams[SNDRV_PCM_STREAM_CAPTURE].buf = addr; in snd_nm256_create()
1605 addr += chip->streams[SNDRV_PCM_STREAM_CAPTURE].bufsize; in snd_nm256_create()
1606 if (chip->use_cache) { in snd_nm256_create()
1607 chip->all_coeff_buf = addr; in snd_nm256_create()
1609 chip->coeff_buf[SNDRV_PCM_STREAM_PLAYBACK] = addr; in snd_nm256_create()
1611 chip->coeff_buf[SNDRV_PCM_STREAM_CAPTURE] = addr; in snd_nm256_create()
1615 chip->mixer_base = NM_MIXER_OFFSET; in snd_nm256_create()
1617 chip->coeffs_current = 0; in snd_nm256_create()
1623 if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) in snd_nm256_create()
1640 /* Reset workarounds to avoid lock-ups */
1641 SND_PCI_QUIRK(0x104d, 0x8041, "Sony PCG-F305", NM_RESET_WORKAROUND),
1642 SND_PCI_QUIRK(0x1028, 0x0080, "Dell Latitude LS", NM_RESET_WORKAROUND),
1651 struct snd_card *card; in snd_nm256_probe() local
1658 dev_dbg(&pci->dev, "Enabled quirk for %s.\n", in snd_nm256_probe()
1660 switch (q->value) { in snd_nm256_probe()
1662 dev_info(&pci->dev, in snd_nm256_probe()
1664 return -ENODEV; in snd_nm256_probe()
1674 err = snd_card_new(&pci->dev, index, id, THIS_MODULE, 0, &card); in snd_nm256_probe()
1678 switch (pci->device) { in snd_nm256_probe()
1680 strcpy(card->driver, "NM256AV"); in snd_nm256_probe()
1683 strcpy(card->driver, "NM256ZX"); in snd_nm256_probe()
1686 strcpy(card->driver, "NM256XL+"); in snd_nm256_probe()
1689 dev_err(&pci->dev, "invalid device id 0x%x\n", pci->device); in snd_nm256_probe()
1690 snd_card_free(card); in snd_nm256_probe()
1691 return -EINVAL; in snd_nm256_probe()
1705 if ((err = snd_nm256_create(card, pci, &chip)) < 0) { in snd_nm256_probe()
1706 snd_card_free(card); in snd_nm256_probe()
1709 card->private_data = chip; in snd_nm256_probe()
1712 dev_dbg(&pci->dev, "reset_workaround activated\n"); in snd_nm256_probe()
1713 chip->reset_workaround = 1; in snd_nm256_probe()
1717 dev_dbg(&pci->dev, "reset_workaround_2 activated\n"); in snd_nm256_probe()
1718 chip->reset_workaround_2 = 1; in snd_nm256_probe()
1723 snd_card_free(card); in snd_nm256_probe()
1727 sprintf(card->shortname, "NeoMagic %s", card->driver); in snd_nm256_probe()
1728 sprintf(card->longname, "%s at 0x%lx & 0x%lx, irq %d", in snd_nm256_probe()
1729 card->shortname, in snd_nm256_probe()
1730 chip->buffer_addr, chip->cport_addr, chip->irq); in snd_nm256_probe()
1732 if ((err = snd_card_register(card)) < 0) { in snd_nm256_probe()
1733 snd_card_free(card); in snd_nm256_probe()
1737 pci_set_drvdata(pci, card); in snd_nm256_probe()