* [PATCH 00/12] i2c: add and start using i2c_adapter-specific printk helpers
@ 2025-12-23 10:02 Bartosz Golaszewski
2025-12-23 10:02 ` [PATCH 01/12] i2c: add " Bartosz Golaszewski
` (13 more replies)
0 siblings, 14 replies; 28+ messages in thread
From: Bartosz Golaszewski @ 2025-12-23 10:02 UTC (permalink / raw)
To: Wolfram Sang, Andi Shyti, Chen-Yu Tsai, Jernej Skrabec,
Samuel Holland, Khalil Blaiech, Asmaa Mnebhi, Jean Delvare,
Madhavan Srinivasan, Michael Ellerman, Nicholas Piggin,
Christophe Leroy (CS GROUP), Andreas Färber,
Manivannan Sadhasivam
Cc: linux-i2c, linux-kernel, linux-arm-kernel, linux-sunxi,
linuxppc-dev, linux-actions, Bartosz Golaszewski,
Bartosz Golaszewski
It's been another year of discussing the object life-time problems at
conferences. I2C is one of the offenders and its problems are more
complex than those of some other subsystems. It seems the revocable[1]
API may make its way into the kernel this year but even with it in
place, I2C won't be able to use it as there's currently nothing to
*revoke*. The struct device is embedded within the i2c_adapter struct
whose lifetime is tied to the provider device being bound to its driver.
Fixing this won't be fast and easy but nothing's going to happen if we
don't start chipping away at it. The ultimate goal in order to be able
to use an SRCU-based solution (revocable or otherwise) is to convert the
embedded struct device in struct i2c_adapter into an __rcu pointer that
can be *revoked*. To that end we need to hide all dereferences of
adap->dev in drivers.
This series addresses the usage of adap->dev in device printk() helpers
(dev_err() et al). It introduces a set of i2c-specific helpers and
starts using them across bus drivers. For now just 12 patches but I'll
keep on doing it if these get accepted. Once these get upstream for
v6.20/7.0, we'll be able to also start converting i2c drivers outside of
drivers/i2c/.
[1] https://lore.kernel.org/all/20251106152330.11733-1-tzungbi@kernel.org/
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
---
Bartosz Golaszewski (12):
i2c: add i2c_adapter-specific printk helpers
i2c: sun6i-p2wi: use i2c_adapter-specific printk helpers
i2c: mlxbf: use i2c_adapter-specific printk helpers
i2c: isch: use i2c_adapter-specific printk helpers
i2c: ali1535: use i2c_adapter-specific printk helpers
i2c: scmi: use i2c_adapter-specific printk helpers
i2c: ali15x3: use i2c_adapter-specific printk helpers
i2c: powermac: use i2c_adapter-specific printk helpers
i2c: owl: use i2c_adapter-specific printk helpers
i2c: nforce2: use i2c_adapter-specific printk helpers
i2c: amd756: use i2c_adapter-specific printk helpers
i2c: piix4: use i2c_adapter-specific printk helpers
drivers/i2c/busses/i2c-ali1535.c | 20 ++++++++++----------
drivers/i2c/busses/i2c-ali15x3.c | 20 ++++++++++----------
drivers/i2c/busses/i2c-amd756.c | 24 ++++++++++++------------
drivers/i2c/busses/i2c-isch.c | 32 ++++++++++++++++----------------
drivers/i2c/busses/i2c-mlxbf.c | 19 +++++++++----------
drivers/i2c/busses/i2c-nforce2.c | 14 +++++++-------
drivers/i2c/busses/i2c-owl.c | 4 ++--
drivers/i2c/busses/i2c-piix4.c | 8 ++++----
drivers/i2c/busses/i2c-powermac.c | 26 +++++++++++++-------------
drivers/i2c/busses/i2c-scmi.c | 6 +++---
drivers/i2c/busses/i2c-sun6i-p2wi.c | 8 ++++----
include/linux/i2c.h | 6 ++++++
12 files changed, 96 insertions(+), 91 deletions(-)
---
base-commit: cc3aa43b44bdb43dfbac0fcb51c56594a11338a8
change-id: 20251222-i2c-printk-helpers-a69f4403ca70
Best regards,
--
Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 28+ messages in thread
* [PATCH 01/12] i2c: add i2c_adapter-specific printk helpers
2025-12-23 10:02 [PATCH 00/12] i2c: add and start using i2c_adapter-specific printk helpers Bartosz Golaszewski
@ 2025-12-23 10:02 ` Bartosz Golaszewski
2025-12-25 18:30 ` kernel test robot
2025-12-25 19:33 ` kernel test robot
2025-12-23 10:02 ` [PATCH 02/12] i2c: sun6i-p2wi: use " Bartosz Golaszewski
` (12 subsequent siblings)
13 siblings, 2 replies; 28+ messages in thread
From: Bartosz Golaszewski @ 2025-12-23 10:02 UTC (permalink / raw)
To: Wolfram Sang, Andi Shyti, Chen-Yu Tsai, Jernej Skrabec,
Samuel Holland, Khalil Blaiech, Asmaa Mnebhi, Jean Delvare,
Madhavan Srinivasan, Michael Ellerman, Nicholas Piggin,
Christophe Leroy (CS GROUP), Andreas Färber,
Manivannan Sadhasivam
Cc: linux-i2c, linux-kernel, linux-arm-kernel, linux-sunxi,
linuxppc-dev, linux-actions, Bartosz Golaszewski,
Bartosz Golaszewski
Add a set of i2c-specific printk helpers that wrap their device-level
counterparts and hide the dereferencing of struct device embedded in
struct i2c_adapter. This is done in order to allow moving this struct
device out of struct i2c_adapter into memory managed by i2c core.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
---
include/linux/i2c.h | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/include/linux/i2c.h b/include/linux/i2c.h
index 20fd41b51d5c85ee1665395c07345faafd8e2fca..2225696c859f617479be4d5c9d304bb32cbf5e9d 100644
--- a/include/linux/i2c.h
+++ b/include/linux/i2c.h
@@ -768,6 +768,12 @@ struct i2c_adapter {
};
#define to_i2c_adapter(d) container_of(d, struct i2c_adapter, dev)
+#define i2c_err(adap, fmt, ...) dev_err(&(adap)->dev, fmt, ##__VA_ARGS__)
+#define i2c_warn(adap, fmt, ...) dev_warn(&(adap)->dev, fmt, ##__VA_ARGS__)
+#define i2c_notice(adap, fmt, ...) dev_notice(&(adap)->dev, fmt, ##__VA_ARGS__)
+#define i2c_info(adap, fmt, ...) dev_info(&(adap)->dev, fmt, ##__VA_ARGS__)
+#define i2c_dbg(adap, fmt, ...) dev_dbg(&(adap)->dev, fmt, ##__VA_ARGS__)
+
static inline void *i2c_get_adapdata(const struct i2c_adapter *adap)
{
return dev_get_drvdata(&adap->dev);
--
2.47.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PATCH 02/12] i2c: sun6i-p2wi: use i2c_adapter-specific printk helpers
2025-12-23 10:02 [PATCH 00/12] i2c: add and start using i2c_adapter-specific printk helpers Bartosz Golaszewski
2025-12-23 10:02 ` [PATCH 01/12] i2c: add " Bartosz Golaszewski
@ 2025-12-23 10:02 ` Bartosz Golaszewski
2025-12-23 11:04 ` Chen-Yu Tsai
2025-12-23 10:02 ` [PATCH 03/12] i2c: mlxbf: " Bartosz Golaszewski
` (11 subsequent siblings)
13 siblings, 1 reply; 28+ messages in thread
From: Bartosz Golaszewski @ 2025-12-23 10:02 UTC (permalink / raw)
To: Wolfram Sang, Andi Shyti, Chen-Yu Tsai, Jernej Skrabec,
Samuel Holland, Khalil Blaiech, Asmaa Mnebhi, Jean Delvare,
Madhavan Srinivasan, Michael Ellerman, Nicholas Piggin,
Christophe Leroy (CS GROUP), Andreas Färber,
Manivannan Sadhasivam
Cc: linux-i2c, linux-kernel, linux-arm-kernel, linux-sunxi,
linuxppc-dev, linux-actions, Bartosz Golaszewski,
Bartosz Golaszewski
Convert all instances of using device printk helpers with struct device
embedded in struct i2c_adapter to the new i2c-specific macros that hide
that dereference.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
---
drivers/i2c/busses/i2c-sun6i-p2wi.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/i2c/busses/i2c-sun6i-p2wi.c b/drivers/i2c/busses/i2c-sun6i-p2wi.c
index fb5280b8cf7fc0e3cba8ea6a318172ea2b011a02..845ca56cdae2d056c122eb648c082f319d955b5e 100644
--- a/drivers/i2c/busses/i2c-sun6i-p2wi.c
+++ b/drivers/i2c/busses/i2c-sun6i-p2wi.c
@@ -122,7 +122,7 @@ static int p2wi_smbus_xfer(struct i2c_adapter *adap, u16 addr,
unsigned long dlen = P2WI_DLEN_DATA_LENGTH(1);
if (p2wi->target_addr >= 0 && addr != p2wi->target_addr) {
- dev_err(&adap->dev, "invalid P2WI address\n");
+ i2c_err(adap, "invalid P2WI address\n");
return -EINVAL;
}
@@ -139,7 +139,7 @@ static int p2wi_smbus_xfer(struct i2c_adapter *adap, u16 addr,
writel(dlen, p2wi->regs + P2WI_DLEN);
if (readl(p2wi->regs + P2WI_CTRL) & P2WI_CTRL_START_TRANS) {
- dev_err(&adap->dev, "P2WI bus busy\n");
+ i2c_err(adap, "P2WI bus busy\n");
return -EBUSY;
}
@@ -154,12 +154,12 @@ static int p2wi_smbus_xfer(struct i2c_adapter *adap, u16 addr,
wait_for_completion(&p2wi->complete);
if (p2wi->status & P2WI_INTS_LOAD_BSY) {
- dev_err(&adap->dev, "P2WI bus busy\n");
+ i2c_err(adap, "P2WI bus busy\n");
return -EBUSY;
}
if (p2wi->status & P2WI_INTS_TRANS_ERR) {
- dev_err(&adap->dev, "P2WI bus xfer error\n");
+ i2c_err(adap, "P2WI bus xfer error\n");
return -ENXIO;
}
--
2.47.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PATCH 03/12] i2c: mlxbf: use i2c_adapter-specific printk helpers
2025-12-23 10:02 [PATCH 00/12] i2c: add and start using i2c_adapter-specific printk helpers Bartosz Golaszewski
2025-12-23 10:02 ` [PATCH 01/12] i2c: add " Bartosz Golaszewski
2025-12-23 10:02 ` [PATCH 02/12] i2c: sun6i-p2wi: use " Bartosz Golaszewski
@ 2025-12-23 10:02 ` Bartosz Golaszewski
2025-12-23 10:02 ` [PATCH 04/12] i2c: isch: " Bartosz Golaszewski
` (10 subsequent siblings)
13 siblings, 0 replies; 28+ messages in thread
From: Bartosz Golaszewski @ 2025-12-23 10:02 UTC (permalink / raw)
To: Wolfram Sang, Andi Shyti, Chen-Yu Tsai, Jernej Skrabec,
Samuel Holland, Khalil Blaiech, Asmaa Mnebhi, Jean Delvare,
Madhavan Srinivasan, Michael Ellerman, Nicholas Piggin,
Christophe Leroy (CS GROUP), Andreas Färber,
Manivannan Sadhasivam
Cc: linux-i2c, linux-kernel, linux-arm-kernel, linux-sunxi,
linuxppc-dev, linux-actions, Bartosz Golaszewski,
Bartosz Golaszewski
Convert all instances of using device printk helpers with struct device
embedded in struct i2c_adapter to the new i2c-specific macros that hide
that dereference.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
---
drivers/i2c/busses/i2c-mlxbf.c | 19 +++++++++----------
1 file changed, 9 insertions(+), 10 deletions(-)
diff --git a/drivers/i2c/busses/i2c-mlxbf.c b/drivers/i2c/busses/i2c-mlxbf.c
index 8345f7e6385df64bcd3a82021df3f1e04524c6c5..78a7e893b572a682133b3cea200f571f1977ca1e 100644
--- a/drivers/i2c/busses/i2c-mlxbf.c
+++ b/drivers/i2c/busses/i2c-mlxbf.c
@@ -2045,28 +2045,28 @@ static s32 mlxbf_i2c_smbus_xfer(struct i2c_adapter *adap, u16 addr,
switch (size) {
case I2C_SMBUS_QUICK:
mlxbf_i2c_smbus_quick_command(&request, read);
- dev_dbg(&adap->dev, "smbus quick, slave 0x%02x\n", addr);
+ i2c_dbg(adap, "smbus quick, slave 0x%02x\n", addr);
break;
case I2C_SMBUS_BYTE:
mlxbf_i2c_smbus_byte_func(&request,
read ? &data->byte : &command, read,
pec);
- dev_dbg(&adap->dev, "smbus %s byte, slave 0x%02x.\n",
+ i2c_dbg(adap, "smbus %s byte, slave 0x%02x.\n",
str_read_write(read), addr);
break;
case I2C_SMBUS_BYTE_DATA:
mlxbf_i2c_smbus_data_byte_func(&request, &command, &data->byte,
read, pec);
- dev_dbg(&adap->dev, "smbus %s byte data at 0x%02x, slave 0x%02x.\n",
+ i2c_dbg(adap, "smbus %s byte data at 0x%02x, slave 0x%02x.\n",
str_read_write(read), command, addr);
break;
case I2C_SMBUS_WORD_DATA:
mlxbf_i2c_smbus_data_word_func(&request, &command,
(u8 *)&data->word, read, pec);
- dev_dbg(&adap->dev, "smbus %s word data at 0x%02x, slave 0x%02x.\n",
+ i2c_dbg(adap, "smbus %s word data at 0x%02x, slave 0x%02x.\n",
str_read_write(read), command, addr);
break;
@@ -2074,7 +2074,7 @@ static s32 mlxbf_i2c_smbus_xfer(struct i2c_adapter *adap, u16 addr,
byte_cnt = data->block[0];
mlxbf_i2c_smbus_i2c_block_func(&request, &command, data->block,
&byte_cnt, read, pec);
- dev_dbg(&adap->dev, "i2c %s block data, %d bytes at 0x%02x, slave 0x%02x.\n",
+ i2c_dbg(adap, "i2c %s block data, %d bytes at 0x%02x, slave 0x%02x.\n",
str_read_write(read), byte_cnt, command, addr);
break;
@@ -2082,14 +2082,14 @@ static s32 mlxbf_i2c_smbus_xfer(struct i2c_adapter *adap, u16 addr,
byte_cnt = read ? I2C_SMBUS_BLOCK_MAX : data->block[0];
mlxbf_i2c_smbus_block_func(&request, &command, data->block,
&byte_cnt, read, pec);
- dev_dbg(&adap->dev, "smbus %s block data, %d bytes at 0x%02x, slave 0x%02x.\n",
+ i2c_dbg(adap, "smbus %s block data, %d bytes at 0x%02x, slave 0x%02x.\n",
str_read_write(read), byte_cnt, command, addr);
break;
case I2C_FUNC_SMBUS_PROC_CALL:
mlxbf_i2c_smbus_process_call_func(&request, &command,
(u8 *)&data->word, pec);
- dev_dbg(&adap->dev, "process call, wr/rd at 0x%02x, slave 0x%02x.\n",
+ i2c_dbg(adap, "process call, wr/rd at 0x%02x, slave 0x%02x.\n",
command, addr);
break;
@@ -2098,13 +2098,12 @@ static s32 mlxbf_i2c_smbus_xfer(struct i2c_adapter *adap, u16 addr,
mlxbf_i2c_smbus_blk_process_call_func(&request, &command,
data->block, &byte_cnt,
pec);
- dev_dbg(&adap->dev, "block process call, wr/rd %d bytes, slave 0x%02x.\n",
+ i2c_dbg(adap, "block process call, wr/rd %d bytes, slave 0x%02x.\n",
byte_cnt, addr);
break;
default:
- dev_dbg(&adap->dev, "Unsupported I2C/SMBus command %d\n",
- size);
+ i2c_dbg(adap, "Unsupported I2C/SMBus command %d\n", size);
return -EOPNOTSUPP;
}
--
2.47.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PATCH 04/12] i2c: isch: use i2c_adapter-specific printk helpers
2025-12-23 10:02 [PATCH 00/12] i2c: add and start using i2c_adapter-specific printk helpers Bartosz Golaszewski
` (2 preceding siblings ...)
2025-12-23 10:02 ` [PATCH 03/12] i2c: mlxbf: " Bartosz Golaszewski
@ 2025-12-23 10:02 ` Bartosz Golaszewski
2025-12-23 10:02 ` [PATCH 05/12] i2c: ali1535: " Bartosz Golaszewski
` (9 subsequent siblings)
13 siblings, 0 replies; 28+ messages in thread
From: Bartosz Golaszewski @ 2025-12-23 10:02 UTC (permalink / raw)
To: Wolfram Sang, Andi Shyti, Chen-Yu Tsai, Jernej Skrabec,
Samuel Holland, Khalil Blaiech, Asmaa Mnebhi, Jean Delvare,
Madhavan Srinivasan, Michael Ellerman, Nicholas Piggin,
Christophe Leroy (CS GROUP), Andreas Färber,
Manivannan Sadhasivam
Cc: linux-i2c, linux-kernel, linux-arm-kernel, linux-sunxi,
linuxppc-dev, linux-actions, Bartosz Golaszewski,
Bartosz Golaszewski
Convert all instances of using device printk helpers with struct device
embedded in struct i2c_adapter to the new i2c-specific macros that hide
that dereference.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
---
drivers/i2c/busses/i2c-isch.c | 32 ++++++++++++++++----------------
1 file changed, 16 insertions(+), 16 deletions(-)
diff --git a/drivers/i2c/busses/i2c-isch.c b/drivers/i2c/busses/i2c-isch.c
index a2ac992f9cb0d2accfaa979b802b98c3b7fbe3af..6ff07ab12e30db6821cadea4de3a588b9023ea20 100644
--- a/drivers/i2c/busses/i2c-isch.c
+++ b/drivers/i2c/busses/i2c-isch.c
@@ -86,7 +86,7 @@ static int sch_transaction(struct i2c_adapter *adap)
int temp;
int rc;
- dev_dbg(&adap->dev,
+ i2c_dbg(adap,
"Transaction (pre): CNT=%02x, CMD=%02x, ADD=%02x, DAT0=%02x, DAT1=%02x\n",
sch_io_rd8(priv, SMBHSTCNT), sch_io_rd8(priv, SMBHSTCMD),
sch_io_rd8(priv, SMBHSTADD),
@@ -97,13 +97,13 @@ static int sch_transaction(struct i2c_adapter *adap)
if (temp) {
/* Can not be busy since we checked it in sch_access */
if (temp & 0x01)
- dev_dbg(&adap->dev, "Completion (%02x). Clear...\n", temp);
+ i2c_dbg(adap, "Completion (%02x). Clear...\n", temp);
if (temp & 0x06)
- dev_dbg(&adap->dev, "SMBus error (%02x). Resetting...\n", temp);
+ i2c_dbg(adap, "SMBus error (%02x). Resetting...\n", temp);
sch_io_wr8(priv, SMBHSTSTS, temp);
temp = sch_io_rd8(priv, SMBHSTSTS) & 0x0f;
if (temp) {
- dev_err(&adap->dev, "SMBus is not ready: (%02x)\n", temp);
+ i2c_err(adap, "SMBus is not ready: (%02x)\n", temp);
return -EAGAIN;
}
}
@@ -116,28 +116,28 @@ static int sch_transaction(struct i2c_adapter *adap)
rc = read_poll_timeout(sch_io_rd8, temp, !(temp & 0x08), 200, 500000, true, priv, SMBHSTSTS);
/* If the SMBus is still busy, we give up */
if (rc) {
- dev_err(&adap->dev, "SMBus Timeout!\n");
+ i2c_err(adap, "SMBus Timeout!\n");
} else if (temp & 0x04) {
rc = -EIO;
- dev_dbg(&adap->dev, "Bus collision! SMBus may be locked until next hard reset. (sorry!)\n");
+ i2c_dbg(adap, "Bus collision! SMBus may be locked until next hard reset. (sorry!)\n");
/* Clock stops and target is stuck in mid-transmission */
} else if (temp & 0x02) {
rc = -EIO;
- dev_err(&adap->dev, "Error: no response!\n");
+ i2c_err(adap, "Error: no response!\n");
} else if (temp & 0x01) {
- dev_dbg(&adap->dev, "Post complete!\n");
+ i2c_dbg(adap, "Post complete!\n");
sch_io_wr8(priv, SMBHSTSTS, temp & 0x0f);
temp = sch_io_rd8(priv, SMBHSTSTS) & 0x07;
if (temp & 0x06) {
/* Completion clear failed */
- dev_dbg(&adap->dev,
+ i2c_dbg(adap,
"Failed reset at end of transaction (%02x), Bus error!\n", temp);
}
} else {
rc = -ENXIO;
- dev_dbg(&adap->dev, "No such address.\n");
+ i2c_dbg(adap, "No such address.\n");
}
- dev_dbg(&adap->dev, "Transaction (post): CNT=%02x, CMD=%02x, ADD=%02x, DAT0=%02x, DAT1=%02x\n",
+ i2c_dbg(adap, "Transaction (post): CNT=%02x, CMD=%02x, ADD=%02x, DAT0=%02x, DAT1=%02x\n",
sch_io_rd8(priv, SMBHSTCNT), sch_io_rd8(priv, SMBHSTCMD),
sch_io_rd8(priv, SMBHSTADD),
sch_io_rd8(priv, SMBHSTDAT0), sch_io_rd8(priv, SMBHSTDAT1));
@@ -166,7 +166,7 @@ static s32 sch_access(struct i2c_adapter *adap, u16 addr,
/* Make sure the SMBus host is not busy */
temp = sch_io_rd8(priv, SMBHSTSTS) & 0x0f;
if (temp & 0x08) {
- dev_dbg(&adap->dev, "SMBus busy (%02x)\n", temp);
+ i2c_dbg(adap, "SMBus busy (%02x)\n", temp);
return -EAGAIN;
}
temp = sch_io_rd16(priv, SMBHSTCLK);
@@ -177,11 +177,11 @@ static s32 sch_access(struct i2c_adapter *adap, u16 addr,
* 100 kHz. If we actually run at 25 MHz the bus will be
* run ~75 kHz instead which should do no harm.
*/
- dev_notice(&adap->dev, "Clock divider uninitialized. Setting defaults\n");
+ i2c_notice(adap, "Clock divider uninitialized. Setting defaults\n");
sch_io_wr16(priv, SMBHSTCLK, backbone_speed / (4 * 100));
}
- dev_dbg(&adap->dev, "access size: %d %s\n", size, str_read_write(read_write));
+ i2c_dbg(adap, "access size: %d %s\n", size, str_read_write(read_write));
switch (size) {
case I2C_SMBUS_QUICK:
sch_io_wr8(priv, SMBHSTADD, (addr << 1) | read_write);
@@ -223,10 +223,10 @@ static s32 sch_access(struct i2c_adapter *adap, u16 addr,
size = SCH_BLOCK_DATA;
break;
default:
- dev_warn(&adap->dev, "Unsupported transaction %d\n", size);
+ i2c_warn(adap, "Unsupported transaction %d\n", size);
return -EOPNOTSUPP;
}
- dev_dbg(&adap->dev, "write size %d to 0x%04x\n", size, SMBHSTCNT);
+ i2c_dbg(adap, "write size %d to 0x%04x\n", size, SMBHSTCNT);
temp = sch_io_rd8(priv, SMBHSTCNT);
temp = (temp & 0xb0) | (size & 0x7);
--
2.47.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PATCH 05/12] i2c: ali1535: use i2c_adapter-specific printk helpers
2025-12-23 10:02 [PATCH 00/12] i2c: add and start using i2c_adapter-specific printk helpers Bartosz Golaszewski
` (3 preceding siblings ...)
2025-12-23 10:02 ` [PATCH 04/12] i2c: isch: " Bartosz Golaszewski
@ 2025-12-23 10:02 ` Bartosz Golaszewski
2025-12-23 10:02 ` [PATCH 06/12] i2c: scmi: " Bartosz Golaszewski
` (8 subsequent siblings)
13 siblings, 0 replies; 28+ messages in thread
From: Bartosz Golaszewski @ 2025-12-23 10:02 UTC (permalink / raw)
To: Wolfram Sang, Andi Shyti, Chen-Yu Tsai, Jernej Skrabec,
Samuel Holland, Khalil Blaiech, Asmaa Mnebhi, Jean Delvare,
Madhavan Srinivasan, Michael Ellerman, Nicholas Piggin,
Christophe Leroy (CS GROUP), Andreas Färber,
Manivannan Sadhasivam
Cc: linux-i2c, linux-kernel, linux-arm-kernel, linux-sunxi,
linuxppc-dev, linux-actions, Bartosz Golaszewski,
Bartosz Golaszewski
Convert all instances of using device printk helpers with struct device
embedded in struct i2c_adapter to the new i2c-specific macros that hide
that dereference.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
---
drivers/i2c/busses/i2c-ali1535.c | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/drivers/i2c/busses/i2c-ali1535.c b/drivers/i2c/busses/i2c-ali1535.c
index 1eac358380405838d15551e353605cab0a7e5e65..bf0f36450c5930f86b122618d17eecf1782dd776 100644
--- a/drivers/i2c/busses/i2c-ali1535.c
+++ b/drivers/i2c/busses/i2c-ali1535.c
@@ -215,7 +215,7 @@ static int ali1535_transaction(struct i2c_adapter *adap)
int result = 0;
int timeout = 0;
- dev_dbg(&adap->dev, "Transaction (pre): STS=%02x, TYP=%02x, "
+ i2c_dbg(adap, "Transaction (pre): STS=%02x, TYP=%02x, "
"CMD=%02x, ADD=%02x, DAT0=%02x, DAT1=%02x\n",
inb_p(SMBHSTSTS), inb_p(SMBHSTTYP), inb_p(SMBHSTCMD),
inb_p(SMBHSTADD), inb_p(SMBHSTDAT0), inb_p(SMBHSTDAT1));
@@ -245,7 +245,7 @@ static int ali1535_transaction(struct i2c_adapter *adap)
* BUSY bit may come back on when you try and use the chip
* again. If that's the case you are stuck.
*/
- dev_info(&adap->dev,
+ i2c_info(adap,
"Resetting entire SMB Bus to clear busy condition (%02x)\n",
temp);
outb_p(ALI1535_T_OUT, SMBHSTTYP);
@@ -262,7 +262,7 @@ static int ali1535_transaction(struct i2c_adapter *adap)
* power reset as one of the bits now appears to be
* stuck */
/* This may be a bus or device with electrical problems. */
- dev_err(&adap->dev,
+ i2c_err(adap,
"SMBus reset failed! (0x%02x) - controller or "
"device on bus is probably hung\n", temp);
return -EBUSY;
@@ -290,7 +290,7 @@ static int ali1535_transaction(struct i2c_adapter *adap)
if (temp & ALI1535_STS_FAIL) {
result = -EIO;
- dev_dbg(&adap->dev, "Error: Failed bus transaction\n");
+ i2c_dbg(adap, "Error: Failed bus transaction\n");
}
/* Unfortunately the ALI SMB controller maps "no response" and "bus
@@ -299,7 +299,7 @@ static int ali1535_transaction(struct i2c_adapter *adap)
*/
if (temp & ALI1535_STS_BUSERR) {
result = -ENXIO;
- dev_dbg(&adap->dev,
+ i2c_dbg(adap,
"Error: no response or bus collision ADD=%02x\n",
inb_p(SMBHSTADD));
}
@@ -307,14 +307,14 @@ static int ali1535_transaction(struct i2c_adapter *adap)
/* haven't ever seen this */
if (temp & ALI1535_STS_DEV) {
result = -EIO;
- dev_err(&adap->dev, "Error: device error\n");
+ i2c_err(adap, "Error: device error\n");
}
/* check to see if the "command complete" indication is set */
if (!(temp & ALI1535_STS_DONE))
result = -ETIMEDOUT;
- dev_dbg(&adap->dev, "Transaction (post): STS=%02x, TYP=%02x, "
+ i2c_dbg(adap, "Transaction (post): STS=%02x, TYP=%02x, "
"CMD=%02x, ADD=%02x, DAT0=%02x, DAT1=%02x\n",
inb_p(SMBHSTSTS), inb_p(SMBHSTTYP), inb_p(SMBHSTCMD),
inb_p(SMBHSTADD), inb_p(SMBHSTDAT0), inb_p(SMBHSTDAT1));
@@ -352,7 +352,7 @@ static s32 ali1535_access(struct i2c_adapter *adap, u16 addr,
temp = inb_p(SMBHSTSTS);
}
if (timeout >= MAX_TIMEOUT)
- dev_warn(&adap->dev, "Idle wait Timeout! STS=0x%02x\n", temp);
+ i2c_warn(adap, "Idle wait Timeout! STS=0x%02x\n", temp);
/* clear status register (clear-on-write) */
outb_p(0xFF, SMBHSTSTS);
@@ -416,7 +416,7 @@ static s32 ali1535_access(struct i2c_adapter *adap, u16 addr,
}
break;
default:
- dev_warn(&adap->dev, "Unsupported transaction %d\n", size);
+ i2c_warn(adap, "Unsupported transaction %d\n", size);
result = -EOPNOTSUPP;
goto EXIT;
}
@@ -449,7 +449,7 @@ static s32 ali1535_access(struct i2c_adapter *adap, u16 addr,
outb_p(inb_p(SMBHSTTYP) | ALI1535_BLOCK_CLR, SMBHSTTYP);
for (i = 1; i <= data->block[0]; i++) {
data->block[i] = inb_p(SMBBLKDAT);
- dev_dbg(&adap->dev, "Blk: len=%d, i=%d, data=%02x\n",
+ i2c_dbg(adap, "Blk: len=%d, i=%d, data=%02x\n",
len, i, data->block[i]);
}
break;
--
2.47.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PATCH 06/12] i2c: scmi: use i2c_adapter-specific printk helpers
2025-12-23 10:02 [PATCH 00/12] i2c: add and start using i2c_adapter-specific printk helpers Bartosz Golaszewski
` (4 preceding siblings ...)
2025-12-23 10:02 ` [PATCH 05/12] i2c: ali1535: " Bartosz Golaszewski
@ 2025-12-23 10:02 ` Bartosz Golaszewski
2025-12-23 10:02 ` [PATCH 07/12] i2c: ali15x3: " Bartosz Golaszewski
` (7 subsequent siblings)
13 siblings, 0 replies; 28+ messages in thread
From: Bartosz Golaszewski @ 2025-12-23 10:02 UTC (permalink / raw)
To: Wolfram Sang, Andi Shyti, Chen-Yu Tsai, Jernej Skrabec,
Samuel Holland, Khalil Blaiech, Asmaa Mnebhi, Jean Delvare,
Madhavan Srinivasan, Michael Ellerman, Nicholas Piggin,
Christophe Leroy (CS GROUP), Andreas Färber,
Manivannan Sadhasivam
Cc: linux-i2c, linux-kernel, linux-arm-kernel, linux-sunxi,
linuxppc-dev, linux-actions, Bartosz Golaszewski,
Bartosz Golaszewski
Convert all instances of using device printk helpers with struct device
embedded in struct i2c_adapter to the new i2c-specific macros that hide
that dereference.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
---
drivers/i2c/busses/i2c-scmi.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/i2c/busses/i2c-scmi.c b/drivers/i2c/busses/i2c-scmi.c
index 10a5146b3aa5fc6edb4c2f3e1cc57750041b7087..96a2cd70d367f485d5f230be4eaf124398b0f239 100644
--- a/drivers/i2c/busses/i2c-scmi.c
+++ b/drivers/i2c/busses/i2c-scmi.c
@@ -87,7 +87,7 @@ acpi_smbus_cmi_access(struct i2c_adapter *adap, u16 addr, unsigned short flags,
char *method;
int len = 0;
- dev_dbg(&adap->dev, "access size: %d %s\n", size,
+ i2c_dbg(adap, "access size: %d %s\n", size,
(read_write) ? "READ" : "WRITE");
switch (size) {
case I2C_SMBUS_QUICK:
@@ -148,7 +148,7 @@ acpi_smbus_cmi_access(struct i2c_adapter *adap, u16 addr, unsigned short flags,
break;
default:
- dev_warn(&adap->dev, "Unsupported transaction %d\n", size);
+ i2c_warn(adap, "Unsupported transaction %d\n", size);
return -EOPNOTSUPP;
}
@@ -257,7 +257,7 @@ acpi_smbus_cmi_access(struct i2c_adapter *adap, u16 addr, unsigned short flags,
out:
kfree(buffer.pointer);
- dev_dbg(&adap->dev, "Transaction status: %i\n", result);
+ i2c_dbg(adap, "Transaction status: %i\n", result);
return result;
}
--
2.47.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PATCH 07/12] i2c: ali15x3: use i2c_adapter-specific printk helpers
2025-12-23 10:02 [PATCH 00/12] i2c: add and start using i2c_adapter-specific printk helpers Bartosz Golaszewski
` (5 preceding siblings ...)
2025-12-23 10:02 ` [PATCH 06/12] i2c: scmi: " Bartosz Golaszewski
@ 2025-12-23 10:02 ` Bartosz Golaszewski
2025-12-23 10:02 ` [PATCH 08/12] i2c: powermac: " Bartosz Golaszewski
` (6 subsequent siblings)
13 siblings, 0 replies; 28+ messages in thread
From: Bartosz Golaszewski @ 2025-12-23 10:02 UTC (permalink / raw)
To: Wolfram Sang, Andi Shyti, Chen-Yu Tsai, Jernej Skrabec,
Samuel Holland, Khalil Blaiech, Asmaa Mnebhi, Jean Delvare,
Madhavan Srinivasan, Michael Ellerman, Nicholas Piggin,
Christophe Leroy (CS GROUP), Andreas Färber,
Manivannan Sadhasivam
Cc: linux-i2c, linux-kernel, linux-arm-kernel, linux-sunxi,
linuxppc-dev, linux-actions, Bartosz Golaszewski,
Bartosz Golaszewski
Convert all instances of using device printk helpers with struct device
embedded in struct i2c_adapter to the new i2c-specific macros that hide
that dereference.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
---
drivers/i2c/busses/i2c-ali15x3.c | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/drivers/i2c/busses/i2c-ali15x3.c b/drivers/i2c/busses/i2c-ali15x3.c
index 418d11266671e314aa2fb882ece025dc0ae998da..bd62aa8d645004bef121fa46efc1d7afc473332a 100644
--- a/drivers/i2c/busses/i2c-ali15x3.c
+++ b/drivers/i2c/busses/i2c-ali15x3.c
@@ -223,7 +223,7 @@ static int ali15x3_transaction(struct i2c_adapter *adap)
int result = 0;
int timeout = 0;
- dev_dbg(&adap->dev, "Transaction (pre): STS=%02x, CNT=%02x, CMD=%02x, "
+ i2c_dbg(adap, "Transaction (pre): STS=%02x, CNT=%02x, CMD=%02x, "
"ADD=%02x, DAT0=%02x, DAT1=%02x\n", inb_p(SMBHSTSTS),
inb_p(SMBHSTCNT), inb_p(SMBHSTCMD), inb_p(SMBHSTADD),
inb_p(SMBHSTDAT0), inb_p(SMBHSTDAT1));
@@ -255,7 +255,7 @@ static int ali15x3_transaction(struct i2c_adapter *adap)
then the BUSY bit may come back on when you try and use the chip again.
If that's the case you are stuck.
*/
- dev_info(&adap->dev, "Resetting entire SMB Bus to "
+ i2c_info(adap, "Resetting entire SMB Bus to "
"clear busy condition (%02x)\n", temp);
outb_p(ALI15X3_T_OUT, SMBHSTCNT);
temp = inb_p(SMBHSTSTS);
@@ -270,7 +270,7 @@ static int ali15x3_transaction(struct i2c_adapter *adap)
/* this is probably going to be correctable only by a power reset
as one of the bits now appears to be stuck */
/* This may be a bus or device with electrical problems. */
- dev_err(&adap->dev, "SMBus reset failed! (0x%02x) - "
+ i2c_err(adap, "SMBus reset failed! (0x%02x) - "
"controller or device on bus is probably hung\n",
temp);
return -EBUSY;
@@ -299,7 +299,7 @@ static int ali15x3_transaction(struct i2c_adapter *adap)
if (temp & ALI15X3_STS_TERM) {
result = -EIO;
- dev_dbg(&adap->dev, "Error: Failed bus transaction\n");
+ i2c_dbg(adap, "Error: Failed bus transaction\n");
}
/*
@@ -310,7 +310,7 @@ static int ali15x3_transaction(struct i2c_adapter *adap)
*/
if (temp & ALI15X3_STS_COLL) {
result = -ENXIO;
- dev_dbg(&adap->dev,
+ i2c_dbg(adap,
"Error: no response or bus collision ADD=%02x\n",
inb_p(SMBHSTADD));
}
@@ -318,9 +318,9 @@ static int ali15x3_transaction(struct i2c_adapter *adap)
/* haven't ever seen this */
if (temp & ALI15X3_STS_DEV) {
result = -EIO;
- dev_err(&adap->dev, "Error: device error\n");
+ i2c_err(adap, "Error: device error\n");
}
- dev_dbg(&adap->dev, "Transaction (post): STS=%02x, CNT=%02x, CMD=%02x, "
+ i2c_dbg(adap, "Transaction (post): STS=%02x, CNT=%02x, CMD=%02x, "
"ADD=%02x, DAT0=%02x, DAT1=%02x\n", inb_p(SMBHSTSTS),
inb_p(SMBHSTCNT), inb_p(SMBHSTCMD), inb_p(SMBHSTADD),
inb_p(SMBHSTDAT0), inb_p(SMBHSTDAT1));
@@ -347,7 +347,7 @@ static s32 ali15x3_access(struct i2c_adapter * adap, u16 addr,
temp = inb_p(SMBHSTSTS);
}
if (timeout >= MAX_TIMEOUT) {
- dev_err(&adap->dev, "Idle wait Timeout! STS=0x%02x\n", temp);
+ i2c_err(adap, "Idle wait Timeout! STS=0x%02x\n", temp);
}
switch (size) {
@@ -404,7 +404,7 @@ static s32 ali15x3_access(struct i2c_adapter * adap, u16 addr,
size = ALI15X3_BLOCK_DATA;
break;
default:
- dev_warn(&adap->dev, "Unsupported transaction %d\n", size);
+ i2c_warn(adap, "Unsupported transaction %d\n", size);
return -EOPNOTSUPP;
}
@@ -437,7 +437,7 @@ static s32 ali15x3_access(struct i2c_adapter * adap, u16 addr,
outb_p(inb_p(SMBHSTCNT) | ALI15X3_BLOCK_CLR, SMBHSTCNT);
for (i = 1; i <= data->block[0]; i++) {
data->block[i] = inb_p(SMBBLKDAT);
- dev_dbg(&adap->dev, "Blk: len=%d, i=%d, data=%02x\n",
+ i2c_dbg(adap, "Blk: len=%d, i=%d, data=%02x\n",
len, i, data->block[i]);
}
break;
--
2.47.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PATCH 08/12] i2c: powermac: use i2c_adapter-specific printk helpers
2025-12-23 10:02 [PATCH 00/12] i2c: add and start using i2c_adapter-specific printk helpers Bartosz Golaszewski
` (6 preceding siblings ...)
2025-12-23 10:02 ` [PATCH 07/12] i2c: ali15x3: " Bartosz Golaszewski
@ 2025-12-23 10:02 ` Bartosz Golaszewski
2025-12-23 10:02 ` [PATCH 09/12] i2c: owl: " Bartosz Golaszewski
` (5 subsequent siblings)
13 siblings, 0 replies; 28+ messages in thread
From: Bartosz Golaszewski @ 2025-12-23 10:02 UTC (permalink / raw)
To: Wolfram Sang, Andi Shyti, Chen-Yu Tsai, Jernej Skrabec,
Samuel Holland, Khalil Blaiech, Asmaa Mnebhi, Jean Delvare,
Madhavan Srinivasan, Michael Ellerman, Nicholas Piggin,
Christophe Leroy (CS GROUP), Andreas Färber,
Manivannan Sadhasivam
Cc: linux-i2c, linux-kernel, linux-arm-kernel, linux-sunxi,
linuxppc-dev, linux-actions, Bartosz Golaszewski,
Bartosz Golaszewski
Convert all instances of using device printk helpers with struct device
embedded in struct i2c_adapter to the new i2c-specific macros that hide
that dereference.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
---
drivers/i2c/busses/i2c-powermac.c | 26 +++++++++++++-------------
1 file changed, 13 insertions(+), 13 deletions(-)
diff --git a/drivers/i2c/busses/i2c-powermac.c b/drivers/i2c/busses/i2c-powermac.c
index f99a2cc721a81dc328bc03ea88ff959cafe0f05a..fb5482655d6c5c617392e9ccd745433d5d828335 100644
--- a/drivers/i2c/busses/i2c-powermac.c
+++ b/drivers/i2c/busses/i2c-powermac.c
@@ -92,13 +92,13 @@ static s32 i2c_powermac_smbus_xfer( struct i2c_adapter* adap,
rc = pmac_i2c_open(bus, 0);
if (rc) {
- dev_err(&adap->dev, "Failed to open I2C, err %d\n", rc);
+ i2c_err(adap, "Failed to open I2C, err %d\n", rc);
return rc;
}
rc = pmac_i2c_setmode(bus, mode);
if (rc) {
- dev_err(&adap->dev, "Failed to set I2C mode %d, err %d\n",
+ i2c_err(adap, "Failed to set I2C mode %d, err %d\n",
mode, rc);
goto bail;
}
@@ -106,11 +106,11 @@ static s32 i2c_powermac_smbus_xfer( struct i2c_adapter* adap,
rc = pmac_i2c_xfer(bus, addrdir, subsize, subaddr, buf, len);
if (rc) {
if (rc == -ENXIO)
- dev_dbg(&adap->dev,
+ i2c_dbg(adap,
"I2C transfer at 0x%02x failed, size %d, "
"err %d\n", addrdir >> 1, size, rc);
else
- dev_err(&adap->dev,
+ i2c_err(adap,
"I2C transfer at 0x%02x failed, size %d, "
"err %d\n", addrdir >> 1, size, rc);
goto bail;
@@ -145,23 +145,23 @@ static int i2c_powermac_xfer(struct i2c_adapter *adap,
rc = pmac_i2c_open(bus, 0);
if (rc) {
- dev_err(&adap->dev, "Failed to open I2C, err %d\n", rc);
+ i2c_err(adap, "Failed to open I2C, err %d\n", rc);
return rc;
}
rc = pmac_i2c_setmode(bus, pmac_i2c_mode_std);
if (rc) {
- dev_err(&adap->dev, "Failed to set I2C mode %d, err %d\n",
+ i2c_err(adap, "Failed to set I2C mode %d, err %d\n",
pmac_i2c_mode_std, rc);
goto bail;
}
rc = pmac_i2c_xfer(bus, addrdir, 0, 0, msgs->buf, msgs->len);
if (rc < 0) {
if (rc == -ENXIO)
- dev_dbg(&adap->dev, "I2C %s 0x%02x failed, err %d\n",
+ i2c_dbg(adap, "I2C %s 0x%02x failed, err %d\n",
addrdir & 1 ? "read from" : "write to",
addrdir >> 1, rc);
else
- dev_err(&adap->dev, "I2C %s 0x%02x failed, err %d\n",
+ i2c_err(adap, "I2C %s 0x%02x failed, err %d\n",
addrdir & 1 ? "read from" : "write to",
addrdir >> 1, rc);
}
@@ -219,7 +219,7 @@ static u32 i2c_powermac_get_addr(struct i2c_adapter *adap,
else if (of_node_name_eq(node, "deq"))
return 0x34;
- dev_warn(&adap->dev, "No i2c address for %pOF\n", node);
+ i2c_warn(adap, "No i2c address for %pOF\n", node);
return 0xffffffff;
}
@@ -235,7 +235,7 @@ static void i2c_powermac_create_one(struct i2c_adapter *adap,
info.addr = addr;
newdev = i2c_new_client_device(adap, &info);
if (IS_ERR(newdev))
- dev_err(&adap->dev,
+ i2c_err(adap,
"i2c-powermac: Failure to register missing %s\n",
type);
}
@@ -299,7 +299,7 @@ static bool i2c_powermac_get_type(struct i2c_adapter *adap,
}
}
- dev_err(&adap->dev, "i2c-powermac: modalias failure on %pOF\n", node);
+ i2c_err(adap, "i2c-powermac: modalias failure on %pOF\n", node);
return false;
}
@@ -331,7 +331,7 @@ static void i2c_powermac_register_devices(struct i2c_adapter *adap,
if (!pmac_i2c_match_adapter(node, adap))
continue;
- dev_dbg(&adap->dev, "i2c-powermac: register %pOF\n", node);
+ i2c_dbg(adap, "i2c-powermac: register %pOF\n", node);
/*
* Keep track of some device existence to handle
@@ -353,7 +353,7 @@ static void i2c_powermac_register_devices(struct i2c_adapter *adap,
newdev = i2c_new_client_device(adap, &info);
if (IS_ERR(newdev)) {
- dev_err(&adap->dev, "i2c-powermac: Failure to register"
+ i2c_err(adap, "i2c-powermac: Failure to register"
" %pOF\n", node);
of_node_put(node);
/* We do not dispose of the interrupt mapping on
--
2.47.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PATCH 09/12] i2c: owl: use i2c_adapter-specific printk helpers
2025-12-23 10:02 [PATCH 00/12] i2c: add and start using i2c_adapter-specific printk helpers Bartosz Golaszewski
` (7 preceding siblings ...)
2025-12-23 10:02 ` [PATCH 08/12] i2c: powermac: " Bartosz Golaszewski
@ 2025-12-23 10:02 ` Bartosz Golaszewski
2025-12-23 10:02 ` [PATCH 10/12] i2c: nforce2: " Bartosz Golaszewski
` (4 subsequent siblings)
13 siblings, 0 replies; 28+ messages in thread
From: Bartosz Golaszewski @ 2025-12-23 10:02 UTC (permalink / raw)
To: Wolfram Sang, Andi Shyti, Chen-Yu Tsai, Jernej Skrabec,
Samuel Holland, Khalil Blaiech, Asmaa Mnebhi, Jean Delvare,
Madhavan Srinivasan, Michael Ellerman, Nicholas Piggin,
Christophe Leroy (CS GROUP), Andreas Färber,
Manivannan Sadhasivam
Cc: linux-i2c, linux-kernel, linux-arm-kernel, linux-sunxi,
linuxppc-dev, linux-actions, Bartosz Golaszewski,
Bartosz Golaszewski
Convert all instances of using device printk helpers with struct device
embedded in struct i2c_adapter to the new i2c-specific macros that hide
that dereference.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
---
drivers/i2c/busses/i2c-owl.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/i2c/busses/i2c-owl.c b/drivers/i2c/busses/i2c-owl.c
index 84a195e358866d693fb6d435a5beaaee640fd2e2..17718f15a0f1fd238bb4a6f23dbb4f9696969ed5 100644
--- a/drivers/i2c/busses/i2c-owl.c
+++ b/drivers/i2c/busses/i2c-owl.c
@@ -241,7 +241,7 @@ static int owl_i2c_check_bus_busy(struct i2c_adapter *adap)
timeout = jiffies + OWL_I2C_TIMEOUT;
while (readl(i2c_dev->base + OWL_I2C_REG_STAT) & OWL_I2C_STAT_BBB) {
if (time_after(jiffies, timeout)) {
- dev_err(&adap->dev, "Bus busy timeout\n");
+ i2c_err(adap, "Bus busy timeout\n");
return -ETIMEDOUT;
}
}
@@ -383,7 +383,7 @@ static int owl_i2c_xfer_common(struct i2c_adapter *adap, struct i2c_msg *msgs,
spin_lock_irqsave(&i2c_dev->lock, flags);
if (ret) {
- dev_err(&adap->dev, "Transaction timed out\n");
+ i2c_err(adap, "Transaction timed out\n");
/* Send stop condition and release the bus */
owl_i2c_update_reg(i2c_dev->base + OWL_I2C_REG_CTL,
OWL_I2C_CTL_GBCC_STOP | OWL_I2C_CTL_RB,
--
2.47.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PATCH 10/12] i2c: nforce2: use i2c_adapter-specific printk helpers
2025-12-23 10:02 [PATCH 00/12] i2c: add and start using i2c_adapter-specific printk helpers Bartosz Golaszewski
` (8 preceding siblings ...)
2025-12-23 10:02 ` [PATCH 09/12] i2c: owl: " Bartosz Golaszewski
@ 2025-12-23 10:02 ` Bartosz Golaszewski
2025-12-23 10:02 ` [PATCH 11/12] i2c: amd756: " Bartosz Golaszewski
` (3 subsequent siblings)
13 siblings, 0 replies; 28+ messages in thread
From: Bartosz Golaszewski @ 2025-12-23 10:02 UTC (permalink / raw)
To: Wolfram Sang, Andi Shyti, Chen-Yu Tsai, Jernej Skrabec,
Samuel Holland, Khalil Blaiech, Asmaa Mnebhi, Jean Delvare,
Madhavan Srinivasan, Michael Ellerman, Nicholas Piggin,
Christophe Leroy (CS GROUP), Andreas Färber,
Manivannan Sadhasivam
Cc: linux-i2c, linux-kernel, linux-arm-kernel, linux-sunxi,
linuxppc-dev, linux-actions, Bartosz Golaszewski,
Bartosz Golaszewski
Convert all instances of using device printk helpers with struct device
embedded in struct i2c_adapter to the new i2c-specific macros that hide
that dereference.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
---
drivers/i2c/busses/i2c-nforce2.c | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/drivers/i2c/busses/i2c-nforce2.c b/drivers/i2c/busses/i2c-nforce2.c
index d58a308582e47650238312537d2d721261d3bca4..2fa6f1dbd27a92c2d67915775e588e4bab675d76 100644
--- a/drivers/i2c/busses/i2c-nforce2.c
+++ b/drivers/i2c/busses/i2c-nforce2.c
@@ -123,7 +123,7 @@ static void nforce2_abort(struct i2c_adapter *adap)
int timeout = 0;
unsigned char temp;
- dev_dbg(&adap->dev, "Aborting current transaction\n");
+ i2c_dbg(adap, "Aborting current transaction\n");
outb_p(NVIDIA_SMB_CTRL_ABORT, NVIDIA_SMB_CTRL);
do {
@@ -132,7 +132,7 @@ static void nforce2_abort(struct i2c_adapter *adap)
} while (!(temp & NVIDIA_SMB_STATUS_ABRT_STS) &&
(timeout++ < MAX_TIMEOUT));
if (!(temp & NVIDIA_SMB_STATUS_ABRT_STS))
- dev_err(&adap->dev, "Can't reset the smbus\n");
+ i2c_err(adap, "Can't reset the smbus\n");
outb_p(NVIDIA_SMB_STATUS_ABRT_STS, NVIDIA_SMB_STATUS_ABRT);
}
@@ -148,13 +148,13 @@ static int nforce2_check_status(struct i2c_adapter *adap)
} while ((!temp) && (timeout++ < MAX_TIMEOUT));
if (timeout > MAX_TIMEOUT) {
- dev_dbg(&adap->dev, "SMBus Timeout!\n");
+ i2c_dbg(adap, "SMBus Timeout!\n");
if (smbus->can_abort)
nforce2_abort(adap);
return -ETIMEDOUT;
}
if (!(temp & NVIDIA_SMB_STS_DONE) || (temp & NVIDIA_SMB_STS_STATUS)) {
- dev_dbg(&adap->dev, "Transaction failed (0x%02x)!\n", temp);
+ i2c_dbg(adap, "Transaction failed (0x%02x)!\n", temp);
return -EIO;
}
return 0;
@@ -207,7 +207,7 @@ static s32 nforce2_access(struct i2c_adapter *adap, u16 addr,
if (read_write == I2C_SMBUS_WRITE) {
len = data->block[0];
if ((len == 0) || (len > I2C_SMBUS_BLOCK_MAX)) {
- dev_err(&adap->dev,
+ i2c_err(adap,
"Transaction failed (requested block size: %d)\n",
len);
return -EINVAL;
@@ -221,7 +221,7 @@ static s32 nforce2_access(struct i2c_adapter *adap, u16 addr,
break;
default:
- dev_err(&adap->dev, "Unsupported transaction %d\n", size);
+ i2c_err(adap, "Unsupported transaction %d\n", size);
return -EOPNOTSUPP;
}
@@ -249,7 +249,7 @@ static s32 nforce2_access(struct i2c_adapter *adap, u16 addr,
case I2C_SMBUS_BLOCK_DATA:
len = inb_p(NVIDIA_SMB_BCNT);
if ((len <= 0) || (len > I2C_SMBUS_BLOCK_MAX)) {
- dev_err(&adap->dev,
+ i2c_err(adap,
"Transaction failed (received block size: 0x%02x)\n",
len);
return -EPROTO;
--
2.47.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PATCH 11/12] i2c: amd756: use i2c_adapter-specific printk helpers
2025-12-23 10:02 [PATCH 00/12] i2c: add and start using i2c_adapter-specific printk helpers Bartosz Golaszewski
` (9 preceding siblings ...)
2025-12-23 10:02 ` [PATCH 10/12] i2c: nforce2: " Bartosz Golaszewski
@ 2025-12-23 10:02 ` Bartosz Golaszewski
2025-12-23 10:02 ` [PATCH 12/12] i2c: piix4: " Bartosz Golaszewski
` (2 subsequent siblings)
13 siblings, 0 replies; 28+ messages in thread
From: Bartosz Golaszewski @ 2025-12-23 10:02 UTC (permalink / raw)
To: Wolfram Sang, Andi Shyti, Chen-Yu Tsai, Jernej Skrabec,
Samuel Holland, Khalil Blaiech, Asmaa Mnebhi, Jean Delvare,
Madhavan Srinivasan, Michael Ellerman, Nicholas Piggin,
Christophe Leroy (CS GROUP), Andreas Färber,
Manivannan Sadhasivam
Cc: linux-i2c, linux-kernel, linux-arm-kernel, linux-sunxi,
linuxppc-dev, linux-actions, Bartosz Golaszewski,
Bartosz Golaszewski
Convert all instances of using device printk helpers with struct device
embedded in struct i2c_adapter to the new i2c-specific macros that hide
that dereference.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
---
drivers/i2c/busses/i2c-amd756.c | 24 ++++++++++++------------
1 file changed, 12 insertions(+), 12 deletions(-)
diff --git a/drivers/i2c/busses/i2c-amd756.c b/drivers/i2c/busses/i2c-amd756.c
index 3621c02f1cbabd8c5e9d8a4ae1494ada78726b15..629da0b8024b88cc4d51ea5e785147b462a1281c 100644
--- a/drivers/i2c/busses/i2c-amd756.c
+++ b/drivers/i2c/busses/i2c-amd756.c
@@ -99,14 +99,14 @@ static int amd756_transaction(struct i2c_adapter *adap)
int result = 0;
int timeout = 0;
- dev_dbg(&adap->dev, "Transaction (pre): GS=%04x, GE=%04x, ADD=%04x, "
+ i2c_dbg(adap, "Transaction (pre): GS=%04x, GE=%04x, ADD=%04x, "
"DAT=%04x\n", inw_p(SMB_GLOBAL_STATUS),
inw_p(SMB_GLOBAL_ENABLE), inw_p(SMB_HOST_ADDRESS),
inb_p(SMB_HOST_DATA));
/* Make sure the SMBus host is ready to start transmitting */
if ((temp = inw_p(SMB_GLOBAL_STATUS)) & (GS_HST_STS | GS_SMB_STS)) {
- dev_dbg(&adap->dev, "SMBus busy (%04x). Waiting...\n", temp);
+ i2c_dbg(adap, "SMBus busy (%04x). Waiting...\n", temp);
do {
msleep(1);
temp = inw_p(SMB_GLOBAL_STATUS);
@@ -114,7 +114,7 @@ static int amd756_transaction(struct i2c_adapter *adap)
(timeout++ < MAX_TIMEOUT));
/* If the SMBus is still busy, we give up */
if (timeout > MAX_TIMEOUT) {
- dev_dbg(&adap->dev, "Busy wait timeout (%04x)\n", temp);
+ i2c_dbg(adap, "Busy wait timeout (%04x)\n", temp);
goto abort;
}
timeout = 0;
@@ -131,38 +131,38 @@ static int amd756_transaction(struct i2c_adapter *adap)
/* If the SMBus is still busy, we give up */
if (timeout > MAX_TIMEOUT) {
- dev_dbg(&adap->dev, "Completion timeout!\n");
+ i2c_dbg(adap, "Completion timeout!\n");
goto abort;
}
if (temp & GS_PRERR_STS) {
result = -ENXIO;
- dev_dbg(&adap->dev, "SMBus Protocol error (no response)!\n");
+ i2c_dbg(adap, "SMBus Protocol error (no response)!\n");
}
if (temp & GS_COL_STS) {
result = -EIO;
- dev_warn(&adap->dev, "SMBus collision!\n");
+ i2c_warn(adap, "SMBus collision!\n");
}
if (temp & GS_TO_STS) {
result = -ETIMEDOUT;
- dev_dbg(&adap->dev, "SMBus protocol timeout!\n");
+ i2c_dbg(adap, "SMBus protocol timeout!\n");
}
if (temp & GS_HCYC_STS)
- dev_dbg(&adap->dev, "SMBus protocol success!\n");
+ i2c_dbg(adap, "SMBus protocol success!\n");
outw_p(GS_CLEAR_STS, SMB_GLOBAL_STATUS);
#ifdef DEBUG
if (((temp = inw_p(SMB_GLOBAL_STATUS)) & GS_CLEAR_STS) != 0x00) {
- dev_dbg(&adap->dev,
+ i2c_dbg(adap,
"Failed reset at end of transaction (%04x)\n", temp);
}
#endif
- dev_dbg(&adap->dev,
+ i2c_dbg(adap,
"Transaction (post): GS=%04x, GE=%04x, ADD=%04x, DAT=%04x\n",
inw_p(SMB_GLOBAL_STATUS), inw_p(SMB_GLOBAL_ENABLE),
inw_p(SMB_HOST_ADDRESS), inb_p(SMB_HOST_DATA));
@@ -170,7 +170,7 @@ static int amd756_transaction(struct i2c_adapter *adap)
return result;
abort:
- dev_warn(&adap->dev, "Sending abort\n");
+ i2c_warn(adap, "Sending abort\n");
outw_p(inw(SMB_GLOBAL_ENABLE) | GE_ABORT, SMB_GLOBAL_ENABLE);
msleep(100);
outw_p(GS_CLEAR_STS, SMB_GLOBAL_STATUS);
@@ -233,7 +233,7 @@ static s32 amd756_access(struct i2c_adapter * adap, u16 addr,
size = AMD756_BLOCK_DATA;
break;
default:
- dev_warn(&adap->dev, "Unsupported transaction %d\n", size);
+ i2c_warn(adap, "Unsupported transaction %d\n", size);
return -EOPNOTSUPP;
}
--
2.47.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PATCH 12/12] i2c: piix4: use i2c_adapter-specific printk helpers
2025-12-23 10:02 [PATCH 00/12] i2c: add and start using i2c_adapter-specific printk helpers Bartosz Golaszewski
` (10 preceding siblings ...)
2025-12-23 10:02 ` [PATCH 11/12] i2c: amd756: " Bartosz Golaszewski
@ 2025-12-23 10:02 ` Bartosz Golaszewski
2025-12-23 14:23 ` [PATCH 00/12] i2c: add and start using " Johan Hovold
2026-01-13 10:44 ` Wolfram Sang
13 siblings, 0 replies; 28+ messages in thread
From: Bartosz Golaszewski @ 2025-12-23 10:02 UTC (permalink / raw)
To: Wolfram Sang, Andi Shyti, Chen-Yu Tsai, Jernej Skrabec,
Samuel Holland, Khalil Blaiech, Asmaa Mnebhi, Jean Delvare,
Madhavan Srinivasan, Michael Ellerman, Nicholas Piggin,
Christophe Leroy (CS GROUP), Andreas Färber,
Manivannan Sadhasivam
Cc: linux-i2c, linux-kernel, linux-arm-kernel, linux-sunxi,
linuxppc-dev, linux-actions, Bartosz Golaszewski,
Bartosz Golaszewski
Convert all instances of using device printk helpers with struct device
embedded in struct i2c_adapter to the new i2c-specific macros that hide
that dereference.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
---
drivers/i2c/busses/i2c-piix4.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/i2c/busses/i2c-piix4.c b/drivers/i2c/busses/i2c-piix4.c
index ac3bb550303fe5893822af50c385004c9292e695..bf6ce6b4bed3f4ae8aa392c68189a67636c01bf9 100644
--- a/drivers/i2c/busses/i2c-piix4.c
+++ b/drivers/i2c/busses/i2c-piix4.c
@@ -650,7 +650,7 @@ static s32 piix4_access(struct i2c_adapter * adap, u16 addr,
size = PIIX4_BLOCK_DATA;
break;
default:
- dev_warn(&adap->dev, "Unsupported transaction %d\n", size);
+ i2c_warn(adap, "Unsupported transaction %d\n", size);
return -EOPNOTSUPP;
}
@@ -825,12 +825,12 @@ static s32 piix4_access_sb800(struct i2c_adapter *adap, u16 addr,
ret = piix4_imc_sleep();
switch (ret) {
case -EBUSY:
- dev_warn(&adap->dev,
+ i2c_warn(adap,
"IMC base address index region 0x%x already in use.\n",
KERNCZ_IMC_IDX);
break;
case -ETIMEDOUT:
- dev_warn(&adap->dev,
+ i2c_warn(adap,
"Failed to communicate with the IMC.\n");
break;
default:
@@ -839,7 +839,7 @@ static s32 piix4_access_sb800(struct i2c_adapter *adap, u16 addr,
/* If IMC communication fails do not retry */
if (ret) {
- dev_warn(&adap->dev,
+ i2c_warn(adap,
"Continuing without IMC notification.\n");
adapdata->notify_imc = false;
}
--
2.47.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* Re: [PATCH 02/12] i2c: sun6i-p2wi: use i2c_adapter-specific printk helpers
2025-12-23 10:02 ` [PATCH 02/12] i2c: sun6i-p2wi: use " Bartosz Golaszewski
@ 2025-12-23 11:04 ` Chen-Yu Tsai
0 siblings, 0 replies; 28+ messages in thread
From: Chen-Yu Tsai @ 2025-12-23 11:04 UTC (permalink / raw)
To: Bartosz Golaszewski
Cc: Wolfram Sang, Andi Shyti, Jernej Skrabec, Samuel Holland,
Khalil Blaiech, Asmaa Mnebhi, Jean Delvare, Madhavan Srinivasan,
Michael Ellerman, Nicholas Piggin, Christophe Leroy (CS GROUP),
Andreas Färber, Manivannan Sadhasivam, linux-i2c,
linux-kernel, linux-arm-kernel, linux-sunxi, linuxppc-dev,
linux-actions, Bartosz Golaszewski
On Tue, Dec 23, 2025 at 6:02 PM Bartosz Golaszewski
<bartosz.golaszewski@oss.qualcomm.com> wrote:
>
> Convert all instances of using device printk helpers with struct device
> embedded in struct i2c_adapter to the new i2c-specific macros that hide
> that dereference.
>
> Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Acked-by: Chen-Yu Tsai <wens@kernel.org>
> ---
> drivers/i2c/busses/i2c-sun6i-p2wi.c | 8 ++++----
> 1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/i2c/busses/i2c-sun6i-p2wi.c b/drivers/i2c/busses/i2c-sun6i-p2wi.c
> index fb5280b8cf7fc0e3cba8ea6a318172ea2b011a02..845ca56cdae2d056c122eb648c082f319d955b5e 100644
> --- a/drivers/i2c/busses/i2c-sun6i-p2wi.c
> +++ b/drivers/i2c/busses/i2c-sun6i-p2wi.c
> @@ -122,7 +122,7 @@ static int p2wi_smbus_xfer(struct i2c_adapter *adap, u16 addr,
> unsigned long dlen = P2WI_DLEN_DATA_LENGTH(1);
>
> if (p2wi->target_addr >= 0 && addr != p2wi->target_addr) {
> - dev_err(&adap->dev, "invalid P2WI address\n");
> + i2c_err(adap, "invalid P2WI address\n");
> return -EINVAL;
> }
>
> @@ -139,7 +139,7 @@ static int p2wi_smbus_xfer(struct i2c_adapter *adap, u16 addr,
> writel(dlen, p2wi->regs + P2WI_DLEN);
>
> if (readl(p2wi->regs + P2WI_CTRL) & P2WI_CTRL_START_TRANS) {
> - dev_err(&adap->dev, "P2WI bus busy\n");
> + i2c_err(adap, "P2WI bus busy\n");
> return -EBUSY;
> }
>
> @@ -154,12 +154,12 @@ static int p2wi_smbus_xfer(struct i2c_adapter *adap, u16 addr,
> wait_for_completion(&p2wi->complete);
>
> if (p2wi->status & P2WI_INTS_LOAD_BSY) {
> - dev_err(&adap->dev, "P2WI bus busy\n");
> + i2c_err(adap, "P2WI bus busy\n");
> return -EBUSY;
> }
>
> if (p2wi->status & P2WI_INTS_TRANS_ERR) {
> - dev_err(&adap->dev, "P2WI bus xfer error\n");
> + i2c_err(adap, "P2WI bus xfer error\n");
> return -ENXIO;
> }
>
>
> --
> 2.47.3
>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH 00/12] i2c: add and start using i2c_adapter-specific printk helpers
2025-12-23 10:02 [PATCH 00/12] i2c: add and start using i2c_adapter-specific printk helpers Bartosz Golaszewski
` (11 preceding siblings ...)
2025-12-23 10:02 ` [PATCH 12/12] i2c: piix4: " Bartosz Golaszewski
@ 2025-12-23 14:23 ` Johan Hovold
2025-12-23 15:11 ` Bartosz Golaszewski
2026-01-13 10:03 ` Big I2C core changes coming up this year (was: " Wolfram Sang
2026-01-13 10:44 ` Wolfram Sang
13 siblings, 2 replies; 28+ messages in thread
From: Johan Hovold @ 2025-12-23 14:23 UTC (permalink / raw)
To: Bartosz Golaszewski
Cc: Wolfram Sang, Andi Shyti, Chen-Yu Tsai, Jernej Skrabec,
Samuel Holland, Khalil Blaiech, Asmaa Mnebhi, Jean Delvare,
Madhavan Srinivasan, Michael Ellerman, Nicholas Piggin,
Christophe Leroy (CS GROUP), Andreas Färber,
Manivannan Sadhasivam, linux-i2c, linux-kernel, linux-arm-kernel,
linux-sunxi, linuxppc-dev, linux-actions, Bartosz Golaszewski
On Tue, Dec 23, 2025 at 11:02:22AM +0100, Bartosz Golaszewski wrote:
> It's been another year of discussing the object life-time problems at
> conferences. I2C is one of the offenders and its problems are more
> complex than those of some other subsystems. It seems the revocable[1]
> API may make its way into the kernel this year but even with it in
> place, I2C won't be able to use it as there's currently nothing to
> *revoke*. The struct device is embedded within the i2c_adapter struct
> whose lifetime is tied to the provider device being bound to its driver.
>
> Fixing this won't be fast and easy but nothing's going to happen if we
> don't start chipping away at it. The ultimate goal in order to be able
> to use an SRCU-based solution (revocable or otherwise) is to convert the
> embedded struct device in struct i2c_adapter into an __rcu pointer that
> can be *revoked*. To that end we need to hide all dereferences of
> adap->dev in drivers.
No, this is not the way to do it. You start with designing and showing
what the end result will look like *before* you start rewriting world
like you are doing here.
We should not be making driver code less readable just to address some
really niche corner cases like hot pluggable i2c controllers.
But in any case, don't get ahead of things by posting changes that we
most likely don't want in the end anyway.
> This series addresses the usage of adap->dev in device printk() helpers
> (dev_err() et al). It introduces a set of i2c-specific helpers and
> starts using them across bus drivers. For now just 12 patches but I'll
> keep on doing it if these get accepted. Once these get upstream for
> v6.20/7.0, we'll be able to also start converting i2c drivers outside of
> drivers/i2c/.
Same comment applies to the other two series you posted today.
Johan
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH 00/12] i2c: add and start using i2c_adapter-specific printk helpers
2025-12-23 14:23 ` [PATCH 00/12] i2c: add and start using " Johan Hovold
@ 2025-12-23 15:11 ` Bartosz Golaszewski
2026-01-19 11:03 ` Johan Hovold
2026-01-13 10:03 ` Big I2C core changes coming up this year (was: " Wolfram Sang
1 sibling, 1 reply; 28+ messages in thread
From: Bartosz Golaszewski @ 2025-12-23 15:11 UTC (permalink / raw)
To: Johan Hovold
Cc: Bartosz Golaszewski, Wolfram Sang, Andi Shyti, Chen-Yu Tsai,
Jernej Skrabec, Samuel Holland, Khalil Blaiech, Asmaa Mnebhi,
Jean Delvare, Madhavan Srinivasan, Michael Ellerman,
Nicholas Piggin, Christophe Leroy (CS GROUP), Andreas Färber,
Manivannan Sadhasivam, linux-i2c, linux-kernel, linux-arm-kernel,
linux-sunxi, linuxppc-dev, linux-actions
On Tue, Dec 23, 2025 at 3:24 PM Johan Hovold <johan@kernel.org> wrote:
>
> On Tue, Dec 23, 2025 at 11:02:22AM +0100, Bartosz Golaszewski wrote:
> > It's been another year of discussing the object life-time problems at
> > conferences. I2C is one of the offenders and its problems are more
> > complex than those of some other subsystems. It seems the revocable[1]
> > API may make its way into the kernel this year but even with it in
> > place, I2C won't be able to use it as there's currently nothing to
> > *revoke*. The struct device is embedded within the i2c_adapter struct
> > whose lifetime is tied to the provider device being bound to its driver.
> >
> > Fixing this won't be fast and easy but nothing's going to happen if we
> > don't start chipping away at it. The ultimate goal in order to be able
> > to use an SRCU-based solution (revocable or otherwise) is to convert the
> > embedded struct device in struct i2c_adapter into an __rcu pointer that
> > can be *revoked*. To that end we need to hide all dereferences of
> > adap->dev in drivers.
>
> No, this is not the way to do it. You start with designing and showing
> what the end result will look like *before* you start rewriting world
> like you are doing here.
>
The paragraph you're commenting under explains exactly what I propose
to do: move struct device out of struct i2c_adapter and protect the
pointer storing its address with SRCU. This is a well-known design
that's being generalized to a common "revocable" API which will
possibly be available upstream by the time we're ready to use it.
You know I can't possibly *show* the end result in a single series
because - as the paragraph before explains - we need to first hide all
direct dereferences of struct device in struct i2c_adapter behind
dedicated interfaces so that we when do the conversion, it'll affect
only a limited number of places. It can't realistically be done at
once.
> We should not be making driver code less readable just to address some
> really niche corner cases like hot pluggable i2c controllers.
>
> But in any case, don't get ahead of things by posting changes that we
> most likely don't want in the end anyway.
>
The changes I sent are the result of another discussion with Wolfram
at LPC so I'll definitely wait for his take on it before dropping
anything.
Bartosz
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH 01/12] i2c: add i2c_adapter-specific printk helpers
2025-12-23 10:02 ` [PATCH 01/12] i2c: add " Bartosz Golaszewski
@ 2025-12-25 18:30 ` kernel test robot
2025-12-25 19:33 ` kernel test robot
1 sibling, 0 replies; 28+ messages in thread
From: kernel test robot @ 2025-12-25 18:30 UTC (permalink / raw)
To: Bartosz Golaszewski, Wolfram Sang, Andi Shyti, Chen-Yu Tsai,
Jernej Skrabec, Samuel Holland, Khalil Blaiech, Asmaa Mnebhi,
Jean Delvare, Madhavan Srinivasan, Michael Ellerman,
Nicholas Piggin, Christophe Leroy (CS GROUP), Andreas Färber,
Manivannan Sadhasivam
Cc: oe-kbuild-all, linux-i2c, linux-kernel, linux-arm-kernel,
linux-sunxi, linuxppc-dev, linux-actions, Bartosz Golaszewski
Hi Bartosz,
kernel test robot noticed the following build warnings:
[auto build test WARNING on cc3aa43b44bdb43dfbac0fcb51c56594a11338a8]
url: https://github.com/intel-lab-lkp/linux/commits/Bartosz-Golaszewski/i2c-add-i2c_adapter-specific-printk-helpers/20251223-185417
base: cc3aa43b44bdb43dfbac0fcb51c56594a11338a8
patch link: https://lore.kernel.org/r/20251223-i2c-printk-helpers-v1-1-46a08306afdb%40oss.qualcomm.com
patch subject: [PATCH 01/12] i2c: add i2c_adapter-specific printk helpers
config: parisc-allyesconfig (https://download.01.org/0day-ci/archive/20251226/202512260206.C1TExj8d-lkp@intel.com/config)
compiler: hppa-linux-gcc (GCC) 15.1.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251226/202512260206.C1TExj8d-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202512260206.C1TExj8d-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> drivers/media/pci/saa7134/saa7134-i2c.c:31:9: warning: 'i2c_dbg' redefined
31 | #define i2c_dbg(level, fmt, arg...) do { \
| ^~~~~~~
In file included from drivers/media/pci/saa7134/saa7134.h:14,
from drivers/media/pci/saa7134/saa7134-i2c.c:10:
include/linux/i2c.h:775:9: note: this is the location of the previous definition
775 | #define i2c_dbg(adap, fmt, ...) dev_dbg(&(adap)->dev, fmt, ##__VA_ARGS__)
| ^~~~~~~
vim +/i2c_dbg +31 drivers/media/pci/saa7134/saa7134-i2c.c
^1da177e4c3f41 drivers/media/video/saa7134/saa7134-i2c.c Linus Torvalds 2005-04-16 30
45f38cb3b80311 drivers/media/pci/saa7134/saa7134-i2c.c Mauro Carvalho Chehab 2015-05-13 @31 #define i2c_dbg(level, fmt, arg...) do { \
45f38cb3b80311 drivers/media/pci/saa7134/saa7134-i2c.c Mauro Carvalho Chehab 2015-05-13 32 if (i2c_debug == level) \
45f38cb3b80311 drivers/media/pci/saa7134/saa7134-i2c.c Mauro Carvalho Chehab 2015-05-13 33 printk(KERN_DEBUG pr_fmt("i2c: " fmt), ## arg); \
45f38cb3b80311 drivers/media/pci/saa7134/saa7134-i2c.c Mauro Carvalho Chehab 2015-05-13 34 } while (0)
45f38cb3b80311 drivers/media/pci/saa7134/saa7134-i2c.c Mauro Carvalho Chehab 2015-05-13 35
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH 01/12] i2c: add i2c_adapter-specific printk helpers
2025-12-23 10:02 ` [PATCH 01/12] i2c: add " Bartosz Golaszewski
2025-12-25 18:30 ` kernel test robot
@ 2025-12-25 19:33 ` kernel test robot
1 sibling, 0 replies; 28+ messages in thread
From: kernel test robot @ 2025-12-25 19:33 UTC (permalink / raw)
To: Bartosz Golaszewski, Wolfram Sang, Andi Shyti, Chen-Yu Tsai,
Jernej Skrabec, Samuel Holland, Khalil Blaiech, Asmaa Mnebhi,
Jean Delvare, Madhavan Srinivasan, Michael Ellerman,
Nicholas Piggin, Christophe Leroy (CS GROUP), Andreas Färber,
Manivannan Sadhasivam
Cc: llvm, oe-kbuild-all, linux-i2c, linux-kernel, linux-arm-kernel,
linux-sunxi, linuxppc-dev, linux-actions, Bartosz Golaszewski
Hi Bartosz,
kernel test robot noticed the following build warnings:
[auto build test WARNING on cc3aa43b44bdb43dfbac0fcb51c56594a11338a8]
url: https://github.com/intel-lab-lkp/linux/commits/Bartosz-Golaszewski/i2c-add-i2c_adapter-specific-printk-helpers/20251223-185417
base: cc3aa43b44bdb43dfbac0fcb51c56594a11338a8
patch link: https://lore.kernel.org/r/20251223-i2c-printk-helpers-v1-1-46a08306afdb%40oss.qualcomm.com
patch subject: [PATCH 01/12] i2c: add i2c_adapter-specific printk helpers
config: x86_64-randconfig-013-20251225 (https://download.01.org/0day-ci/archive/20251226/202512260303.nUGs1vi7-lkp@intel.com/config)
compiler: clang version 20.1.8 (https://github.com/llvm/llvm-project 87f0227cb60147a26a1eeb4fb06e3b505e9c7261)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251226/202512260303.nUGs1vi7-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202512260303.nUGs1vi7-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> drivers/media/pci/saa7134/saa7134-i2c.c:31:9: warning: 'i2c_dbg' macro redefined [-Wmacro-redefined]
31 | #define i2c_dbg(level, fmt, arg...) do { \
| ^
include/linux/i2c.h:775:9: note: previous definition is here
775 | #define i2c_dbg(adap, fmt, ...) dev_dbg(&(adap)->dev, fmt, ##__VA_ARGS__)
| ^
1 warning generated.
vim +/i2c_dbg +31 drivers/media/pci/saa7134/saa7134-i2c.c
^1da177e4c3f415 drivers/media/video/saa7134/saa7134-i2c.c Linus Torvalds 2005-04-16 30
45f38cb3b80311a drivers/media/pci/saa7134/saa7134-i2c.c Mauro Carvalho Chehab 2015-05-13 @31 #define i2c_dbg(level, fmt, arg...) do { \
45f38cb3b80311a drivers/media/pci/saa7134/saa7134-i2c.c Mauro Carvalho Chehab 2015-05-13 32 if (i2c_debug == level) \
45f38cb3b80311a drivers/media/pci/saa7134/saa7134-i2c.c Mauro Carvalho Chehab 2015-05-13 33 printk(KERN_DEBUG pr_fmt("i2c: " fmt), ## arg); \
45f38cb3b80311a drivers/media/pci/saa7134/saa7134-i2c.c Mauro Carvalho Chehab 2015-05-13 34 } while (0)
45f38cb3b80311a drivers/media/pci/saa7134/saa7134-i2c.c Mauro Carvalho Chehab 2015-05-13 35
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 28+ messages in thread
* Big I2C core changes coming up this year (was: Re: [PATCH 00/12] i2c: add and start using i2c_adapter-specific printk helpers
2025-12-23 14:23 ` [PATCH 00/12] i2c: add and start using " Johan Hovold
2025-12-23 15:11 ` Bartosz Golaszewski
@ 2026-01-13 10:03 ` Wolfram Sang
2026-01-19 10:58 ` Johan Hovold
1 sibling, 1 reply; 28+ messages in thread
From: Wolfram Sang @ 2026-01-13 10:03 UTC (permalink / raw)
To: Johan Hovold
Cc: Bartosz Golaszewski, Andi Shyti, Chen-Yu Tsai, Jernej Skrabec,
Samuel Holland, Khalil Blaiech, Asmaa Mnebhi, Jean Delvare,
Madhavan Srinivasan, Michael Ellerman, Nicholas Piggin,
Christophe Leroy (CS GROUP), Andreas Färber,
Manivannan Sadhasivam, linux-i2c, linux-kernel, linux-arm-kernel,
linux-sunxi, linuxppc-dev, linux-actions, Bartosz Golaszewski
Johan, (and all future readers I have pointed to this mail)
> No, this is not the way to do it. You start with designing and showing
> what the end result will look like *before* you start rewriting world
> like you are doing here.
In general, this is correct. It does not apply here, though. I will
describe it in detail, so I can also point other people to this mail who
wonder about quite some intrusive changes to I2C core this year.
> We should not be making driver code less readable just to address some
> really niche corner cases like hot pluggable i2c controllers.
It is not a niche-case for hot-plugging. Hot-plugging (which still
should be avoided for I2C) just makes a subsystem-inherent lifecycle
problem more obvious. All of Bart's patch series basically prepare to
tackle this comment from the I2C core:
1805 /* wait until all references to the device are gone
1806 *
1807 * FIXME: This is old code and should ideally be replaced by an
1808 * alternative which results in decoupling the lifetime of the struct
1809 * device from the i2c_adapter, like spi or netdev do. Any solution
1810 * should be thoroughly tested with DEBUG_KOBJECT_RELEASE enabled!
1811 */
1812 init_completion(&adap->dev_released);
1813 device_unregister(&adap->dev);
1814 wait_for_completion(&adap->dev_released);
This has been in the I2C core since switching to the driver model and
the underlying problem applies to *all* i2c adapters. Simply unbind an
I2C controller while you still have a reference to its i2c-dev
counterpart and you are right in the problem space.
The problem is known for decades(!) and nobody dared to touch it, so
far. Even worse, the above pattern is not only present in I2C but also
other subsystems. Bart and I have been talking about potential solutions
for three years now. Bart brought in SRCU as a generic solution and at a
Plumbers 2024 session with many experienced maintainers present, it was
decided that this path is worth exploring. Greg suggested to try SRCU
with GPIO and I2C subsystems, and if this works well, we can try to
abstract it into something useful for other canidates as well. Now,
recently, the 'revocable' patch series was introduced which might be
helpful in our case. I am *extremly* thankful that Bartosz took the
initiative to prepare the I2C core for the SRCU approach so we can
research 'revocable'. I currently have zero time for implementing any of
this. At least, from now on, I can reserve time for discussing, testing,
reviewing patches.
It is also perfectly okay to work incrementally here, in my book. It is
such an intrusive change that we need to touch a lot of drivers in any
case. Yet, with the I2C core being a moving target, all the I2C drivers,
the 'revocable' patch series, and Linux in general, I think requesting a
fully complete patch series now is neither efficient nor maintainable.
Bartosz and I do have a plan. We are happy to discuss it with other
interested people, of course. Still, despite all our efforts it might be
a bumpy ride. Because it is such a crucial and deep-inside change to the
subsystem core. This is part of development, though. If something
breaks, we will fix or revert. The alternative is stagnation which I
don't want. The above code was fine back in the days but now we have
better mechanisms to handle lifecycle issues. And I really do not want
Linux to have lifecycle issues. Especially not ones we *know of*.
And who knows, maybe it is not a bumpy ride after all...
> But in any case, don't get ahead of things by posting changes that we
> most likely don't want in the end anyway.
We want helpers accessing that specific 'struct device', so we have
central place to implement access to a protected version of it.
Happy hacking,
Wolfram
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH 00/12] i2c: add and start using i2c_adapter-specific printk helpers
2025-12-23 10:02 [PATCH 00/12] i2c: add and start using i2c_adapter-specific printk helpers Bartosz Golaszewski
` (12 preceding siblings ...)
2025-12-23 14:23 ` [PATCH 00/12] i2c: add and start using " Johan Hovold
@ 2026-01-13 10:44 ` Wolfram Sang
2026-01-13 10:59 ` Bartosz Golaszewski
2026-01-14 13:36 ` Bartosz Golaszewski
13 siblings, 2 replies; 28+ messages in thread
From: Wolfram Sang @ 2026-01-13 10:44 UTC (permalink / raw)
To: Bartosz Golaszewski
Cc: Andi Shyti, Chen-Yu Tsai, Jernej Skrabec, Samuel Holland,
Khalil Blaiech, Asmaa Mnebhi, Jean Delvare, Madhavan Srinivasan,
Michael Ellerman, Nicholas Piggin, Christophe Leroy (CS GROUP),
Andreas Färber, Manivannan Sadhasivam, linux-i2c,
linux-kernel, linux-arm-kernel, linux-sunxi, linuxppc-dev,
linux-actions, Bartosz Golaszewski
Hi Bart,
> can be *revoked*. To that end we need to hide all dereferences of
> adap->dev in drivers.
I haven't actually tested the code yet (but will do so this week). But I
already want to feed back that I approve of the general concept of
abstracting away drivers access to the struct device by something we can
then convert to SRCU in a central place.
This mail is to discuss the timeline of these series. My preferred
solution is to aim for inclusion right after 7.0-rc1 is released. That
gives me enough time to test and you some more time to address review
comments. Bold wish, but maybe we can even get dependencies into 6.19
before (like the i2c_dbg rename for the saa7134 driver. Is there a patch
for it already?).
Does that work for you?
Happy hacking and thanks again for doing all this!
Wolfram
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH 00/12] i2c: add and start using i2c_adapter-specific printk helpers
2026-01-13 10:44 ` Wolfram Sang
@ 2026-01-13 10:59 ` Bartosz Golaszewski
2026-01-13 11:50 ` Wolfram Sang
2026-01-14 13:36 ` Bartosz Golaszewski
1 sibling, 1 reply; 28+ messages in thread
From: Bartosz Golaszewski @ 2026-01-13 10:59 UTC (permalink / raw)
To: Wolfram Sang
Cc: Bartosz Golaszewski, Andi Shyti, Chen-Yu Tsai, Jernej Skrabec,
Samuel Holland, Khalil Blaiech, Asmaa Mnebhi, Jean Delvare,
Madhavan Srinivasan, Michael Ellerman, Nicholas Piggin,
Christophe Leroy (CS GROUP), Andreas Färber,
Manivannan Sadhasivam, linux-i2c, linux-kernel, linux-arm-kernel,
linux-sunxi, linuxppc-dev, linux-actions
On Tue, Jan 13, 2026 at 11:45 AM Wolfram Sang
<wsa+renesas@sang-engineering.com> wrote:
>
> Hi Bart,
>
> > can be *revoked*. To that end we need to hide all dereferences of
> > adap->dev in drivers.
>
> I haven't actually tested the code yet (but will do so this week). But I
> already want to feed back that I approve of the general concept of
> abstracting away drivers access to the struct device by something we can
> then convert to SRCU in a central place.
>
> This mail is to discuss the timeline of these series. My preferred
> solution is to aim for inclusion right after 7.0-rc1 is released. That
> gives me enough time to test and you some more time to address review
> comments. Bold wish, but maybe we can even get dependencies into 6.19
> before (like the i2c_dbg rename for the saa7134 driver. Is there a patch
> for it already?).
>
> Does that work for you?
Yes, I agree it's too late to queue it for v7.0. I actually wanted to
rename my macro to i2c_debug() to avoid a conflict with saa7134 but
you're right, I may submit a patch for that instead for v7.0.
Bart
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH 00/12] i2c: add and start using i2c_adapter-specific printk helpers
2026-01-13 10:59 ` Bartosz Golaszewski
@ 2026-01-13 11:50 ` Wolfram Sang
0 siblings, 0 replies; 28+ messages in thread
From: Wolfram Sang @ 2026-01-13 11:50 UTC (permalink / raw)
To: Bartosz Golaszewski
Cc: Bartosz Golaszewski, Andi Shyti, Chen-Yu Tsai, Jernej Skrabec,
Samuel Holland, Khalil Blaiech, Asmaa Mnebhi, Jean Delvare,
Madhavan Srinivasan, Michael Ellerman, Nicholas Piggin,
Christophe Leroy (CS GROUP), Andreas Färber,
Manivannan Sadhasivam, linux-i2c, linux-kernel, linux-arm-kernel,
linux-sunxi, linuxppc-dev, linux-actions
> Yes, I agree it's too late to queue it for v7.0. I actually wanted to
> rename my macro to i2c_debug() to avoid a conflict with saa7134 but
> you're right, I may submit a patch for that instead for v7.0.
Your choice. I think keeping 'i2c_dbg' is more consistent but the
dependency on media might not be worth it.
I set your patches to 'Deferred' in patchwork. Meaning that they will be
handled as agreed above.
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH 00/12] i2c: add and start using i2c_adapter-specific printk helpers
2026-01-13 10:44 ` Wolfram Sang
2026-01-13 10:59 ` Bartosz Golaszewski
@ 2026-01-14 13:36 ` Bartosz Golaszewski
2026-01-14 15:22 ` Wolfram Sang
1 sibling, 1 reply; 28+ messages in thread
From: Bartosz Golaszewski @ 2026-01-14 13:36 UTC (permalink / raw)
To: Wolfram Sang
Cc: Bartosz Golaszewski, Andi Shyti, Chen-Yu Tsai, Jernej Skrabec,
Samuel Holland, Khalil Blaiech, Asmaa Mnebhi, Jean Delvare,
Madhavan Srinivasan, Michael Ellerman, Nicholas Piggin,
Christophe Leroy (CS GROUP), Andreas Färber,
Manivannan Sadhasivam, linux-i2c, linux-kernel, linux-arm-kernel,
linux-sunxi, linuxppc-dev, linux-actions
On Tue, Jan 13, 2026 at 11:45 AM Wolfram Sang
<wsa+renesas@sang-engineering.com> wrote:
>
> Hi Bart,
>
> > can be *revoked*. To that end we need to hide all dereferences of
> > adap->dev in drivers.
>
> I haven't actually tested the code yet (but will do so this week). But I
> already want to feed back that I approve of the general concept of
> abstracting away drivers access to the struct device by something we can
> then convert to SRCU in a central place.
>
> This mail is to discuss the timeline of these series. My preferred
> solution is to aim for inclusion right after 7.0-rc1 is released. That
> gives me enough time to test and you some more time to address review
> comments. Bold wish, but maybe we can even get dependencies into 6.19
> before (like the i2c_dbg rename for the saa7134 driver. Is there a patch
> for it already?).
>
FYI: I think the road-map will look something like this: v7.1 will get
new interfaces and most controllers under drivers/i2c/ converted as
this can be done within your tree exclusively. For v7.2 (with the new
interfaces upstream) we can think about converting all i2c controller
drivers treewide to the new helpers. Once v7.2-rc1 is tagged, I would
try to remove struct device from struct i2c_adapter locally and send
it to autobuilders for testing. If that goes well, we could create
struct i2c_adapter_private or something like this and store its
address in struct i2c_adapter. This new struct would be controlled by
i2c core and contain struct device. With that out of the way, for v7.4
we could think about adding SRCU into the mix (possibly using the
then-available revocable).
If all goes well, we should be done in early 2027. :)
Bartosz
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH 00/12] i2c: add and start using i2c_adapter-specific printk helpers
2026-01-14 13:36 ` Bartosz Golaszewski
@ 2026-01-14 15:22 ` Wolfram Sang
0 siblings, 0 replies; 28+ messages in thread
From: Wolfram Sang @ 2026-01-14 15:22 UTC (permalink / raw)
To: Bartosz Golaszewski
Cc: Bartosz Golaszewski, Andi Shyti, Chen-Yu Tsai, Jernej Skrabec,
Samuel Holland, Khalil Blaiech, Asmaa Mnebhi, Jean Delvare,
Madhavan Srinivasan, Michael Ellerman, Nicholas Piggin,
Christophe Leroy (CS GROUP), Andreas Färber,
Manivannan Sadhasivam, linux-i2c, linux-kernel, linux-arm-kernel,
linux-sunxi, linuxppc-dev, linux-actions
> FYI: I think the road-map will look something like this: v7.1 will get
> new interfaces and most controllers under drivers/i2c/ converted as
> this can be done within your tree exclusively. For v7.2 (with the new
> interfaces upstream) we can think about converting all i2c controller
> drivers treewide to the new helpers. Once v7.2-rc1 is tagged, I would
> try to remove struct device from struct i2c_adapter locally and send
> it to autobuilders for testing. If that goes well, we could create
> struct i2c_adapter_private or something like this and store its
> address in struct i2c_adapter. This new struct would be controlled by
> i2c core and contain struct device. With that out of the way, for v7.4
> we could think about adding SRCU into the mix (possibly using the
> then-available revocable).
>
> If all goes well, we should be done in early 2027. :)
With this plan, what could possibly go wrong? :)
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: Big I2C core changes coming up this year (was: Re: [PATCH 00/12] i2c: add and start using i2c_adapter-specific printk helpers
2026-01-13 10:03 ` Big I2C core changes coming up this year (was: " Wolfram Sang
@ 2026-01-19 10:58 ` Johan Hovold
0 siblings, 0 replies; 28+ messages in thread
From: Johan Hovold @ 2026-01-19 10:58 UTC (permalink / raw)
To: Wolfram Sang
Cc: Bartosz Golaszewski, Andi Shyti, Chen-Yu Tsai, Jernej Skrabec,
Samuel Holland, Khalil Blaiech, Asmaa Mnebhi, Jean Delvare,
Madhavan Srinivasan, Michael Ellerman, Nicholas Piggin,
Christophe Leroy (CS GROUP), Andreas Färber,
Manivannan Sadhasivam, linux-i2c, linux-kernel, linux-arm-kernel,
linux-sunxi, linuxppc-dev, linux-actions, Bartosz Golaszewski
On Tue, Jan 13, 2026 at 11:03:16AM +0100, Wolfram Sang wrote:
> Johan, (and all future readers I have pointed to this mail)
>
> > No, this is not the way to do it. You start with designing and showing
> > what the end result will look like *before* you start rewriting world
> > like you are doing here.
>
> In general, this is correct. It does not apply here, though. I will
> describe it in detail, so I can also point other people to this mail who
> wonder about quite some intrusive changes to I2C core this year.
>
> > We should not be making driver code less readable just to address some
> > really niche corner cases like hot pluggable i2c controllers.
>
> It is not a niche-case for hot-plugging. Hot-plugging (which still
> should be avoided for I2C) just makes a subsystem-inherent lifecycle
> problem more obvious. All of Bart's patch series basically prepare to
> tackle this comment from the I2C core:
>
> 1805 /* wait until all references to the device are gone
> 1806 *
> 1807 * FIXME: This is old code and should ideally be replaced by an
> 1808 * alternative which results in decoupling the lifetime of the struct
> 1809 * device from the i2c_adapter, like spi or netdev do. Any solution
> 1810 * should be thoroughly tested with DEBUG_KOBJECT_RELEASE enabled!
> 1811 */
> 1812 init_completion(&adap->dev_released);
> 1813 device_unregister(&adap->dev);
> 1814 wait_for_completion(&adap->dev_released);
>
> This has been in the I2C core since switching to the driver model and
> the underlying problem applies to *all* i2c adapters. Simply unbind an
> I2C controller while you still have a reference to its i2c-dev
> counterpart and you are right in the problem space.
Unbinding drivers is even more of a corner case than hot-plugging i2c
controllers is since only root can do that.
Unloading modules is really just a development (debugging) tool so there
is a perfectly simple solution for any issues stemming from root
unbinding a driver while it's in use: don't do that then.
Furthermore, we even have mechanisms for preventing root from shooting
themselves in the foot with module refcounting and suppression of bind
attributes (which sometimes makes sense).
Issues stemming from unbinding drivers are not in themselves a
sufficient reason for making code harder to read and maintain or for
adding overhead to normal operation.
> The problem is known for decades(!) and nobody dared to touch it, so
> far. Even worse, the above pattern is not only present in I2C but also
> other subsystems. Bart and I have been talking about potential solutions
> for three years now. Bart brought in SRCU as a generic solution and at a
> Plumbers 2024 session with many experienced maintainers present, it was
> decided that this path is worth exploring. Greg suggested to try SRCU
> with GPIO and I2C subsystems, and if this works well, we can try to
> abstract it into something useful for other canidates as well. Now,
> recently, the 'revocable' patch series was introduced which might be
> helpful in our case.
Revocable is definitely not something we want for the very reasons I
outlined above (wrapping every access in code that's generally simply
not needed).
> It is also perfectly okay to work incrementally here, in my book. It is
> such an intrusive change that we need to touch a lot of drivers in any
> case. Yet, with the I2C core being a moving target, all the I2C drivers,
> the 'revocable' patch series, and Linux in general, I think requesting a
> fully complete patch series now is neither efficient nor maintainable.
Again, if the end result is undesirable, that's what we should be
focusing on and not "chipping away" in a direction were we most likely
do not want to go.
It doesn't have to be a complete series, an RFC reworking one driver is
more than enough to be able to judge the end result. And of course a
proper description of the problem you're trying to solve.
> Bartosz and I do have a plan. We are happy to discuss it with other
> interested people, of course. Still, despite all our efforts it might be
> a bumpy ride. Because it is such a crucial and deep-inside change to the
> subsystem core. This is part of development, though. If something
> breaks, we will fix or revert. The alternative is stagnation which I
> don't want. The above code was fine back in the days but now we have
> better mechanisms to handle lifecycle issues. And I really do not want
> Linux to have lifecycle issues. Especially not ones we *know of*.
There are lifetime issues in some subsystems related to user space
interfaces and hotplugging, but driver unbind is really not something
you need to worry about.
> > But in any case, don't get ahead of things by posting changes that we
> > most likely don't want in the end anyway.
>
> We want helpers accessing that specific 'struct device', so we have
> central place to implement access to a protected version of it.
I really don't think we do. USB has been dealing with hotplugging since
forever without any of this. You need to keep some state around and
prevent new accesses until the last user is gone. That's about it.
Johan
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH 00/12] i2c: add and start using i2c_adapter-specific printk helpers
2025-12-23 15:11 ` Bartosz Golaszewski
@ 2026-01-19 11:03 ` Johan Hovold
2026-01-19 11:17 ` Bartosz Golaszewski
0 siblings, 1 reply; 28+ messages in thread
From: Johan Hovold @ 2026-01-19 11:03 UTC (permalink / raw)
To: Bartosz Golaszewski
Cc: Bartosz Golaszewski, Wolfram Sang, Andi Shyti, Chen-Yu Tsai,
Jernej Skrabec, Samuel Holland, Khalil Blaiech, Asmaa Mnebhi,
Jean Delvare, Madhavan Srinivasan, Michael Ellerman,
Nicholas Piggin, Christophe Leroy (CS GROUP), Andreas Färber,
Manivannan Sadhasivam, linux-i2c, linux-kernel, linux-arm-kernel,
linux-sunxi, linuxppc-dev, linux-actions
On Tue, Dec 23, 2025 at 04:11:08PM +0100, Bartosz Golaszewski wrote:
> On Tue, Dec 23, 2025 at 3:24 PM Johan Hovold <johan@kernel.org> wrote:
> >
> > On Tue, Dec 23, 2025 at 11:02:22AM +0100, Bartosz Golaszewski wrote:
> > > It's been another year of discussing the object life-time problems at
> > > conferences. I2C is one of the offenders and its problems are more
> > > complex than those of some other subsystems. It seems the revocable[1]
> > > API may make its way into the kernel this year but even with it in
> > > place, I2C won't be able to use it as there's currently nothing to
> > > *revoke*. The struct device is embedded within the i2c_adapter struct
> > > whose lifetime is tied to the provider device being bound to its driver.
> > >
> > > Fixing this won't be fast and easy but nothing's going to happen if we
> > > don't start chipping away at it. The ultimate goal in order to be able
> > > to use an SRCU-based solution (revocable or otherwise) is to convert the
> > > embedded struct device in struct i2c_adapter into an __rcu pointer that
> > > can be *revoked*. To that end we need to hide all dereferences of
> > > adap->dev in drivers.
> >
> > No, this is not the way to do it. You start with designing and showing
> > what the end result will look like *before* you start rewriting world
> > like you are doing here.
>
> The paragraph you're commenting under explains exactly what I propose
> to do: move struct device out of struct i2c_adapter and protect the
> pointer storing its address with SRCU. This is a well-known design
> that's being generalized to a common "revocable" API which will
> possibly be available upstream by the time we're ready to use it.
Revocable, as presented in plumbers, is not going upstream.
> You know I can't possibly *show* the end result in a single series
> because - as the paragraph before explains - we need to first hide all
> direct dereferences of struct device in struct i2c_adapter behind
> dedicated interfaces so that we when do the conversion, it'll affect
> only a limited number of places. It can't realistically be done at
> once.
You can post an RFC converting one driver with a proper description of
the problem you're trying to solve.
Johan
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH 00/12] i2c: add and start using i2c_adapter-specific printk helpers
2026-01-19 11:03 ` Johan Hovold
@ 2026-01-19 11:17 ` Bartosz Golaszewski
2026-01-19 11:32 ` Johan Hovold
0 siblings, 1 reply; 28+ messages in thread
From: Bartosz Golaszewski @ 2026-01-19 11:17 UTC (permalink / raw)
To: Johan Hovold
Cc: Bartosz Golaszewski, Wolfram Sang, Andi Shyti, Chen-Yu Tsai,
Jernej Skrabec, Samuel Holland, Khalil Blaiech, Asmaa Mnebhi,
Jean Delvare, Madhavan Srinivasan, Michael Ellerman,
Nicholas Piggin, Christophe Leroy (CS GROUP), Andreas Färber,
Manivannan Sadhasivam, linux-i2c, linux-kernel, linux-arm-kernel,
linux-sunxi, linuxppc-dev, linux-actions
On Mon, Jan 19, 2026 at 12:03 PM Johan Hovold <johan@kernel.org> wrote:
>
> On Tue, Dec 23, 2025 at 04:11:08PM +0100, Bartosz Golaszewski wrote:
> > On Tue, Dec 23, 2025 at 3:24 PM Johan Hovold <johan@kernel.org> wrote:
> > >
> > > On Tue, Dec 23, 2025 at 11:02:22AM +0100, Bartosz Golaszewski wrote:
> > > > It's been another year of discussing the object life-time problems at
> > > > conferences. I2C is one of the offenders and its problems are more
> > > > complex than those of some other subsystems. It seems the revocable[1]
> > > > API may make its way into the kernel this year but even with it in
> > > > place, I2C won't be able to use it as there's currently nothing to
> > > > *revoke*. The struct device is embedded within the i2c_adapter struct
> > > > whose lifetime is tied to the provider device being bound to its driver.
> > > >
> > > > Fixing this won't be fast and easy but nothing's going to happen if we
> > > > don't start chipping away at it. The ultimate goal in order to be able
> > > > to use an SRCU-based solution (revocable or otherwise) is to convert the
> > > > embedded struct device in struct i2c_adapter into an __rcu pointer that
> > > > can be *revoked*. To that end we need to hide all dereferences of
> > > > adap->dev in drivers.
> > >
> > > No, this is not the way to do it. You start with designing and showing
> > > what the end result will look like *before* you start rewriting world
> > > like you are doing here.
> >
> > The paragraph you're commenting under explains exactly what I propose
> > to do: move struct device out of struct i2c_adapter and protect the
> > pointer storing its address with SRCU. This is a well-known design
> > that's being generalized to a common "revocable" API which will
> > possibly be available upstream by the time we're ready to use it.
>
> Revocable, as presented in plumbers, is not going upstream.
>
Oh really? :)
https://lore.kernel.org/all/2026011607-canister-catalyst-9fdd@gregkh/
> > You know I can't possibly *show* the end result in a single series
> > because - as the paragraph before explains - we need to first hide all
> > direct dereferences of struct device in struct i2c_adapter behind
> > dedicated interfaces so that we when do the conversion, it'll affect
> > only a limited number of places. It can't realistically be done at
> > once.
>
> You can post an RFC converting one driver with a proper description of
> the problem you're trying to solve.
>
It's not a one-driver problem. It's a subsystem-wide problem requiring
a subsystem-wide solution. Wolfram explained it really well in his
summary, I'm not going to repeat it here.
I also don't agree that i2c-specific helpers make code harder to read.
Is device_set_node() harder to read than
dev->fwnode = fwnode;
dev->of_node = to_of_node(fwnode);
?
Even if you answer yes - it at least helps hide the implementation
details of the OF layer where fwnode-level is preferred. We do it all
the time in the kernel. This kind of helpers allows easier transitions
when some implementation detail needs to change - as is the case here.
Bartosz
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH 00/12] i2c: add and start using i2c_adapter-specific printk helpers
2026-01-19 11:17 ` Bartosz Golaszewski
@ 2026-01-19 11:32 ` Johan Hovold
0 siblings, 0 replies; 28+ messages in thread
From: Johan Hovold @ 2026-01-19 11:32 UTC (permalink / raw)
To: Bartosz Golaszewski
Cc: Bartosz Golaszewski, Wolfram Sang, Andi Shyti, Chen-Yu Tsai,
Jernej Skrabec, Samuel Holland, Khalil Blaiech, Asmaa Mnebhi,
Jean Delvare, Madhavan Srinivasan, Michael Ellerman,
Nicholas Piggin, Christophe Leroy (CS GROUP), Andreas Färber,
Manivannan Sadhasivam, linux-i2c, linux-kernel, linux-arm-kernel,
linux-sunxi, linuxppc-dev, linux-actions
On Mon, Jan 19, 2026 at 12:17:49PM +0100, Bartosz Golaszewski wrote:
> On Mon, Jan 19, 2026 at 12:03 PM Johan Hovold <johan@kernel.org> wrote:
> >
> > On Tue, Dec 23, 2025 at 04:11:08PM +0100, Bartosz Golaszewski wrote:
> > > On Tue, Dec 23, 2025 at 3:24 PM Johan Hovold <johan@kernel.org> wrote:
> > > >
> > > > On Tue, Dec 23, 2025 at 11:02:22AM +0100, Bartosz Golaszewski wrote:
> > > > > It's been another year of discussing the object life-time problems at
> > > > > conferences. I2C is one of the offenders and its problems are more
> > > > > complex than those of some other subsystems. It seems the revocable[1]
> > > > > API may make its way into the kernel this year but even with it in
> > > > > place, I2C won't be able to use it as there's currently nothing to
> > > > > *revoke*. The struct device is embedded within the i2c_adapter struct
> > > > > whose lifetime is tied to the provider device being bound to its driver.
> > > > >
> > > > > Fixing this won't be fast and easy but nothing's going to happen if we
> > > > > don't start chipping away at it. The ultimate goal in order to be able
> > > > > to use an SRCU-based solution (revocable or otherwise) is to convert the
> > > > > embedded struct device in struct i2c_adapter into an __rcu pointer that
> > > > > can be *revoked*. To that end we need to hide all dereferences of
> > > > > adap->dev in drivers.
> > > >
> > > > No, this is not the way to do it. You start with designing and showing
> > > > what the end result will look like *before* you start rewriting world
> > > > like you are doing here.
> > >
> > > The paragraph you're commenting under explains exactly what I propose
> > > to do: move struct device out of struct i2c_adapter and protect the
> > > pointer storing its address with SRCU. This is a well-known design
> > > that's being generalized to a common "revocable" API which will
> > > possibly be available upstream by the time we're ready to use it.
> >
> > Revocable, as presented in plumbers, is not going upstream.
> >
>
> Oh really? :)
>
> https://lore.kernel.org/all/2026011607-canister-catalyst-9fdd@gregkh/
Looks like a bad call as Laurent immediately pointed out:
https://lore.kernel.org/all/20260116160454.GN30544@pendragon.ideasonboard.com/#t
Let's see where that goes.
> > > You know I can't possibly *show* the end result in a single series
> > > because - as the paragraph before explains - we need to first hide all
> > > direct dereferences of struct device in struct i2c_adapter behind
> > > dedicated interfaces so that we when do the conversion, it'll affect
> > > only a limited number of places. It can't realistically be done at
> > > once.
> >
> > You can post an RFC converting one driver with a proper description of
> > the problem you're trying to solve.
> >
>
> It's not a one-driver problem. It's a subsystem-wide problem requiring
> a subsystem-wide solution. Wolfram explained it really well in his
> summary, I'm not going to repeat it here.
Of course it is, but you still don't have to rewrite world to post an
RFC where the problem can be discussed. A single driver is more than
enough.
> I also don't agree that i2c-specific helpers make code harder to read.
> Is device_set_node() harder to read than
>
> dev->fwnode = fwnode;
> dev->of_node = to_of_node(fwnode);
>
> ?
>
> Even if you answer yes - it at least helps hide the implementation
> details of the OF layer where fwnode-level is preferred. We do it all
> the time in the kernel. This kind of helpers allows easier transitions
> when some implementation detail needs to change - as is the case here.
Magic helpers that hide what's really going on hurts readability. So
introducing them when they are not really needed should be avoided.
(But yeah, we have a problem with developers introducing esoteric
helpers while seemingly thinking all that matters is LOC count, and too
few people raising their voice against bad ideas.)
Johan
^ permalink raw reply [flat|nested] 28+ messages in thread
end of thread, other threads:[~2026-01-19 11:32 UTC | newest]
Thread overview: 28+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-12-23 10:02 [PATCH 00/12] i2c: add and start using i2c_adapter-specific printk helpers Bartosz Golaszewski
2025-12-23 10:02 ` [PATCH 01/12] i2c: add " Bartosz Golaszewski
2025-12-25 18:30 ` kernel test robot
2025-12-25 19:33 ` kernel test robot
2025-12-23 10:02 ` [PATCH 02/12] i2c: sun6i-p2wi: use " Bartosz Golaszewski
2025-12-23 11:04 ` Chen-Yu Tsai
2025-12-23 10:02 ` [PATCH 03/12] i2c: mlxbf: " Bartosz Golaszewski
2025-12-23 10:02 ` [PATCH 04/12] i2c: isch: " Bartosz Golaszewski
2025-12-23 10:02 ` [PATCH 05/12] i2c: ali1535: " Bartosz Golaszewski
2025-12-23 10:02 ` [PATCH 06/12] i2c: scmi: " Bartosz Golaszewski
2025-12-23 10:02 ` [PATCH 07/12] i2c: ali15x3: " Bartosz Golaszewski
2025-12-23 10:02 ` [PATCH 08/12] i2c: powermac: " Bartosz Golaszewski
2025-12-23 10:02 ` [PATCH 09/12] i2c: owl: " Bartosz Golaszewski
2025-12-23 10:02 ` [PATCH 10/12] i2c: nforce2: " Bartosz Golaszewski
2025-12-23 10:02 ` [PATCH 11/12] i2c: amd756: " Bartosz Golaszewski
2025-12-23 10:02 ` [PATCH 12/12] i2c: piix4: " Bartosz Golaszewski
2025-12-23 14:23 ` [PATCH 00/12] i2c: add and start using " Johan Hovold
2025-12-23 15:11 ` Bartosz Golaszewski
2026-01-19 11:03 ` Johan Hovold
2026-01-19 11:17 ` Bartosz Golaszewski
2026-01-19 11:32 ` Johan Hovold
2026-01-13 10:03 ` Big I2C core changes coming up this year (was: " Wolfram Sang
2026-01-19 10:58 ` Johan Hovold
2026-01-13 10:44 ` Wolfram Sang
2026-01-13 10:59 ` Bartosz Golaszewski
2026-01-13 11:50 ` Wolfram Sang
2026-01-14 13:36 ` Bartosz Golaszewski
2026-01-14 15:22 ` Wolfram Sang
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox