linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [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	[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	[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	[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 NNTP newsgroup(s).