* [PATCH v4 1/5] i2c: xiic: minor cosmetic cleanup
2026-01-23 16:34 [PATCH v4 0/5] i2c: xiic: use generic device property accessors Abdurrahman Hussain via B4 Relay
@ 2026-01-23 16:34 ` Abdurrahman Hussain via B4 Relay
2026-01-23 16:34 ` [PATCH v4 2/5] i2c: xiic: make the clock optional Abdurrahman Hussain via B4 Relay
` (4 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Abdurrahman Hussain via B4 Relay @ 2026-01-23 16:34 UTC (permalink / raw)
To: Michal Simek, Andi Shyti
Cc: Andy Shevchenko, linux-arm-kernel, linux-i2c, linux-kernel,
Abdurrahman Hussain
From: Abdurrahman Hussain <abdurrahman@nexthop.ai>
Add a temporary dev variable and reuse it instead of referencing pdev->dev
everywhere.
Signed-off-by: Abdurrahman Hussain <abdurrahman@nexthop.ai>
---
drivers/i2c/busses/i2c-xiic.c | 57 ++++++++++++++++++++++---------------------
1 file changed, 29 insertions(+), 28 deletions(-)
diff --git a/drivers/i2c/busses/i2c-xiic.c b/drivers/i2c/busses/i2c-xiic.c
index 28015d77599d..12321654055f 100644
--- a/drivers/i2c/busses/i2c-xiic.c
+++ b/drivers/i2c/busses/i2c-xiic.c
@@ -1423,6 +1423,7 @@ MODULE_DEVICE_TABLE(of, xiic_of_match);
static int xiic_i2c_probe(struct platform_device *pdev)
{
+ struct device *dev = &pdev->dev;
struct xiic_i2c *i2c;
struct xiic_i2c_platform_data *pdata;
const struct of_device_id *match;
@@ -1431,11 +1432,11 @@ static int xiic_i2c_probe(struct platform_device *pdev)
u8 i;
u32 sr;
- i2c = devm_kzalloc(&pdev->dev, sizeof(*i2c), GFP_KERNEL);
+ i2c = devm_kzalloc(dev, sizeof(*i2c), GFP_KERNEL);
if (!i2c)
return -ENOMEM;
- match = of_match_node(xiic_of_match, pdev->dev.of_node);
+ match = of_match_node(xiic_of_match, dev->of_node);
if (match && match->data) {
const struct xiic_version_data *data = match->data;
@@ -1450,50 +1451,49 @@ static int xiic_i2c_probe(struct platform_device *pdev)
if (irq < 0)
return irq;
- pdata = dev_get_platdata(&pdev->dev);
+ pdata = dev_get_platdata(dev);
/* hook up driver to tree */
platform_set_drvdata(pdev, i2c);
i2c->adap = xiic_adapter;
i2c_set_adapdata(&i2c->adap, i2c);
- i2c->adap.dev.parent = &pdev->dev;
- i2c->adap.dev.of_node = pdev->dev.of_node;
+ i2c->adap.dev.parent = dev;
+ i2c->adap.dev.of_node = dev->of_node;
snprintf(i2c->adap.name, sizeof(i2c->adap.name),
DRIVER_NAME " %s", pdev->name);
mutex_init(&i2c->lock);
spin_lock_init(&i2c->atomic_lock);
- i2c->clk = devm_clk_get_enabled(&pdev->dev, NULL);
+ i2c->clk = devm_clk_get_enabled(dev, NULL);
if (IS_ERR(i2c->clk))
- return dev_err_probe(&pdev->dev, PTR_ERR(i2c->clk),
+ return dev_err_probe(dev, PTR_ERR(i2c->clk),
"failed to enable input clock.\n");
- i2c->dev = &pdev->dev;
- pm_runtime_set_autosuspend_delay(i2c->dev, XIIC_PM_TIMEOUT);
- pm_runtime_use_autosuspend(i2c->dev);
- pm_runtime_set_active(i2c->dev);
- pm_runtime_enable(i2c->dev);
+ i2c->dev = dev;
+ pm_runtime_set_autosuspend_delay(dev, XIIC_PM_TIMEOUT);
+ pm_runtime_use_autosuspend(dev);
+ pm_runtime_set_active(dev);
+ pm_runtime_enable(dev);
/* SCL frequency configuration */
i2c->input_clk = clk_get_rate(i2c->clk);
- ret = of_property_read_u32(pdev->dev.of_node, "clock-frequency",
+ ret = of_property_read_u32(dev->of_node, "clock-frequency",
&i2c->i2c_clk);
/* If clock-frequency not specified in DT, do not configure in SW */
if (ret || i2c->i2c_clk > I2C_MAX_FAST_MODE_PLUS_FREQ)
i2c->i2c_clk = 0;
- ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
- xiic_process, IRQF_ONESHOT,
- pdev->name, i2c);
+ ret = devm_request_threaded_irq(dev, irq, NULL, xiic_process,
+ IRQF_ONESHOT, pdev->name, i2c);
if (ret < 0) {
- dev_err_probe(&pdev->dev, ret, "Cannot claim IRQ\n");
+ dev_err_probe(dev, ret, "Cannot claim IRQ\n");
goto err_pm_disable;
}
i2c->singlemaster =
- of_property_read_bool(pdev->dev.of_node, "single-master");
+ of_property_read_bool(dev->of_node, "single-master");
/*
* Detect endianness
@@ -1509,7 +1509,7 @@ static int xiic_i2c_probe(struct platform_device *pdev)
ret = xiic_reinit(i2c);
if (ret < 0) {
- dev_err_probe(&pdev->dev, ret, "Cannot xiic_reinit\n");
+ dev_err_probe(dev, ret, "Cannot xiic_reinit\n");
goto err_pm_disable;
}
@@ -1526,38 +1526,39 @@ static int xiic_i2c_probe(struct platform_device *pdev)
i2c_new_client_device(&i2c->adap, pdata->devices + i);
}
- dev_dbg(&pdev->dev, "mmio %08lx irq %d scl clock frequency %d\n",
+ dev_dbg(dev, "mmio %08lx irq %d scl clock frequency %d\n",
(unsigned long)res->start, irq, i2c->i2c_clk);
return 0;
err_pm_disable:
- pm_runtime_disable(&pdev->dev);
- pm_runtime_set_suspended(&pdev->dev);
+ pm_runtime_disable(dev);
+ pm_runtime_set_suspended(dev);
return ret;
}
static void xiic_i2c_remove(struct platform_device *pdev)
{
+ struct device *dev = &pdev->dev;
struct xiic_i2c *i2c = platform_get_drvdata(pdev);
int ret;
/* remove adapter & data */
i2c_del_adapter(&i2c->adap);
- ret = pm_runtime_get_sync(i2c->dev);
+ ret = pm_runtime_get_sync(dev);
if (ret < 0)
- dev_warn(&pdev->dev, "Failed to activate device for removal (%pe)\n",
+ dev_warn(dev, "Failed to activate device for removal (%pe)\n",
ERR_PTR(ret));
else
xiic_deinit(i2c);
- pm_runtime_put_sync(i2c->dev);
- pm_runtime_disable(&pdev->dev);
- pm_runtime_set_suspended(&pdev->dev);
- pm_runtime_dont_use_autosuspend(&pdev->dev);
+ pm_runtime_put_sync(dev);
+ pm_runtime_disable(dev);
+ pm_runtime_set_suspended(dev);
+ pm_runtime_dont_use_autosuspend(dev);
}
static const struct dev_pm_ops xiic_dev_pm_ops = {
--
2.52.0
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH v4 2/5] i2c: xiic: make the clock optional
2026-01-23 16:34 [PATCH v4 0/5] i2c: xiic: use generic device property accessors Abdurrahman Hussain via B4 Relay
2026-01-23 16:34 ` [PATCH v4 1/5] i2c: xiic: minor cosmetic cleanup Abdurrahman Hussain via B4 Relay
@ 2026-01-23 16:34 ` Abdurrahman Hussain via B4 Relay
2026-01-23 16:34 ` [PATCH v4 3/5] i2c: xiic: switch to devm_ managed apis to simplify the error code paths Abdurrahman Hussain via B4 Relay
` (3 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Abdurrahman Hussain via B4 Relay @ 2026-01-23 16:34 UTC (permalink / raw)
To: Michal Simek, Andi Shyti
Cc: Andy Shevchenko, linux-arm-kernel, linux-i2c, linux-kernel,
Abdurrahman Hussain
From: Abdurrahman Hussain <abdurrahman@nexthop.ai>
The xiic driver is designed to operate without explicit clock configuration
when clocks are not specified in the firmware. This functionality is
already implemented in xiic_setclk(), which performs an early return when
either i2c_clk or input_clk are zero:
This condition is satisfied when clocks are missing, as clk_get_rate(NULL)
returns zero, allowing the driver to rely on hardware-configured timing.
Signed-off-by: Abdurrahman Hussain <abdurrahman@nexthop.ai>
---
drivers/i2c/busses/i2c-xiic.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/i2c/busses/i2c-xiic.c b/drivers/i2c/busses/i2c-xiic.c
index 12321654055f..2da7e9d1d5ca 100644
--- a/drivers/i2c/busses/i2c-xiic.c
+++ b/drivers/i2c/busses/i2c-xiic.c
@@ -1465,7 +1465,7 @@ static int xiic_i2c_probe(struct platform_device *pdev)
mutex_init(&i2c->lock);
spin_lock_init(&i2c->atomic_lock);
- i2c->clk = devm_clk_get_enabled(dev, NULL);
+ i2c->clk = devm_clk_get_optional_enabled(dev, NULL);
if (IS_ERR(i2c->clk))
return dev_err_probe(dev, PTR_ERR(i2c->clk),
"failed to enable input clock.\n");
--
2.52.0
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH v4 3/5] i2c: xiic: switch to devm_ managed apis to simplify the error code paths
2026-01-23 16:34 [PATCH v4 0/5] i2c: xiic: use generic device property accessors Abdurrahman Hussain via B4 Relay
2026-01-23 16:34 ` [PATCH v4 1/5] i2c: xiic: minor cosmetic cleanup Abdurrahman Hussain via B4 Relay
2026-01-23 16:34 ` [PATCH v4 2/5] i2c: xiic: make the clock optional Abdurrahman Hussain via B4 Relay
@ 2026-01-23 16:34 ` Abdurrahman Hussain via B4 Relay
2026-01-23 16:34 ` [PATCH v4 4/5] i2c: xiic: remove duplicate error message Abdurrahman Hussain via B4 Relay
` (2 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Abdurrahman Hussain via B4 Relay @ 2026-01-23 16:34 UTC (permalink / raw)
To: Michal Simek, Andi Shyti
Cc: Andy Shevchenko, linux-arm-kernel, linux-i2c, linux-kernel,
Abdurrahman Hussain
From: Abdurrahman Hussain <abdurrahman@nexthop.ai>
Simplify the error code paths by switching devm_mutex_init() and
devm_pm_runtime_set_active_enabled().
Signed-off-by: Abdurrahman Hussain <abdurrahman@nexthop.ai>
---
drivers/i2c/busses/i2c-xiic.c | 24 ++++++++++--------------
1 file changed, 10 insertions(+), 14 deletions(-)
diff --git a/drivers/i2c/busses/i2c-xiic.c b/drivers/i2c/busses/i2c-xiic.c
index 2da7e9d1d5ca..6d47c9972719 100644
--- a/drivers/i2c/busses/i2c-xiic.c
+++ b/drivers/i2c/busses/i2c-xiic.c
@@ -1462,7 +1462,10 @@ static int xiic_i2c_probe(struct platform_device *pdev)
snprintf(i2c->adap.name, sizeof(i2c->adap.name),
DRIVER_NAME " %s", pdev->name);
- mutex_init(&i2c->lock);
+ ret = devm_mutex_init(&pdev->dev, &i2c->lock);
+ if (ret < 0)
+ return ret;
+
spin_lock_init(&i2c->atomic_lock);
i2c->clk = devm_clk_get_optional_enabled(dev, NULL);
@@ -1473,8 +1476,9 @@ static int xiic_i2c_probe(struct platform_device *pdev)
i2c->dev = dev;
pm_runtime_set_autosuspend_delay(dev, XIIC_PM_TIMEOUT);
pm_runtime_use_autosuspend(dev);
- pm_runtime_set_active(dev);
- pm_runtime_enable(dev);
+ ret = devm_pm_runtime_set_active_enabled(dev);
+ if (ret < 0)
+ return ret;
/* SCL frequency configuration */
i2c->input_clk = clk_get_rate(i2c->clk);
@@ -1489,7 +1493,7 @@ static int xiic_i2c_probe(struct platform_device *pdev)
if (ret < 0) {
dev_err_probe(dev, ret, "Cannot claim IRQ\n");
- goto err_pm_disable;
+ return ret;
}
i2c->singlemaster =
@@ -1510,14 +1514,14 @@ static int xiic_i2c_probe(struct platform_device *pdev)
ret = xiic_reinit(i2c);
if (ret < 0) {
dev_err_probe(dev, ret, "Cannot xiic_reinit\n");
- goto err_pm_disable;
+ return ret;
}
/* add i2c adapter to i2c tree */
ret = i2c_add_adapter(&i2c->adap);
if (ret) {
xiic_deinit(i2c);
- goto err_pm_disable;
+ return ret;
}
if (pdata) {
@@ -1529,12 +1533,6 @@ static int xiic_i2c_probe(struct platform_device *pdev)
dev_dbg(dev, "mmio %08lx irq %d scl clock frequency %d\n",
(unsigned long)res->start, irq, i2c->i2c_clk);
- return 0;
-
-err_pm_disable:
- pm_runtime_disable(dev);
- pm_runtime_set_suspended(dev);
-
return ret;
}
@@ -1556,8 +1554,6 @@ static void xiic_i2c_remove(struct platform_device *pdev)
xiic_deinit(i2c);
pm_runtime_put_sync(dev);
- pm_runtime_disable(dev);
- pm_runtime_set_suspended(dev);
pm_runtime_dont_use_autosuspend(dev);
}
--
2.52.0
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH v4 4/5] i2c: xiic: remove duplicate error message
2026-01-23 16:34 [PATCH v4 0/5] i2c: xiic: use generic device property accessors Abdurrahman Hussain via B4 Relay
` (2 preceding siblings ...)
2026-01-23 16:34 ` [PATCH v4 3/5] i2c: xiic: switch to devm_ managed apis to simplify the error code paths Abdurrahman Hussain via B4 Relay
@ 2026-01-23 16:34 ` Abdurrahman Hussain via B4 Relay
2026-01-23 16:34 ` [PATCH v4 5/5] i2c: xiic: switch to generic device property accessors Abdurrahman Hussain via B4 Relay
2026-01-23 16:56 ` [PATCH v4 0/5] i2c: xiic: use " Andy Shevchenko
5 siblings, 0 replies; 7+ messages in thread
From: Abdurrahman Hussain via B4 Relay @ 2026-01-23 16:34 UTC (permalink / raw)
To: Michal Simek, Andi Shyti
Cc: Andy Shevchenko, linux-arm-kernel, linux-i2c, linux-kernel,
Abdurrahman Hussain
From: Abdurrahman Hussain <abdurrahman@nexthop.ai>
The devm_request_threaded_irq() already prints an error message. Remove
the duplicate.
Signed-off-by: Abdurrahman Hussain <abdurrahman@nexthop.ai>
---
drivers/i2c/busses/i2c-xiic.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/drivers/i2c/busses/i2c-xiic.c b/drivers/i2c/busses/i2c-xiic.c
index 6d47c9972719..800a27413978 100644
--- a/drivers/i2c/busses/i2c-xiic.c
+++ b/drivers/i2c/busses/i2c-xiic.c
@@ -1491,10 +1491,8 @@ static int xiic_i2c_probe(struct platform_device *pdev)
ret = devm_request_threaded_irq(dev, irq, NULL, xiic_process,
IRQF_ONESHOT, pdev->name, i2c);
- if (ret < 0) {
- dev_err_probe(dev, ret, "Cannot claim IRQ\n");
+ if (ret < 0)
return ret;
- }
i2c->singlemaster =
of_property_read_bool(dev->of_node, "single-master");
--
2.52.0
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH v4 5/5] i2c: xiic: switch to generic device property accessors
2026-01-23 16:34 [PATCH v4 0/5] i2c: xiic: use generic device property accessors Abdurrahman Hussain via B4 Relay
` (3 preceding siblings ...)
2026-01-23 16:34 ` [PATCH v4 4/5] i2c: xiic: remove duplicate error message Abdurrahman Hussain via B4 Relay
@ 2026-01-23 16:34 ` Abdurrahman Hussain via B4 Relay
2026-01-23 16:56 ` [PATCH v4 0/5] i2c: xiic: use " Andy Shevchenko
5 siblings, 0 replies; 7+ messages in thread
From: Abdurrahman Hussain via B4 Relay @ 2026-01-23 16:34 UTC (permalink / raw)
To: Michal Simek, Andi Shyti
Cc: Andy Shevchenko, linux-arm-kernel, linux-i2c, linux-kernel,
Abdurrahman Hussain
From: Abdurrahman Hussain <abdurrahman@nexthop.ai>
Use generic device property accessors.
Signed-off-by: Abdurrahman Hussain <abdurrahman@nexthop.ai>
---
drivers/i2c/busses/i2c-xiic.c | 20 ++++++--------------
1 file changed, 6 insertions(+), 14 deletions(-)
diff --git a/drivers/i2c/busses/i2c-xiic.c b/drivers/i2c/busses/i2c-xiic.c
index 800a27413978..dfb8fa2787b2 100644
--- a/drivers/i2c/busses/i2c-xiic.c
+++ b/drivers/i2c/busses/i2c-xiic.c
@@ -27,7 +27,6 @@
#include <linux/platform_data/i2c-xiic.h>
#include <linux/io.h>
#include <linux/slab.h>
-#include <linux/of.h>
#include <linux/clk.h>
#include <linux/pm_runtime.h>
#include <linux/iopoll.h>
@@ -1408,7 +1407,6 @@ static const struct i2c_adapter xiic_adapter = {
.algo = &xiic_algorithm,
};
-#if defined(CONFIG_OF)
static const struct xiic_version_data xiic_2_00 = {
.quirks = DYNAMIC_MODE_READ_BROKEN_BIT,
};
@@ -1419,14 +1417,13 @@ static const struct of_device_id xiic_of_match[] = {
{},
};
MODULE_DEVICE_TABLE(of, xiic_of_match);
-#endif
static int xiic_i2c_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
struct xiic_i2c *i2c;
struct xiic_i2c_platform_data *pdata;
- const struct of_device_id *match;
+ const struct xiic_version_data *data;
struct resource *res;
int ret, irq;
u8 i;
@@ -1436,12 +1433,9 @@ static int xiic_i2c_probe(struct platform_device *pdev)
if (!i2c)
return -ENOMEM;
- match = of_match_node(xiic_of_match, dev->of_node);
- if (match && match->data) {
- const struct xiic_version_data *data = match->data;
-
+ data = device_get_match_data(dev);
+ if (data)
i2c->quirks = data->quirks;
- }
i2c->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
if (IS_ERR(i2c->base))
@@ -1458,7 +1452,7 @@ static int xiic_i2c_probe(struct platform_device *pdev)
i2c->adap = xiic_adapter;
i2c_set_adapdata(&i2c->adap, i2c);
i2c->adap.dev.parent = dev;
- i2c->adap.dev.of_node = dev->of_node;
+ device_set_node(&i2c->adap.dev, dev_fwnode(dev));
snprintf(i2c->adap.name, sizeof(i2c->adap.name),
DRIVER_NAME " %s", pdev->name);
@@ -1482,8 +1476,7 @@ static int xiic_i2c_probe(struct platform_device *pdev)
/* SCL frequency configuration */
i2c->input_clk = clk_get_rate(i2c->clk);
- ret = of_property_read_u32(dev->of_node, "clock-frequency",
- &i2c->i2c_clk);
+ ret = device_property_read_u32(dev, "clock-frequency", &i2c->i2c_clk);
/* If clock-frequency not specified in DT, do not configure in SW */
if (ret || i2c->i2c_clk > I2C_MAX_FAST_MODE_PLUS_FREQ)
i2c->i2c_clk = 0;
@@ -1494,8 +1487,7 @@ static int xiic_i2c_probe(struct platform_device *pdev)
if (ret < 0)
return ret;
- i2c->singlemaster =
- of_property_read_bool(dev->of_node, "single-master");
+ i2c->singlemaster = device_property_read_bool(dev, "single-master");
/*
* Detect endianness
--
2.52.0
^ permalink raw reply related [flat|nested] 7+ messages in thread* Re: [PATCH v4 0/5] i2c: xiic: use generic device property accessors
2026-01-23 16:34 [PATCH v4 0/5] i2c: xiic: use generic device property accessors Abdurrahman Hussain via B4 Relay
` (4 preceding siblings ...)
2026-01-23 16:34 ` [PATCH v4 5/5] i2c: xiic: switch to generic device property accessors Abdurrahman Hussain via B4 Relay
@ 2026-01-23 16:56 ` Andy Shevchenko
5 siblings, 0 replies; 7+ messages in thread
From: Andy Shevchenko @ 2026-01-23 16:56 UTC (permalink / raw)
To: abdurrahman
Cc: Michal Simek, Andi Shyti, linux-arm-kernel, linux-i2c,
linux-kernel
On Fri, Jan 23, 2026 at 04:34:13PM +0000, Abdurrahman Hussain via B4 Relay wrote:
> Switch to generic device property accessors.
>
> Switch to managed devm_ functions to simplify error handling.
>
> Make the clock optional since the driver is designed to operate without
> explicit configuration in firmware thus making it useful on platforms
> where clock is not or cannot be provided.
...
> Changes in v4:
> - Reorder the cosmetic patch to be the first in the series.
No. that's not what I meant. I meant that the line that adds a temporary
variable should be moved from the last patch to the first one. The order
of the _patches_ was fine, now it's broken again.
Take your time and try to play with the patches locally to see my point.
Next week v5 would be nice to have that addresses my point.
> - Amend the mutex_init patch to also switch to the managed pm_runtime_
> variant.
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 7+ messages in thread