ALSA: 6fire: make buffers DMA-able (midi)
Patch makes midi output buffer DMA-able by allocating it separately. Signed-off-by: Torsten Schenk <torsten.schenk@zoho.com> Cc: <stable@vger.kernel.org> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
5ece263f1d
commit
4c2aee0032
|
@ -19,6 +19,10 @@
|
||||||
#include "chip.h"
|
#include "chip.h"
|
||||||
#include "comm.h"
|
#include "comm.h"
|
||||||
|
|
||||||
|
enum {
|
||||||
|
MIDI_BUFSIZE = 64
|
||||||
|
};
|
||||||
|
|
||||||
static void usb6fire_midi_out_handler(struct urb *urb)
|
static void usb6fire_midi_out_handler(struct urb *urb)
|
||||||
{
|
{
|
||||||
struct midi_runtime *rt = urb->context;
|
struct midi_runtime *rt = urb->context;
|
||||||
|
@ -156,6 +160,12 @@ int usb6fire_midi_init(struct sfire_chip *chip)
|
||||||
if (!rt)
|
if (!rt)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
rt->out_buffer = kzalloc(MIDI_BUFSIZE, GFP_KERNEL);
|
||||||
|
if (!rt->out_buffer) {
|
||||||
|
kfree(rt);
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
rt->chip = chip;
|
rt->chip = chip;
|
||||||
rt->in_received = usb6fire_midi_in_received;
|
rt->in_received = usb6fire_midi_in_received;
|
||||||
rt->out_buffer[0] = 0x80; /* 'send midi' command */
|
rt->out_buffer[0] = 0x80; /* 'send midi' command */
|
||||||
|
@ -169,6 +179,7 @@ int usb6fire_midi_init(struct sfire_chip *chip)
|
||||||
|
|
||||||
ret = snd_rawmidi_new(chip->card, "6FireUSB", 0, 1, 1, &rt->instance);
|
ret = snd_rawmidi_new(chip->card, "6FireUSB", 0, 1, 1, &rt->instance);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
kfree(rt->out_buffer);
|
||||||
kfree(rt);
|
kfree(rt);
|
||||||
snd_printk(KERN_ERR PREFIX "unable to create midi.\n");
|
snd_printk(KERN_ERR PREFIX "unable to create midi.\n");
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -197,6 +208,9 @@ void usb6fire_midi_abort(struct sfire_chip *chip)
|
||||||
|
|
||||||
void usb6fire_midi_destroy(struct sfire_chip *chip)
|
void usb6fire_midi_destroy(struct sfire_chip *chip)
|
||||||
{
|
{
|
||||||
kfree(chip->midi);
|
struct midi_runtime *rt = chip->midi;
|
||||||
|
|
||||||
|
kfree(rt->out_buffer);
|
||||||
|
kfree(rt);
|
||||||
chip->midi = NULL;
|
chip->midi = NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,10 +16,6 @@
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
enum {
|
|
||||||
MIDI_BUFSIZE = 64
|
|
||||||
};
|
|
||||||
|
|
||||||
struct midi_runtime {
|
struct midi_runtime {
|
||||||
struct sfire_chip *chip;
|
struct sfire_chip *chip;
|
||||||
struct snd_rawmidi *instance;
|
struct snd_rawmidi *instance;
|
||||||
|
@ -32,7 +28,7 @@ struct midi_runtime {
|
||||||
struct snd_rawmidi_substream *out;
|
struct snd_rawmidi_substream *out;
|
||||||
struct urb out_urb;
|
struct urb out_urb;
|
||||||
u8 out_serial; /* serial number of out packet */
|
u8 out_serial; /* serial number of out packet */
|
||||||
u8 out_buffer[MIDI_BUFSIZE];
|
u8 *out_buffer;
|
||||||
int buffer_offset;
|
int buffer_offset;
|
||||||
|
|
||||||
void (*in_received)(struct midi_runtime *rt, u8 *data, int length);
|
void (*in_received)(struct midi_runtime *rt, u8 *data, int length);
|
||||||
|
|
Loading…
Reference in New Issue