All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andi Shyti <andi.shyti@kernel.org>
To: xianwei.zhao@amlogic.com
Cc: Junyi Zhao <junyi.zhao@amlogic.com>,
	Rob Herring <robh@kernel.org>,
	 Krzysztof Kozlowski <krzk+dt@kernel.org>,
	Conor Dooley <conor+dt@kernel.org>,
	 Xianwei Zhao <xianwei.zhaol@amlogic.com>,
	Junyi Zhao <junyi.zhaol@amlogic.com>,
	linux-i2c@vger.kernel.org,  linux-amlogic@lists.infradead.org,
	devicetree@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 2/3] i2c: amlogic: Add Amlogic A9 I2C controller driver
Date: Sun, 27 Sep 2026 14:08:52 +0200	[thread overview]
Message-ID: <arkDNC8st4Nsqu1C@zenone.zhora.eu> (raw)
In-Reply-To: <20260924-a9-i2c-v1-2-b8ad9b46f4a8@amlogic.com>

Hi Xianwei,

...

> +config I2C_AMLOGIC_A9
> +	tristate "Amlogic new I2C controller"
> +	depends on ARCH_MESON || COMPILE_TEST
> +	depends on COMMON_CLK
> +	help
> +	  If you say yes to this option, support will be included for the
> +	  I2C interface on the new Amlogic family of SoCs.
> +
> +

Please, remove this extra line

>  config I2C_MICROCHIP_CORE
>  	tristate "Microchip FPGA I2C controller"
>  	depends on ARCH_MICROCHIP_POLARFIRE || COMPILE_TEST

...

> +#include <linux/clk.h>
> +#include <linux/completion.h>
> +#include <linux/i2c.h>
> +#include <linux/interrupt.h>
> +#include <linux/io.h>
> +#include <linux/module.h>
> +#include <linux/of.h>
> +#include <linux/of_device.h>
> +#include <linux/platform_device.h>
> +#include <linux/pinctrl/consumer.h>
> +#include <linux/delay.h>

Please sort the above in alphabetic order.

> +/* Amlogic I2C register map */
> +#define REG_CFG_RDY		0x00
> +#define REG_CFG_I2C		0x04
> +#define REG_CFG_START		0x08
> +#define REG_CFG_BUS		0x0c
> +#define REG_TX_RD_ADDR		0x10
> +#define REG_TX_WR_ADDR		0x14
> +#define REG_RX_RD_ADDR		0x18
> +#define REG_RX_WR_ADDR		0x1c
> +#define REG_CGF_TX		0x20
> +#define REG_CGF_RX		0x24
> +#define REG_CGF_IRQ_STATE	0x30
> +#define REG_CGF_IRQ_ENABLE	0x34
> +#define REG_SHAKE_BLK_CNT	0x38
> +
> +/* CFG RDY fields */
> +#define RDY_TEE_ONLY		BIT(1)
> +#define RDY_IF			BIT(0)
> +
> +/* CFG I2C fields */
> +#define I2C_RX_THR		GENMASK(23, 16)
> +#define I2C_TX_THR		GENMASK(15, 8)
> +
> +/* CFG BUS fields */
> +#define BUS_NO_STOP		BIT(18)
> +#define BUS_SPEED_MODE		BIT(17)
> +#define BUS_SLAVE_MODE		BIT(16)
> +#define BUS_FILTER_MASK		GENMASK(15, 12)
> +/* SCL = clk/b_ratio	if b_ratio<=8, SCL = clk/8 */
> +#define BUS_RATIO_MASK		GENMASK(11, 0)
> +
> +/* CFG START fields */
> +#define START_START		BIT(31)
> +#define START_LEN		GENMASK(23, 12)
> +#define START_LEN_SHIFT		12
> +#define START_SLAVE_ADDR	GENMASK(10, 1)
> +#define START_READ		BIT(0)
> +
> +/* CFG TX_RX fields */
> +#define TX_RX_EMPTY		BIT(9)
> +#define TX_RX_FULL		BIT(8)
> +#define TX_RX_DATA		GENMASK(7, 0)
> +
> +/*CGF IRQ fields */
> +#define IRQ_ALL_MASK		0xffff
> +#define A9_NCK_ERROR		BIT(0)
> +#define A9_RX_EMPTY		BIT(1)
> +#define A9_RX_FULL		BIT(2)
> +#define A9_TX_EMPTY		BIT(3)
> +#define A9_TX_FULL		BIT(4)
> +#define A9_RX_THRESH_READ	BIT(5)
> +#define A9_TX_THRESH_WRITE	BIT(6)
> +#define A9_PHY_DONE		BIT(7)
> +#define A9_TASK_DONE		BIT(8)
> +#define A9_ALL_DONE		BIT(9)
> +
> +#define A9_TRANS_DONE		(A9_PHY_DONE | A9_NCK_ERROR)
> +#define A9_TRANS_ERROR		(A9_NCK_ERROR)
> +#define A9_ENABLE_IRQ_BIT	(A9_NCK_ERROR | A9_PHY_DONE)
> +#define THRESH_MODE		(A9_RX_THRESH_READ | A9_TX_THRESH_WRITE)
> +
> +#define A9_I2C_FIFO_DEPTH	32
> +#define A9_I2C_HALF_FIFO	(A9_I2C_FIFO_DEPTH >> 1)
> +
> +#define I2C_TIMEOUT_MS		500
> +
> +enum {
> +	STATE_IDLE,
> +	STATE_READ,
> +	STATE_WRITE,
> +};
> +
> +enum fifo_fill_mode {
> +	FIFO_FILL_FULL,
> +	FIFO_FILL_HALF,
> +};

For all the enums and defines above, please use the prefix of the
driver name, A9, I guess.

...

> +static void aml_i2c_put_data(struct aml_i2c *i2c, char *buf, int len)
> +{
> +	int i;
> +
> +	/* this i2c module when trans 0 byte, must put at least 1.
> +	 */

Please use the kernel style commenting format, I think checkpatch
would have had raised this.

> +	if (!i2c->msg->len) {
> +		writel(0x00, i2c->regs + REG_CGF_TX);
> +		return;
> +	}
> +
> +	for (i = 0; i < len; i++, buf++)
> +		writel(*buf, i2c->regs + REG_CGF_TX);
> +}
> +
> +static void aml_i2c_prepare_xfer(struct aml_i2c *i2c, enum fifo_fill_mode mode)
> +{
> +	bool write = !(i2c->msg->flags & I2C_M_RD);
> +
> +	if (write) {

you can revert the logic here with if (!write) return; to save a
level of indentation.

> +		if (mode == FIFO_FILL_FULL)
> +			i2c->count = min(i2c->msg->len - i2c->pos, A9_I2C_FIFO_DEPTH);
> +		else
> +			i2c->count = min(i2c->msg->len - i2c->pos, A9_I2C_HALF_FIFO);
> +		aml_i2c_put_data(i2c, i2c->msg->buf + i2c->pos, i2c->count);
> +	}
> +}

...

> +static int aml_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
> +{
> +	struct aml_i2c *i2c = adap->algo_data;
> +	int i, ret = 0;
> +
> +	for (i = 0; i < num; i++) {
> +		ret = aml_i2c_xfer_msg(i2c, msgs + i, i == num - 1);
> +		if (ret)
> +			break;

you can save some code here by doing

	for (...) {
		int ret;

		ret = aml_i2c_xfer_msg(...);
		if (ret)
			return ret;
	}

	return i;

> +	}
> +
> +	return ret ?: i;
> +}

...

> +static int aml_i2c_probe(struct platform_device *pdev)
> +{
> +	struct device_node *np = pdev->dev.of_node;
> +	struct aml_i2c *i2c;

...

> +	i2c->clk = devm_clk_get(&pdev->dev, NULL);
> +	if (IS_ERR(i2c->clk)) {
> +		dev_err(&pdev->dev, "can't get device clock\n");
> +		return PTR_ERR(i2c->clk);
> +	}

Please use return dev_err_probe(...);

Andi

> +

WARNING: multiple messages have this Message-ID (diff)
From: Andi Shyti <andi.shyti@kernel.org>
To: xianwei.zhao@amlogic.com
Cc: Junyi Zhao <junyi.zhao@amlogic.com>,
	Rob Herring <robh@kernel.org>,
	 Krzysztof Kozlowski <krzk+dt@kernel.org>,
	Conor Dooley <conor+dt@kernel.org>,
	 Xianwei Zhao <xianwei.zhaol@amlogic.com>,
	Junyi Zhao <junyi.zhaol@amlogic.com>,
	linux-i2c@vger.kernel.org,  linux-amlogic@lists.infradead.org,
	devicetree@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 2/3] i2c: amlogic: Add Amlogic A9 I2C controller driver
Date: Sun, 27 Sep 2026 14:08:52 +0200	[thread overview]
Message-ID: <arkDNC8st4Nsqu1C@zenone.zhora.eu> (raw)
In-Reply-To: <20260924-a9-i2c-v1-2-b8ad9b46f4a8@amlogic.com>

Hi Xianwei,

...

> +config I2C_AMLOGIC_A9
> +	tristate "Amlogic new I2C controller"
> +	depends on ARCH_MESON || COMPILE_TEST
> +	depends on COMMON_CLK
> +	help
> +	  If you say yes to this option, support will be included for the
> +	  I2C interface on the new Amlogic family of SoCs.
> +
> +

Please, remove this extra line

>  config I2C_MICROCHIP_CORE
>  	tristate "Microchip FPGA I2C controller"
>  	depends on ARCH_MICROCHIP_POLARFIRE || COMPILE_TEST

...

> +#include <linux/clk.h>
> +#include <linux/completion.h>
> +#include <linux/i2c.h>
> +#include <linux/interrupt.h>
> +#include <linux/io.h>
> +#include <linux/module.h>
> +#include <linux/of.h>
> +#include <linux/of_device.h>
> +#include <linux/platform_device.h>
> +#include <linux/pinctrl/consumer.h>
> +#include <linux/delay.h>

Please sort the above in alphabetic order.

> +/* Amlogic I2C register map */
> +#define REG_CFG_RDY		0x00
> +#define REG_CFG_I2C		0x04
> +#define REG_CFG_START		0x08
> +#define REG_CFG_BUS		0x0c
> +#define REG_TX_RD_ADDR		0x10
> +#define REG_TX_WR_ADDR		0x14
> +#define REG_RX_RD_ADDR		0x18
> +#define REG_RX_WR_ADDR		0x1c
> +#define REG_CGF_TX		0x20
> +#define REG_CGF_RX		0x24
> +#define REG_CGF_IRQ_STATE	0x30
> +#define REG_CGF_IRQ_ENABLE	0x34
> +#define REG_SHAKE_BLK_CNT	0x38
> +
> +/* CFG RDY fields */
> +#define RDY_TEE_ONLY		BIT(1)
> +#define RDY_IF			BIT(0)
> +
> +/* CFG I2C fields */
> +#define I2C_RX_THR		GENMASK(23, 16)
> +#define I2C_TX_THR		GENMASK(15, 8)
> +
> +/* CFG BUS fields */
> +#define BUS_NO_STOP		BIT(18)
> +#define BUS_SPEED_MODE		BIT(17)
> +#define BUS_SLAVE_MODE		BIT(16)
> +#define BUS_FILTER_MASK		GENMASK(15, 12)
> +/* SCL = clk/b_ratio	if b_ratio<=8, SCL = clk/8 */
> +#define BUS_RATIO_MASK		GENMASK(11, 0)
> +
> +/* CFG START fields */
> +#define START_START		BIT(31)
> +#define START_LEN		GENMASK(23, 12)
> +#define START_LEN_SHIFT		12
> +#define START_SLAVE_ADDR	GENMASK(10, 1)
> +#define START_READ		BIT(0)
> +
> +/* CFG TX_RX fields */
> +#define TX_RX_EMPTY		BIT(9)
> +#define TX_RX_FULL		BIT(8)
> +#define TX_RX_DATA		GENMASK(7, 0)
> +
> +/*CGF IRQ fields */
> +#define IRQ_ALL_MASK		0xffff
> +#define A9_NCK_ERROR		BIT(0)
> +#define A9_RX_EMPTY		BIT(1)
> +#define A9_RX_FULL		BIT(2)
> +#define A9_TX_EMPTY		BIT(3)
> +#define A9_TX_FULL		BIT(4)
> +#define A9_RX_THRESH_READ	BIT(5)
> +#define A9_TX_THRESH_WRITE	BIT(6)
> +#define A9_PHY_DONE		BIT(7)
> +#define A9_TASK_DONE		BIT(8)
> +#define A9_ALL_DONE		BIT(9)
> +
> +#define A9_TRANS_DONE		(A9_PHY_DONE | A9_NCK_ERROR)
> +#define A9_TRANS_ERROR		(A9_NCK_ERROR)
> +#define A9_ENABLE_IRQ_BIT	(A9_NCK_ERROR | A9_PHY_DONE)
> +#define THRESH_MODE		(A9_RX_THRESH_READ | A9_TX_THRESH_WRITE)
> +
> +#define A9_I2C_FIFO_DEPTH	32
> +#define A9_I2C_HALF_FIFO	(A9_I2C_FIFO_DEPTH >> 1)
> +
> +#define I2C_TIMEOUT_MS		500
> +
> +enum {
> +	STATE_IDLE,
> +	STATE_READ,
> +	STATE_WRITE,
> +};
> +
> +enum fifo_fill_mode {
> +	FIFO_FILL_FULL,
> +	FIFO_FILL_HALF,
> +};

For all the enums and defines above, please use the prefix of the
driver name, A9, I guess.

...

> +static void aml_i2c_put_data(struct aml_i2c *i2c, char *buf, int len)
> +{
> +	int i;
> +
> +	/* this i2c module when trans 0 byte, must put at least 1.
> +	 */

Please use the kernel style commenting format, I think checkpatch
would have had raised this.

> +	if (!i2c->msg->len) {
> +		writel(0x00, i2c->regs + REG_CGF_TX);
> +		return;
> +	}
> +
> +	for (i = 0; i < len; i++, buf++)
> +		writel(*buf, i2c->regs + REG_CGF_TX);
> +}
> +
> +static void aml_i2c_prepare_xfer(struct aml_i2c *i2c, enum fifo_fill_mode mode)
> +{
> +	bool write = !(i2c->msg->flags & I2C_M_RD);
> +
> +	if (write) {

you can revert the logic here with if (!write) return; to save a
level of indentation.

> +		if (mode == FIFO_FILL_FULL)
> +			i2c->count = min(i2c->msg->len - i2c->pos, A9_I2C_FIFO_DEPTH);
> +		else
> +			i2c->count = min(i2c->msg->len - i2c->pos, A9_I2C_HALF_FIFO);
> +		aml_i2c_put_data(i2c, i2c->msg->buf + i2c->pos, i2c->count);
> +	}
> +}

...

> +static int aml_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
> +{
> +	struct aml_i2c *i2c = adap->algo_data;
> +	int i, ret = 0;
> +
> +	for (i = 0; i < num; i++) {
> +		ret = aml_i2c_xfer_msg(i2c, msgs + i, i == num - 1);
> +		if (ret)
> +			break;

you can save some code here by doing

	for (...) {
		int ret;

		ret = aml_i2c_xfer_msg(...);
		if (ret)
			return ret;
	}

	return i;

> +	}
> +
> +	return ret ?: i;
> +}

...

> +static int aml_i2c_probe(struct platform_device *pdev)
> +{
> +	struct device_node *np = pdev->dev.of_node;
> +	struct aml_i2c *i2c;

...

> +	i2c->clk = devm_clk_get(&pdev->dev, NULL);
> +	if (IS_ERR(i2c->clk)) {
> +		dev_err(&pdev->dev, "can't get device clock\n");
> +		return PTR_ERR(i2c->clk);
> +	}

Please use return dev_err_probe(...);

Andi

> +

_______________________________________________
linux-amlogic mailing list
linux-amlogic@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-amlogic

  parent reply	other threads:[~2026-09-27 12:08 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-24  8:39 [PATCH 0/3] i2c: Add driver support Amlogic A9 I2C Xianwei Zhao via B4 Relay
2026-09-24  8:39 ` Xianwei Zhao via B4 Relay
2026-09-24  8:39 ` Xianwei Zhao
2026-09-24  8:39 ` [PATCH 1/3] dt-bindings: i2c: add Amlogic A9 I2C controller Xianwei Zhao via B4 Relay
2026-09-24  8:39   ` Xianwei Zhao via B4 Relay
2026-09-24  8:39   ` Xianwei Zhao
2026-09-24  8:46   ` sashiko-bot
2026-09-24  8:46     ` sashiko-bot
2026-09-24 17:01   ` Conor Dooley
2026-09-24 17:01     ` Conor Dooley
2026-09-29  3:11     ` Xianwei Zhao
2026-09-29  3:11       ` Xianwei Zhao
2026-09-24  8:39 ` [PATCH 2/3] i2c: amlogic: Add Amlogic A9 I2C controller driver Xianwei Zhao via B4 Relay
2026-09-24  8:39   ` Xianwei Zhao via B4 Relay
2026-09-24  8:39   ` Xianwei Zhao
2026-09-24  8:57   ` sashiko-bot
2026-09-24  8:57     ` sashiko-bot
2026-09-27 12:08   ` Andi Shyti [this message]
2026-09-27 12:08     ` Andi Shyti
2026-09-29  5:53     ` Xianwei Zhao
2026-09-29  5:53       ` Xianwei Zhao
2026-09-24  8:39 ` [PATCH 3/3] MAINTAINERS: Add an entry for Amlogic I2C driver Xianwei Zhao via B4 Relay
2026-09-24  8:39   ` Xianwei Zhao via B4 Relay
2026-09-24  8:39   ` Xianwei Zhao

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=arkDNC8st4Nsqu1C@zenone.zhora.eu \
    --to=andi.shyti@kernel.org \
    --cc=conor+dt@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=junyi.zhao@amlogic.com \
    --cc=junyi.zhaol@amlogic.com \
    --cc=krzk+dt@kernel.org \
    --cc=linux-amlogic@lists.infradead.org \
    --cc=linux-i2c@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=robh@kernel.org \
    --cc=xianwei.zhao@amlogic.com \
    --cc=xianwei.zhaol@amlogic.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.