All of lore.kernel.org
 help / color / mirror / Atom feed
From: Eduardo Valentin <eduardo.valentin@nokia.com>
To: Takashi Iwai <tiwai@suse.de>
Cc: Linux-OMAP <linux-omap@vger.kernel.org>,
	ALSA-Devel <alsa-devel@vger.kernel.org>,
	Jarkko Nikula <jhnikula@gmail.com>,
	"Nurkkala Eero.An (EXT-Offcode/Oulu)"
	<ext-Eero.Nurkkala@nokia.com>,
	"Ujfalusi Peter (Nokia-D/Tampere)" <peter.ujfalusi@nokia.com>,
	Mark Brown <broonie@opensource.wolfsonmicro.com>,
	Eduardo Valentin <eduardo.valentin@nokia.com>
Subject: [PATCHv4 08/20] OMAP: McBSP: Add link DMA mode selection
Date: Mon, 17 Aug 2009 14:51:07 +0300	[thread overview]
Message-ID: <1250509879-6703-9-git-send-email-eduardo.valentin@nokia.com> (raw)
In-Reply-To: <1250509879-6703-1-git-send-email-eduardo.valentin@nokia.com>

From: Peter Ujfalusi <peter.ujfalusi@nokia.com>

It adds a new sysfs file, where the user can configure the mcbsp mode to use.
If the mcbsp channel is in use, it does not allow the change.
Than in omap_pcm_open we can call the omap_mcbsp_get_opmode to get the mode,
store it, than use it to implement the different modes.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@nokia.com>
Signed-off-by: Eduardo Valentin <eduardo.valentin@nokia.com>
---
 arch/arm/plat-omap/include/mach/mcbsp.h |    8 +++
 arch/arm/plat-omap/mcbsp.c              |   84 +++++++++++++++++++++++++++++++
 2 files changed, 92 insertions(+), 0 deletions(-)

diff --git a/arch/arm/plat-omap/include/mach/mcbsp.h b/arch/arm/plat-omap/include/mach/mcbsp.h
index 832330d..bd5b759 100644
--- a/arch/arm/plat-omap/include/mach/mcbsp.h
+++ b/arch/arm/plat-omap/include/mach/mcbsp.h
@@ -255,6 +255,11 @@
 /********************** McBSP SYSCONFIG bit definitions ********************/
 #define SOFTRST			0x0002
 
+/********************** McBSP DMA operating modes **************************/
+#define MCBSP_DMA_MODE_ELEMENT		0
+#define MCBSP_DMA_MODE_THRESHOLD	1
+#define MCBSP_DMA_MODE_FRAME		2
+
 /* we don't do multichannel for now */
 struct omap_mcbsp_reg_cfg {
 	u16 spcr2;
@@ -385,6 +390,7 @@ struct omap_mcbsp {
 	struct clk *iclk;
 	struct clk *fclk;
 #ifdef CONFIG_ARCH_OMAP34XX
+	int dma_op_mode;
 	u16 max_tx_thres;
 	u16 max_rx_thres;
 #endif
@@ -401,6 +407,7 @@ void omap_mcbsp_set_tx_threshold(unsigned int id, u16 threshold);
 void omap_mcbsp_set_rx_threshold(unsigned int id, u16 threshold);
 u16 omap_mcbsp_get_max_tx_threshold(unsigned int id);
 u16 omap_mcbsp_get_max_rx_threshold(unsigned int id);
+int omap_mcbsp_get_dma_op_mode(unsigned int id);
 #else
 static inline void omap_mcbsp_set_tx_threshold(unsigned int id, u16 threshold)
 { }
@@ -408,6 +415,7 @@ static inline void omap_mcbsp_set_rx_threshold(unsigned int id, u16 threshold)
 { }
 static inline u16 omap_mcbsp_get_max_tx_threshold(unsigned int id) { return 0; }
 static inline u16 omap_mcbsp_get_max_rx_threshold(unsigned int id) { return 0; }
+static inline int omap_mcbsp_get_dma_op_mode(unsigned int id) { return 0; }
 #endif
 int omap_mcbsp_request(unsigned int id);
 void omap_mcbsp_free(unsigned int id);
diff --git a/arch/arm/plat-omap/mcbsp.c b/arch/arm/plat-omap/mcbsp.c
index ccaa9ae..9e69994 100644
--- a/arch/arm/plat-omap/mcbsp.c
+++ b/arch/arm/plat-omap/mcbsp.c
@@ -282,6 +282,29 @@ u16 omap_mcbsp_get_max_rx_threshold(unsigned int id)
 	return mcbsp->max_rx_thres;
 }
 EXPORT_SYMBOL(omap_mcbsp_get_max_rx_threshold);
+
+/*
+ * omap_mcbsp_get_dma_op_mode just return the current configured
+ * operating mode for the mcbsp channel
+ */
+int omap_mcbsp_get_dma_op_mode(unsigned int id)
+{
+	struct omap_mcbsp *mcbsp;
+	int dma_op_mode;
+
+	if (!omap_mcbsp_check_valid_id(id)) {
+		printk(KERN_ERR "%s: Invalid id (%u)\n", __func__, id + 1);
+		return -ENODEV;
+	}
+	mcbsp = id_to_mcbsp_ptr(id);
+
+	spin_lock_irq(&mcbsp->lock);
+	dma_op_mode = mcbsp->dma_op_mode;
+	spin_unlock_irq(&mcbsp->lock);
+
+	return dma_op_mode;
+}
+EXPORT_SYMBOL(omap_mcbsp_get_dma_op_mode);
 #endif
 
 /*
@@ -1077,9 +1100,65 @@ static DEVICE_ATTR(prop, 0644, prop##_show, prop##_store);
 THRESHOLD_PROP_BUILDER(max_tx_thres);
 THRESHOLD_PROP_BUILDER(max_rx_thres);
 
+static ssize_t dma_op_mode_show(struct device *dev,
+			struct device_attribute *attr, char *buf)
+{
+	struct omap_mcbsp *mcbsp = dev_get_drvdata(dev);
+	int dma_op_mode;
+
+	spin_lock_irq(&mcbsp->lock);
+	dma_op_mode = mcbsp->dma_op_mode;
+	spin_unlock_irq(&mcbsp->lock);
+
+	return sprintf(buf, "current mode: %d\n"
+			"possible mode values are:\n"
+			"%d - %s\n"
+			"%d - %s\n"
+			"%d - %s\n",
+			dma_op_mode,
+			MCBSP_DMA_MODE_ELEMENT, "element mode",
+			MCBSP_DMA_MODE_THRESHOLD, "threshold mode",
+			MCBSP_DMA_MODE_FRAME, "frame mode");
+}
+
+static ssize_t dma_op_mode_store(struct device *dev,
+				struct device_attribute *attr,
+				const char *buf, size_t size)
+{
+	struct omap_mcbsp *mcbsp = dev_get_drvdata(dev);
+	unsigned long val;
+	int status;
+
+	status = strict_strtoul(buf, 0, &val);
+	if (status)
+		return status;
+
+	spin_lock_irq(&mcbsp->lock);
+
+	if (!mcbsp->free) {
+		size = -EBUSY;
+		goto unlock;
+	}
+
+	if (val > MCBSP_DMA_MODE_FRAME || val < MCBSP_DMA_MODE_ELEMENT) {
+		size = -EINVAL;
+		goto unlock;
+	}
+
+	mcbsp->dma_op_mode = val;
+
+unlock:
+	spin_unlock_irq(&mcbsp->lock);
+
+	return size;
+}
+
+static DEVICE_ATTR(dma_op_mode, 0644, dma_op_mode_show, dma_op_mode_store);
+
 static const struct attribute *additional_attrs[] = {
 	&dev_attr_max_tx_thres.attr,
 	&dev_attr_max_rx_thres.attr,
+	&dev_attr_dma_op_mode.attr,
 	NULL,
 };
 
@@ -1099,9 +1178,14 @@ static inline void __devexit omap_additional_remove(struct device *dev)
 
 static inline void __devinit omap34xx_device_init(struct omap_mcbsp *mcbsp)
 {
+	mcbsp->dma_op_mode = MCBSP_DMA_MODE_ELEMENT;
 	if (cpu_is_omap34xx()) {
 		mcbsp->max_tx_thres = max_thres(mcbsp);
 		mcbsp->max_rx_thres = max_thres(mcbsp);
+		/*
+		 * REVISIT: Set dmap_op_mode to THRESHOLD as default
+		 * for mcbsp2 instances.
+		 */
 		if (omap_additional_add(mcbsp->dev))
 			dev_warn(mcbsp->dev,
 				"Unable to create additional controls\n");
-- 
1.6.2.GIT


  parent reply	other threads:[~2009-08-17 12:05 UTC|newest]

Thread overview: 68+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-08-17 11:50 [PATCHv4 00/20] OMAP ASoC changes in DMA utilization Eduardo Valentin
2009-08-17 11:51 ` [PATCHv4 01/20] OMAP: McBSP: Provide functions for ASoC frame syncronization Eduardo Valentin
2009-08-17 11:51 ` Eduardo Valentin
2009-08-17 11:51 ` [PATCHv4 02/20] OMAP: McBSP: Add IRQEN, IRQSTATUS, THRESHOLD2 and THRESHOLD1 registers Eduardo Valentin
2009-08-17 13:53   ` Tony Lindgren
2009-08-17 13:53   ` Tony Lindgren
2009-08-17 14:13     ` Eduardo Valentin
2009-08-17 14:13     ` Eduardo Valentin
2009-08-17 11:51 ` [PATCHv4 03/20] OMAP: McBSP: Use appropriate value for startup delay Eduardo Valentin
2009-08-17 13:56   ` Tony Lindgren
2009-08-17 14:09     ` [PATCHv5 " Eduardo Valentin
2009-08-17 13:56   ` [PATCHv4 " Tony Lindgren
2009-08-17 11:51 ` Eduardo Valentin
2009-08-17 11:51 ` [PATCHv4 04/20] OMAP: McBSP: Add transmit/receive threshold handler Eduardo Valentin
2009-08-17 11:51 ` Eduardo Valentin
2009-08-17 11:51 ` [PATCHv4 05/20] OMAP: McBSP: Create and export max_(r|t)x_thres property Eduardo Valentin
2009-08-17 11:51 ` Eduardo Valentin
2009-08-17 11:51 ` [PATCHv4 06/20] OMAP3: McBSP: Lower the maximum buffersize for McBSP1,3,4,5 Eduardo Valentin
2009-08-17 11:51 ` [PATCHv4 06/20] OMAP3: McBSP: Lower the maximum buffersize for McBSP1, 3, 4, 5 Eduardo Valentin
2009-08-17 11:51 ` [PATCHv4 07/20] OMAP: McBSP: Rename thres sysfs symbols Eduardo Valentin
2009-08-17 11:51 ` Eduardo Valentin
2009-08-17 11:51 ` [PATCHv4 08/20] OMAP: McBSP: Add link DMA mode selection Eduardo Valentin
2009-08-17 11:51 ` Eduardo Valentin [this message]
2009-08-17 11:51 ` [PATCHv4 09/20] OMAP: McBSP: Wakeups utilized Eduardo Valentin
2009-08-17 11:51 ` Eduardo Valentin
2009-08-17 11:51 ` [PATCHv4 10/20] OMAP: McBSP: Change wakeup signals Eduardo Valentin
2009-08-17 11:51 ` Eduardo Valentin
2009-08-17 11:51 ` [PATCHv4 11/20] OMAP: McBSP: Retain McBSP FCLK clockactivity Eduardo Valentin
2009-08-17 11:51 ` Eduardo Valentin
2009-08-17 11:51 ` [PATCHv4 12/20] OMAP: McBSP: Configure NO IDLE mode for DMA mode different of threshold Eduardo Valentin
2009-08-17 11:51 ` Eduardo Valentin
2009-08-17 11:51 ` [PATCHv4 13/20] OMAP: McBSP: Do not enable wakeups for no-idle mode Eduardo Valentin
2009-08-17 11:51 ` Eduardo Valentin
2009-08-17 11:51 ` [PATCHv4 14/20] OMAP: McBSP: Let element DMA mode hit retention also Eduardo Valentin
2009-08-17 11:51 ` Eduardo Valentin
2009-08-17 11:51 ` [PATCHv4 15/20] ASoC: OMAP: Make DMA 64 aligned Eduardo Valentin
2009-08-17 11:51 ` Eduardo Valentin
2009-08-17 14:00   ` Tony Lindgren
2009-08-17 14:35     ` Eduardo Valentin
2009-08-17 14:00   ` Tony Lindgren
2009-08-17 11:51 ` [PATCHv4 16/20] ASoC: OMAP: Enable DMA burst mode Eduardo Valentin
2009-08-17 11:51 ` Eduardo Valentin
2009-08-17 13:25   ` Jarkko Nikula
2009-08-17 14:01     ` Tony Lindgren
2009-08-17 14:01     ` Tony Lindgren
2009-08-17 14:29       ` [PATCH] " Eduardo Valentin
2009-08-17 14:39       ` [PATCHv4 16/20] " Eduardo Valentin
2009-08-17 14:39       ` Eduardo Valentin
2009-08-17 13:25   ` Jarkko Nikula
2009-08-17 11:51 ` [PATCHv4 17/20] ASoC: Add runtime check for RFIG and XFIG Eduardo Valentin
2009-08-17 11:51 ` Eduardo Valentin
2009-08-17 11:51 ` [PATCHv4 18/20] ASoC: Always syncronize audio transfers on frames Eduardo Valentin
2009-08-17 11:51 ` Eduardo Valentin
2009-08-17 11:51 ` [PATCHv4 19/20] ASoC: OMAP: Use McBSP threshold to playback and capture Eduardo Valentin
2009-08-17 11:51 ` Eduardo Valentin
2009-08-17 11:51 ` [PATCHv4 20/20] ASoC: OMAP: Use DMA operating mode of McBSP Eduardo Valentin
2009-08-17 11:51 ` Eduardo Valentin
2009-08-17 14:02   ` Tony Lindgren
2009-08-17 14:02   ` Tony Lindgren
2009-08-17 14:19     ` Eduardo Valentin
2009-08-17 14:19     ` Eduardo Valentin
2009-08-17 14:05 ` [PATCHv4 00/20] OMAP ASoC changes in DMA utilization Jarkko Nikula
2009-08-19  7:40   ` Eduardo Valentin
2009-08-19  7:48     ` Eduardo Valentin
2009-08-19  8:26       ` Mark Brown
2009-08-24 14:00         ` [alsa-devel] " Tony Lindgren
2009-08-19  7:48     ` Eduardo Valentin
2009-08-19  7:40   ` Eduardo Valentin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1250509879-6703-9-git-send-email-eduardo.valentin@nokia.com \
    --to=eduardo.valentin@nokia.com \
    --cc=alsa-devel@vger.kernel.org \
    --cc=broonie@opensource.wolfsonmicro.com \
    --cc=ext-Eero.Nurkkala@nokia.com \
    --cc=jhnikula@gmail.com \
    --cc=linux-omap@vger.kernel.org \
    --cc=peter.ujfalusi@nokia.com \
    --cc=tiwai@suse.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.