summaryrefslogtreecommitdiffstats
path: root/target/linux/brcm2708/patches-3.10/0061-Merge-pull-request-286-from-martinezjavier-rpi-3.6.y.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/brcm2708/patches-3.10/0061-Merge-pull-request-286-from-martinezjavier-rpi-3.6.y.patch')
-rw-r--r--target/linux/brcm2708/patches-3.10/0061-Merge-pull-request-286-from-martinezjavier-rpi-3.6.y.patch483
1 files changed, 0 insertions, 483 deletions
diff --git a/target/linux/brcm2708/patches-3.10/0061-Merge-pull-request-286-from-martinezjavier-rpi-3.6.y.patch b/target/linux/brcm2708/patches-3.10/0061-Merge-pull-request-286-from-martinezjavier-rpi-3.6.y.patch
deleted file mode 100644
index 84b2af3041..0000000000
--- a/target/linux/brcm2708/patches-3.10/0061-Merge-pull-request-286-from-martinezjavier-rpi-3.6.y.patch
+++ /dev/null
@@ -1,483 +0,0 @@
-From 46b48162ae7d5323a73eea61c29f3f1e18e12b0c Mon Sep 17 00:00:00 2001
-From: popcornmix <popcornmix@gmail.com>
-Date: Fri, 26 Apr 2013 10:08:31 -0700
-Subject: [PATCH 061/196] Merge pull request #286 from
- martinezjavier/rpi-3.6.y-dev
-
-add mmap support and some cleanups to bcm2835 ALSA driver
----
- sound/arm/bcm2835-pcm.c | 69 ++++++++++++++++++++++--------------
- sound/arm/bcm2835-vchiq.c | 89 +++++++++++++++++++++++++++++++++--------------
- sound/arm/bcm2835.c | 34 +++++++++---------
- sound/arm/bcm2835.h | 2 ++
- 4 files changed, 124 insertions(+), 70 deletions(-)
-
-diff --git a/sound/arm/bcm2835-pcm.c b/sound/arm/bcm2835-pcm.c
-index 4206b7e..21e435b 100755
---- a/sound/arm/bcm2835-pcm.c
-+++ b/sound/arm/bcm2835-pcm.c
-@@ -19,7 +19,8 @@
-
- /* hardware definition */
- static struct snd_pcm_hardware snd_bcm2835_playback_hw = {
-- .info = (SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_BLOCK_TRANSFER),
-+ .info = (SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_BLOCK_TRANSFER |
-+ SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_MMAP_VALID),
- .formats = SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_LE,
- .rates = SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000,
- .rate_min = 8000,
-@@ -251,6 +252,12 @@ static int snd_bcm2835_pcm_prepare(struct snd_pcm_substream *substream)
-
- audio_info(" .. IN\n");
-
-+ memset(&alsa_stream->pcm_indirect, 0, sizeof(alsa_stream->pcm_indirect));
-+
-+ alsa_stream->pcm_indirect.hw_buffer_size =
-+ alsa_stream->pcm_indirect.sw_buffer_size =
-+ snd_pcm_lib_buffer_bytes(substream);
-+
- alsa_stream->buffer_size = snd_pcm_lib_buffer_bytes(substream);
- alsa_stream->period_size = snd_pcm_lib_period_bytes(substream);
- alsa_stream->pos = 0;
-@@ -263,6 +270,32 @@ static int snd_bcm2835_pcm_prepare(struct snd_pcm_substream *substream)
- return 0;
- }
-
-+static void snd_bcm2835_pcm_transfer(struct snd_pcm_substream *substream,
-+ struct snd_pcm_indirect *rec, size_t bytes)
-+{
-+ struct snd_pcm_runtime *runtime = substream->runtime;
-+ bcm2835_alsa_stream_t *alsa_stream = runtime->private_data;
-+ void *src = (void *)(substream->runtime->dma_area + rec->sw_data);
-+ int err;
-+
-+ err = bcm2835_audio_write(alsa_stream, bytes, src);
-+ if (err)
-+ audio_error(" Failed to transfer to alsa device (%d)\n", err);
-+
-+}
-+
-+static int snd_bcm2835_pcm_ack(struct snd_pcm_substream *substream)
-+{
-+ struct snd_pcm_runtime *runtime = substream->runtime;
-+ bcm2835_alsa_stream_t *alsa_stream = runtime->private_data;
-+ struct snd_pcm_indirect *pcm_indirect = &alsa_stream->pcm_indirect;
-+
-+ pcm_indirect->hw_queue_size = runtime->hw.buffer_bytes_max;
-+ snd_pcm_indirect_playback_transfer(substream, pcm_indirect,
-+ snd_bcm2835_pcm_transfer);
-+ return 0;
-+}
-+
- /* trigger callback */
- static int snd_bcm2835_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
- {
-@@ -279,6 +312,11 @@ static int snd_bcm2835_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
- if (!alsa_stream->running) {
- err = bcm2835_audio_start(alsa_stream);
- if (err == 0) {
-+ alsa_stream->pcm_indirect.hw_io =
-+ alsa_stream->pcm_indirect.hw_data =
-+ bytes_to_frames(runtime,
-+ alsa_stream->pos);
-+ substream->ops->ack(substream);
- alsa_stream->running = 1;
- alsa_stream->draining = 1;
- } else {
-@@ -327,30 +365,9 @@ snd_bcm2835_pcm_pointer(struct snd_pcm_substream *substream)
- alsa_stream->pos);
-
- audio_info(" .. OUT\n");
-- return bytes_to_frames(runtime, alsa_stream->pos);
--}
--
--static int snd_bcm2835_pcm_copy(struct snd_pcm_substream *substream,
-- int channel, snd_pcm_uframes_t pos, void *src,
-- snd_pcm_uframes_t count)
--{
-- int ret;
-- struct snd_pcm_runtime *runtime = substream->runtime;
-- bcm2835_alsa_stream_t *alsa_stream = runtime->private_data;
--
-- audio_info(" .. IN\n");
-- audio_debug("copy.......... (%d) hwptr=%d appl=%d pos=%d\n",
-- frames_to_bytes(runtime, count), frames_to_bytes(runtime,
-- runtime->
-- status->
-- hw_ptr),
-- frames_to_bytes(runtime, runtime->control->appl_ptr),
-- alsa_stream->pos);
-- ret =
-- bcm2835_audio_write(alsa_stream, frames_to_bytes(runtime, count),
-- src);
-- audio_info(" .. OUT\n");
-- return ret;
-+ return snd_pcm_indirect_playback_pointer(substream,
-+ &alsa_stream->pcm_indirect,
-+ alsa_stream->pos);
- }
-
- static int snd_bcm2835_pcm_lib_ioctl(struct snd_pcm_substream *substream,
-@@ -372,7 +389,7 @@ static struct snd_pcm_ops snd_bcm2835_playback_ops = {
- .prepare = snd_bcm2835_pcm_prepare,
- .trigger = snd_bcm2835_pcm_trigger,
- .pointer = snd_bcm2835_pcm_pointer,
-- .copy = snd_bcm2835_pcm_copy,
-+ .ack = snd_bcm2835_pcm_ack,
- };
-
- /* create a pcm device */
-diff --git a/sound/arm/bcm2835-vchiq.c b/sound/arm/bcm2835-vchiq.c
-index 9ecb2d6..169d899 100755
---- a/sound/arm/bcm2835-vchiq.c
-+++ b/sound/arm/bcm2835-vchiq.c
-@@ -27,6 +27,7 @@
- #include <linux/delay.h>
- #include <linux/atomic.h>
- #include <linux/module.h>
-+#include <linux/completion.h>
-
- #include "bcm2835.h"
-
-@@ -37,6 +38,10 @@
-
- /* ---- Private Constants and Types ------------------------------------------ */
-
-+#define BCM2835_AUDIO_STOP 0
-+#define BCM2835_AUDIO_START 1
-+#define BCM2835_AUDIO_WRITE 2
-+
- /* Logging macros (for remapping to other logging mechanisms, i.e., printf) */
- #ifdef AUDIO_DEBUG_ENABLE
- #define LOG_ERR( fmt, arg... ) pr_err( "%s:%d " fmt, __func__, __LINE__, ##arg)
-@@ -53,7 +58,7 @@
- typedef struct opaque_AUDIO_INSTANCE_T {
- uint32_t num_connections;
- VCHI_SERVICE_HANDLE_T vchi_handle[VCHI_MAX_NUM_CONNECTIONS];
-- struct semaphore msg_avail_event;
-+ struct completion msg_avail_comp;
- struct mutex vchi_mutex;
- bcm2835_alsa_stream_t *alsa_stream;
- int32_t result;
-@@ -70,27 +75,35 @@ bool force_bulk = false;
-
- static int bcm2835_audio_stop_worker(bcm2835_alsa_stream_t * alsa_stream);
- static int bcm2835_audio_start_worker(bcm2835_alsa_stream_t * alsa_stream);
-+static int bcm2835_audio_write_worker(bcm2835_alsa_stream_t *alsa_stream,
-+ uint32_t count, void *src);
-
- typedef struct {
- struct work_struct my_work;
- bcm2835_alsa_stream_t *alsa_stream;
-- int x;
-+ int cmd;
-+ void *src;
-+ uint32_t count;
- } my_work_t;
-
- static void my_wq_function(struct work_struct *work)
- {
- my_work_t *w = (my_work_t *) work;
- int ret = -9;
-- LOG_DBG(" .. IN %p:%d\n", w->alsa_stream, w->x);
-- switch (w->x) {
-- case 1:
-+ LOG_DBG(" .. IN %p:%d\n", w->alsa_stream, w->cmd);
-+ switch (w->cmd) {
-+ case BCM2835_AUDIO_START:
- ret = bcm2835_audio_start_worker(w->alsa_stream);
- break;
-- case 2:
-+ case BCM2835_AUDIO_STOP:
- ret = bcm2835_audio_stop_worker(w->alsa_stream);
- break;
-+ case BCM2835_AUDIO_WRITE:
-+ ret = bcm2835_audio_write_worker(w->alsa_stream, w->count,
-+ w->src);
-+ break;
- default:
-- LOG_ERR(" Unexpected work: %p:%d\n", w->alsa_stream, w->x);
-+ LOG_ERR(" Unexpected work: %p:%d\n", w->alsa_stream, w->cmd);
- break;
- }
- kfree((void *)work);
-@@ -107,7 +120,7 @@ int bcm2835_audio_start(bcm2835_alsa_stream_t * alsa_stream)
- if (work) {
- INIT_WORK((struct work_struct *)work, my_wq_function);
- work->alsa_stream = alsa_stream;
-- work->x = 1;
-+ work->cmd = BCM2835_AUDIO_START;
- if (queue_work
- (alsa_stream->my_wq, (struct work_struct *)work))
- ret = 0;
-@@ -128,7 +141,31 @@ int bcm2835_audio_stop(bcm2835_alsa_stream_t * alsa_stream)
- if (work) {
- INIT_WORK((struct work_struct *)work, my_wq_function);
- work->alsa_stream = alsa_stream;
-- work->x = 2;
-+ work->cmd = BCM2835_AUDIO_STOP;
-+ if (queue_work
-+ (alsa_stream->my_wq, (struct work_struct *)work))
-+ ret = 0;
-+ } else
-+ LOG_ERR(" .. Error: NULL work kmalloc\n");
-+ }
-+ LOG_DBG(" .. OUT %d\n", ret);
-+ return ret;
-+}
-+
-+int bcm2835_audio_write(bcm2835_alsa_stream_t *alsa_stream,
-+ uint32_t count, void *src)
-+{
-+ int ret = -1;
-+ LOG_DBG(" .. IN\n");
-+ if (alsa_stream->my_wq) {
-+ my_work_t *work = kmalloc(sizeof(my_work_t), GFP_ATOMIC);
-+ /*--- Queue some work (item 1) ---*/
-+ if (work) {
-+ INIT_WORK((struct work_struct *)work, my_wq_function);
-+ work->alsa_stream = alsa_stream;
-+ work->cmd = BCM2835_AUDIO_WRITE;
-+ work->src = src;
-+ work->count = count;
- if (queue_work
- (alsa_stream->my_wq, (struct work_struct *)work))
- ret = 0;
-@@ -178,7 +215,7 @@ static void audio_vchi_callback(void *param,
- (" .. instance=%p, m.type=VC_AUDIO_MSG_TYPE_RESULT, success=%d\n",
- instance, m.u.result.success);
- instance->result = m.u.result.success;
-- up(&instance->msg_avail_event);
-+ complete(&instance->msg_avail_comp);
- } else if (m.type == VC_AUDIO_MSG_TYPE_COMPLETE) {
- irq_handler_t callback = (irq_handler_t) m.u.complete.callback;
- LOG_DBG
-@@ -435,8 +472,8 @@ static int bcm2835_audio_set_ctls_chan(bcm2835_alsa_stream_t * alsa_stream,
- m.u.control.dest = chip->dest;
- m.u.control.volume = chip->volume;
-
-- /* Create the message available event */
-- sema_init(&instance->msg_avail_event, 0);
-+ /* Create the message available completion */
-+ init_completion(&instance->msg_avail_comp);
-
- /* Send the message to the videocore */
- success = vchi_msg_queue(instance->vchi_handle[0],
-@@ -452,11 +489,10 @@ static int bcm2835_audio_set_ctls_chan(bcm2835_alsa_stream_t * alsa_stream,
- }
-
- /* We are expecting a reply from the videocore */
-- if (down_interruptible(&instance->msg_avail_event)) {
-+ ret = wait_for_completion_interruptible(&instance->msg_avail_comp);
-+ if (ret) {
- LOG_ERR("%s: failed on waiting for event (status=%d)\n",
- __func__, success);
--
-- ret = -1;
- goto unlock;
- }
-
-@@ -539,8 +575,8 @@ int bcm2835_audio_set_params(bcm2835_alsa_stream_t * alsa_stream,
- m.u.config.samplerate = samplerate;
- m.u.config.bps = bps;
-
-- /* Create the message available event */
-- sema_init(&instance->msg_avail_event, 0);
-+ /* Create the message available completion */
-+ init_completion(&instance->msg_avail_comp);
-
- /* Send the message to the videocore */
- success = vchi_msg_queue(instance->vchi_handle[0],
-@@ -556,11 +592,10 @@ int bcm2835_audio_set_params(bcm2835_alsa_stream_t * alsa_stream,
- }
-
- /* We are expecting a reply from the videocore */
-- if (down_interruptible(&instance->msg_avail_event)) {
-+ ret = wait_for_completion_interruptible(&instance->msg_avail_comp);
-+ if (ret) {
- LOG_ERR("%s: failed on waiting for event (status=%d)\n",
- __func__, success);
--
-- ret = -1;
- goto unlock;
- }
-
-@@ -688,8 +723,8 @@ int bcm2835_audio_close(bcm2835_alsa_stream_t * alsa_stream)
-
- m.type = VC_AUDIO_MSG_TYPE_CLOSE;
-
-- /* Create the message available event */
-- sema_init(&instance->msg_avail_event, 0);
-+ /* Create the message available completion */
-+ init_completion(&instance->msg_avail_comp);
-
- /* Send the message to the videocore */
- success = vchi_msg_queue(instance->vchi_handle[0],
-@@ -702,11 +737,11 @@ int bcm2835_audio_close(bcm2835_alsa_stream_t * alsa_stream)
- ret = -1;
- goto unlock;
- }
-- if (down_interruptible(&instance->msg_avail_event)) {
-+
-+ ret = wait_for_completion_interruptible(&instance->msg_avail_comp);
-+ if (ret) {
- LOG_ERR("%s: failed on waiting for event (status=%d)",
- __func__, success);
--
-- ret = -1;
- goto unlock;
- }
- if (instance->result != 0) {
-@@ -732,8 +767,8 @@ unlock:
- return ret;
- }
-
--int bcm2835_audio_write(bcm2835_alsa_stream_t * alsa_stream, uint32_t count,
-- void *src)
-+int bcm2835_audio_write_worker(bcm2835_alsa_stream_t *alsa_stream,
-+ uint32_t count, void *src)
- {
- VC_AUDIO_MSG_T m;
- AUDIO_INSTANCE_T *instance = alsa_stream->instance;
-diff --git a/sound/arm/bcm2835.c b/sound/arm/bcm2835.c
-index e5ac894..d5ad830 100755
---- a/sound/arm/bcm2835.c
-+++ b/sound/arm/bcm2835.c
-@@ -110,20 +110,20 @@ static int snd_bcm2835_alsa_probe(struct platform_device *pdev)
-
- err = snd_bcm2835_create(g_card, pdev, &chip);
- if (err < 0) {
-- printk(KERN_ERR "Failed to create bcm2835 chip\n");
-+ dev_err(&pdev->dev, "Failed to create bcm2835 chip\n");
- goto out_bcm2835_create;
- }
-
- g_chip = chip;
- err = snd_bcm2835_new_pcm(chip);
- if (err < 0) {
-- printk(KERN_ERR "Failed to create new BCM2835 pcm device\n");
-+ dev_err(&pdev->dev, "Failed to create new BCM2835 pcm device\n");
- goto out_bcm2835_new_pcm;
- }
-
- err = snd_bcm2835_new_ctl(chip);
- if (err < 0) {
-- printk(KERN_ERR "Failed to create new BCM2835 ctl\n");
-+ dev_err(&pdev->dev, "Failed to create new BCM2835 ctl\n");
- goto out_bcm2835_new_ctl;
- }
-
-@@ -139,14 +139,14 @@ add_register_map:
- if (dev == 0) {
- err = snd_card_register(card);
- if (err < 0) {
-- printk(KERN_ERR
-- "Failed to register bcm2835 ALSA card \n");
-+ dev_err(&pdev->dev,
-+ "Failed to register bcm2835 ALSA card \n");
- goto out_card_register;
- }
- platform_set_drvdata(pdev, card);
-- printk(KERN_INFO "bcm2835 ALSA card created!\n");
-+ audio_info("bcm2835 ALSA card created!\n");
- } else {
-- printk(KERN_INFO "bcm2835 ALSA chip created!\n");
-+ audio_info("bcm2835 ALSA chip created!\n");
- platform_set_drvdata(pdev, (void *)dev);
- }
-
-@@ -160,11 +160,11 @@ out_bcm2835_new_pcm:
- out_bcm2835_create:
- BUG_ON(!g_card);
- if (snd_card_free(g_card))
-- printk(KERN_ERR "Failed to free Registered alsa card\n");
-+ dev_err(&pdev->dev, "Failed to free Registered alsa card\n");
- g_card = NULL;
- out:
- dev = SNDRV_CARDS; /* stop more avail_substreams from being probed */
-- printk(KERN_ERR "BCM2835 ALSA Probe failed !!\n");
-+ dev_err(&pdev->dev, "BCM2835 ALSA Probe failed !!\n");
- return err;
- }
-
-@@ -326,49 +326,49 @@ static int bcm2835_alsa_device_init(void)
- int err;
- err = platform_driver_register(&bcm2835_alsa0_driver);
- if (err) {
-- printk("Error registering bcm2835_alsa0_driver %d .\n", err);
-+ pr_err("Error registering bcm2835_alsa0_driver %d .\n", err);
- goto out;
- }
-
- err = platform_driver_register(&bcm2835_alsa1_driver);
- if (err) {
-- printk("Error registering bcm2835_alsa1_driver %d .\n", err);
-+ pr_err("Error registering bcm2835_alsa0_driver %d .\n", err);
- goto unregister_0;
- }
-
- err = platform_driver_register(&bcm2835_alsa2_driver);
- if (err) {
-- printk("Error registering bcm2835_alsa2_driver %d .\n", err);
-+ pr_err("Error registering bcm2835_alsa0_driver %d .\n", err);
- goto unregister_1;
- }
-
- err = platform_driver_register(&bcm2835_alsa3_driver);
- if (err) {
-- printk("Error registering bcm2835_alsa3_driver %d .\n", err);
-+ pr_err("Error registering bcm2835_alsa0_driver %d .\n", err);
- goto unregister_2;
- }
-
- err = platform_driver_register(&bcm2835_alsa4_driver);
- if (err) {
-- printk("Error registering bcm2835_alsa4_driver %d .\n", err);
-+ pr_err("Error registering bcm2835_alsa0_driver %d .\n", err);
- goto unregister_3;
- }
-
- err = platform_driver_register(&bcm2835_alsa5_driver);
- if (err) {
-- printk("Error registering bcm2835_alsa5_driver %d .\n", err);
-+ pr_err("Error registering bcm2835_alsa0_driver %d .\n", err);
- goto unregister_4;
- }
-
- err = platform_driver_register(&bcm2835_alsa6_driver);
- if (err) {
-- printk("Error registering bcm2835_alsa6_driver %d .\n", err);
-+ pr_err("Error registering bcm2835_alsa0_driver %d .\n", err);
- goto unregister_5;
- }
-
- err = platform_driver_register(&bcm2835_alsa7_driver);
- if (err) {
-- printk("Error registering bcm2835_alsa7_driver %d .\n", err);
-+ pr_err("Error registering bcm2835_alsa0_driver %d .\n", err);
- goto unregister_6;
- }
-
-diff --git a/sound/arm/bcm2835.h b/sound/arm/bcm2835.h
-index b966e28..08c763d 100755
---- a/sound/arm/bcm2835.h
-+++ b/sound/arm/bcm2835.h
-@@ -23,6 +23,7 @@
- #include <sound/initval.h>
- #include <sound/pcm.h>
- #include <sound/pcm_params.h>
-+#include <sound/pcm-indirect.h>
- #include <linux/workqueue.h>
-
- /*
-@@ -110,6 +111,7 @@ typedef struct bcm2835_chip {
- typedef struct bcm2835_alsa_stream {
- bcm2835_chip_t *chip;
- struct snd_pcm_substream *substream;
-+ struct snd_pcm_indirect pcm_indirect;
-
- struct semaphore buffers_update_sem;
- struct semaphore control_sem;
---
-1.9.1
-