| From 65a9c428e0e22b1fbe6d8524dbc194d57d4e335b Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 29 Oct 2025 19:07:42 +0100 |
| Subject: i2c: qcom-geni: make sure I2C hub controllers can't use SE DMA |
| |
| From: Neil Armstrong <neil.armstrong@linaro.org> |
| |
| [ Upstream commit c0c50e3743e467ec4752c638e10e97f89c8644e2 ] |
| |
| The I2C Hub controller is a simpler GENI I2C variant that doesn't |
| support DMA at all, add a no_dma flag to make sure it nevers selects |
| the SE DMA mode with mappable 32bytes long transfers. |
| |
| Fixes: cacd9643eca7 ("i2c: qcom-geni: add support for I2C Master Hub variant") |
| Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org> |
| Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com> |
| Reviewed-by: Mukesh Kumar Savaliya <mukesh.savaliya@oss.qualcomm.com>> |
| Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/i2c/busses/i2c-qcom-geni.c | 11 +++++++---- |
| 1 file changed, 7 insertions(+), 4 deletions(-) |
| |
| diff --git a/drivers/i2c/busses/i2c-qcom-geni.c b/drivers/i2c/busses/i2c-qcom-geni.c |
| index 43fdd89b8bebc..bfb352b04902c 100644 |
| --- a/drivers/i2c/busses/i2c-qcom-geni.c |
| +++ b/drivers/i2c/busses/i2c-qcom-geni.c |
| @@ -97,6 +97,7 @@ struct geni_i2c_dev { |
| dma_addr_t dma_addr; |
| struct dma_chan *tx_c; |
| struct dma_chan *rx_c; |
| + bool no_dma; |
| bool gpi_mode; |
| bool abort_done; |
| }; |
| @@ -425,7 +426,7 @@ static int geni_i2c_rx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg, |
| size_t len = msg->len; |
| struct i2c_msg *cur; |
| |
| - dma_buf = i2c_get_dma_safe_msg_buf(msg, 32); |
| + dma_buf = gi2c->no_dma ? NULL : i2c_get_dma_safe_msg_buf(msg, 32); |
| if (dma_buf) |
| geni_se_select_mode(se, GENI_SE_DMA); |
| else |
| @@ -464,7 +465,7 @@ static int geni_i2c_tx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg, |
| size_t len = msg->len; |
| struct i2c_msg *cur; |
| |
| - dma_buf = i2c_get_dma_safe_msg_buf(msg, 32); |
| + dma_buf = gi2c->no_dma ? NULL : i2c_get_dma_safe_msg_buf(msg, 32); |
| if (dma_buf) |
| geni_se_select_mode(se, GENI_SE_DMA); |
| else |
| @@ -880,10 +881,12 @@ static int geni_i2c_probe(struct platform_device *pdev) |
| goto err_resources; |
| } |
| |
| - if (desc && desc->no_dma_support) |
| + if (desc && desc->no_dma_support) { |
| fifo_disable = false; |
| - else |
| + gi2c->no_dma = true; |
| + } else { |
| fifo_disable = readl_relaxed(gi2c->se.base + GENI_IF_DISABLE_RO) & FIFO_IF_DISABLE; |
| + } |
| |
| if (fifo_disable) { |
| /* FIFO is disabled, so we can only use GPI DMA */ |
| -- |
| 2.51.0 |
| |