From: Lee Jones <lee@kernel.org>
To: Matthias Schiffer <matthias.schiffer@ew.tq-group.com>
Cc: Andi Shyti <andi.shyti@kernel.org>,
linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org,
linux@ew.tq-group.com
Subject: Re: [PATCH v4 2/4] mfd: tqmx86: refactor I2C setup
Date: Thu, 8 Jan 2026 11:52:33 +0000 [thread overview]
Message-ID: <20260108115233.GE302752@google.com> (raw)
In-Reply-To: <10b68f0c46a68d9b946d6cedfacb5a9efb476e37.1765373900.git.matthias.schiffer@ew.tq-group.com>
On Wed, 10 Dec 2025, Matthias Schiffer wrote:
> Preparation for supporting the second I2C controller, and detecting both
> ocores and machxo2 controllers.
>
> - Introduce tqmx86_detect_i2c1()
> - Avoid the confusing "soft" I2C controller term - just call it the
> ocores I2C
> - Define TQMX86_REG_I2C_DETECT relative to I2C base register
>
> Signed-off-by: Matthias Schiffer <matthias.schiffer@ew.tq-group.com>
> ---
>
> v2: no changes
>
> v3: no changes
>
> v4:
> - Keep resource and mfd_cell definitions at the toplevel
> - The very generic tqmx86_detect_i2c() of the previous version is replaced with
> tqmx86_detect_i2c1(), so we don't need to pass so many arguments around
>
> drivers/mfd/tqmx86.c | 92 +++++++++++++++++++++++---------------------
> 1 file changed, 49 insertions(+), 43 deletions(-)
>
> diff --git a/drivers/mfd/tqmx86.c b/drivers/mfd/tqmx86.c
> index 1c2fe3f912389..6d304741f8989 100644
> --- a/drivers/mfd/tqmx86.c
> +++ b/drivers/mfd/tqmx86.c
> @@ -18,7 +18,7 @@
>
> #define TQMX86_IOBASE 0x180
> #define TQMX86_IOSIZE 0x20
> -#define TQMX86_IOBASE_I2C 0x1a0
> +#define TQMX86_IOBASE_I2C1 0x1a0
> #define TQMX86_IOSIZE_I2C 0xa
> #define TQMX86_IOBASE_WATCHDOG 0x18b
> #define TQMX86_IOSIZE_WATCHDOG 0x2
> @@ -56,8 +56,8 @@
> #define TQMX86_REG_IO_EXT_INT_GPIO_SHIFT 4
> #define TQMX86_REG_SAUC 0x17
>
> -#define TQMX86_REG_I2C_DETECT 0x1a7
> -#define TQMX86_REG_I2C_DETECT_SOFT 0xa5
> +#define TQMX86_REG_I2C_DETECT 0x7
> +#define TQMX86_REG_I2C_DETECT_OCORES 0xa5
>
> static uint gpio_irq;
> module_param(gpio_irq, uint, 0);
> @@ -72,8 +72,8 @@ enum tqmx86_i2c1_resource_type {
> TQMX86_I2C1_IRQ,
> };
>
> -static struct resource tqmx_i2c_soft_resources[] = {
> - [TQMX86_I2C1_IO] = DEFINE_RES_IO(TQMX86_IOBASE_I2C, TQMX86_IOSIZE_I2C),
> +static struct resource tqmx_i2c1_resources[] = {
> + [TQMX86_I2C1_IO] = DEFINE_RES_IO(TQMX86_IOBASE_I2C1, TQMX86_IOSIZE_I2C),
> /* Placeholder for IRQ resource */
> [TQMX86_I2C1_IRQ] = {},
> };
> @@ -93,26 +93,24 @@ static struct resource tqmx_gpio_resources[] = {
> [TQMX86_GPIO_IRQ] = {},
> };
>
> -static struct i2c_board_info tqmx86_i2c_devices[] = {
> +static const struct i2c_board_info tqmx86_i2c1_devices[] = {
> {
> /* 4K EEPROM at 0x50 */
> I2C_BOARD_INFO("24c32", 0x50),
> },
> };
>
> -static struct ocores_i2c_platform_data ocores_platform_data = {
> - .num_devices = ARRAY_SIZE(tqmx86_i2c_devices),
> - .devices = tqmx86_i2c_devices,
> +static struct ocores_i2c_platform_data tqmx86_i2c1_platform_data_ocores = {
> + .num_devices = ARRAY_SIZE(tqmx86_i2c1_devices),
> + .devices = tqmx86_i2c1_devices,
> };
>
> -static const struct mfd_cell tqmx86_i2c_soft_dev[] = {
> - {
> - .name = "ocores-i2c",
> - .platform_data = &ocores_platform_data,
> - .pdata_size = sizeof(ocores_platform_data),
> - .resources = tqmx_i2c_soft_resources,
> - .num_resources = ARRAY_SIZE(tqmx_i2c_soft_resources),
> - },
> +static const struct mfd_cell tqmx86_i2c1_dev_ocores = {
> + .name = "ocores-i2c",
> + .platform_data = &tqmx86_i2c1_platform_data_ocores,
> + .pdata_size = sizeof(tqmx86_i2c1_platform_data_ocores),
> + .resources = tqmx_i2c1_resources,
> + .num_resources = ARRAY_SIZE(tqmx_i2c1_resources),
> };
>
> static const struct mfd_cell tqmx86_devs[] = {
> @@ -246,13 +244,40 @@ static int tqmx86_setup_irq(struct device *dev, const char *label, u8 irq,
> return 0;
> }
>
> +static int tqmx86_detect_i2c1(struct device *dev, void __iomem *io_base, int clock_khz)
> +{
> + u8 i2c_det;
> +
> + if (i2c1_irq) {
> + if (!tqmx86_setup_irq(dev, "I2C1", i2c1_irq, io_base,
It was better before.
Please place the return value into a local variable and compare that.
Function calls inside if () statements hurts readability.
> + TQMX86_REG_IO_EXT_INT_I2C1_SHIFT))
> + tqmx_i2c1_resources[TQMX86_I2C1_IRQ] = DEFINE_RES_IRQ(i2c1_irq);
> + }
> +
> + /*
> + * The I2C_DETECT register is in the range assigned to the I2C driver
> + * later, so we don't extend TQMX86_IOSIZE. Use inb() for this one-off
> + * access instead of ioport_map + unmap.
> + */
> + i2c_det = inb(TQMX86_IOBASE_I2C1 + TQMX86_REG_I2C_DETECT);
> +
> + if (i2c_det == TQMX86_REG_I2C_DETECT_OCORES) {
Reverse the logic and return early instead.
> + tqmx86_i2c1_platform_data_ocores.clock_khz = clock_khz;
> + return devm_mfd_add_devices(dev, PLATFORM_DEVID_NONE,
> + &tqmx86_i2c1_dev_ocores, 1, NULL, 0,
> + NULL);
> + }
> +
> + return 0;
> +}
> +
> static int tqmx86_probe(struct platform_device *pdev)
> {
> - u8 board_id, sauc, rev, i2c_det;
> + u8 board_id, sauc, rev;
> struct device *dev = &pdev->dev;
> const char *board_name;
> void __iomem *io_base;
> - int err;
> + int err, clock_khz;
>
> io_base = devm_ioport_map(dev, TQMX86_IOBASE, TQMX86_IOSIZE);
> if (!io_base)
> @@ -267,13 +292,6 @@ static int tqmx86_probe(struct platform_device *pdev)
> "Found %s - Board ID %d, PCB Revision %d, PLD Revision %d\n",
> board_name, board_id, rev >> 4, rev & 0xf);
>
> - /*
> - * The I2C_DETECT register is in the range assigned to the I2C driver
> - * later, so we don't extend TQMX86_IOSIZE. Use inb() for this one-off
> - * access instead of ioport_map + unmap.
> - */
> - i2c_det = inb(TQMX86_REG_I2C_DETECT);
> -
> if (gpio_irq) {
> err = tqmx86_setup_irq(dev, "GPIO", gpio_irq, io_base,
> TQMX86_REG_IO_EXT_INT_GPIO_SHIFT);
> @@ -281,23 +299,11 @@ static int tqmx86_probe(struct platform_device *pdev)
> tqmx_gpio_resources[TQMX86_GPIO_IRQ] = DEFINE_RES_IRQ(gpio_irq);
> }
>
> - ocores_platform_data.clock_khz = tqmx86_board_id_to_clk_rate(dev, board_id);
> -
> - if (i2c_det == TQMX86_REG_I2C_DETECT_SOFT) {
> - if (i2c1_irq) {
> - err = tqmx86_setup_irq(dev, "I2C1", i2c1_irq, io_base,
> - TQMX86_REG_IO_EXT_INT_I2C1_SHIFT);
> - if (!err)
> - tqmx_i2c_soft_resources[TQMX86_I2C1_IRQ] = DEFINE_RES_IRQ(i2c1_irq);
> - }
> -
> - err = devm_mfd_add_devices(dev, PLATFORM_DEVID_NONE,
> - tqmx86_i2c_soft_dev,
> - ARRAY_SIZE(tqmx86_i2c_soft_dev),
> - NULL, 0, NULL);
> - if (err)
> - return err;
> - }
> + clock_khz = tqmx86_board_id_to_clk_rate(dev, board_id);
Move this into the new functions and only call it if required.
> +
> + err = tqmx86_detect_i2c1(dev, io_base, clock_khz);
> + if (err)
> + return err;
>
> return devm_mfd_add_devices(dev, PLATFORM_DEVID_NONE,
> tqmx86_devs,
> --
> TQ-Systems GmbH | Mühlstraße 2, Gut Delling | 82229 Seefeld, Germany
> Amtsgericht München, HRB 105018
> Geschäftsführer: Detlef Schneider, Rüdiger Stahl, Stefan Schneider
> https://www.tq-group.com/
>
--
Lee Jones [李琼斯]
next prev parent reply other threads:[~2026-01-08 11:52 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-12-10 13:52 [PATCH v4 1/4] i2c: machxo2: new driver Matthias Schiffer
2025-12-10 13:52 ` [PATCH v4 2/4] mfd: tqmx86: refactor I2C setup Matthias Schiffer
2026-01-08 11:52 ` Lee Jones [this message]
2025-12-10 13:52 ` [PATCH v4 3/4] mfd: tqmx86: add detection for secondary I2C controller Matthias Schiffer
2025-12-10 13:52 ` [PATCH v4 4/4] mfd: tqmx86: add detection for MachXO2 " Matthias Schiffer
2026-01-08 11:55 ` Lee Jones
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=20260108115233.GE302752@google.com \
--to=lee@kernel.org \
--cc=andi.shyti@kernel.org \
--cc=linux-i2c@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@ew.tq-group.com \
--cc=matthias.schiffer@ew.tq-group.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.