Skip to content

Commit 5ece263

Browse files
Torsten Schenktiwai
authored andcommitted
ALSA: 6fire: make buffers DMA-able (pcm)
Patch makes pcm buffers DMA-able by allocating each one separately. Signed-off-by: Torsten Schenk <[email protected]> Cc: <[email protected]> Signed-off-by: Takashi Iwai <[email protected]>
1 parent db8a38e commit 5ece263

File tree

2 files changed

+41
-2
lines changed

2 files changed

+41
-2
lines changed

sound/usb/6fire/pcm.c

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -582,6 +582,33 @@ static void usb6fire_pcm_init_urb(struct pcm_urb *urb,
582582
urb->instance.number_of_packets = PCM_N_PACKETS_PER_URB;
583583
}
584584

585+
static int usb6fire_pcm_buffers_init(struct pcm_runtime *rt)
586+
{
587+
int i;
588+
589+
for (i = 0; i < PCM_N_URBS; i++) {
590+
rt->out_urbs[i].buffer = kzalloc(PCM_N_PACKETS_PER_URB
591+
* PCM_MAX_PACKET_SIZE, GFP_KERNEL);
592+
if (!rt->out_urbs[i].buffer)
593+
return -ENOMEM;
594+
rt->in_urbs[i].buffer = kzalloc(PCM_N_PACKETS_PER_URB
595+
* PCM_MAX_PACKET_SIZE, GFP_KERNEL);
596+
if (!rt->in_urbs[i].buffer)
597+
return -ENOMEM;
598+
}
599+
return 0;
600+
}
601+
602+
static void usb6fire_pcm_buffers_destroy(struct pcm_runtime *rt)
603+
{
604+
int i;
605+
606+
for (i = 0; i < PCM_N_URBS; i++) {
607+
kfree(rt->out_urbs[i].buffer);
608+
kfree(rt->in_urbs[i].buffer);
609+
}
610+
}
611+
585612
int usb6fire_pcm_init(struct sfire_chip *chip)
586613
{
587614
int i;
@@ -593,6 +620,13 @@ int usb6fire_pcm_init(struct sfire_chip *chip)
593620
if (!rt)
594621
return -ENOMEM;
595622

623+
ret = usb6fire_pcm_buffers_init(rt);
624+
if (ret) {
625+
usb6fire_pcm_buffers_destroy(rt);
626+
kfree(rt);
627+
return ret;
628+
}
629+
596630
rt->chip = chip;
597631
rt->stream_state = STREAM_DISABLED;
598632
rt->rate = ARRAY_SIZE(rates);
@@ -614,6 +648,7 @@ int usb6fire_pcm_init(struct sfire_chip *chip)
614648

615649
ret = snd_pcm_new(chip->card, "DMX6FireUSB", 0, 1, 1, &pcm);
616650
if (ret < 0) {
651+
usb6fire_pcm_buffers_destroy(rt);
617652
kfree(rt);
618653
snd_printk(KERN_ERR PREFIX "cannot create pcm instance.\n");
619654
return ret;
@@ -625,6 +660,7 @@ int usb6fire_pcm_init(struct sfire_chip *chip)
625660
snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &pcm_ops);
626661

627662
if (ret) {
663+
usb6fire_pcm_buffers_destroy(rt);
628664
kfree(rt);
629665
snd_printk(KERN_ERR PREFIX
630666
"error preallocating pcm buffers.\n");
@@ -669,6 +705,9 @@ void usb6fire_pcm_abort(struct sfire_chip *chip)
669705

670706
void usb6fire_pcm_destroy(struct sfire_chip *chip)
671707
{
672-
kfree(chip->pcm);
708+
struct pcm_runtime *rt = chip->pcm;
709+
710+
usb6fire_pcm_buffers_destroy(rt);
711+
kfree(rt);
673712
chip->pcm = NULL;
674713
}

sound/usb/6fire/pcm.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ struct pcm_urb {
3232
struct urb instance;
3333
struct usb_iso_packet_descriptor packets[PCM_N_PACKETS_PER_URB];
3434
/* END DO NOT SEPARATE */
35-
u8 buffer[PCM_N_PACKETS_PER_URB * PCM_MAX_PACKET_SIZE];
35+
u8 *buffer;
3636

3737
struct pcm_urb *peer;
3838
};

0 commit comments

Comments
 (0)