Commit ea984911 authored by Shawn Lin's avatar Shawn Lin Committed by Mark Brown

spi: rockchip: check return value of dmaengine_prep_slave_sg

We should check return value of dmaengine_prep_slave_sg, otherwise
we take risk of null pointer.
Signed-off-by: default avatarShawn Lin <shawn.lin@rock-chips.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 0277e01a
...@@ -436,7 +436,7 @@ static void rockchip_spi_dma_txcb(void *data) ...@@ -436,7 +436,7 @@ static void rockchip_spi_dma_txcb(void *data)
spin_unlock_irqrestore(&rs->lock, flags); spin_unlock_irqrestore(&rs->lock, flags);
} }
static void rockchip_spi_prepare_dma(struct rockchip_spi *rs) static int rockchip_spi_prepare_dma(struct rockchip_spi *rs)
{ {
unsigned long flags; unsigned long flags;
struct dma_slave_config rxconf, txconf; struct dma_slave_config rxconf, txconf;
...@@ -459,6 +459,8 @@ static void rockchip_spi_prepare_dma(struct rockchip_spi *rs) ...@@ -459,6 +459,8 @@ static void rockchip_spi_prepare_dma(struct rockchip_spi *rs)
rs->dma_rx.ch, rs->dma_rx.ch,
rs->rx_sg.sgl, rs->rx_sg.nents, rs->rx_sg.sgl, rs->rx_sg.nents,
rs->dma_rx.direction, DMA_PREP_INTERRUPT); rs->dma_rx.direction, DMA_PREP_INTERRUPT);
if (!rxdesc)
return -EINVAL;
rxdesc->callback = rockchip_spi_dma_rxcb; rxdesc->callback = rockchip_spi_dma_rxcb;
rxdesc->callback_param = rs; rxdesc->callback_param = rs;
...@@ -476,6 +478,11 @@ static void rockchip_spi_prepare_dma(struct rockchip_spi *rs) ...@@ -476,6 +478,11 @@ static void rockchip_spi_prepare_dma(struct rockchip_spi *rs)
rs->dma_tx.ch, rs->dma_tx.ch,
rs->tx_sg.sgl, rs->tx_sg.nents, rs->tx_sg.sgl, rs->tx_sg.nents,
rs->dma_tx.direction, DMA_PREP_INTERRUPT); rs->dma_tx.direction, DMA_PREP_INTERRUPT);
if (!txdesc) {
if (rxdesc)
dmaengine_terminate_sync(rs->dma_rx.ch);
return -EINVAL;
}
txdesc->callback = rockchip_spi_dma_txcb; txdesc->callback = rockchip_spi_dma_txcb;
txdesc->callback_param = rs; txdesc->callback_param = rs;
...@@ -497,6 +504,8 @@ static void rockchip_spi_prepare_dma(struct rockchip_spi *rs) ...@@ -497,6 +504,8 @@ static void rockchip_spi_prepare_dma(struct rockchip_spi *rs)
dmaengine_submit(txdesc); dmaengine_submit(txdesc);
dma_async_issue_pending(rs->dma_tx.ch); dma_async_issue_pending(rs->dma_tx.ch);
} }
return 0;
} }
static void rockchip_spi_config(struct rockchip_spi *rs) static void rockchip_spi_config(struct rockchip_spi *rs)
...@@ -610,12 +619,12 @@ static int rockchip_spi_transfer_one( ...@@ -610,12 +619,12 @@ static int rockchip_spi_transfer_one(
if (rs->use_dma) { if (rs->use_dma) {
if (rs->tmode == CR0_XFM_RO) { if (rs->tmode == CR0_XFM_RO) {
/* rx: dma must be prepared first */ /* rx: dma must be prepared first */
rockchip_spi_prepare_dma(rs); ret = rockchip_spi_prepare_dma(rs);
spi_enable_chip(rs, 1); spi_enable_chip(rs, 1);
} else { } else {
/* tx or tr: spi must be enabled first */ /* tx or tr: spi must be enabled first */
spi_enable_chip(rs, 1); spi_enable_chip(rs, 1);
rockchip_spi_prepare_dma(rs); ret = rockchip_spi_prepare_dma(rs);
} }
} else { } else {
spi_enable_chip(rs, 1); spi_enable_chip(rs, 1);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment