mailman.alsa-project.org
Sign In Sign Up
Manage this list Sign In Sign Up

Keyboard Shortcuts

Thread View

  • j: Next unread message
  • k: Previous unread message
  • j a: Jump to all threads
  • j l: Jump to MailingList overview

Sound-open-firmware

Thread Start a new thread
Download
Threads by month
  • ----- 2025 -----
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2024 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2023 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2022 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2021 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2020 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2019 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2018 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2017 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2016 -----
  • December
  • November
  • October
sound-open-firmware@alsa-project.org

  • 1572 discussions
[Sound-open-firmware] [PATCH] dw-dma: fix dsp local memory mapping issue
by Keyon Jie 09 Dec '16

09 Dec '16
for DMA controller, we need mask dsp local memory before setting it to DMAC registers, otherwise, DMAC will locate to wrong memory address. Signed-off-by: Keyon Jie <yang.jie(a)linux.intel.com> --- src/drivers/dw-dma.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/drivers/dw-dma.c b/src/drivers/dw-dma.c index 8834ca3..33c0d87 100644 --- a/src/drivers/dw-dma.c +++ b/src/drivers/dw-dma.c @@ -633,15 +633,15 @@ static int dw_dma_set_config(struct dma *dma, int channel, case DMA_DIR_MEM_TO_MEM: lli_desc->ctrl_lo |= DW_CTLL_FC_M2M; lli_desc->ctrl_lo |= DW_CTLL_SRC_INC | DW_CTLL_DST_INC; - lli_desc->sar = (uint32_t)sg_elem->src; - lli_desc->dar = (uint32_t)sg_elem->dest; + lli_desc->sar = (uint32_t)sg_elem->src | PLATFORM_HOST_DMA_MASK; + lli_desc->dar = (uint32_t)sg_elem->dest | PLATFORM_HOST_DMA_MASK; break; case DMA_DIR_MEM_TO_DEV: lli_desc->ctrl_lo |= DW_CTLL_FC_M2P; lli_desc->ctrl_lo |= DW_CTLL_SRC_INC | DW_CTLL_DST_FIX; p->chan[channel].cfg_hi |= DW_CFGH_DST_PER(config->dest_dev); - lli_desc->sar = (uint32_t)sg_elem->src; + lli_desc->sar = (uint32_t)sg_elem->src | PLATFORM_HOST_DMA_MASK; lli_desc->dar = (uint32_t)sg_elem->dest; break; case DMA_DIR_DEV_TO_MEM: @@ -650,7 +650,7 @@ static int dw_dma_set_config(struct dma *dma, int channel, p->chan[channel].cfg_hi |= DW_CFGH_SRC_PER(config->src_dev); lli_desc->sar = (uint32_t)sg_elem->src; - lli_desc->dar = (uint32_t)sg_elem->dest; + lli_desc->dar = (uint32_t)sg_elem->dest | PLATFORM_HOST_DMA_MASK; break; case DMA_DIR_DEV_TO_DEV: lli_desc->ctrl_lo |= DW_CTLL_FC_P2P; -- 2.5.0
2 1
0 0
[Sound-open-firmware] [PATCH] pipeline: clear buffer content to 0s on new
by Keyon Jie 09 Dec '16

09 Dec '16
We need clear/reset buffer content to 0s each time creating a pipeline buffer, to avoid random noise when using it. Signed-off-by: Keyon Jie <yang.jie(a)linux.intel.com> --- src/audio/pipeline.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/audio/pipeline.c b/src/audio/pipeline.c index f42fa15..50ae768 100644 --- a/src/audio/pipeline.c +++ b/src/audio/pipeline.c @@ -250,6 +250,7 @@ struct comp_buffer *pipeline_buffer_new(struct pipeline *p, trace_pipe_error("ebm"); return NULL; } + bzero(buffer->addr, desc->size); buffer->w_ptr = buffer->r_ptr = buffer->addr; buffer->end_addr = buffer->addr + desc->size; -- 2.7.4
2 1
0 0
[Sound-open-firmware] [PATCH] core: Add dsp-core option for XTENSA compiler
by Sebastien Guiriec 02 Nov '16

02 Nov '16
In order to use native XTENSA compiler the core target needs to be overwite with the good platform. This patch is adding an optional option in order to be able to overwrite the core selection. Example: - Set Xtensa export PATH=$PATH:<PATH>/xtensa/XtDevTools/install/tools/RD-2012.5-linux/XtensaTools ./configure --with-arch=xtensa --with-platform=baytrail --with-dsp-core=CHT_audio_hifiep --with-root-dir=<PATH>/xtensa/XtDevTools/install/tools/RD-2012.5-linux/XtensaTools --host=xtensa CC=xt-xcc OBJCOPY=xt-objcopy OBJDUMP=xt-objdump make make bin Signed-off-by: Sebastien Guiriec <sebastien.guiriec(a)intel.com> --- configure.ac | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/configure.ac b/configure.ac index 5a368b4..71e7795 100644 --- a/configure.ac +++ b/configure.ac @@ -113,6 +113,20 @@ case "$with_platform" in ;; esac +# DSP core support (Optional) +AC_ARG_WITH([dsp-core], + AS_HELP_STRING([--with-dsp-core], [Specify DSP Core]), + [], [with_dsp_core=no]) + +case "$with_dsp_core" in + CHT_audio_hifiep*) + # BXT/CHT DSP Core + XTENSA_CORE="CHT_audio_hifiep" + AC_SUBST(XTENSA_CORE) + ;; + +esac + # Test after CFLAGS set othewise test of cross compiler fails. AM_PROG_AS AM_PROG_AR @@ -157,6 +171,7 @@ echo " Target Architecture: ${ARCH} Target Platform: ${PLATFORM} +Target Core: ${XTENSA_CORE} Compiler: ${CC} CFLAGS: ${CFLAGS} -- 2.9.3 --------------------------------------------------------------------- Intel Corporation SAS (French simplified joint stock company) Registered headquarters: "Les Montalets"- 2, rue de Paris, 92196 Meudon Cedex, France Registration Number: 302 456 199 R.C.S. NANTERRE Capital: 4,572,000 Euros This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). Any review or distribution by others is strictly prohibited. If you are not the intended recipient, please contact the sender and delete all copies.
2 1
0 0
[Sound-open-firmware] [PATCH] readme: Fix DSP compiler tool directy setting for platform build
by Sebastien Guiriec 01 Nov '16

01 Nov '16
In order to set the Root directory of the DSP compiler we should use --with-root-dir instead of --with-tool-dir Signed-off-by: Sebastien Guiriec <sebastien.guiriec(a)intel.com> --- README | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README b/README index 9212303..4a38efa 100644 --- a/README +++ b/README @@ -7,11 +7,11 @@ Build Instructions Baytrail :- -./configure --with-arch=xtensa --with-platform=baytrail --with-tool-dir=~/source/reef/xtensa-byt-elf --host=xtensa-byt-elf host_alias=xtensa-byt-elf +./configure --with-arch=xtensa --with-platform=baytrail --with-root-dir=~/source/reef/xtensa-byt-elf --host=xtensa-byt-elf host_alias=xtensa-byt-elf Cherrytrail :- -./configure --with-arch=xtensa --with-platform=cherrytrail --with-tool-dir=~/source/reef/xtensa-byt-elf --host=xtensa-byt-elf host_alias=xtensa-byt-elf +./configure --with-arch=xtensa --with-platform=cherrytrail --with-root-dir=~/source/reef/xtensa-byt-elf --host=xtensa-byt-elf host_alias=xtensa-byt-elf 3) make -- 2.9.3 --------------------------------------------------------------------- Intel Corporation SAS (French simplified joint stock company) Registered headquarters: "Les Montalets"- 2, rue de Paris, 92196 Meudon Cedex, France Registration Number: 302 456 199 R.C.S. NANTERRE Capital: 4,572,000 Euros This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). Any review or distribution by others is strictly prohibited. If you are not the intended recipient, please contact the sender and delete all copies.
2 1
0 0
[Sound-open-firmware] [PATCH v2] platform: baytrail: use package string as the fw version
by Keyon Jie 27 Oct '16

27 Oct '16
On the linux driver side, it need get version infomation from fw, including: type -- Reef version -- major.minor build number last commit id -- gID So here we use the package string, which come from git version, which can provide all those fw version infos. Signed-off-by: Keyon Jie <yang.jie(a)linux.intel.com> --- src/platform/baytrail/platform.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/platform/baytrail/platform.c b/src/platform/baytrail/platform.c index 36d4993..ea3828f 100644 --- a/src/platform/baytrail/platform.c +++ b/src/platform/baytrail/platform.c @@ -57,11 +57,7 @@ static const struct sst_intel_ipc_fw_ready ready = { .outbox_size = MAILBOX_INBOX_SIZE, .fw_info_size = sizeof(struct fw_info), { - .info = { - .name = "REEF", - .date = __DATE__, - .time = __TIME__, - }, + .rsvd = PACKAGE_STRING, }, }; -- 2.7.4
2 1
0 0
[Sound-open-firmware] [PATCH] platform: baytrail: use package string as the fw version
by Keyon Jie 27 Oct '16

27 Oct '16
use the package string, which come from git version, as the fw version. Signed-off-by: Keyon Jie <yang.jie(a)linux.intel.com> --- src/platform/baytrail/platform.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/platform/baytrail/platform.c b/src/platform/baytrail/platform.c index 36d4993..ea3828f 100644 --- a/src/platform/baytrail/platform.c +++ b/src/platform/baytrail/platform.c @@ -57,11 +57,7 @@ static const struct sst_intel_ipc_fw_ready ready = { .outbox_size = MAILBOX_INBOX_SIZE, .fw_info_size = sizeof(struct fw_info), { - .info = { - .name = "REEF", - .date = __DATE__, - .time = __TIME__, - }, + .rsvd = PACKAGE_STRING, }, }; -- 2.7.4
2 3
0 0
[Sound-open-firmware] [PATCH] dai: add macros for dai tracing
by Keyon Jie 24 Oct '16

24 Oct '16
Signed-off-by: Keyon Jie <yang.jie(a)linux.intel.com> --- src/audio/dai.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/audio/dai.c b/src/audio/dai.c index 13fc94a..6b2c83b 100644 --- a/src/audio/dai.c +++ b/src/audio/dai.c @@ -47,6 +47,12 @@ #define DAI_PLAYBACK_STREAM 0 #define DAI_CAPTURE_STREAM 1 +/* tracing */ +#define trace_dai(__e) trace_event(TRACE_CLASS_DAI, __e) +#define trace_dai_error(__e) trace_error(TRACE_CLASS_DAI, __e) +#define tracev_dai(__e) tracev_event(TRACE_CLASS_DAI, __e) + + struct dai_data { /* local DMA config */ int chan; -- 2.5.0
2 1
0 0
[Sound-open-firmware] [PATCH] ssp: return after draining finished
by Keyon Jie 24 Oct '16

24 Oct '16
To prevent the consequent command arrive when we are at substates. Signed-off-by: Keyon Jie <yang.jie(a)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
1 0
0 0
[Sound-open-firmware] [PATCH] ssp: cleanup ssp status
by Keyon Jie 24 Oct '16

24 Oct '16
We are using 6 states, 2 of them are substates: init, idle, running, paused, draining(sub state when transferring from running to idle) pausing(substate when transferring from running to paused). Don't response new command when in substates, only stay in substates for limited timeout. e.g. 2ms for draing and 1ms for pausing. Signed-off-by: Keyon Jie <yang.jie(a)linux.intel.com> --- src/drivers/ssp.c | 48 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/src/drivers/ssp.c b/src/drivers/ssp.c index d4a8d89..b7d27d1 100644 --- a/src/drivers/ssp.c +++ b/src/drivers/ssp.c @@ -113,8 +113,8 @@ /* SSP port status */ #define SSP_STATE_INIT 0 -#define SSP_STATE_RUNNING 1 -#define SSP_STATE_IDLE 2 +#define SSP_STATE_IDLE 1 +#define SSP_STATE_RUNNING 2 #define SSP_STATE_DRAINING 3 #define SSP_STATE_PAUSING 4 #define SSP_STATE_PAUSED 5 @@ -182,16 +182,10 @@ static inline int ssp_set_config(struct dai *dai, struct dai_config *dai_config) spin_lock(&ssp->lock); - /* is playback already running */ - if (ssp->state[DAI_DIR_PLAYBACK] == SSP_STATE_RUNNING || - ssp->state[DAI_DIR_PLAYBACK] == SSP_STATE_DRAINING) { - trace_ssp_error("wsP"); - goto out; - } - - /* is capture already running */ - if (ssp->state[DAI_DIR_CAPTURE] == SSP_STATE_RUNNING) { - trace_ssp_error("wsC"); + /* is playback/capture already running */ + if (ssp->state[DAI_DIR_PLAYBACK] > SSP_STATE_IDLE || + ssp->state[DAI_DIR_CAPTURE] > SSP_STATE_IDLE) { + trace_ssp_error("wsS"); goto out; } @@ -301,6 +295,9 @@ static inline int ssp_set_config(struct dai *dai, struct dai_config *dai_config) ssp_write(dai, SSPSP, sspsp); ssp_write(dai, SFIFOTT, sfifott); + ssp->state[DAI_DIR_PLAYBACK] = SSP_STATE_IDLE; + ssp->state[DAI_DIR_CAPTURE] = SSP_STATE_IDLE; + out: spin_unlock(&ssp->lock); @@ -415,17 +412,29 @@ static int ssp_trigger(struct dai *dai, int cmd, int direction) switch (cmd) { case DAI_TRIGGER_START: +/* let's only wait until draining finished(timout) before another start */ +#if 0 /* cancel any scheduled work */ if (ssp->state[direction] == SSP_STATE_DRAINING) work_cancel_default(&ssp->work); - ssp_start(dai, direction); +#endif + if (ssp->state[direction] == SSP_STATE_IDLE) + ssp_start(dai, direction); break; case DAI_TRIGGER_PAUSE_RELEASE: +/* let's only wait until pausing finished(timout) before next release */ +#if 0 if (ssp->state[direction] == SSP_STATE_PAUSING) work_cancel_default(&ssp->work); - ssp_start(dai, direction); +#endif + if (ssp->state[direction] == SSP_STATE_PAUSED) + ssp_start(dai, direction); break; case DAI_TRIGGER_PAUSE_PUSH: + if (ssp->state[direction] != SSP_STATE_RUNNING) { + trace_ssp_error("wsP"); + return 0; + } if (direction == STREAM_DIRECTION_PLAYBACK) { ssp->state[STREAM_DIRECTION_PLAYBACK] = SSP_STATE_PAUSING; @@ -434,7 +443,13 @@ static int ssp_trigger(struct dai *dai, int cmd, int direction) ssp_pause(dai, direction); break; case DAI_TRIGGER_STOP: - if (direction == STREAM_DIRECTION_PLAYBACK) { + if (ssp->state[direction] != SSP_STATE_RUNNING && + ssp->state[direction] != SSP_STATE_PAUSED) { + trace_ssp_error("wsO"); + return 0; + } + if (direction == STREAM_DIRECTION_PLAYBACK && + ssp->state[direction] == SSP_STATE_RUNNING) { ssp->state[STREAM_DIRECTION_PLAYBACK] = SSP_STATE_DRAINING; work_schedule_default(&ssp->work, 2000); @@ -467,6 +482,9 @@ static int ssp_probe(struct dai *dai) work_init(&ssp->work, ssp_drain_work, dai, WORK_ASYNC); spinlock_init(&ssp->lock); + ssp->state[DAI_DIR_PLAYBACK] = SSP_STATE_INIT; + ssp->state[DAI_DIR_CAPTURE] = SSP_STATE_INIT; + return 0; } -- 2.5.0
1 0
0 0
[Sound-open-firmware] [PATCH] dai: cleanup dai component status
by Keyon Jie 24 Oct '16

24 Oct '16
Only use 4 states for dai component: init, prepare, runing, paused. Signed-off-by: Keyon Jie <yang.jie(a)linux.intel.com> --- src/audio/dai.c | 108 ++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 69 insertions(+), 39 deletions(-) diff --git a/src/audio/dai.c b/src/audio/dai.c index 6b2c83b..afa1be1 100644 --- a/src/audio/dai.c +++ b/src/audio/dai.c @@ -217,20 +217,22 @@ static int dai_playback_params(struct comp_dev *dev, dma_period_desc = &dma_buffer->desc.sink_period; dma_buffer->params = *params; - /* set up cyclic list of DMA elems */ - for (i = 0; i < dma_period_desc->number; i++) { + if (list_is_empty(&config->elem_list)) { + /* set up cyclic list of DMA elems */ + for (i = 0; i < dma_period_desc->number; i++) { - elem = rzalloc(RZONE_MODULE, RMOD_SYS, sizeof(*elem)); - if (elem == NULL) - goto err_unwind; + elem = rzalloc(RZONE_MODULE, RMOD_SYS, sizeof(*elem)); + if (elem == NULL) + goto err_unwind; - elem->size = dma_period_desc->size; - elem->src = (uint32_t)(dma_buffer->r_ptr) + - i * dma_period_desc->size; + elem->size = dma_period_desc->size; + elem->src = (uint32_t)(dma_buffer->r_ptr) + + i * dma_period_desc->size; - elem->dest = dai_fifo(dd->ssp, params->direction); + elem->dest = dai_fifo(dd->ssp, params->direction); - list_item_append(&elem->list, &config->elem_list); + list_item_append(&elem->list, &config->elem_list); + } } /* set write pointer to start of buffer */ @@ -273,18 +275,20 @@ static int dai_capture_params(struct comp_dev *dev, dma_period_desc = &dma_buffer->desc.source_period; dma_buffer->params = *params; - /* set up cyclic list of DMA elems */ - for (i = 0; i < dma_period_desc->number; i++) { + if (list_is_empty(&config->elem_list)) { + /* set up cyclic list of DMA elems */ + for (i = 0; i < dma_period_desc->number; i++) { - elem = rzalloc(RZONE_MODULE, RMOD_SYS, sizeof(*elem)); - if (elem == NULL) - goto err_unwind; + elem = rzalloc(RZONE_MODULE, RMOD_SYS, sizeof(*elem)); + if (elem == NULL) + goto err_unwind; - elem->size = dma_period_desc->size; - elem->dest = (uint32_t)(dma_buffer->w_ptr) + - i * dma_period_desc->size; - elem->src = dai_fifo(dd->ssp, params->direction); - list_item_append(&elem->list, &config->elem_list); + elem->size = dma_period_desc->size; + elem->dest = (uint32_t)(dma_buffer->w_ptr) + + i * dma_period_desc->size; + elem->src = dai_fifo(dd->ssp, params->direction); + list_item_append(&elem->list, &config->elem_list); + } } /* set write pointer to start of buffer */ @@ -306,6 +310,11 @@ static int dai_params(struct comp_dev *dev, { struct comp_buffer *dma_buffer; + /* can set params on only init state */ + if (dev->state != COMP_STATE_INIT) { + trace_dai_error("wdp"); + return -EINVAL; + } if (params->direction == STREAM_DIRECTION_PLAYBACK) { dma_buffer = list_first_item(&dev->bsource_list, struct comp_buffer, sink_list); @@ -323,14 +332,22 @@ static int dai_params(struct comp_dev *dev, static int dai_prepare(struct comp_dev *dev) { + int ret = 0; struct dai_data *dd = comp_get_drvdata(dev); + if (list_is_empty(&dd->config.elem_list)) { + trace_dai_error("wdm"); + return -EINVAL; + } + dd->dai_pos_blks = 0; if (dd->dai_pos) *dd->dai_pos = 0; - return dma_set_config(dd->dma, dd->chan, &dd->config); + ret = dma_set_config(dd->dma, dd->chan, &dd->config); + dev->state = COMP_STATE_PREPARE; + return ret; } static int dai_reset(struct comp_dev *dev) @@ -364,30 +381,43 @@ static int dai_cmd(struct comp_dev *dev, int cmd, void *data) switch (cmd) { case COMP_CMD_PAUSE: - dma_pause(dd->dma, dd->chan); - dai_trigger(dd->ssp, cmd, dd->direction); - dev->state = COMP_STATE_PAUSED; + if (dev->state == COMP_STATE_RUNNING) { + dma_pause(dd->dma, dd->chan); + dai_trigger(dd->ssp, cmd, dd->direction); + dev->state = COMP_STATE_PAUSED; + } break; case COMP_CMD_STOP: - if (dev->state == COMP_STATE_RUNNING) - dma_stop(dd->dma, dd->chan, 1); - else if (dev->state == COMP_STATE_PAUSED) - dma_stop(dd->dma, dd->chan, 0); - - dai_trigger(dd->ssp, cmd, dd->direction); - dev->state = COMP_STATE_STOPPED; + switch (dev->state) { + case COMP_STATE_RUNNING: + case COMP_STATE_PAUSED: + dma_stop(dd->dma, dd->chan, + dev->state == COMP_STATE_RUNNING ? 1 : 0); + /* need stop ssp */ + dai_trigger(dd->ssp, cmd, dd->direction); + /* go through */ + case COMP_STATE_PREPARE: + dev->state = COMP_STATE_INIT; + break; + } break; case COMP_CMD_RELEASE: - dai_trigger(dd->ssp, cmd, dd->direction); - dma_release(dd->dma, dd->chan); - dev->state = COMP_STATE_RUNNING; + /* only release from paused*/ + if (dev->state == COMP_STATE_PAUSED) { + dai_trigger(dd->ssp, cmd, dd->direction); + dma_release(dd->dma, dd->chan); + dev->state = COMP_STATE_RUNNING; + } break; case COMP_CMD_START: - ret = dma_start(dd->dma, dd->chan); - if (ret < 0) - return ret; - dai_trigger(dd->ssp, cmd, dd->direction); - dev->state = COMP_STATE_RUNNING; + /* only start from prepared*/ + if (dev->state == COMP_STATE_PREPARE) { + ret = dma_start(dd->dma, dd->chan); + if (ret < 0) + return ret; + dai_trigger(dd->ssp, cmd, dd->direction); + dev->state = COMP_STATE_RUNNING; + } break; case COMP_CMD_SUSPEND: case COMP_CMD_RESUME: -- 2.5.0
1 0
0 0
  • ← Newer
  • 1
  • ...
  • 154
  • 155
  • 156
  • 157
  • 158
  • Older →

HyperKitty Powered by HyperKitty version 1.3.8.