Samsung VZW MB1 update
/drivers/usb/gadget/f_audio_source.c
blob:23a75117124f1b2cd9c503a0951eda0d35b1746c -> blob:9b9931fffcc8560744248bbe7b65ead0b8e34a05
--- drivers/usb/gadget/f_audio_source.c
+++ drivers/usb/gadget/f_audio_source.c
@@ -22,11 +22,9 @@
#include <sound/pcm.h>
#define SAMPLE_RATE 44100
-/* Each frame is two 16 bit integers (one per channel) */
-#define BYTES_PER_FRAME 4
#define FRAMES_PER_MSEC (SAMPLE_RATE / 1000)
-#define IN_EP_MAX_PACKET_SIZE 256
+#define IN_EP_MAX_PACKET_SIZE 384
/* Number of requests to allocate */
#define IN_EP_REQ_COUNT 4
@@ -245,8 +243,7 @@ struct audio_dev {
struct list_head idle_reqs;
struct usb_ep *in_ep;
- struct usb_endpoint_descriptor *in_desc;
-
+ struct usb_endpoint_descriptor *in_desc;
spinlock_t lock;
/* beginning, end and current position in our buffer */
@@ -414,7 +411,7 @@ static void audio_data_complete(struct u
audio_req_put(audio, req);
- if (!audio->buffer_start)
+ if (!audio->buffer_start || req->status)
return;
audio->period_offset += req->actual;
@@ -622,7 +619,10 @@ audio_unbind(struct usb_configuration *c
audio_request_free(req, audio->in_ep);
snd_card_free_when_closed(audio->card);
- kfree(audio);
+ audio->card = NULL;
+ audio->pcm = NULL;
+ audio->substream = NULL;
+ audio->in_ep = NULL;
}
static void audio_pcm_playback_start(struct audio_dev *audio)
@@ -738,6 +738,22 @@ static int audio_pcm_playback_trigger(st
return ret;
}
+static struct audio_dev _audio_dev = {
+ .func = {
+ .name = "audio_source",
+ .bind = audio_bind,
+ .unbind = audio_unbind,
+ .set_alt = audio_set_alt,
+ .setup = audio_setup,
+ .disable = audio_disable,
+ .descriptors = fs_audio_desc,
+ .hs_descriptors = hs_audio_desc,
+ },
+ .in_desc = &fs_as_in_ep_desc,
+ .lock = __SPIN_LOCK_UNLOCKED(_audio_dev.lock),
+ .idle_reqs = LIST_HEAD_INIT(_audio_dev.idle_reqs),
+};
+
static struct snd_pcm_ops audio_playback_ops = {
.open = audio_pcm_open,
.close = audio_pcm_close,
@@ -760,27 +776,12 @@ int audio_source_bind_config(struct usb_
config->card = -1;
config->device = -1;
- audio = kzalloc(sizeof *audio, GFP_KERNEL);
- if (!audio)
- return -ENOMEM;
-
- audio->func.name = "audio_source";
-
- spin_lock_init(&audio->lock);
-
- audio->func.bind = audio_bind;
- audio->func.unbind = audio_unbind;
- audio->func.set_alt = audio_set_alt;
- audio->func.setup = audio_setup;
- audio->func.disable = audio_disable;
- audio->in_desc = &fs_as_in_ep_desc;
-
- INIT_LIST_HEAD(&audio->idle_reqs);
+ audio = &_audio_dev;
err = snd_card_create(SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1,
THIS_MODULE, 0, &card);
if (err)
- goto snd_card_fail;
+ return err;
snd_card_set_dev(card, &c->cdev->gadget->dev);
@@ -819,7 +820,5 @@ add_fail:
register_fail:
pcm_fail:
snd_card_free(audio->card);
-snd_card_fail:
- kfree(audio);
return err;
}