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 -----
  • 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

  • 4 participants
  • 1568 discussions
[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
[Sound-open-firmware] [PATCH] ipc: dma: Correct typo for DMA timeout time and units.
by Liam Girdwood 20 Oct '16

20 Oct '16
100 usecs not 1 msec Signed-off-by: Liam Girdwood <liam.r.girdwood(a)linux.intel.com> --- src/ipc/dma-copy.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ipc/dma-copy.c b/src/ipc/dma-copy.c index c7523fa..0e92ebe 100644 --- a/src/ipc/dma-copy.c +++ b/src/ipc/dma-copy.c @@ -89,7 +89,7 @@ int dma_copy_to_host(struct dma_sg_config *host_sg, int32_t host_offset, return -EINVAL; /* set up DMA configuration */ - complete.timeout = 100; /* wait 1 msecs for DMA to finish */ + complete.timeout = 100; /* wait 100 usecs for DMA to finish */ config.direction = DMA_DIR_LMEM_TO_HMEM; config.src_width = sizeof(uint32_t); config.dest_width = sizeof(uint32_t); @@ -166,7 +166,7 @@ int dma_copy_from_host(struct dma_sg_config *host_sg, int32_t host_offset, return -EINVAL; /* set up DMA configuration */ - complete.timeout = 100; /* wait 1 msecs for DMA to finish */ + complete.timeout = 100; /* wait 100 usecs for DMA to finish */ config.direction = DMA_DIR_HMEM_TO_LMEM; config.src_width = sizeof(uint32_t); config.dest_width = sizeof(uint32_t); -- 2.7.4
1 0
0 0
[Sound-open-firmware] [PATCH] dai: add support for CHT SSP ports
by Liam Girdwood 20 Oct '16

20 Oct '16
CHT has 6 SSP ports compared to 3 on BYT Signed-off-by: Liam Girdwood <liam.r.girdwood(a)linux.intel.com> --- src/platform/baytrail/dai.c | 58 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/src/platform/baytrail/dai.c b/src/platform/baytrail/dai.c index 4db91e5..8df13ed 100644 --- a/src/platform/baytrail/dai.c +++ b/src/platform/baytrail/dai.c @@ -39,7 +39,7 @@ #include <stdint.h> #include <string.h> -static struct dai ssp[3] = { +static struct dai ssp[] = { { .type = COMP_TYPE_DAI_SSP, .index = 0, @@ -90,7 +90,61 @@ static struct dai ssp[3] = { } }, .ops = &ssp_ops, -},}; +}, +#if defined CONFIG_CHERRYTRAIL +{ + .type = COMP_TYPE_DAI_SSP, + .index = 3, + .plat_data = { + .base = SSP3_BASE, + .irq = IRQ_NUM_EXT_SSP0, + .fifo[STREAM_DIRECTION_PLAYBACK] = { + .offset = SSP3_BASE + SSDR, + .handshake = DMA_HANDSHAKE_SSP3_TX, + }, + .fifo[STREAM_DIRECTION_CAPTURE] = { + .offset = SSP0_BASE + SSDR, + .handshake = DMA_HANDSHAKE_SSP3_RX, + } + }, + .ops = &ssp_ops, +}, +{ + .type = COMP_TYPE_DAI_SSP, + .index = 4, + .plat_data = { + .base = SSP4_BASE, + .irq = IRQ_NUM_EXT_SSP1, + .fifo[STREAM_DIRECTION_PLAYBACK] = { + .offset = SSP4_BASE + SSDR, + .handshake = DMA_HANDSHAKE_SSP4_TX, + }, + .fifo[STREAM_DIRECTION_CAPTURE] = { + .offset = SSP4_BASE + SSDR, + .handshake = DMA_HANDSHAKE_SSP4_RX, + } + }, + .ops = &ssp_ops, +}, +{ + .type = COMP_TYPE_DAI_SSP, + .index = 5, + .plat_data = { + .base = SSP5_BASE, + .irq = IRQ_NUM_EXT_SSP2, + .fifo[STREAM_DIRECTION_PLAYBACK] = { + .offset = SSP5_BASE + SSDR, + .handshake = DMA_HANDSHAKE_SSP5_TX, + }, + .fifo[STREAM_DIRECTION_CAPTURE] = { + .offset = SSP5_BASE + SSDR, + .handshake = DMA_HANDSHAKE_SSP5_RX, + } + }, + .ops = &ssp_ops, +}, +#endif +}; struct dai *dai_get(uint32_t type, uint32_t index) { -- 2.7.4
1 3
0 0
  • ← Newer
  • 1
  • ...
  • 154
  • 155
  • 156
  • 157
  • Older →

HyperKitty Powered by HyperKitty version 1.3.8.