Changeset 717 for GPL/trunk/alsa-kernel/pci/trident
- Timestamp:
- Aug 7, 2022, 6:11:12 PM (3 years ago)
- Location:
- GPL/trunk
- Files:
-
- 5 edited
-
. (modified) (1 prop)
-
alsa-kernel/pci/trident/trident.c (modified) (5 diffs)
-
alsa-kernel/pci/trident/trident.h (modified) (2 diffs)
-
alsa-kernel/pci/trident/trident_main.c (modified) (13 diffs)
-
alsa-kernel/pci/trident/trident_memory.c (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
GPL/trunk
- Property svn:mergeinfo changed
/GPL/branches/uniaud32-next merged: 710-716
- Property svn:mergeinfo changed
-
GPL/trunk/alsa-kernel/pci/trident/trident.c
r703 r717 72 72 } 73 73 74 err = snd_ card_new(&pci->dev, index[dev], id[dev], THIS_MODULE,75 0, &card);74 err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, 75 sizeof(*trident), &card); 76 76 if (err < 0) 77 77 return err; 78 trident = card->private_data; 78 79 79 80 err = snd_trident_create(card, pci, 80 81 pcm_channels[dev], 81 82 ((pci->vendor << 16) | pci->device) == TRIDENT_DEVICE_ID_SI7018 ? 1 : 2, 82 wavetable_size[dev], 83 &trident); 84 if (err < 0) { 85 snd_card_free(card); 83 wavetable_size[dev]); 84 if (err < 0) 86 85 return err; 87 }88 card->private_data = trident;89 86 90 87 switch (trident->device) { … … 112 109 113 110 err = snd_trident_pcm(trident, pcm_dev++); 114 if (err < 0) { 115 snd_card_free(card); 111 if (err < 0) 116 112 return err; 117 }118 113 switch (trident->device) { 119 114 case TRIDENT_DEVICE_ID_DX: 120 115 case TRIDENT_DEVICE_ID_NX: 121 116 err = snd_trident_foldback_pcm(trident, pcm_dev++); 122 if (err < 0) { 123 snd_card_free(card); 117 if (err < 0) 124 118 return err; 125 }126 119 break; 127 120 } 128 121 if (trident->device == TRIDENT_DEVICE_ID_NX || trident->device == TRIDENT_DEVICE_ID_SI7018) { 129 122 err = snd_trident_spdif_pcm(trident, pcm_dev++); 130 if (err < 0) { 131 snd_card_free(card); 123 if (err < 0) 132 124 return err; 133 }134 125 } 135 126 if (trident->device != TRIDENT_DEVICE_ID_SI7018) { … … 139 130 MPU401_INFO_IRQ_HOOK, 140 131 -1, &trident->rmidi); 141 if (err < 0) { 142 snd_card_free(card); 132 if (err < 0) 143 133 return err; 144 }145 134 } 146 135 … … 148 137 149 138 err = snd_card_register(card); 150 if (err < 0) { 151 snd_card_free(card); 139 if (err < 0) 152 140 return err; 153 }154 141 pci_set_drvdata(pci, card); 155 142 dev++; 156 143 return 0; 157 }158 159 static void snd_trident_remove(struct pci_dev *pci)160 {161 snd_card_free(pci_get_drvdata(pci));162 144 } 163 145 … … 166 148 .id_table = snd_trident_ids, 167 149 .probe = snd_trident_probe, 168 .remove = snd_trident_remove,169 150 #ifdef CONFIG_PM_SLEEP 170 151 .driver = { -
GPL/trunk/alsa-kernel/pci/trident/trident.h
r703 r717 252 252 __le32 *entries; /* 16k-aligned TLB table */ 253 253 dma_addr_t entries_dmaaddr; /* 16k-aligned PCI address to TLB table */ 254 struct snd_dma_buffer buffer;254 struct snd_dma_buffer *buffer; 255 255 struct snd_util_memhdr * memhdr; /* page allocation list */ 256 struct snd_dma_buffer silent_page;256 struct snd_dma_buffer *silent_page; 257 257 }; 258 258 … … 401 401 int pcm_streams, 402 402 int pcm_spdif_device, 403 int max_wavetable_size, 404 struct snd_trident ** rtrident); 403 int max_wavetable_size); 405 404 int snd_trident_create_gameport(struct snd_trident *trident); 406 405 -
GPL/trunk/alsa-kernel/pci/trident/trident_main.c
r703 r717 47 47 static void snd_trident_clear_voices(struct snd_trident * trident, 48 48 unsigned short v_min, unsigned short v_max); 49 static int snd_trident_free(struct snd_trident *trident);49 static void snd_trident_free(struct snd_card *card); 50 50 51 51 /* … … 3312 3312 } 3313 3313 3314 static int snd_trident_dev_free(struct snd_device *device)3315 {3316 struct snd_trident *trident = device->device_data;3317 return snd_trident_free(trident);3318 }3319 3320 3314 /*--------------------------------------------------------------------------- 3321 3315 snd_trident_tlb_alloc … … 3337 3331 32kB region and correct offset when necessary */ 3338 3332 3339 if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, &trident->pci->dev, 3340 2 * SNDRV_TRIDENT_MAX_PAGES * 4, &trident->tlb.buffer) < 0) { 3333 trident->tlb.buffer = 3334 snd_devm_alloc_pages(&trident->pci->dev, SNDRV_DMA_TYPE_DEV, 3335 2 * SNDRV_TRIDENT_MAX_PAGES * 4); 3336 if (!trident->tlb.buffer) { 3341 3337 dev_err(trident->card->dev, "unable to allocate TLB buffer\n"); 3342 3338 return -ENOMEM; 3343 3339 } 3344 trident->tlb.entries = (__le32 *)ALIGN((unsigned long)trident->tlb.buffer .area, SNDRV_TRIDENT_MAX_PAGES * 4);3345 trident->tlb.entries_dmaaddr = ALIGN(trident->tlb.buffer .addr, SNDRV_TRIDENT_MAX_PAGES * 4);3340 trident->tlb.entries = (__le32 *)ALIGN((unsigned long)trident->tlb.buffer->area, SNDRV_TRIDENT_MAX_PAGES * 4); 3341 trident->tlb.entries_dmaaddr = ALIGN(trident->tlb.buffer->addr, SNDRV_TRIDENT_MAX_PAGES * 4); 3346 3342 3347 3343 /* allocate and setup silent page and initialise TLB entries */ 3348 if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, &trident->pci->dev, 3349 SNDRV_TRIDENT_PAGE_SIZE, &trident->tlb.silent_page) < 0) { 3344 trident->tlb.silent_page = 3345 snd_devm_alloc_pages(&trident->pci->dev, SNDRV_DMA_TYPE_DEV, 3346 SNDRV_TRIDENT_PAGE_SIZE); 3347 if (!trident->tlb.silent_page) { 3350 3348 dev_err(trident->card->dev, "unable to allocate silent page\n"); 3351 3349 return -ENOMEM; 3352 3350 } 3353 memset(trident->tlb.silent_page .area, 0, SNDRV_TRIDENT_PAGE_SIZE);3351 memset(trident->tlb.silent_page->area, 0, SNDRV_TRIDENT_PAGE_SIZE); 3354 3352 for (i = 0; i < SNDRV_TRIDENT_MAX_PAGES; i++) 3355 trident->tlb.entries[i] = cpu_to_le32(trident->tlb.silent_page .addr & ~(SNDRV_TRIDENT_PAGE_SIZE-1));3353 trident->tlb.entries[i] = cpu_to_le32(trident->tlb.silent_page->addr & ~(SNDRV_TRIDENT_PAGE_SIZE-1)); 3356 3354 3357 3355 /* use emu memory block manager code to manage tlb page allocation */ … … 3510 3508 int pcm_streams, 3511 3509 int pcm_spdif_device, 3512 int max_wavetable_size, 3513 struct snd_trident ** rtrident) 3514 { 3515 struct snd_trident *trident; 3510 int max_wavetable_size) 3511 { 3512 struct snd_trident *trident = card->private_data; 3516 3513 int i, err; 3517 3514 struct snd_trident_voice *voice; 3518 3515 struct snd_trident_pcm_mixer *tmix; 3519 static const struct snd_device_ops ops = {3520 .dev_free = snd_trident_dev_free,3521 };3522 3523 *rtrident = NULL;3524 3516 3525 3517 /* enable PCI device */ 3526 err = pci _enable_device(pci);3518 err = pcim_enable_device(pci); 3527 3519 if (err < 0) 3528 3520 return err; … … 3531 3523 dev_err(card->dev, 3532 3524 "architecture does not support 30bit PCI busmaster DMA\n"); 3533 pci_disable_device(pci);3534 3525 return -ENXIO; 3535 3526 } 3536 3527 3537 trident = kzalloc(sizeof(*trident), GFP_KERNEL);3538 if (trident == NULL) {3539 pci_disable_device(pci);3540 return -ENOMEM;3541 }3542 3528 trident->device = (pci->vendor << 16) | pci->device; 3543 3529 trident->card = card; … … 3555 3541 trident->synth.max_size = max_wavetable_size * 1024; 3556 3542 trident->irq = -1; 3543 card->private_free = snd_trident_free; 3557 3544 3558 3545 trident->midi_port = TRID_REG(trident, T4D_MPU401_BASE); … … 3560 3547 3561 3548 err = pci_request_regions(pci, "Trident Audio"); 3562 if (err < 0) { 3563 kfree(trident); 3564 pci_disable_device(pci); 3549 if (err < 0) 3565 3550 return err; 3566 }3567 3551 trident->port = pci_resource_start(pci, 0); 3568 3552 3569 if ( request_irq(pci->irq, snd_trident_interrupt, IRQF_SHARED,3570 KBUILD_MODNAME, trident)) {3553 if (devm_request_irq(&pci->dev, pci->irq, snd_trident_interrupt, 3554 IRQF_SHARED, KBUILD_MODNAME, trident)) { 3571 3555 dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq); 3572 snd_trident_free(trident);3573 3556 return -EBUSY; 3574 3557 } … … 3578 3561 /* allocate 16k-aligned TLB for NX cards */ 3579 3562 trident->tlb.entries = NULL; 3580 trident->tlb.buffer.area = NULL;3581 3563 if (trident->device == TRIDENT_DEVICE_ID_NX) { 3582 3564 err = snd_trident_tlb_alloc(trident); 3583 if (err < 0) { 3584 snd_trident_free(trident); 3565 if (err < 0) 3585 3566 return err; 3586 }3587 3567 } 3588 3568 … … 3604 3584 break; 3605 3585 } 3606 if (err < 0) { 3607 snd_trident_free(trident); 3586 if (err < 0) 3608 3587 return err; 3609 }3610 3611 err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, trident, &ops);3612 if (err < 0) {3613 snd_trident_free(trident);3614 return err;3615 }3616 3588 3617 3589 err = snd_trident_mixer(trident, pcm_spdif_device); … … 3637 3609 3638 3610 snd_trident_proc_init(trident); 3639 *rtrident = trident;3640 3611 return 0; 3641 3612 } … … 3647 3618 the 4DWave card. 3648 3619 3649 Parameters: trident - device specific private data for 4DWave card3620 Parameters: card - card to release 3650 3621 3651 3622 Returns: None. … … 3653 3624 ---------------------------------------------------------------------------*/ 3654 3625 3655 static int snd_trident_free(struct snd_trident *trident) 3656 { 3626 static void snd_trident_free(struct snd_card *card) 3627 { 3628 struct snd_trident *trident = card->private_data; 3629 3657 3630 snd_trident_free_gameport(trident); 3658 3631 snd_trident_disable_eso(trident); … … 3663 3636 outl(0, TRID_REG(trident, SI_SERIAL_INTF_CTRL)); 3664 3637 } 3665 if (trident->irq >= 0) 3666 free_irq(trident->irq, trident); 3667 if (trident->tlb.buffer.area) { 3638 if (trident->tlb.buffer) { 3668 3639 outl(0, TRID_REG(trident, NX_TLBC)); 3669 3640 snd_util_memhdr_free(trident->tlb.memhdr); 3670 if (trident->tlb.silent_page.area) 3671 snd_dma_free_pages(&trident->tlb.silent_page); 3672 snd_dma_free_pages(&trident->tlb.buffer); 3673 } 3674 pci_release_regions(trident->pci); 3675 pci_disable_device(trident->pci); 3676 kfree(trident); 3677 return 0; 3641 } 3678 3642 } 3679 3643 -
GPL/trunk/alsa-kernel/pci/trident/trident_memory.c
r703 r717 32 32 #define set_tlb_bus(trident,page,addr) __set_tlb_bus(trident,page,addr) 33 33 /* fill TLB entrie(s) corresponding to page with silence pointer */ 34 #define set_silent_tlb(trident,page) __set_tlb_bus(trident, page, trident->tlb.silent_page .addr)34 #define set_silent_tlb(trident,page) __set_tlb_bus(trident, page, trident->tlb.silent_page->addr) 35 35 /* get aligned page from offset address */ 36 36 #define get_aligned_page(offset) ((offset) >> 12) … … 59 59 { 60 60 page <<= 1; 61 __set_tlb_bus(trident, page, trident->tlb.silent_page .addr);62 __set_tlb_bus(trident, page+1, trident->tlb.silent_page .addr);61 __set_tlb_bus(trident, page, trident->tlb.silent_page->addr); 62 __set_tlb_bus(trident, page+1, trident->tlb.silent_page->addr); 63 63 } 64 64 … … 93 93 page *= UNIT_PAGES; 94 94 for (i = 0; i < UNIT_PAGES; i++, page++) 95 __set_tlb_bus(trident, page, trident->tlb.silent_page .addr);95 __set_tlb_bus(trident, page, trident->tlb.silent_page->addr); 96 96 } 97 97
Note:
See TracChangeset
for help on using the changeset viewer.
