* [PATCH 0/3] add i2c support for mt8195
@ 2021-06-08 3:16 Kewei Xu
2021-06-08 3:16 ` [PATCH 1/3] dt-bindings: i2c: update bindings for MT8195 SoC Kewei Xu
` (2 more replies)
0 siblings, 3 replies; 10+ messages in thread
From: Kewei Xu @ 2021-06-08 3:16 UTC (permalink / raw
To: wsa
Cc: matthias.bgg, robh+dt, linux-i2c, devicetree, linux-arm-kernel,
linux-kernel, linux-mediatek, srv_heupstream, leilk.liu, qii.wang,
qiangming.xia, kewei.xu
This series are based on 5.13-rc1 and we provide three i2c patches
to support mt8195 SoC.
Kewei.Xu (3):
dt-bindings: i2c: update bindings for MT8195 SoC
i2c: mediatek: Dump i2c/dma register when a timeout occurs
i2c: mediatek: Reset the handshake signal between i2c and dma
.../devicetree/bindings/i2c/i2c-mt65xx.txt | 1 +
drivers/i2c/busses/i2c-mt65xx.c | 111 ++++++++++++++++++++-
2 files changed, 110 insertions(+), 2 deletions(-)
--
1.9.1
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 1/3] dt-bindings: i2c: update bindings for MT8195 SoC
2021-06-08 3:16 [PATCH 0/3] add i2c support for mt8195 Kewei Xu
@ 2021-06-08 3:16 ` Kewei Xu
2021-06-08 13:59 ` Matthias Brugger
2021-06-18 20:27 ` Rob Herring
2021-06-08 3:16 ` [PATCH 2/3] i2c: mediatek: Dump i2c/dma register when a timeout occurs Kewei Xu
2021-06-08 3:16 ` [PATCH 3/3] i2c: mediatek: Reset the handshake signal between i2c and dma Kewei Xu
2 siblings, 2 replies; 10+ messages in thread
From: Kewei Xu @ 2021-06-08 3:16 UTC (permalink / raw
To: wsa
Cc: matthias.bgg, robh+dt, linux-i2c, devicetree, linux-arm-kernel,
linux-kernel, linux-mediatek, srv_heupstream, leilk.liu, qii.wang,
qiangming.xia, kewei.xu
From: "Kewei.Xu" <kewei.xu@mediatek.com>
Add a DT binding documentation for the MT8195 soc.
Signed-off-by: Kewei.Xu <kewei.xu@mediatek.com>
---
Documentation/devicetree/bindings/i2c/i2c-mt65xx.txt | 1 +
1 file changed, 1 insertion(+)
diff --git a/Documentation/devicetree/bindings/i2c/i2c-mt65xx.txt b/Documentation/devicetree/bindings/i2c/i2c-mt65xx.txt
index 7f0194f..7c4915bc 100644
--- a/Documentation/devicetree/bindings/i2c/i2c-mt65xx.txt
+++ b/Documentation/devicetree/bindings/i2c/i2c-mt65xx.txt
@@ -15,6 +15,7 @@ Required properties:
"mediatek,mt8173-i2c": for MediaTek MT8173
"mediatek,mt8183-i2c": for MediaTek MT8183
"mediatek,mt8192-i2c": for MediaTek MT8192
+ "mediatek,mt8195-i2c", "mediatek,mt8192-i2c": for MediaTek MT8195
"mediatek,mt8516-i2c", "mediatek,mt2712-i2c": for MediaTek MT8516
- reg: physical base address of the controller and dma base, length of memory
mapped region.
--
1.9.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 2/3] i2c: mediatek: Dump i2c/dma register when a timeout occurs
2021-06-08 3:16 [PATCH 0/3] add i2c support for mt8195 Kewei Xu
2021-06-08 3:16 ` [PATCH 1/3] dt-bindings: i2c: update bindings for MT8195 SoC Kewei Xu
@ 2021-06-08 3:16 ` Kewei Xu
2021-06-08 14:01 ` Matthias Brugger
2021-06-08 3:16 ` [PATCH 3/3] i2c: mediatek: Reset the handshake signal between i2c and dma Kewei Xu
2 siblings, 1 reply; 10+ messages in thread
From: Kewei Xu @ 2021-06-08 3:16 UTC (permalink / raw
To: wsa
Cc: matthias.bgg, robh+dt, linux-i2c, devicetree, linux-arm-kernel,
linux-kernel, linux-mediatek, srv_heupstream, leilk.liu, qii.wang,
qiangming.xia, kewei.xu
From: "Kewei.Xu" <kewei.xu@mediatek.com>
When a timeout error occurs in i2c transter, it is usually related
to the i2c/dma IP hardware configuration. Therefore, the purpose of
this patch is to dump the key register values of i2c/dma when a
timeout occurs in i2c for debugging.
Signed-off-by: Kewei.Xu <kewei.xu@mediatek.com>
---
drivers/i2c/busses/i2c-mt65xx.c | 97 ++++++++++++++++++++++++++++++++++++++++-
1 file changed, 95 insertions(+), 2 deletions(-)
diff --git a/drivers/i2c/busses/i2c-mt65xx.c b/drivers/i2c/busses/i2c-mt65xx.c
index 5ddfa4e..e65a41e 100644
--- a/drivers/i2c/busses/i2c-mt65xx.c
+++ b/drivers/i2c/busses/i2c-mt65xx.c
@@ -125,6 +125,7 @@ enum I2C_REGS_OFFSET {
OFFSET_HS,
OFFSET_SOFTRESET,
OFFSET_DCM_EN,
+ OFFSET_MULTI_DMA,
OFFSET_PATH_DIR,
OFFSET_DEBUGSTAT,
OFFSET_DEBUGCTRL,
@@ -192,8 +193,9 @@ enum I2C_REGS_OFFSET {
[OFFSET_TRANSFER_LEN_AUX] = 0x44,
[OFFSET_CLOCK_DIV] = 0x48,
[OFFSET_SOFTRESET] = 0x50,
+ [OFFSET_MULTI_DMA] = 0x84,
[OFFSET_SCL_MIS_COMP_POINT] = 0x90,
- [OFFSET_DEBUGSTAT] = 0xe0,
+ [OFFSET_DEBUGSTAT] = 0xe4,
[OFFSET_DEBUGCTRL] = 0xe8,
[OFFSET_FIFO_STAT] = 0xf4,
[OFFSET_FIFO_THRESH] = 0xf8,
@@ -828,6 +830,96 @@ static int mtk_i2c_set_speed(struct mtk_i2c *i2c, unsigned int parent_clk)
return 0;
}
+static void i2c_dump_register(struct mtk_i2c *i2c)
+{
+ dev_err(i2c->dev, "SLAVE_ADDR[0x%x]: 0x%x, INTR_MASK[0x%x]: 0x%x\n",
+ OFFSET_SLAVE_ADDR,
+ (mtk_i2c_readw(i2c, OFFSET_SLAVE_ADDR)),
+ OFFSET_INTR_MASK,
+ (mtk_i2c_readw(i2c, OFFSET_INTR_MASK)));
+ dev_err(i2c->dev, "INTR_STAT[0x%x]: 0x%x, CONTROL[0x%x]: 0x%x\n",
+ OFFSET_INTR_STAT,
+ (mtk_i2c_readw(i2c, OFFSET_INTR_STAT)),
+ OFFSET_CONTROL,
+ (mtk_i2c_readw(i2c, OFFSET_CONTROL)));
+ dev_err(i2c->dev, "TRANSFER_LEN[0x%x]: 0x%x, TRANSAC_LEN[0x%x]: 0x%x\n",
+ OFFSET_TRANSFER_LEN,
+ (mtk_i2c_readw(i2c, OFFSET_TRANSFER_LEN)),
+ OFFSET_TRANSAC_LEN,
+ (mtk_i2c_readw(i2c, OFFSET_TRANSAC_LEN)));
+ dev_err(i2c->dev, "DELAY_LEN[0x%x]: 0x%x, HTIMING[0x%x]: 0x%x\n",
+ OFFSET_DELAY_LEN,
+ (mtk_i2c_readw(i2c, OFFSET_DELAY_LEN)),
+ OFFSET_TIMING,
+ (mtk_i2c_readw(i2c, OFFSET_TIMING)));
+ dev_err(i2c->dev, "OFFSET_START[0x%x]: 0x%x\n",
+ OFFSET_START,
+ mtk_i2c_readw(i2c, OFFSET_START));
+ dev_err(i2c->dev, "OFFSET_EXT_CONF[0x%x]: 0x%x\n",
+ OFFSET_EXT_CONF,
+ mtk_i2c_readw(i2c, OFFSET_EXT_CONF));
+ dev_err(i2c->dev, "OFFSET_HS[0x%x]: 0x%x\n",
+ OFFSET_HS,
+ mtk_i2c_readw(i2c, OFFSET_HS));
+ dev_err(i2c->dev, "OFFSET_IO_CONFIG[0x%x]: 0x%x\n",
+ OFFSET_IO_CONFIG,
+ mtk_i2c_readw(i2c, OFFSET_IO_CONFIG));
+ dev_err(i2c->dev, "OFFSET_FIFO_ADDR_CLR[0x%x]: 0x%x\n",
+ OFFSET_FIFO_ADDR_CLR,
+ mtk_i2c_readw(i2c, OFFSET_FIFO_ADDR_CLR));
+ dev_err(i2c->dev, "TRANSFER_LEN_AUX[0x%x]: 0x%x\n",
+ OFFSET_TRANSFER_LEN_AUX,
+ mtk_i2c_readw(i2c, OFFSET_TRANSFER_LEN_AUX));
+ dev_err(i2c->dev, "CLOCK_DIV[0x%x]: 0x%x\n",
+ OFFSET_CLOCK_DIV,
+ mtk_i2c_readw(i2c, OFFSET_CLOCK_DIV));
+ dev_err(i2c->dev, "FIFO_STAT[0x%x]: 0x%x, FIFO_THRESH[0x%x]: 0x%x\n",
+ OFFSET_FIFO_STAT,
+ mtk_i2c_readw(i2c, OFFSET_FIFO_STAT),
+ OFFSET_FIFO_THRESH,
+ mtk_i2c_readw(i2c, OFFSET_FIFO_THRESH));
+ dev_err(i2c->dev, "DCM_EN[0x%x] 0x%x\n",
+ OFFSET_DCM_EN,
+ mtk_i2c_readw(i2c, OFFSET_DCM_EN));
+ dev_err(i2c->dev, "DEBUGSTAT[0x%x]: 0x%x, DEBUGCTRL[0x%x]: 0x%x\n",
+ OFFSET_DEBUGSTAT,
+ (mtk_i2c_readw(i2c, OFFSET_DEBUGSTAT)),
+ OFFSET_DEBUGCTRL,
+ (mtk_i2c_readw(i2c, OFFSET_DEBUGCTRL)));
+
+ if (i2c->dev_comp->regs == mt_i2c_regs_v2) {
+ dev_err(i2c->dev, "OFFSET_LTIMING[0x%x]: 0x%x\n",
+ OFFSET_LTIMING,
+ mtk_i2c_readw(i2c, OFFSET_LTIMING));
+ dev_err(i2c->dev, "MULTI_DMA[0x%x]: 0x%x\n",
+ OFFSET_MULTI_DMA,
+ (mtk_i2c_readw(i2c, OFFSET_MULTI_DMA)));
+ }
+
+ dev_err(i2c->dev, "OFFSET_INT_FLAG = 0x%x\n",
+ readl(i2c->pdmabase + OFFSET_INT_FLAG));
+ dev_err(i2c->dev, "OFFSET_INT_EN = 0x%x\n",
+ readl(i2c->pdmabase + OFFSET_INT_EN));
+ dev_err(i2c->dev, "OFFSET_EN = 0x%x\n",
+ readl(i2c->pdmabase + OFFSET_EN));
+ dev_err(i2c->dev, "OFFSET_RST = 0x%x\n",
+ readl(i2c->pdmabase + OFFSET_RST));
+ dev_err(i2c->dev, "OFFSET_CON = 0x%x\n",
+ readl(i2c->pdmabase + OFFSET_CON));
+ dev_err(i2c->dev, "OFFSET_TX_MEM_ADDR = 0x%x\n",
+ readl(i2c->pdmabase + OFFSET_TX_MEM_ADDR));
+ dev_err(i2c->dev, "OFFSET_RX_MEM_ADDR = 0x%x\n",
+ readl(i2c->pdmabase + OFFSET_RX_MEM_ADDR));
+ dev_err(i2c->dev, "OFFSET_TX_LEN = 0x%x\n",
+ readl(i2c->pdmabase + OFFSET_TX_LEN));
+ dev_err(i2c->dev, "OFFSET_RX_LEN = 0x%x\n",
+ readl(i2c->pdmabase + OFFSET_RX_LEN));
+ dev_err(i2c->dev, "OFFSET_TX_4G_MODE = 0x%x\n",
+ readl(i2c->pdmabase + OFFSET_TX_4G_MODE));
+ dev_err(i2c->dev, "OFFSET_RX_4G_MODE = 0x%x\n",
+ readl(i2c->pdmabase + OFFSET_RX_4G_MODE));
+}
+
static int mtk_i2c_do_transfer(struct mtk_i2c *i2c, struct i2c_msg *msgs,
int num, int left_num)
{
@@ -1034,7 +1126,8 @@ static int mtk_i2c_do_transfer(struct mtk_i2c *i2c, struct i2c_msg *msgs,
}
if (ret == 0) {
- dev_dbg(i2c->dev, "addr: %x, transfer timeout\n", msgs->addr);
+ dev_err(i2c->dev, "addr: %x, transfer timeout\n", msgs->addr);
+ i2c_dump_register(i2c);
mtk_i2c_init_hw(i2c);
return -ETIMEDOUT;
}
--
1.9.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 3/3] i2c: mediatek: Reset the handshake signal between i2c and dma
2021-06-08 3:16 [PATCH 0/3] add i2c support for mt8195 Kewei Xu
2021-06-08 3:16 ` [PATCH 1/3] dt-bindings: i2c: update bindings for MT8195 SoC Kewei Xu
2021-06-08 3:16 ` [PATCH 2/3] i2c: mediatek: Dump i2c/dma register when a timeout occurs Kewei Xu
@ 2021-06-08 3:16 ` Kewei Xu
2 siblings, 0 replies; 10+ messages in thread
From: Kewei Xu @ 2021-06-08 3:16 UTC (permalink / raw
To: wsa
Cc: matthias.bgg, robh+dt, linux-i2c, devicetree, linux-arm-kernel,
linux-kernel, linux-mediatek, srv_heupstream, leilk.liu, qii.wang,
qiangming.xia, kewei.xu
From: "Kewei.Xu" <kewei.xu@mediatek.com>
Due to changes in the hardware design of the handshaking signal
between i2c and dma, it is necessary to reset the handshaking
signal before each transfer to ensure that the multi-msgs can
be transferred correctly.
Signed-off-by: Kewei.Xu <kewei.xu@mediatek.com>
---
drivers/i2c/busses/i2c-mt65xx.c | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/drivers/i2c/busses/i2c-mt65xx.c b/drivers/i2c/busses/i2c-mt65xx.c
index e65a41e..ded94f9 100644
--- a/drivers/i2c/busses/i2c-mt65xx.c
+++ b/drivers/i2c/busses/i2c-mt65xx.c
@@ -47,6 +47,9 @@
#define I2C_RD_TRANAC_VALUE 0x0001
#define I2C_SCL_MIS_COMP_VALUE 0x0000
#define I2C_CHN_CLR_FLAG 0x0000
+#define I2C_CLR_DEBUGCTR 0x0000
+#define I2C_RELIABILITY 0x0010
+#define I2C_DMAACK_ENABLE 0x0008
#define I2C_DMA_CON_TX 0x0000
#define I2C_DMA_CON_RX 0x0001
@@ -942,6 +945,17 @@ static int mtk_i2c_do_transfer(struct mtk_i2c *i2c, struct i2c_msg *msgs,
reinit_completion(&i2c->msg_complete);
+ if (i2c->dev_comp->apdma_sync) {
+ mtk_i2c_writew(i2c, I2C_CLR_DEBUGCTR, OFFSET_DEBUGCTRL);
+ writel(I2C_DMA_HANDSHAKE_RST | I2C_DMA_WARM_RST,
+ i2c->pdmabase + OFFSET_RST);
+ writel(I2C_DMA_CLR_FLAG, i2c->pdmabase + OFFSET_RST);
+ mtk_i2c_writew(i2c, I2C_HANDSHAKE_RST, OFFSET_SOFTRESET);
+ mtk_i2c_writew(i2c, I2C_CHN_CLR_FLAG, OFFSET_SOFTRESET);
+ mtk_i2c_writew(i2c, I2C_RELIABILITY | I2C_DMAACK_ENABLE,
+ OFFSET_DEBUGCTRL);
+ }
+
control_reg = mtk_i2c_readw(i2c, OFFSET_CONTROL) &
~(I2C_CONTROL_DIR_CHANGE | I2C_CONTROL_RS);
if ((i2c->speed_hz > I2C_MAX_FAST_MODE_PLUS_FREQ) || (left_num >= 1))
--
1.9.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH 1/3] dt-bindings: i2c: update bindings for MT8195 SoC
2021-06-08 3:16 ` [PATCH 1/3] dt-bindings: i2c: update bindings for MT8195 SoC Kewei Xu
@ 2021-06-08 13:59 ` Matthias Brugger
2021-06-18 20:27 ` Rob Herring
1 sibling, 0 replies; 10+ messages in thread
From: Matthias Brugger @ 2021-06-08 13:59 UTC (permalink / raw
To: Kewei Xu, wsa
Cc: robh+dt, linux-i2c, devicetree, linux-arm-kernel, linux-kernel,
linux-mediatek, srv_heupstream, leilk.liu, qii.wang,
qiangming.xia
On 08/06/2021 05:16, Kewei Xu wrote:
> From: "Kewei.Xu" <kewei.xu@mediatek.com>
>
> Add a DT binding documentation for the MT8195 soc.
>
> Signed-off-by: Kewei.Xu <kewei.xu@mediatek.com>
Reviewed-by: Matthias Brugger <matthias.bgg@gmail.com>
> ---
> Documentation/devicetree/bindings/i2c/i2c-mt65xx.txt | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/Documentation/devicetree/bindings/i2c/i2c-mt65xx.txt b/Documentation/devicetree/bindings/i2c/i2c-mt65xx.txt
> index 7f0194f..7c4915bc 100644
> --- a/Documentation/devicetree/bindings/i2c/i2c-mt65xx.txt
> +++ b/Documentation/devicetree/bindings/i2c/i2c-mt65xx.txt
> @@ -15,6 +15,7 @@ Required properties:
> "mediatek,mt8173-i2c": for MediaTek MT8173
> "mediatek,mt8183-i2c": for MediaTek MT8183
> "mediatek,mt8192-i2c": for MediaTek MT8192
> + "mediatek,mt8195-i2c", "mediatek,mt8192-i2c": for MediaTek MT8195
> "mediatek,mt8516-i2c", "mediatek,mt2712-i2c": for MediaTek MT8516
> - reg: physical base address of the controller and dma base, length of memory
> mapped region.
>
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/3] i2c: mediatek: Dump i2c/dma register when a timeout occurs
2021-06-08 3:16 ` [PATCH 2/3] i2c: mediatek: Dump i2c/dma register when a timeout occurs Kewei Xu
@ 2021-06-08 14:01 ` Matthias Brugger
2021-06-09 2:43 ` Kewei Xu
0 siblings, 1 reply; 10+ messages in thread
From: Matthias Brugger @ 2021-06-08 14:01 UTC (permalink / raw
To: Kewei Xu, wsa
Cc: robh+dt, linux-i2c, devicetree, linux-arm-kernel, linux-kernel,
linux-mediatek, srv_heupstream, leilk.liu, qii.wang,
qiangming.xia
On 08/06/2021 05:16, Kewei Xu wrote:
> From: "Kewei.Xu" <kewei.xu@mediatek.com>
>
> When a timeout error occurs in i2c transter, it is usually related
> to the i2c/dma IP hardware configuration. Therefore, the purpose of
> this patch is to dump the key register values of i2c/dma when a
> timeout occurs in i2c for debugging.
>
> Signed-off-by: Kewei.Xu <kewei.xu@mediatek.com>
> ---
> drivers/i2c/busses/i2c-mt65xx.c | 97 ++++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 95 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/i2c/busses/i2c-mt65xx.c b/drivers/i2c/busses/i2c-mt65xx.c
> index 5ddfa4e..e65a41e 100644
> --- a/drivers/i2c/busses/i2c-mt65xx.c
> +++ b/drivers/i2c/busses/i2c-mt65xx.c
> @@ -125,6 +125,7 @@ enum I2C_REGS_OFFSET {
> OFFSET_HS,
> OFFSET_SOFTRESET,
> OFFSET_DCM_EN,
> + OFFSET_MULTI_DMA,
> OFFSET_PATH_DIR,
> OFFSET_DEBUGSTAT,
> OFFSET_DEBUGCTRL,
> @@ -192,8 +193,9 @@ enum I2C_REGS_OFFSET {
> [OFFSET_TRANSFER_LEN_AUX] = 0x44,
> [OFFSET_CLOCK_DIV] = 0x48,
> [OFFSET_SOFTRESET] = 0x50,
> + [OFFSET_MULTI_DMA] = 0x84,
> [OFFSET_SCL_MIS_COMP_POINT] = 0x90,
> - [OFFSET_DEBUGSTAT] = 0xe0,
> + [OFFSET_DEBUGSTAT] = 0xe4,
Is this offset only for mt8192 or also for mt8183?
In any case that should go in as another patch. Either a fix or a new
mt_i2c_regs_v3[]
Regards,
Matthias
> [OFFSET_DEBUGCTRL] = 0xe8,
> [OFFSET_FIFO_STAT] = 0xf4,
> [OFFSET_FIFO_THRESH] = 0xf8,
> @@ -828,6 +830,96 @@ static int mtk_i2c_set_speed(struct mtk_i2c *i2c, unsigned int parent_clk)
> return 0;
> }
>
> +static void i2c_dump_register(struct mtk_i2c *i2c)
> +{
> + dev_err(i2c->dev, "SLAVE_ADDR[0x%x]: 0x%x, INTR_MASK[0x%x]: 0x%x\n",
> + OFFSET_SLAVE_ADDR,
> + (mtk_i2c_readw(i2c, OFFSET_SLAVE_ADDR)),
> + OFFSET_INTR_MASK,
> + (mtk_i2c_readw(i2c, OFFSET_INTR_MASK)));
> + dev_err(i2c->dev, "INTR_STAT[0x%x]: 0x%x, CONTROL[0x%x]: 0x%x\n",
> + OFFSET_INTR_STAT,
> + (mtk_i2c_readw(i2c, OFFSET_INTR_STAT)),
> + OFFSET_CONTROL,
> + (mtk_i2c_readw(i2c, OFFSET_CONTROL)));
> + dev_err(i2c->dev, "TRANSFER_LEN[0x%x]: 0x%x, TRANSAC_LEN[0x%x]: 0x%x\n",
> + OFFSET_TRANSFER_LEN,
> + (mtk_i2c_readw(i2c, OFFSET_TRANSFER_LEN)),
> + OFFSET_TRANSAC_LEN,
> + (mtk_i2c_readw(i2c, OFFSET_TRANSAC_LEN)));
> + dev_err(i2c->dev, "DELAY_LEN[0x%x]: 0x%x, HTIMING[0x%x]: 0x%x\n",
> + OFFSET_DELAY_LEN,
> + (mtk_i2c_readw(i2c, OFFSET_DELAY_LEN)),
> + OFFSET_TIMING,
> + (mtk_i2c_readw(i2c, OFFSET_TIMING)));
> + dev_err(i2c->dev, "OFFSET_START[0x%x]: 0x%x\n",
> + OFFSET_START,
> + mtk_i2c_readw(i2c, OFFSET_START));
> + dev_err(i2c->dev, "OFFSET_EXT_CONF[0x%x]: 0x%x\n",
> + OFFSET_EXT_CONF,
> + mtk_i2c_readw(i2c, OFFSET_EXT_CONF));
> + dev_err(i2c->dev, "OFFSET_HS[0x%x]: 0x%x\n",
> + OFFSET_HS,
> + mtk_i2c_readw(i2c, OFFSET_HS));
> + dev_err(i2c->dev, "OFFSET_IO_CONFIG[0x%x]: 0x%x\n",
> + OFFSET_IO_CONFIG,
> + mtk_i2c_readw(i2c, OFFSET_IO_CONFIG));
> + dev_err(i2c->dev, "OFFSET_FIFO_ADDR_CLR[0x%x]: 0x%x\n",
> + OFFSET_FIFO_ADDR_CLR,
> + mtk_i2c_readw(i2c, OFFSET_FIFO_ADDR_CLR));
> + dev_err(i2c->dev, "TRANSFER_LEN_AUX[0x%x]: 0x%x\n",
> + OFFSET_TRANSFER_LEN_AUX,
> + mtk_i2c_readw(i2c, OFFSET_TRANSFER_LEN_AUX));
> + dev_err(i2c->dev, "CLOCK_DIV[0x%x]: 0x%x\n",
> + OFFSET_CLOCK_DIV,
> + mtk_i2c_readw(i2c, OFFSET_CLOCK_DIV));
> + dev_err(i2c->dev, "FIFO_STAT[0x%x]: 0x%x, FIFO_THRESH[0x%x]: 0x%x\n",
> + OFFSET_FIFO_STAT,
> + mtk_i2c_readw(i2c, OFFSET_FIFO_STAT),
> + OFFSET_FIFO_THRESH,
> + mtk_i2c_readw(i2c, OFFSET_FIFO_THRESH));
> + dev_err(i2c->dev, "DCM_EN[0x%x] 0x%x\n",
> + OFFSET_DCM_EN,
> + mtk_i2c_readw(i2c, OFFSET_DCM_EN));
> + dev_err(i2c->dev, "DEBUGSTAT[0x%x]: 0x%x, DEBUGCTRL[0x%x]: 0x%x\n",
> + OFFSET_DEBUGSTAT,
> + (mtk_i2c_readw(i2c, OFFSET_DEBUGSTAT)),
> + OFFSET_DEBUGCTRL,
> + (mtk_i2c_readw(i2c, OFFSET_DEBUGCTRL)));
> +
> + if (i2c->dev_comp->regs == mt_i2c_regs_v2) {
> + dev_err(i2c->dev, "OFFSET_LTIMING[0x%x]: 0x%x\n",
> + OFFSET_LTIMING,
> + mtk_i2c_readw(i2c, OFFSET_LTIMING));
> + dev_err(i2c->dev, "MULTI_DMA[0x%x]: 0x%x\n",
> + OFFSET_MULTI_DMA,
> + (mtk_i2c_readw(i2c, OFFSET_MULTI_DMA)));
> + }
> +
> + dev_err(i2c->dev, "OFFSET_INT_FLAG = 0x%x\n",
> + readl(i2c->pdmabase + OFFSET_INT_FLAG));
> + dev_err(i2c->dev, "OFFSET_INT_EN = 0x%x\n",
> + readl(i2c->pdmabase + OFFSET_INT_EN));
> + dev_err(i2c->dev, "OFFSET_EN = 0x%x\n",
> + readl(i2c->pdmabase + OFFSET_EN));
> + dev_err(i2c->dev, "OFFSET_RST = 0x%x\n",
> + readl(i2c->pdmabase + OFFSET_RST));
> + dev_err(i2c->dev, "OFFSET_CON = 0x%x\n",
> + readl(i2c->pdmabase + OFFSET_CON));
> + dev_err(i2c->dev, "OFFSET_TX_MEM_ADDR = 0x%x\n",
> + readl(i2c->pdmabase + OFFSET_TX_MEM_ADDR));
> + dev_err(i2c->dev, "OFFSET_RX_MEM_ADDR = 0x%x\n",
> + readl(i2c->pdmabase + OFFSET_RX_MEM_ADDR));
> + dev_err(i2c->dev, "OFFSET_TX_LEN = 0x%x\n",
> + readl(i2c->pdmabase + OFFSET_TX_LEN));
> + dev_err(i2c->dev, "OFFSET_RX_LEN = 0x%x\n",
> + readl(i2c->pdmabase + OFFSET_RX_LEN));
> + dev_err(i2c->dev, "OFFSET_TX_4G_MODE = 0x%x\n",
> + readl(i2c->pdmabase + OFFSET_TX_4G_MODE));
> + dev_err(i2c->dev, "OFFSET_RX_4G_MODE = 0x%x\n",
> + readl(i2c->pdmabase + OFFSET_RX_4G_MODE));
> +}
> +
> static int mtk_i2c_do_transfer(struct mtk_i2c *i2c, struct i2c_msg *msgs,
> int num, int left_num)
> {
> @@ -1034,7 +1126,8 @@ static int mtk_i2c_do_transfer(struct mtk_i2c *i2c, struct i2c_msg *msgs,
> }
>
> if (ret == 0) {
> - dev_dbg(i2c->dev, "addr: %x, transfer timeout\n", msgs->addr);
> + dev_err(i2c->dev, "addr: %x, transfer timeout\n", msgs->addr);
> + i2c_dump_register(i2c);
> mtk_i2c_init_hw(i2c);
> return -ETIMEDOUT;
> }
>
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/3] i2c: mediatek: Dump i2c/dma register when a timeout occurs
2021-06-08 14:01 ` Matthias Brugger
@ 2021-06-09 2:43 ` Kewei Xu
2021-06-29 4:19 ` Tzung-Bi Shih
0 siblings, 1 reply; 10+ messages in thread
From: Kewei Xu @ 2021-06-09 2:43 UTC (permalink / raw
To: Matthias Brugger
Cc: wsa, robh+dt, linux-i2c, devicetree, linux-arm-kernel,
linux-kernel, linux-mediatek, srv_heupstream, leilk.liu, qii.wang,
qiangming.xia, liguo.zhang
On Tue, 2021-06-08 at 16:01 +0200, Matthias Brugger wrote:
>
> On 08/06/2021 05:16, Kewei Xu wrote:
> > From: "Kewei.Xu" <kewei.xu@mediatek.com>
> >
> > When a timeout error occurs in i2c transter, it is usually related
> > to the i2c/dma IP hardware configuration. Therefore, the purpose of
> > this patch is to dump the key register values of i2c/dma when a
> > timeout occurs in i2c for debugging.
> >
> > Signed-off-by: Kewei.Xu <kewei.xu@mediatek.com>
> > ---
> > drivers/i2c/busses/i2c-mt65xx.c | 97 ++++++++++++++++++++++++++++++++++++++++-
> > 1 file changed, 95 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/i2c/busses/i2c-mt65xx.c b/drivers/i2c/busses/i2c-mt65xx.c
> > index 5ddfa4e..e65a41e 100644
> > --- a/drivers/i2c/busses/i2c-mt65xx.c
> > +++ b/drivers/i2c/busses/i2c-mt65xx.c
> > @@ -125,6 +125,7 @@ enum I2C_REGS_OFFSET {
> > OFFSET_HS,
> > OFFSET_SOFTRESET,
> > OFFSET_DCM_EN,
> > + OFFSET_MULTI_DMA,
> > OFFSET_PATH_DIR,
> > OFFSET_DEBUGSTAT,
> > OFFSET_DEBUGCTRL,
> > @@ -192,8 +193,9 @@ enum I2C_REGS_OFFSET {
> > [OFFSET_TRANSFER_LEN_AUX] = 0x44,
> > [OFFSET_CLOCK_DIV] = 0x48,
> > [OFFSET_SOFTRESET] = 0x50,
> > + [OFFSET_MULTI_DMA] = 0x84,
> > [OFFSET_SCL_MIS_COMP_POINT] = 0x90,
> > - [OFFSET_DEBUGSTAT] = 0xe0,
> > + [OFFSET_DEBUGSTAT] = 0xe4,
>
> Is this offset only for mt8192 or also for mt8183?
> In any case that should go in as another patch. Either a fix or a new
> mt_i2c_regs_v3[]
>
> Regards,
Matthias
Hi Matthias,
This offset value is suitable for the IC of mt_i2c_regs_v2 hardware
design similar to mt8192/8195, not for 8183.
The reason for the modification here is that the previous
offset information is incorrect, OFFSET_DEBUGSTAT = 0XE4 is
the correct value.
Regards,
Kewei
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 1/3] dt-bindings: i2c: update bindings for MT8195 SoC
2021-06-08 3:16 ` [PATCH 1/3] dt-bindings: i2c: update bindings for MT8195 SoC Kewei Xu
2021-06-08 13:59 ` Matthias Brugger
@ 2021-06-18 20:27 ` Rob Herring
1 sibling, 0 replies; 10+ messages in thread
From: Rob Herring @ 2021-06-18 20:27 UTC (permalink / raw
To: Kewei Xu
Cc: qii.wang, qiangming.xia, matthias.bgg, wsa, devicetree,
linux-kernel, srv_heupstream, linux-i2c, linux-arm-kernel,
leilk.liu, linux-mediatek, robh+dt
On Tue, 08 Jun 2021 11:16:38 +0800, Kewei Xu wrote:
> From: "Kewei.Xu" <kewei.xu@mediatek.com>
>
> Add a DT binding documentation for the MT8195 soc.
>
> Signed-off-by: Kewei.Xu <kewei.xu@mediatek.com>
> ---
> Documentation/devicetree/bindings/i2c/i2c-mt65xx.txt | 1 +
> 1 file changed, 1 insertion(+)
>
Acked-by: Rob Herring <robh@kernel.org>
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/3] i2c: mediatek: Dump i2c/dma register when a timeout occurs
2021-06-09 2:43 ` Kewei Xu
@ 2021-06-29 4:19 ` Tzung-Bi Shih
2021-06-29 12:12 ` Kewei Xu
0 siblings, 1 reply; 10+ messages in thread
From: Tzung-Bi Shih @ 2021-06-29 4:19 UTC (permalink / raw
To: Kewei Xu
Cc: Matthias Brugger, wsa, robh+dt, linux-i2c, devicetree,
linux-arm-kernel, linux-kernel, linux-mediatek, srv_heupstream,
leilk.liu, qii.wang, qiangming.xia, liguo.zhang
On Wed, Jun 9, 2021 at 10:44 AM Kewei Xu <kewei.xu@mediatek.com> wrote:
>
> On Tue, 2021-06-08 at 16:01 +0200, Matthias Brugger wrote:
> > Is this offset only for mt8192 or also for mt8183?
> > In any case that should go in as another patch. Either a fix or a new
> > mt_i2c_regs_v3[]
>
> This offset value is suitable for the IC of mt_i2c_regs_v2 hardware
> design similar to mt8192/8195, not for 8183.
>
> The reason for the modification here is that the previous
> offset information is incorrect, OFFSET_DEBUGSTAT = 0XE4 is
> the correct value.
Please submit another patch for fixing the incorrect value.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/3] i2c: mediatek: Dump i2c/dma register when a timeout occurs
2021-06-29 4:19 ` Tzung-Bi Shih
@ 2021-06-29 12:12 ` Kewei Xu
0 siblings, 0 replies; 10+ messages in thread
From: Kewei Xu @ 2021-06-29 12:12 UTC (permalink / raw
To: Tzung-Bi Shih
Cc: Matthias Brugger, wsa, robh+dt, linux-i2c, devicetree,
linux-arm-kernel, linux-kernel, linux-mediatek, srv_heupstream,
leilk.liu, qii.wang, qiangming.xia, liguo.zhang
On Tue, 2021-06-29 at 12:19 +0800, Tzung-Bi Shih wrote:
> On Wed, Jun 9, 2021 at 10:44 AM Kewei Xu <kewei.xu@mediatek.com> wrote:
> >
> > On Tue, 2021-06-08 at 16:01 +0200, Matthias Brugger wrote:
> > > Is this offset only for mt8192 or also for mt8183?
> > > In any case that should go in as another patch. Either a fix or a new
> > > mt_i2c_regs_v3[]
> >
> > This offset value is suitable for the IC of mt_i2c_regs_v2 hardware
> > design similar to mt8192/8195, not for 8183.
> >
> > The reason for the modification here is that the previous
> > offset information is incorrect, OFFSET_DEBUGSTAT = 0XE4 is
> > the correct value.
>
> Please submit another patch for fixing the incorrect value.
Okay, I will resubmit a patch to fixing the incorrect value,Thanks.
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2021-06-29 12:13 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-06-08 3:16 [PATCH 0/3] add i2c support for mt8195 Kewei Xu
2021-06-08 3:16 ` [PATCH 1/3] dt-bindings: i2c: update bindings for MT8195 SoC Kewei Xu
2021-06-08 13:59 ` Matthias Brugger
2021-06-18 20:27 ` Rob Herring
2021-06-08 3:16 ` [PATCH 2/3] i2c: mediatek: Dump i2c/dma register when a timeout occurs Kewei Xu
2021-06-08 14:01 ` Matthias Brugger
2021-06-09 2:43 ` Kewei Xu
2021-06-29 4:19 ` Tzung-Bi Shih
2021-06-29 12:12 ` Kewei Xu
2021-06-08 3:16 ` [PATCH 3/3] i2c: mediatek: Reset the handshake signal between i2c and dma Kewei Xu
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).