Skip to content

Commit

Permalink
ALSA: 6fire: make buffers DMA-able (pcm)
Browse files Browse the repository at this point in the history
Patch makes pcm buffers DMA-able by allocating each one separately.

Signed-off-by: Torsten Schenk <torsten.schenk@zoho.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
  • Loading branch information
Torsten Schenk authored and Takashi Iwai committed Aug 12, 2013
1 parent db8a38e commit 5ece263
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 2 deletions.
41 changes: 40 additions & 1 deletion sound/usb/6fire/pcm.c
Original file line number Diff line number Diff line change
Expand Up @@ -582,6 +582,33 @@ static void usb6fire_pcm_init_urb(struct pcm_urb *urb,
urb->instance.number_of_packets = PCM_N_PACKETS_PER_URB;
}

static int usb6fire_pcm_buffers_init(struct pcm_runtime *rt)
{
int i;

for (i = 0; i < PCM_N_URBS; i++) {
rt->out_urbs[i].buffer = kzalloc(PCM_N_PACKETS_PER_URB
* PCM_MAX_PACKET_SIZE, GFP_KERNEL);
if (!rt->out_urbs[i].buffer)
return -ENOMEM;
rt->in_urbs[i].buffer = kzalloc(PCM_N_PACKETS_PER_URB
* PCM_MAX_PACKET_SIZE, GFP_KERNEL);
if (!rt->in_urbs[i].buffer)
return -ENOMEM;
}
return 0;
}

static void usb6fire_pcm_buffers_destroy(struct pcm_runtime *rt)
{
int i;

for (i = 0; i < PCM_N_URBS; i++) {
kfree(rt->out_urbs[i].buffer);
kfree(rt->in_urbs[i].buffer);
}
}

int usb6fire_pcm_init(struct sfire_chip *chip)
{
int i;
Expand All @@ -593,6 +620,13 @@ int usb6fire_pcm_init(struct sfire_chip *chip)
if (!rt)
return -ENOMEM;

ret = usb6fire_pcm_buffers_init(rt);
if (ret) {
usb6fire_pcm_buffers_destroy(rt);
kfree(rt);
return ret;
}

rt->chip = chip;
rt->stream_state = STREAM_DISABLED;
rt->rate = ARRAY_SIZE(rates);
Expand All @@ -614,6 +648,7 @@ int usb6fire_pcm_init(struct sfire_chip *chip)

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

if (ret) {
usb6fire_pcm_buffers_destroy(rt);
kfree(rt);
snd_printk(KERN_ERR PREFIX
"error preallocating pcm buffers.\n");
Expand Down Expand Up @@ -669,6 +705,9 @@ void usb6fire_pcm_abort(struct sfire_chip *chip)

void usb6fire_pcm_destroy(struct sfire_chip *chip)
{
kfree(chip->pcm);
struct pcm_runtime *rt = chip->pcm;

usb6fire_pcm_buffers_destroy(rt);
kfree(rt);
chip->pcm = NULL;
}
2 changes: 1 addition & 1 deletion sound/usb/6fire/pcm.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ struct pcm_urb {
struct urb instance;
struct usb_iso_packet_descriptor packets[PCM_N_PACKETS_PER_URB];
/* END DO NOT SEPARATE */
u8 buffer[PCM_N_PACKETS_PER_URB * PCM_MAX_PACKET_SIZE];
u8 *buffer;

struct pcm_urb *peer;
};
Expand Down

0 comments on commit 5ece263

Please sign in to comment.