[Sound-open-firmware] [PATCH] ssp: return after draining finished

Keyon Jie yang.jie at linux.intel.com
Mon Oct 24 04:46:20 CEST 2016


To prevent the consequent command arrive when we are
at substates.

Signed-off-by: Keyon Jie <yang.jie at linux.intel.com>
---
 src/drivers/ssp.c | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/src/drivers/ssp.c b/src/drivers/ssp.c
index b7d27d1..77341b6 100644
--- a/src/drivers/ssp.c
+++ b/src/drivers/ssp.c
@@ -39,6 +39,7 @@
 #include <reef/lock.h>
 #include <reef/work.h>
 #include <reef/trace.h>
+#include <reef/wait.h>
 
 /* SSCR0 bits */
 #define SSCR0_DSS_MASK	(0x0000000f)
@@ -132,6 +133,8 @@ struct ssp_pdata {
 	struct work work;
 	spinlock_t lock;
 	uint32_t state[2];		/* SSP_STATE_ for each direction */
+	completion_t drain_complete;
+
 };
 
 static inline void ssp_write(struct dai *dai, uint32_t reg, uint32_t value)
@@ -401,6 +404,7 @@ static uint32_t ssp_drain_work(void *data, uint32_t udelay)
 		ssp_stop(dai, STREAM_DIRECTION_PLAYBACK);
 	else
 		ssp_pause(dai, STREAM_DIRECTION_PLAYBACK);
+	wait_completed(&ssp->drain_complete);
 	return 0;
 }
 
@@ -438,7 +442,11 @@ static int ssp_trigger(struct dai *dai, int cmd, int direction)
 		if (direction == STREAM_DIRECTION_PLAYBACK) {
 			ssp->state[STREAM_DIRECTION_PLAYBACK] =
 				SSP_STATE_PAUSING;
-			work_schedule_default(&ssp->work, 1000);
+			/* make sure the maximum 256 bytes are drained */
+			work_schedule_default(&ssp->work, 1333);
+			wait_init(&ssp->drain_complete);
+			ssp->drain_complete.timeout = 1500;
+			wait_for_completion_timeout(&ssp->drain_complete);
 		} else
 			ssp_pause(dai, direction);
 		break;
@@ -453,6 +461,9 @@ static int ssp_trigger(struct dai *dai, int cmd, int direction)
 			ssp->state[STREAM_DIRECTION_PLAYBACK] =
 				SSP_STATE_DRAINING;
 			work_schedule_default(&ssp->work, 2000);
+			wait_init(&ssp->drain_complete);
+			ssp->drain_complete.timeout = 3000;
+			wait_for_completion_timeout(&ssp->drain_complete);
 		} else
 			ssp_stop(dai, direction);
 		break;
-- 
2.5.0



More information about the Sound-open-firmware mailing list