summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chip/stm32/dma.c6
-rw-r--r--chip/stm32/i2c.c20
2 files changed, 18 insertions, 8 deletions
diff --git a/chip/stm32/dma.c b/chip/stm32/dma.c
index 9d7f72df6f..c37063a894 100644
--- a/chip/stm32/dma.c
+++ b/chip/stm32/dma.c
@@ -193,8 +193,14 @@ void dma_test(void)
void dma_init(void)
{
+ int i;
+
/* Enable DMA1, we don't support DMA2 yet */
STM32_RCC_AHBENR |= RCC_AHBENR_DMA1EN;
+
+ /* Initialize data for interrupt handlers */
+ for (i = 0; i < DMA_NUM_CHANNELS; i++)
+ id[i] = TASK_ID_INVALID;
}
int dma_wait(int channel)
diff --git a/chip/stm32/i2c.c b/chip/stm32/i2c.c
index f74479310c..bc3aac9eac 100644
--- a/chip/stm32/i2c.c
+++ b/chip/stm32/i2c.c
@@ -535,7 +535,7 @@ cr_cleanup:
static int i2c_master_transmit(int port, int slave_addr, uint8_t *data,
int size, int stop)
{
- int rv;
+ int rv, rv_start;
struct dma_channel *chan;
disable_ack(port);
@@ -552,17 +552,19 @@ static int i2c_master_transmit(int port, int slave_addr, uint8_t *data,
STM32_I2C_CR2(port) |= CR2_DMAEN;
/* Initialise i2c communication by sending START and ADDR */
- rv = master_start(port, slave_addr);
+ rv_start = master_start(port, slave_addr);
/* If it started, wait for the transmission complete Interrupt */
- if (!rv)
+ if (!rv_start)
rv = task_wait_event(DMA_TRANSFER_TIMEOUT_US);
dma_disable(DMAC_I2C_TX);
dma_disable_tc_interrupt(DMAC_I2C_TX);
STM32_I2C_CR2(port) &= ~CR2_DMAEN;
- if (rv && !(rv & TASK_EVENT_WAKE))
+ if (rv_start)
+ return rv_start;
+ if (!(rv & TASK_EVENT_WAKE))
return rv;
rv = wait_status(port, SR1_BTF, WAIT_XMIT_BTF);
@@ -580,7 +582,7 @@ static int i2c_master_transmit(int port, int slave_addr, uint8_t *data,
static int i2c_master_receive(int port, int slave_addr, uint8_t *data,
int size)
{
- int rv;
+ int rv, rv_start;
if (data == NULL || size < 1)
return EC_ERROR_INVAL;
@@ -596,8 +598,8 @@ static int i2c_master_receive(int port, int slave_addr, uint8_t *data,
STM32_I2C_CR2(port) |= CR2_DMAEN;
STM32_I2C_CR2(port) |= CR2_LAST;
- rv = master_start(port, slave_addr | 1);
- if (!rv)
+ rv_start = master_start(port, slave_addr | 1);
+ if (!rv_start)
rv = task_wait_event(DMA_TRANSFER_TIMEOUT_US);
dma_disable(DMAC_I2C_RX);
@@ -605,7 +607,9 @@ static int i2c_master_receive(int port, int slave_addr, uint8_t *data,
STM32_I2C_CR2(port) &= ~CR2_DMAEN;
disable_ack(port);
- if (rv && !(rv & TASK_EVENT_WAKE))
+ if (rv_start)
+ return rv_start;
+ if (!(rv & TASK_EVENT_WAKE))
return rv;
master_stop(port);