Skip to content

Commit c631540

Browse files
committed
drivers: i2s: consistent use of stream state
Reworks i2s_esp32_read() and i2s_esp32_write() to allow consistent use of stream->data->state Signed-off-by: Marcio Ribeiro <[email protected]>
1 parent 5ebb894 commit c631540

File tree

1 file changed

+20
-20
lines changed

1 file changed

+20
-20
lines changed

drivers/i2s/i2s_esp32.c

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1383,6 +1383,7 @@ static int i2s_esp32_read(const struct device *dev, void **mem_block, size_t *si
13831383
#if I2S_ESP32_IS_DIR_EN(rx)
13841384
const struct i2s_esp32_cfg *dev_cfg = dev->config;
13851385
const struct i2s_esp32_stream *stream = &dev_cfg->rx;
1386+
enum i2s_state state = stream->data->state;
13861387
struct queue_item item;
13871388
int err;
13881389

@@ -1394,26 +1395,26 @@ static int i2s_esp32_read(const struct device *dev, void **mem_block, size_t *si
13941395
return -EINVAL;
13951396
}
13961397

1397-
if (stream->data->state == I2S_STATE_NOT_READY) {
1398+
if (state == I2S_STATE_NOT_READY) {
13981399
LOG_ERR("RX invalid state: %d", (int)stream->data->state);
13991400
return -EIO;
1400-
} else if (stream->data->state == I2S_STATE_ERROR &&
1401-
k_msgq_num_used_get(&stream->data->queue) == 0) {
1402-
LOG_ERR("RX queue empty");
1403-
return -EIO;
14041401
}
14051402

14061403
err = k_msgq_get(&stream->data->queue, &item,
1407-
K_MSEC(stream->data->i2s_cfg.timeout));
1408-
if (err < 0) {
1404+
(state == I2S_STATE_ERROR) ? K_NO_WAIT
1405+
: K_MSEC(stream->data->i2s_cfg.timeout));
1406+
if (err == 0) {
1407+
*mem_block = item.buffer;
1408+
*size = item.size;
1409+
} else {
14091410
LOG_ERR("RX queue empty");
1410-
return err;
1411-
}
14121411

1413-
*mem_block = item.buffer;
1414-
*size = item.size;
1412+
if (err == -ENOMSG) {
1413+
err = -EIO;
1414+
}
1415+
}
14151416

1416-
return 0;
1417+
return err;
14171418
#else
14181419
*mem_block = NULL;
14191420
*size = 0;
@@ -1428,34 +1429,33 @@ static int i2s_esp32_write(const struct device *dev, void *mem_block, size_t siz
14281429
#if I2S_ESP32_IS_DIR_EN(tx)
14291430
const struct i2s_esp32_cfg *dev_cfg = dev->config;
14301431
const struct i2s_esp32_stream *stream = &dev_cfg->tx;
1432+
enum i2s_state state = stream->data->state;
14311433
int err;
14321434

14331435
if (!stream) {
14341436
LOG_ERR("I2S_DIR_TX not enabled");
14351437
return -EINVAL;
14361438
}
14371439

1438-
if (stream->data->state != I2S_STATE_RUNNING &&
1439-
stream->data->state != I2S_STATE_READY) {
1440-
LOG_ERR("TX Invalid state: %d", (int)stream->data->state);
1441-
return -EIO;
1442-
}
1443-
14441440
if (size > stream->data->i2s_cfg.block_size) {
14451441
LOG_ERR("Max write size is: %zu", stream->data->i2s_cfg.block_size);
14461442
return -EINVAL;
14471443
}
14481444

1445+
if (state != I2S_STATE_RUNNING && state != I2S_STATE_READY) {
1446+
LOG_ERR("TX Invalid state: %d", (int)state);
1447+
return -EIO;
1448+
}
1449+
14491450
struct queue_item item = {.buffer = mem_block, .size = size};
14501451

14511452
err = k_msgq_put(&stream->data->queue, &item,
14521453
K_MSEC(stream->data->i2s_cfg.timeout));
14531454
if (err < 0) {
14541455
LOG_ERR("TX queue full");
1455-
return err;
14561456
}
14571457

1458-
return 0;
1458+
return err;
14591459
#else
14601460
LOG_ERR("I2S_DIR_TX not enabled");
14611461
return -EINVAL;

0 commit comments

Comments
 (0)