All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 0/5] OMAP/ASoC: McBSP: FIFO handling related fixes
@ 2010-06-01 11:18 Peter Ujfalusi
  2010-06-01 11:18 ` [PATCH v3 1/5] OMAP: McBSP: Function to query the FIFO size Peter Ujfalusi
                   ` (7 more replies)
  0 siblings, 8 replies; 13+ messages in thread
From: Peter Ujfalusi @ 2010-06-01 11:18 UTC (permalink / raw)
  To: alsa-devel, linux-omap
  Cc: tony, broonie, eduardo.valentin, ext-eero.nurkkala, lrg

Hello,

Changes since RFC v2:
- Comments added explaining the changes, and documenting the API in patch2
- In patch5:
 - Variable names changed in the hw_rule function
 - hw_rule function got renamed
 - The snd_pcm_hw_rule_add calls moved so it anly got set on OMAP3

Intro mail from the previous series:

This series aims to correct how the McBSP FIFO is viewed, and handled.

Introduction of the problem:
OMAP McBSP FIFO is word structured:
McBSP2 has 1024 + 256 = 1280 word long buffer,
McBSP1,3,4,5 has 128 word long buffer

This means, that the size of the FIFO
depends on the McBSP word size configuration.
For example on McBSP3:
16bit samples: size is 128 * 2 = 256 bytes
32bit samples: size is 128 * 4 = 512 bytes
It is simpler to place constraint for buffer and period based on channels.
McBSP3 as example again (16 or 32 bit samples):
1 channel (mono): size is 128 frames (128 words)
2 channels (stereo): size is 128 / 2 = 64 frames (2 * 64 words)
4 channels: size is 128 / 4 = 32 frames (4 * 32 words)

Since now the McBSP codec supports not only 16bit samples (32biut has been
recently added), the FIFO size handling is no longer correct, since it has
been hard wired for 16bit word length.

The series changes how the users of McBSP are configuring the FIFO:
It used to be 0 based (0 meant 1 word threshold). After this series users can
configure the threshold in 1 base mode (1 means 1 word threshold).
The platform code now provides the _full_ size of the FIFO in words, instead of
the already limited value used in the past.

In ASoC omap-mcbsp code hw_rule based constraint refinement is going to be used
instead of the hardwired static constraint, which was correct only in case of
16bit word length.

The hw_rule is refining the minimum buffer size based on the channel number
going to be used by the coming stream.
In case of threshold mode additional hw_rule refines the maximum allowed period
size.

The series are generated agains Takashi's sound-2.6: topic/asoc branch.

CCing also Eduardo, and Eero since they have worked on the original
FIFO/threshold implementation.

All commetns and testers are welcome!
Peter

---
Peter Ujfalusi (5):
  OMAP: McBSP: Function to query the FIFO size
  OMAP2: McBSP: Change the way how the FIFO is handled
  OMAP2: McBSP: Use the port's buffer_size when calculating tx delay
  ASoC: omap-mcbsp: Save, and use wlen for threshold configuration
  ASoC: omap-mcbsp: Place correct constraints for streams

 arch/arm/mach-omap2/mcbsp.c             |   10 ++--
 arch/arm/plat-omap/include/plat/mcbsp.h |    2 +
 arch/arm/plat-omap/mcbsp.c              |   51 ++++++++++-----
 sound/soc/omap/omap-mcbsp.c             |  113 ++++++++++++++++++++++++-------
 4 files changed, 129 insertions(+), 47 deletions(-)

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH v3 1/5] OMAP: McBSP: Function to query the FIFO size
  2010-06-01 11:18 [PATCH v3 0/5] OMAP/ASoC: McBSP: FIFO handling related fixes Peter Ujfalusi
@ 2010-06-01 11:18 ` Peter Ujfalusi
  2010-06-01 11:18 ` [PATCH v3 2/5] OMAP2: McBSP: Change the way how the FIFO is handled Peter Ujfalusi
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 13+ messages in thread
From: Peter Ujfalusi @ 2010-06-01 11:18 UTC (permalink / raw)
  To: alsa-devel, linux-omap
  Cc: broonie, lrg, jhnikula, tony, ext-eero.nurkkala, eduardo.valentin

Users of McBSP can use the omap_mcbsp_get_fifo_size function to query
the size of the McBSP FIFO.
The function will return the FIFO size in words (the HW maximum).

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@nokia.com>
---
 arch/arm/plat-omap/include/plat/mcbsp.h |    2 ++
 arch/arm/plat-omap/mcbsp.c              |   14 ++++++++++++++
 2 files changed, 16 insertions(+), 0 deletions(-)

diff --git a/arch/arm/plat-omap/include/plat/mcbsp.h b/arch/arm/plat-omap/include/plat/mcbsp.h
index 1bd7021..e126951 100644
--- a/arch/arm/plat-omap/include/plat/mcbsp.h
+++ b/arch/arm/plat-omap/include/plat/mcbsp.h
@@ -473,6 +473,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);
+u16 omap_mcbsp_get_fifo_size(unsigned int id);
 u16 omap_mcbsp_get_tx_delay(unsigned int id);
 u16 omap_mcbsp_get_rx_delay(unsigned int id);
 int omap_mcbsp_get_dma_op_mode(unsigned int id);
@@ -483,6 +484,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 u16 omap_mcbsp_get_fifo_size(unsigned int id) { return 0; }
 static inline u16 omap_mcbsp_get_tx_delay(unsigned int id) { return 0; }
 static inline u16 omap_mcbsp_get_rx_delay(unsigned int id) { return 0; }
 static inline int omap_mcbsp_get_dma_op_mode(unsigned int id) { return 0; }
diff --git a/arch/arm/plat-omap/mcbsp.c b/arch/arm/plat-omap/mcbsp.c
index 4820cab..51d8abf 100644
--- a/arch/arm/plat-omap/mcbsp.c
+++ b/arch/arm/plat-omap/mcbsp.c
@@ -559,6 +559,20 @@ u16 omap_mcbsp_get_max_rx_threshold(unsigned int id)
 }
 EXPORT_SYMBOL(omap_mcbsp_get_max_rx_threshold);
 
+u16 omap_mcbsp_get_fifo_size(unsigned int id)
+{
+	struct omap_mcbsp *mcbsp;
+
+	if (!omap_mcbsp_check_valid_id(id)) {
+		printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
+		return -ENODEV;
+	}
+	mcbsp = id_to_mcbsp_ptr(id);
+
+	return mcbsp->pdata->buffer_size;
+}
+EXPORT_SYMBOL(omap_mcbsp_get_fifo_size);
+
 #define MCBSP2_FIFO_SIZE	0x500 /* 1024 + 256 locations */
 #define MCBSP1345_FIFO_SIZE	0x80  /* 128 locations */
 /*
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v3 2/5] OMAP2: McBSP: Change the way how the FIFO is handled
  2010-06-01 11:18 [PATCH v3 0/5] OMAP/ASoC: McBSP: FIFO handling related fixes Peter Ujfalusi
  2010-06-01 11:18 ` [PATCH v3 1/5] OMAP: McBSP: Function to query the FIFO size Peter Ujfalusi
@ 2010-06-01 11:18 ` Peter Ujfalusi
  2010-06-01 11:18 ` [PATCH v3 3/5] OMAP2: McBSP: Use the port's buffer_size when calculating tx delay Peter Ujfalusi
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 13+ messages in thread
From: Peter Ujfalusi @ 2010-06-01 11:18 UTC (permalink / raw)
  To: alsa-devel, linux-omap
  Cc: broonie, lrg, jhnikula, tony, ext-eero.nurkkala, eduardo.valentin

Use the actual FIFO size in words as buffer_size on OMAP2.
Change the threshold configuration to use 1 based numbering, when
specifying the allowed threshold maximum or the McBSP threshold value.
Set the default maximum threshold to (buffer_size - 0x10) intialy.
>From users of McBSP, now it is expected to use this method.
Asking for threshold 1 means that the value written to threshold registers
are going to be 0, which means 1 word threshold.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@nokia.com>
---
 arch/arm/mach-omap2/mcbsp.c |   10 +++++-----
 arch/arm/plat-omap/mcbsp.c  |   30 ++++++++++++++++++++----------
 2 files changed, 25 insertions(+), 15 deletions(-)

diff --git a/arch/arm/mach-omap2/mcbsp.c b/arch/arm/mach-omap2/mcbsp.c
index 016fe60..ed9f562 100644
--- a/arch/arm/mach-omap2/mcbsp.c
+++ b/arch/arm/mach-omap2/mcbsp.c
@@ -132,7 +132,7 @@ static struct omap_mcbsp_platform_data omap34xx_mcbsp_pdata[] = {
 		.rx_irq		= INT_24XX_MCBSP1_IRQ_RX,
 		.tx_irq		= INT_24XX_MCBSP1_IRQ_TX,
 		.ops		= &omap2_mcbsp_ops,
-		.buffer_size	= 0x6F,
+		.buffer_size	= 0x80, /* The FIFO has 128 locations */
 	},
 	{
 		.phys_base	= OMAP34XX_MCBSP2_BASE,
@@ -142,7 +142,7 @@ static struct omap_mcbsp_platform_data omap34xx_mcbsp_pdata[] = {
 		.rx_irq		= INT_24XX_MCBSP2_IRQ_RX,
 		.tx_irq		= INT_24XX_MCBSP2_IRQ_TX,
 		.ops		= &omap2_mcbsp_ops,
-		.buffer_size	= 0x3FF,
+		.buffer_size	= 0x500, /* The FIFO has 1024 + 256 locations */
 	},
 	{
 		.phys_base	= OMAP34XX_MCBSP3_BASE,
@@ -152,7 +152,7 @@ static struct omap_mcbsp_platform_data omap34xx_mcbsp_pdata[] = {
 		.rx_irq		= INT_24XX_MCBSP3_IRQ_RX,
 		.tx_irq		= INT_24XX_MCBSP3_IRQ_TX,
 		.ops		= &omap2_mcbsp_ops,
-		.buffer_size	= 0x6F,
+		.buffer_size	= 0x80, /* The FIFO has 128 locations */
 	},
 	{
 		.phys_base	= OMAP34XX_MCBSP4_BASE,
@@ -161,7 +161,7 @@ static struct omap_mcbsp_platform_data omap34xx_mcbsp_pdata[] = {
 		.rx_irq		= INT_24XX_MCBSP4_IRQ_RX,
 		.tx_irq		= INT_24XX_MCBSP4_IRQ_TX,
 		.ops		= &omap2_mcbsp_ops,
-		.buffer_size	= 0x6F,
+		.buffer_size	= 0x80, /* The FIFO has 128 locations */
 	},
 	{
 		.phys_base	= OMAP34XX_MCBSP5_BASE,
@@ -170,7 +170,7 @@ static struct omap_mcbsp_platform_data omap34xx_mcbsp_pdata[] = {
 		.rx_irq		= INT_24XX_MCBSP5_IRQ_RX,
 		.tx_irq		= INT_24XX_MCBSP5_IRQ_TX,
 		.ops		= &omap2_mcbsp_ops,
-		.buffer_size	= 0x6F,
+		.buffer_size	= 0x80, /* The FIFO has 128 locations */
 	},
 };
 #define OMAP34XX_MCBSP_PDATA_SZ		ARRAY_SIZE(omap34xx_mcbsp_pdata)
diff --git a/arch/arm/plat-omap/mcbsp.c b/arch/arm/plat-omap/mcbsp.c
index 51d8abf..d883bbf 100644
--- a/arch/arm/plat-omap/mcbsp.c
+++ b/arch/arm/plat-omap/mcbsp.c
@@ -480,9 +480,9 @@ int omap_st_is_enabled(unsigned int id)
 EXPORT_SYMBOL(omap_st_is_enabled);
 
 /*
- * omap_mcbsp_set_tx_threshold configures how to deal
- * with transmit threshold. the threshold value and handler can be
- * configure in here.
+ * omap_mcbsp_set_rx_threshold configures the transmit threshold in words.
+ * The threshold parameter is 1 based, and it is converted (threshold - 1)
+ * for the THRSH2 register.
  */
 void omap_mcbsp_set_tx_threshold(unsigned int id, u16 threshold)
 {
@@ -497,14 +497,15 @@ void omap_mcbsp_set_tx_threshold(unsigned int id, u16 threshold)
 	}
 	mcbsp = id_to_mcbsp_ptr(id);
 
-	MCBSP_WRITE(mcbsp, THRSH2, threshold);
+	if (threshold && threshold <= mcbsp->max_tx_thres)
+		MCBSP_WRITE(mcbsp, THRSH2, threshold - 1);
 }
 EXPORT_SYMBOL(omap_mcbsp_set_tx_threshold);
 
 /*
- * omap_mcbsp_set_rx_threshold configures how to deal
- * with receive threshold. the threshold value and handler can be
- * configure in here.
+ * omap_mcbsp_set_rx_threshold configures the receive threshold in words.
+ * The threshold parameter is 1 based, and it is converted (threshold - 1)
+ * for the THRSH1 register.
  */
 void omap_mcbsp_set_rx_threshold(unsigned int id, u16 threshold)
 {
@@ -519,7 +520,8 @@ void omap_mcbsp_set_rx_threshold(unsigned int id, u16 threshold)
 	}
 	mcbsp = id_to_mcbsp_ptr(id);
 
-	MCBSP_WRITE(mcbsp, THRSH1, threshold);
+	if (threshold && threshold <= mcbsp->max_rx_thres)
+		MCBSP_WRITE(mcbsp, THRSH1, threshold - 1);
 }
 EXPORT_SYMBOL(omap_mcbsp_set_rx_threshold);
 
@@ -1696,8 +1698,16 @@ 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);
+		/*
+		 * Initially configure the maximum thresholds to a safe value.
+		 * The McBSP FIFO usage with these values should not go under
+		 * 16 locations.
+		 * If the whole FIFO without safety buffer is used, than there
+		 * is a possibility that the DMA will be not able to push the
+		 * new data on time, causing channel shifts in runtime.
+		 */
+		mcbsp->max_tx_thres = max_thres(mcbsp) - 0x10;
+		mcbsp->max_rx_thres = max_thres(mcbsp) - 0x10;
 		/*
 		 * REVISIT: Set dmap_op_mode to THRESHOLD as default
 		 * for mcbsp2 instances.
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v3 3/5] OMAP2: McBSP: Use the port's buffer_size when calculating tx delay
  2010-06-01 11:18 [PATCH v3 0/5] OMAP/ASoC: McBSP: FIFO handling related fixes Peter Ujfalusi
  2010-06-01 11:18 ` [PATCH v3 1/5] OMAP: McBSP: Function to query the FIFO size Peter Ujfalusi
  2010-06-01 11:18 ` [PATCH v3 2/5] OMAP2: McBSP: Change the way how the FIFO is handled Peter Ujfalusi
@ 2010-06-01 11:18 ` Peter Ujfalusi
  2010-06-01 11:18 ` [PATCH v3 4/5] ASoC: omap-mcbsp: Save, and use wlen for threshold configuration Peter Ujfalusi
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 13+ messages in thread
From: Peter Ujfalusi @ 2010-06-01 11:18 UTC (permalink / raw)
  To: alsa-devel, linux-omap
  Cc: broonie, lrg, jhnikula, tony, ext-eero.nurkkala, eduardo.valentin

Sicne the platform data's buffer_size now holds the full size
of the FIFO, there is no longer need to handle the ports
differently.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@nokia.com>
---
 arch/arm/plat-omap/mcbsp.c |    7 +------
 1 files changed, 1 insertions(+), 6 deletions(-)

diff --git a/arch/arm/plat-omap/mcbsp.c b/arch/arm/plat-omap/mcbsp.c
index d883bbf..ac09c79 100644
--- a/arch/arm/plat-omap/mcbsp.c
+++ b/arch/arm/plat-omap/mcbsp.c
@@ -575,8 +575,6 @@ u16 omap_mcbsp_get_fifo_size(unsigned int id)
 }
 EXPORT_SYMBOL(omap_mcbsp_get_fifo_size);
 
-#define MCBSP2_FIFO_SIZE	0x500 /* 1024 + 256 locations */
-#define MCBSP1345_FIFO_SIZE	0x80  /* 128 locations */
 /*
  * omap_mcbsp_get_tx_delay returns the number of used slots in the McBSP FIFO
  */
@@ -595,10 +593,7 @@ u16 omap_mcbsp_get_tx_delay(unsigned int id)
 	buffstat = MCBSP_READ(mcbsp, XBUFFSTAT);
 
 	/* Number of slots are different in McBSP ports */
-	if (mcbsp->id == 2)
-		return MCBSP2_FIFO_SIZE - buffstat;
-	else
-		return MCBSP1345_FIFO_SIZE - buffstat;
+	return mcbsp->pdata->buffer_size - buffstat;
 }
 EXPORT_SYMBOL(omap_mcbsp_get_tx_delay);
 
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v3 4/5] ASoC: omap-mcbsp: Save, and use wlen for threshold configuration
  2010-06-01 11:18 [PATCH v3 0/5] OMAP/ASoC: McBSP: FIFO handling related fixes Peter Ujfalusi
                   ` (2 preceding siblings ...)
  2010-06-01 11:18 ` [PATCH v3 3/5] OMAP2: McBSP: Use the port's buffer_size when calculating tx delay Peter Ujfalusi
@ 2010-06-01 11:18 ` Peter Ujfalusi
  2010-06-01 11:18 ` [PATCH v3 5/5] ASoC: omap-mcbsp: Place correct constraints for streams Peter Ujfalusi
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 13+ messages in thread
From: Peter Ujfalusi @ 2010-06-01 11:18 UTC (permalink / raw)
  To: alsa-devel, linux-omap
  Cc: broonie, lrg, jhnikula, tony, ext-eero.nurkkala, eduardo.valentin

Save the word length configuration of McBSP, and use that information
to calculate, and configure the threshold in McBSP.
Previously the calculation was only correct when the stream had 16bit
audio.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@nokia.com>
---
 sound/soc/omap/omap-mcbsp.c |   14 +++++++++-----
 1 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/sound/soc/omap/omap-mcbsp.c b/sound/soc/omap/omap-mcbsp.c
index 6f44cb4..b06d8f1 100644
--- a/sound/soc/omap/omap-mcbsp.c
+++ b/sound/soc/omap/omap-mcbsp.c
@@ -59,6 +59,7 @@ struct omap_mcbsp_data {
 	int				configured;
 	unsigned int			in_freq;
 	int				clk_div;
+	int				wlen;
 };
 
 #define to_mcbsp(priv)	container_of((priv), struct omap_mcbsp_data, bus_id)
@@ -155,19 +156,21 @@ static void omap_mcbsp_set_threshold(struct snd_pcm_substream *substream)
 	struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
 	struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data);
 	int dma_op_mode = omap_mcbsp_get_dma_op_mode(mcbsp_data->bus_id);
-	int samples;
+	int words;
 
 	/* TODO: Currently, MODE_ELEMENT == MODE_FRAME */
 	if (dma_op_mode == MCBSP_DMA_MODE_THRESHOLD)
-		samples = snd_pcm_lib_period_bytes(substream) >> 1;
+		/* The FIFO size depends on the McBSP word configuration */
+		words = snd_pcm_lib_period_bytes(substream) /
+							(mcbsp_data->wlen / 8);
 	else
-		samples = 1;
+		words = 1;
 
 	/* Configure McBSP internal buffer usage */
 	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-		omap_mcbsp_set_tx_threshold(mcbsp_data->bus_id, samples - 1);
+		omap_mcbsp_set_tx_threshold(mcbsp_data->bus_id, words);
 	else
-		omap_mcbsp_set_rx_threshold(mcbsp_data->bus_id, samples - 1);
+		omap_mcbsp_set_rx_threshold(mcbsp_data->bus_id, words);
 }
 
 static int omap_mcbsp_dai_startup(struct snd_pcm_substream *substream,
@@ -409,6 +412,7 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream,
 	}
 
 	omap_mcbsp_config(bus_id, &mcbsp_data->regs);
+	mcbsp_data->wlen = wlen;
 	mcbsp_data->configured = 1;
 
 	return 0;
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v3 5/5] ASoC: omap-mcbsp: Place correct constraints for streams
  2010-06-01 11:18 [PATCH v3 0/5] OMAP/ASoC: McBSP: FIFO handling related fixes Peter Ujfalusi
                   ` (3 preceding siblings ...)
  2010-06-01 11:18 ` [PATCH v3 4/5] ASoC: omap-mcbsp: Save, and use wlen for threshold configuration Peter Ujfalusi
@ 2010-06-01 11:18 ` Peter Ujfalusi
  2010-06-01 12:19   ` Peter Ujfalusi
  2010-06-01 11:40 ` [PATCH v3 0/5] OMAP/ASoC: McBSP: FIFO handling related fixes Jarkko Nikula
                   ` (2 subsequent siblings)
  7 siblings, 1 reply; 13+ messages in thread
From: Peter Ujfalusi @ 2010-06-01 11:18 UTC (permalink / raw)
  To: alsa-devel, linux-omap
  Cc: broonie, lrg, jhnikula, tony, ext-eero.nurkkala, eduardo.valentin

OMAP McBSP FIFO is word structured:
McBSP2 has 1024 + 256 = 1280 word long buffer,
McBSP1,3,4,5 has 128 word long buffer

This means, that the size of the FIFO
depends on the McBSP word size configuration.
For example on McBSP3:
16bit samples: size is 128 * 2 = 256 bytes
32bit samples: size is 128 * 4 = 512 bytes
It is simpler to place constraint for buffer and period based on channels.
McBSP3 as example again (16 or 32 bit samples):
1 channel (mono): size is 128 frames (128 words)
2 channels (stereo): size is 128 / 2 = 64 frames (2 * 64 words)
4 channels: size is 128 / 4 = 32 frames (4 * 32 words)

Use the second method to place hw_rule on buffer size, and in threshold
mode to period size.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@nokia.com>
---
 sound/soc/omap/omap-mcbsp.c |   99 ++++++++++++++++++++++++++++++++++---------
 1 files changed, 78 insertions(+), 21 deletions(-)

diff --git a/sound/soc/omap/omap-mcbsp.c b/sound/soc/omap/omap-mcbsp.c
index b06d8f1..8a55c9a 100644
--- a/sound/soc/omap/omap-mcbsp.c
+++ b/sound/soc/omap/omap-mcbsp.c
@@ -173,6 +173,51 @@ static void omap_mcbsp_set_threshold(struct snd_pcm_substream *substream)
 		omap_mcbsp_set_rx_threshold(mcbsp_data->bus_id, words);
 }
 
+static int omap_mcbsp_hwrule_min_buffersize(struct snd_pcm_hw_params *params,
+				    struct snd_pcm_hw_rule *rule)
+{
+	struct snd_interval *buffer_size = hw_param_interval(params,
+					SNDRV_PCM_HW_PARAM_BUFFER_SIZE);
+	struct snd_interval *channels = hw_param_interval(params,
+					SNDRV_PCM_HW_PARAM_CHANNELS);
+	struct omap_mcbsp_data *mcbsp_data = rule->private;
+	struct snd_interval frames;
+	int size;
+
+	snd_interval_any(&frames);
+	size = omap_mcbsp_get_fifo_size(mcbsp_data->bus_id);
+
+	frames.min = size / channels->min;
+	frames.integer = 1;
+	return snd_interval_refine(buffer_size, &frames);
+
+}
+
+static int omap_mcbsp_hwrule_max_periodsize(struct snd_pcm_hw_params *params,
+				    struct snd_pcm_hw_rule *rule)
+{
+	struct snd_interval *period_size = hw_param_interval(params,
+					SNDRV_PCM_HW_PARAM_PERIOD_SIZE);
+	struct snd_interval *channels = hw_param_interval(params,
+					SNDRV_PCM_HW_PARAM_CHANNELS);
+	struct snd_pcm_substream *substream = rule->private;
+	struct snd_soc_pcm_runtime *rtd = substream->private_data;
+	struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
+	struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data);
+	struct snd_interval frames;
+	int size;
+
+	snd_interval_any(&frames);
+	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
+		size = omap_mcbsp_get_max_tx_threshold(mcbsp_data->bus_id);
+	else
+		size = omap_mcbsp_get_max_rx_threshold(mcbsp_data->bus_id);
+
+	frames.max = size / channels->min;
+	frames.integer = 1;
+	return snd_interval_refine(period_size, &frames);
+}
+
 static int omap_mcbsp_dai_startup(struct snd_pcm_substream *substream,
 				  struct snd_soc_dai *dai)
 {
@@ -185,33 +230,45 @@ static int omap_mcbsp_dai_startup(struct snd_pcm_substream *substream,
 	if (!cpu_dai->active)
 		err = omap_mcbsp_request(bus_id);
 
+	/*
+	 * OMAP3 McBSP FIFO is word structured.
+	 * McBSP2 has 1024 + 256 = 1280 word long buffer,
+	 * McBSP1,3,4,5 has 128 word long buffer
+	 * This means that the size of the FIFO depends on the sample format.
+	 * For example on McBSP3:
+	 * 16bit samples: size is 128 * 2 = 256 bytes
+	 * 32bit samples: size is 128 * 4 = 512 bytes
+	 * It is simpler to place constraint for buffer and period based on
+	 * channels.
+	 * McBSP3 as example again (16 or 32 bit samples):
+	 * 1 channel (mono): size is 128 frames (128 words)
+	 * 2 channels (stereo): size is 128 / 2 = 64 frames (2 * 64 words)
+	 * 4 channels: size is 128 / 4 = 32 frames (4 * 32 words)
+	 */
 	if (cpu_is_omap343x()) {
 		int dma_op_mode = omap_mcbsp_get_dma_op_mode(bus_id);
-		int max_period;
 
 		/*
-		 * McBSP2 in OMAP3 has 1024 * 32-bit internal audio buffer.
-		 * Set constraint for minimum buffer size to the same than FIFO
-		 * size in order to avoid underruns in playback startup because
-		 * HW is keeping the DMA request active until FIFO is filled.
-		 */
-		if (bus_id == 1)
-			snd_pcm_hw_constraint_minmax(substream->runtime,
-					SNDRV_PCM_HW_PARAM_BUFFER_BYTES,
-					4096, UINT_MAX);
-
-		if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-			max_period = omap_mcbsp_get_max_tx_threshold(bus_id);
-		else
-			max_period = omap_mcbsp_get_max_rx_threshold(bus_id);
-
-		max_period++;
-		max_period <<= 1;
+		* The first rule is for the buffer size, we should not allow
+		* smaller buffer than the FIFO size to avoid underruns
+		*/
+		snd_pcm_hw_rule_add(substream->runtime, 0,
+				    SNDRV_PCM_HW_PARAM_CHANNELS,
+				    omap_mcbsp_hwrule_min_buffersize,
+				    mcbsp_data,
+				    SNDRV_PCM_HW_PARAM_BUFFER_SIZE, -1);
 
+		/*
+		 * In case of threshold mode, the rule will ensure, that the
+		 * period size is not bigger than the maximum allowed threshold
+		 * value.
+		 */
 		if (dma_op_mode == MCBSP_DMA_MODE_THRESHOLD)
-			snd_pcm_hw_constraint_minmax(substream->runtime,
-						SNDRV_PCM_HW_PARAM_PERIOD_BYTES,
-						32, max_period);
+			snd_pcm_hw_rule_add(substream->runtime, 0,
+					    SNDRV_PCM_HW_PARAM_CHANNELS,
+					    omap_mcbsp_hwrule_max_periodsize,
+					    substream,
+					    SNDRV_PCM_HW_PARAM_PERIOD_SIZE, -1);
 	}
 
 	return err;
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 0/5]  OMAP/ASoC: McBSP: FIFO handling related fixes
  2010-06-01 11:18 [PATCH v3 0/5] OMAP/ASoC: McBSP: FIFO handling related fixes Peter Ujfalusi
                   ` (4 preceding siblings ...)
  2010-06-01 11:18 ` [PATCH v3 5/5] ASoC: omap-mcbsp: Place correct constraints for streams Peter Ujfalusi
@ 2010-06-01 11:40 ` Jarkko Nikula
  2010-06-01 12:30 ` Mark Brown
  2010-06-02  9:05 ` [alsa-devel] " Peter Ujfalusi
  7 siblings, 0 replies; 13+ messages in thread
From: Jarkko Nikula @ 2010-06-01 11:40 UTC (permalink / raw)
  To: Peter Ujfalusi
  Cc: alsa-devel, linux-omap, broonie, lrg, tony, ext-eero.nurkkala,
	eduardo.valentin

On Tue,  1 Jun 2010 14:18:19 +0300
Peter Ujfalusi <peter.ujfalusi@nokia.com> wrote:

> Hello,
> 
> Changes since RFC v2:
> - Comments added explaining the changes, and documenting the API in patch2
> - In patch5:
>  - Variable names changed in the hw_rule function
>  - hw_rule function got renamed
>  - The snd_pcm_hw_rule_add calls moved so it anly got set on OMAP3
> 
To whole series:

Acked-by: Jarkko Nikula <jhnikula@gmail.com>

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 5/5] ASoC: omap-mcbsp: Place correct constraints for streams
  2010-06-01 11:18 ` [PATCH v3 5/5] ASoC: omap-mcbsp: Place correct constraints for streams Peter Ujfalusi
@ 2010-06-01 12:19   ` Peter Ujfalusi
  0 siblings, 0 replies; 13+ messages in thread
From: Peter Ujfalusi @ 2010-06-01 12:19 UTC (permalink / raw)
  To: alsa-devel
  Cc: tony, broonie, Valentin Eduardo (Nokia-D/Helsinki),
	Nurkkala Eero.An (EXT-Offcode/Oulu),
	linux-omap, lrg

Hi,

On Tuesday 01 June 2010 14:18:24 Ujfalusi Peter (Nokia-D/Tampere) wrote:

...

> +static int omap_mcbsp_hwrule_min_buffersize(struct snd_pcm_hw_params
> *params, +				    struct snd_pcm_hw_rule *rule)
> +{
> +	struct snd_interval *buffer_size = hw_param_interval(params,
> +					SNDRV_PCM_HW_PARAM_BUFFER_SIZE);
> +	struct snd_interval *channels = hw_param_interval(params,
> +					SNDRV_PCM_HW_PARAM_CHANNELS);
> +	struct omap_mcbsp_data *mcbsp_data = rule->private;
> +	struct snd_interval frames;
> +	int size;
> +
> +	snd_interval_any(&frames);
> +	size = omap_mcbsp_get_fifo_size(mcbsp_data->bus_id);
> +
> +	frames.min = size / channels->min;
> +	frames.integer = 1;
> +	return snd_interval_refine(buffer_size, &frames);
> +
> +}

Just noticed this extra line after the return...
Should I resend?

-- 
Péter

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 0/5]  OMAP/ASoC: McBSP: FIFO handling related fixes
  2010-06-01 11:18 [PATCH v3 0/5] OMAP/ASoC: McBSP: FIFO handling related fixes Peter Ujfalusi
                   ` (5 preceding siblings ...)
  2010-06-01 11:40 ` [PATCH v3 0/5] OMAP/ASoC: McBSP: FIFO handling related fixes Jarkko Nikula
@ 2010-06-01 12:30 ` Mark Brown
  2010-06-02  9:05 ` [alsa-devel] " Peter Ujfalusi
  7 siblings, 0 replies; 13+ messages in thread
From: Mark Brown @ 2010-06-01 12:30 UTC (permalink / raw)
  To: Peter Ujfalusi
  Cc: alsa-devel, linux-omap, lrg, jhnikula, tony, ext-eero.nurkkala,
	eduardo.valentin

On Tue, Jun 01, 2010 at 02:18:19PM +0300, Peter Ujfalusi wrote:

> Changes since RFC v2:
> - Comments added explaining the changes, and documenting the API in patch2
> - In patch5:
>  - Variable names changed in the hw_rule function
>  - hw_rule function got renamed
>  - The snd_pcm_hw_rule_add calls moved so it anly got set on OMAP3

All of these look sensible enough from an ASoC point of view, though I
can't say too much about the OMAP specifics.

Acked-by: Mark Brown <broonie@opensource.wolsfonmicro.com>

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [alsa-devel] [PATCH v3 0/5] OMAP/ASoC: McBSP: FIFO handling related fixes
  2010-06-01 11:18 [PATCH v3 0/5] OMAP/ASoC: McBSP: FIFO handling related fixes Peter Ujfalusi
                   ` (6 preceding siblings ...)
  2010-06-01 12:30 ` Mark Brown
@ 2010-06-02  9:05 ` Peter Ujfalusi
  2010-06-02  9:15   ` Liam Girdwood
  7 siblings, 1 reply; 13+ messages in thread
From: Peter Ujfalusi @ 2010-06-02  9:05 UTC (permalink / raw)
  To: alsa-devel
  Cc: linux-omap, tony, broonie, Valentin Eduardo (Nokia-D/Helsinki),
	Nurkkala Eero.An (EXT-Offcode/Oulu),
	lrg

Hi,

On Tuesday 01 June 2010 14:18:19 Ujfalusi Peter (Nokia-D/Tampere) wrote:

..

Liam if you are going to take the series, could you fix the patch names?
I can also resend them if it is easier for you.

> ---
> Peter Ujfalusi (5):
>   OMAP: McBSP: Function to query the FIFO size
>   OMAP2: McBSP: Change the way how the FIFO is handled
>   OMAP2: McBSP: Use the port's buffer_size when calculating tx delay

These two are not for OMAP2, but OMAP3
I really don't know how it happened, that I left the OMAP2 there, since I have 
noticed it in the first RFC series..


>   ASoC: omap-mcbsp: Save, and use wlen for threshold configuration
>   ASoC: omap-mcbsp: Place correct constraints for streams
> 
>  arch/arm/mach-omap2/mcbsp.c             |   10 ++--
>  arch/arm/plat-omap/include/plat/mcbsp.h |    2 +
>  arch/arm/plat-omap/mcbsp.c              |   51 ++++++++++-----
>  sound/soc/omap/omap-mcbsp.c             |  113
> ++++++++++++++++++++++++------- 4 files changed, 129 insertions(+), 47
> deletions(-)

Thank you,
Péter
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 0/5] OMAP/ASoC: McBSP: FIFO handling related fixes
  2010-06-02  9:05 ` [alsa-devel] " Peter Ujfalusi
@ 2010-06-02  9:15   ` Liam Girdwood
  2010-06-02 12:14     ` Peter Ujfalusi
  0 siblings, 1 reply; 13+ messages in thread
From: Liam Girdwood @ 2010-06-02  9:15 UTC (permalink / raw)
  To: Peter Ujfalusi
  Cc: alsa-devel, tony, broonie, Valentin Eduardo (Nokia-D/Helsinki),
	Nurkkala Eero.An (EXT-Offcode/Oulu),
	linux-omap

On Wed, 2010-06-02 at 12:05 +0300, Peter Ujfalusi wrote:
> Hi,
> 
> On Tuesday 01 June 2010 14:18:19 Ujfalusi Peter (Nokia-D/Tampere) wrote:
> 
> ..
> 
> Liam if you are going to take the series, could you fix the patch names?
> I can also resend them if it is easier for you.
> 

Peter, I think it's probably better if you can resend. Can you also
append the Acks too.

Tony, do we have your ack too ?

Thanks

Liam

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 0/5] OMAP/ASoC: McBSP: FIFO handling related fixes
  2010-06-02  9:15   ` Liam Girdwood
@ 2010-06-02 12:14     ` Peter Ujfalusi
  2010-06-10  6:27       ` [alsa-devel] " Tony Lindgren
  0 siblings, 1 reply; 13+ messages in thread
From: Peter Ujfalusi @ 2010-06-02 12:14 UTC (permalink / raw)
  To: ext Liam Girdwood
  Cc: alsa-devel, Tony Lindgren, broonie,
	Valentin Eduardo (Nokia-D/Helsinki),
	Nurkkala Eero.An (EXT-Offcode/Oulu),
	linux-omap

On Wednesday 02 June 2010 12:15:22 ext Liam Girdwood wrote:
> On Wed, 2010-06-02 at 12:05 +0300, Peter Ujfalusi wrote:
> > Hi,
> > 
> > On Tuesday 01 June 2010 14:18:19 Ujfalusi Peter (Nokia-D/Tampere) wrote:
> > 
> > ..
> > 
> > Liam if you are going to take the series, could you fix the patch names?
> > I can also resend them if it is easier for you.
> 
> Peter, I think it's probably better if you can resend. Can you also
> append the Acks too.
> 
> Tony, do we have your ack too ?

No problem, I'll wait for Tony's ack, and resend the series.

> 
> Thanks
> 
> Liam

-- 
Péter
_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [alsa-devel] [PATCH v3 0/5] OMAP/ASoC: McBSP: FIFO handling related fixes
  2010-06-02 12:14     ` Peter Ujfalusi
@ 2010-06-10  6:27       ` Tony Lindgren
  0 siblings, 0 replies; 13+ messages in thread
From: Tony Lindgren @ 2010-06-10  6:27 UTC (permalink / raw)
  To: Peter Ujfalusi
  Cc: ext Liam Girdwood, alsa-devel, broonie,
	Valentin Eduardo (Nokia-D/Helsinki),
	Nurkkala Eero.An (EXT-Offcode/Oulu),
	linux-omap

* Peter Ujfalusi <peter.ujfalusi@nokia.com> [100602 15:09]:
> On Wednesday 02 June 2010 12:15:22 ext Liam Girdwood wrote:
> > On Wed, 2010-06-02 at 12:05 +0300, Peter Ujfalusi wrote:
> > > Hi,
> > > 
> > > On Tuesday 01 June 2010 14:18:19 Ujfalusi Peter (Nokia-D/Tampere) wrote:
> > > 
> > > ..
> > > 
> > > Liam if you are going to take the series, could you fix the patch names?
> > > I can also resend them if it is easier for you.
> > 
> > Peter, I think it's probably better if you can resend. Can you also
> > append the Acks too.
> > 
> > Tony, do we have your ack too ?
> 
> No problem, I'll wait for Tony's ack, and resend the series.

Hmm, I thought I already acked these.. Anyways, the whole series
looks good to me:

Acked-by: Tony Lindgren <tony@atomide.com>

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2010-06-10  6:27 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-06-01 11:18 [PATCH v3 0/5] OMAP/ASoC: McBSP: FIFO handling related fixes Peter Ujfalusi
2010-06-01 11:18 ` [PATCH v3 1/5] OMAP: McBSP: Function to query the FIFO size Peter Ujfalusi
2010-06-01 11:18 ` [PATCH v3 2/5] OMAP2: McBSP: Change the way how the FIFO is handled Peter Ujfalusi
2010-06-01 11:18 ` [PATCH v3 3/5] OMAP2: McBSP: Use the port's buffer_size when calculating tx delay Peter Ujfalusi
2010-06-01 11:18 ` [PATCH v3 4/5] ASoC: omap-mcbsp: Save, and use wlen for threshold configuration Peter Ujfalusi
2010-06-01 11:18 ` [PATCH v3 5/5] ASoC: omap-mcbsp: Place correct constraints for streams Peter Ujfalusi
2010-06-01 12:19   ` Peter Ujfalusi
2010-06-01 11:40 ` [PATCH v3 0/5] OMAP/ASoC: McBSP: FIFO handling related fixes Jarkko Nikula
2010-06-01 12:30 ` Mark Brown
2010-06-02  9:05 ` [alsa-devel] " Peter Ujfalusi
2010-06-02  9:15   ` Liam Girdwood
2010-06-02 12:14     ` Peter Ujfalusi
2010-06-10  6:27       ` [alsa-devel] " Tony Lindgren

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.