sound/pci/aw2/aw2-alsa.c

Source file repositories/reference/linux-study-clean/sound/pci/aw2/aw2-alsa.c

File Facts

System
Linux kernel
Corpus path
sound/pci/aw2/aw2-alsa.c
Extension
.c
Size
18241 bytes
Lines
640
Domain
Driver Families
Bucket
sound/pci
Inferred role
Driver Families: operation-table or driver-model contract
Status
pattern implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

static struct pci_driver aw2_driver = {
	.name = KBUILD_MODNAME,
	.id_table = snd_aw2_ids,
	.probe = snd_aw2_probe,
};

module_pci_driver(aw2_driver);

/* operators for playback PCM alsa interface */
static const struct snd_pcm_ops snd_aw2_playback_ops = {
	.open = snd_aw2_pcm_playback_open,
	.close = snd_aw2_pcm_playback_close,
	.prepare = snd_aw2_pcm_prepare_playback,
	.trigger = snd_aw2_pcm_trigger_playback,
	.pointer = snd_aw2_pcm_pointer_playback,
};

/* operators for capture PCM alsa interface */
static const struct snd_pcm_ops snd_aw2_capture_ops = {
	.open = snd_aw2_pcm_capture_open,
	.close = snd_aw2_pcm_capture_close,
	.prepare = snd_aw2_pcm_prepare_capture,
	.trigger = snd_aw2_pcm_trigger_capture,
	.pointer = snd_aw2_pcm_pointer_capture,
};

static const struct snd_kcontrol_new aw2_control = {
	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
	.name = "PCM Capture Route",
	.index = 0,
	.access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
	.private_value = 0xffff,
	.info = snd_aw2_control_switch_capture_info,
	.get = snd_aw2_control_switch_capture_get,
	.put = snd_aw2_control_switch_capture_put
};

/*********************************
 * FUNCTION IMPLEMENTATIONS
 ********************************/

/* component-destructor */
static void snd_aw2_free(struct snd_card *card)
{
	struct aw2 *chip = card->private_data;

	/* Free hardware */
	snd_aw2_saa7146_free(&chip->saa7146);
}

/* chip-specific constructor */
static int snd_aw2_create(struct snd_card *card,
			  struct pci_dev *pci)
{
	struct aw2 *chip = card->private_data;
	int err;

	/* initialize the PCI entry */
	err = pcim_enable_device(pci);
	if (err < 0)
		return err;
	pci_set_master(pci);

	/* check PCI availability (32bit DMA) */
	if (dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(32))) {
		dev_err(card->dev, "Impossible to set 32bit mask DMA\n");
		return -ENXIO;
	}

	/* initialize the stuff */
	chip->card = card;
	chip->pci = pci;
	chip->irq = -1;

	/* (1) PCI resource allocation */
	chip->iobase_virt = pcim_iomap_region(pci, 0, "Audiowerk2");
	if (IS_ERR(chip->iobase_virt))
		return PTR_ERR(chip->iobase_virt);
	chip->iobase_phys = pci_resource_start(pci, 0);

	/* (2) initialization of the chip hardware */
	snd_aw2_saa7146_setup(&chip->saa7146, chip->iobase_virt);

	if (devm_request_irq(&pci->dev, pci->irq, snd_aw2_saa7146_interrupt,
			     IRQF_SHARED, KBUILD_MODNAME, chip)) {
		dev_err(card->dev, "Cannot grab irq %d\n", pci->irq);
		return -EBUSY;
	}
	chip->irq = pci->irq;
	card->sync_irq = chip->irq;

Annotation

Implementation Notes