diff mbox

[08/10] ASoC: dmaengine_pcm: Add open function for DT DMA request

Message ID 1362940391-8338-9-git-send-email-mpa@pengutronix.de (mailing list archive)
State New, archived
Headers show

Commit Message

Markus Pargmann March 10, 2013, 6:33 p.m. UTC
Add a function to open a DMA PCM substream using devicetree data
provided via the client device node. The patch introduces a public
function and a private subfunction that is called by both open
functions.

Signed-off-by: Markus Pargmann <mpa@pengutronix.de>
---
 include/sound/dmaengine_pcm.h |  2 +
 sound/soc/soc-dmaengine-pcm.c | 89 ++++++++++++++++++++++++++++++++++---------
 2 files changed, 72 insertions(+), 19 deletions(-)

Comments

Mark Brown March 12, 2013, 7:02 p.m. UTC | #1
On Sun, Mar 10, 2013 at 07:33:09PM +0100, Markus Pargmann wrote:
> Add a function to open a DMA PCM substream using devicetree data
> provided via the client device node. The patch introduces a public
> function and a private subfunction that is called by both open
> functions.

Someone (I think it was Shawn) sent a very similar patch just recently
which appears to have fallen out of my inbox unfortunately - can you
please check what's going on there and coordinate with them?  Let me
know if you can't find the patch and I'll dig it out.
Shawn Guo March 13, 2013, 2:18 a.m. UTC | #2
On Tue, Mar 12, 2013 at 07:02:07PM +0000, Mark Brown wrote:
> On Sun, Mar 10, 2013 at 07:33:09PM +0100, Markus Pargmann wrote:
> > Add a function to open a DMA PCM substream using devicetree data
> > provided via the client device node. The patch introduces a public
> > function and a private subfunction that is called by both open
> > functions.
> 
> Someone (I think it was Shawn) sent a very similar patch just recently
> which appears to have fallen out of my inbox unfortunately - can you
> please check what's going on there and coordinate with them?  Let me
> know if you can't find the patch and I'll dig it out.

It's here, Markus.

http://thread.gmane.org/gmane.linux.alsa.devel/106027/focus=106031

Mark,

I did not see any objection from you on that patch, so I'm waiting for
you to publish a branch for it, so that my mxs-dma generic binding
series can move forward.

Shawn
Mark Brown March 13, 2013, 10:49 a.m. UTC | #3
On Wed, Mar 13, 2013 at 10:18:29AM +0800, Shawn Guo wrote:

> I did not see any objection from you on that patch, so I'm waiting for
> you to publish a branch for it, so that my mxs-dma generic binding
> series can move forward.

I commented on the removal of the const from the name parameter (and
ideally an in order version of the patch series would be nice) but in
general I was mostly waiting for review and test from other people.  DT
and dmaengine both seem endless sources of problems so I'd rather make
sure everyone's had a chance to look.
Shawn Guo March 14, 2013, 6:04 a.m. UTC | #4
On Wed, Mar 13, 2013 at 10:49:45AM +0000, Mark Brown wrote:
> On Wed, Mar 13, 2013 at 10:18:29AM +0800, Shawn Guo wrote:
> 
> > I did not see any objection from you on that patch, so I'm waiting for
> > you to publish a branch for it, so that my mxs-dma generic binding
> > series can move forward.
> 
> I commented on the removal of the const from the name parameter (and

I just double checked my mailbox and can only see the conversation
between you and rmk, nothing particularly on the removal of the const
from the name parameter.  Or I'm still missing something?

Shawn
Markus Pargmann March 14, 2013, 1:08 p.m. UTC | #5
On Wed, Mar 13, 2013 at 10:18:29AM +0800, Shawn Guo wrote:
> On Tue, Mar 12, 2013 at 07:02:07PM +0000, Mark Brown wrote:
> > On Sun, Mar 10, 2013 at 07:33:09PM +0100, Markus Pargmann wrote:
> > > Add a function to open a DMA PCM substream using devicetree data
> > > provided via the client device node. The patch introduces a public
> > > function and a private subfunction that is called by both open
> > > functions.
> > 
> > Someone (I think it was Shawn) sent a very similar patch just recently
> > which appears to have fallen out of my inbox unfortunately - can you
> > please check what's going on there and coordinate with them?  Let me
> > know if you can't find the patch and I'll dig it out.
> 
> It's here, Markus.
> 
> http://thread.gmane.org/gmane.linux.alsa.devel/106027/focus=106031
> 

Thanks. Do you already have a patch for the non-generic function which I
could use instead?

Regards

Markus
Mark Brown March 15, 2013, 1:12 a.m. UTC | #6
On Thu, Mar 14, 2013 at 02:04:45PM +0800, Shawn Guo wrote:

> I just double checked my mailbox and can only see the conversation
> between you and rmk, nothing particularly on the removal of the const
> from the name parameter.  Or I'm still missing something?

You're missing the bit where I complained about you doing that - you
should be adding the const to the dmaengine side, not removing it from
the client side.  Unless there's some reason it should be modifiable,
but that'd be very surprising.
Shawn Guo March 15, 2013, 3:42 a.m. UTC | #7
On Thu, Mar 14, 2013 at 02:08:32PM +0100, Markus Pargmann wrote:
> On Wed, Mar 13, 2013 at 10:18:29AM +0800, Shawn Guo wrote:
> > On Tue, Mar 12, 2013 at 07:02:07PM +0000, Mark Brown wrote:
> > > On Sun, Mar 10, 2013 at 07:33:09PM +0100, Markus Pargmann wrote:
> > > > Add a function to open a DMA PCM substream using devicetree data
> > > > provided via the client device node. The patch introduces a public
> > > > function and a private subfunction that is called by both open
> > > > functions.
> > > 
> > > Someone (I think it was Shawn) sent a very similar patch just recently
> > > which appears to have fallen out of my inbox unfortunately - can you
> > > please check what's going on there and coordinate with them?  Let me
> > > know if you can't find the patch and I'll dig it out.
> > 
> > It's here, Markus.
> > 
> > http://thread.gmane.org/gmane.linux.alsa.devel/106027/focus=106031
> > 
> 
> Thanks. Do you already have a patch for the non-generic function which I
> could use instead?
> 
I do not follow.  With my patch in place, there will be two
dmaengine_pcm APIs.

int snd_dmaengine_pcm_open(struct snd_pcm_substream *substream,
        dma_filter_fn filter_fn, void *filter_data)

int snd_dmaengine_generic_pcm_open(struct snd_pcm_substream *substream,
                                   struct device *dev, const char *name)

The first one is for users that their dmaengine driver hasn't converted
to generic device tree bindings, and the second one is for users that
their dmaengine driver is converted to generic device tree bindings.

Shawn
Markus Pargmann March 15, 2013, 9:07 a.m. UTC | #8
On Fri, Mar 15, 2013 at 11:42:48AM +0800, Shawn Guo wrote:
> On Thu, Mar 14, 2013 at 02:08:32PM +0100, Markus Pargmann wrote:
> > On Wed, Mar 13, 2013 at 10:18:29AM +0800, Shawn Guo wrote:
> > > On Tue, Mar 12, 2013 at 07:02:07PM +0000, Mark Brown wrote:
> > > > On Sun, Mar 10, 2013 at 07:33:09PM +0100, Markus Pargmann wrote:
> > > > > Add a function to open a DMA PCM substream using devicetree data
> > > > > provided via the client device node. The patch introduces a public
> > > > > function and a private subfunction that is called by both open
> > > > > functions.
> > > > 
> > > > Someone (I think it was Shawn) sent a very similar patch just recently
> > > > which appears to have fallen out of my inbox unfortunately - can you
> > > > please check what's going on there and coordinate with them?  Let me
> > > > know if you can't find the patch and I'll dig it out.
> > > 
> > > It's here, Markus.
> > > 
> > > http://thread.gmane.org/gmane.linux.alsa.devel/106027/focus=106031
> > > 
> > 
> > Thanks. Do you already have a patch for the non-generic function which I
> > could use instead?
> > 
> I do not follow.  With my patch in place, there will be two
> dmaengine_pcm APIs.
> 
> int snd_dmaengine_pcm_open(struct snd_pcm_substream *substream,
>         dma_filter_fn filter_fn, void *filter_data)
> 
> int snd_dmaengine_generic_pcm_open(struct snd_pcm_substream *substream,
>                                    struct device *dev, const char *name)
> 
> The first one is for users that their dmaengine driver hasn't converted
> to generic device tree bindings, and the second one is for users that
> their dmaengine driver is converted to generic device tree bindings.

Sorry, I mixed up different patch versions and was confused.

Regards,

Markus
diff mbox

Patch

diff --git a/include/sound/dmaengine_pcm.h b/include/sound/dmaengine_pcm.h
index b877334..358951a 100644
--- a/include/sound/dmaengine_pcm.h
+++ b/include/sound/dmaengine_pcm.h
@@ -43,6 +43,8 @@  snd_pcm_uframes_t snd_dmaengine_pcm_pointer_no_residue(struct snd_pcm_substream
 
 int snd_dmaengine_pcm_open(struct snd_pcm_substream *substream,
 	dma_filter_fn filter_fn, void *filter_data);
+int of_snd_dmaengine_pcm_open(struct snd_pcm_substream *substream,
+	struct device_node *client_node, const char *name);
 int snd_dmaengine_pcm_close(struct snd_pcm_substream *substream);
 
 struct dma_chan *snd_dmaengine_pcm_get_chan(struct snd_pcm_substream *substream);
diff --git a/sound/soc/soc-dmaengine-pcm.c b/sound/soc/soc-dmaengine-pcm.c
index 111b7d92..017b691 100644
--- a/sound/soc/soc-dmaengine-pcm.c
+++ b/sound/soc/soc-dmaengine-pcm.c
@@ -20,6 +20,8 @@ 
  */
 #include <linux/module.h>
 #include <linux/init.h>
+#include <linux/of.h>
+#include <linux/of_dma.h>
 #include <linux/dmaengine.h>
 #include <linux/slab.h>
 #include <sound/pcm.h>
@@ -260,24 +262,21 @@  static int dmaengine_pcm_request_channel(struct dmaengine_pcm_runtime_data *prtd
 	return 0;
 }
 
-/**
- * snd_dmaengine_pcm_open - Open a dmaengine based PCM substream
- * @substream: PCM substream
- * @filter_fn: Filter function used to request the DMA channel
- * @filter_data: Data passed to the DMA filter function
- *
- * Returns 0 on success, a negative error code otherwise.
- *
- * This function will request a DMA channel using the passed filter function and
- * data. The function should usually be called from the pcm open callback.
- *
- * Note that this function will use private_data field of the substream's
- * runtime. So it is not availabe to your pcm driver implementation. If you need
- * to keep additional data attached to a substream use
- * snd_dmaengine_pcm_{set,get}_data.
- */
-int snd_dmaengine_pcm_open(struct snd_pcm_substream *substream,
-	dma_filter_fn filter_fn, void *filter_data)
+static int of_dmaengine_pcm_request_channel(
+		struct dmaengine_pcm_runtime_data *prtd, struct device_node *np,
+		const char *name)
+{
+	prtd->dma_chan = of_dma_request_slave_channel(np, name);
+
+	if (!prtd->dma_chan)
+		return -ENXIO;
+
+	return 0;
+}
+
+static int _snd_dmaengine_pcm_open(struct snd_pcm_substream *substream,
+		dma_filter_fn filter_fn, void *filter_data,
+		struct device_node *np, const char *slave_name)
 {
 	struct dmaengine_pcm_runtime_data *prtd;
 	int ret;
@@ -291,7 +290,11 @@  int snd_dmaengine_pcm_open(struct snd_pcm_substream *substream,
 	if (!prtd)
 		return -ENOMEM;
 
-	ret = dmaengine_pcm_request_channel(prtd, filter_fn, filter_data);
+	if (np)
+		ret = of_dmaengine_pcm_request_channel(prtd, np, slave_name);
+	else
+		ret = dmaengine_pcm_request_channel(prtd, filter_fn,
+						    filter_data);
 	if (ret < 0) {
 		kfree(prtd);
 		return ret;
@@ -301,9 +304,57 @@  int snd_dmaengine_pcm_open(struct snd_pcm_substream *substream,
 
 	return 0;
 }
+
+/**
+ * snd_dmaengine_pcm_open - Open a dmaengine based PCM substream
+ * @substream: PCM substream
+ * @filter_fn: Filter function used to request the DMA channel
+ * @filter_data: Data passed to the DMA filter function
+ *
+ * Returns 0 on success, a negative error code otherwise.
+ *
+ * This function will request a DMA channel using the passed filter function and
+ * data. The function should usually be called from the pcm open callback.
+ *
+ * Note that this function will use private_data field of the substream's
+ * runtime. So it is not availabe to your pcm driver implementation. If you need
+ * to keep additional data attached to a substream use
+ * snd_dmaengine_pcm_{set,get}_data.
+ */
+int snd_dmaengine_pcm_open(struct snd_pcm_substream *substream,
+	dma_filter_fn filter_fn, void *filter_data)
+{
+	return _snd_dmaengine_pcm_open(substream, filter_fn, filter_data, NULL,
+					NULL);
+}
 EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_open);
 
 /**
+ * of_snd_dmaengine_pcm_open - Open a dmaengine based PCM substream using oftree data
+ * @substream: PCM substream
+ * @client_node: DMA client oftree node used to request a DMA channel
+ * @name: DMA request name
+ *
+ * Returns 0 on success, a negative error code otherwise.
+ *
+ * This function will request a DMA channel using devicetree data.
+ *
+ * Note that this function will use private_data field of the substream's
+ * runtime. So it is not availabe to your pcm driver implementation. If you need
+ * to keep additional data attached to a substream use
+ * snd_dmaengine_pcm_{set,get}_data.
+ *
+ * Use the normal snd_dmaengine_pcm_close function to close the substream.
+ */
+int of_snd_dmaengine_pcm_open(struct snd_pcm_substream *substream,
+		struct device_node *client_node, const char *name)
+{
+	return _snd_dmaengine_pcm_open(substream, NULL, NULL, client_node,
+					name);
+}
+EXPORT_SYMBOL_GPL(of_snd_dmaengine_pcm_open);
+
+/**
  * snd_dmaengine_pcm_close - Close a dmaengine based PCM substream
  * @substream: PCM substream
  */