public inbox for linux-arm-kernel@lists.infradead.org
 help / color / mirror / Atom feed
* [PATCH v2 0/2] i2c: xiic: use generic device property accessors
@ 2026-01-22  8:32 Abdurrahman Hussain via B4 Relay
  2026-01-22  8:32 ` [PATCH v2 1/2] i2c: xiic: switch to " Abdurrahman Hussain via B4 Relay
  2026-01-22  8:32 ` [PATCH v2 2/2] i2c: xiic: make the clock optional Abdurrahman Hussain via B4 Relay
  0 siblings, 2 replies; 6+ messages in thread
From: Abdurrahman Hussain via B4 Relay @ 2026-01-22  8:32 UTC (permalink / raw)
  To: Michal Simek, Andi Shyti
  Cc: Andy Shevchenko, linux-arm-kernel, linux-i2c, linux-kernel,
	Abdurrahman Hussain

Switch to generic device property accessors and make minor code
refactoring.

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.

Changed in v2:

* Split the patch into two independent changes.
* Added struct device *dev at the top of probe() and remove() to re-use.
* Switched to device_set_node(...)

Signed-off-by: Abdurrahman Hussain <abdurrahman@nexthop.ai>
---
Abdurrahman Hussain (2):
      i2c: xiic: switch to generic device property accessors
      i2c: xiic: make the clock optional

 drivers/i2c/busses/i2c-xiic.c | 60 +++++++++++++++++++------------------------
 1 file changed, 27 insertions(+), 33 deletions(-)
---
base-commit: 944aacb68baf7624ab8d277d0ebf07f025ca137c
change-id: 20260122-i2c-xiic-3ba89ff5ea93

Best regards,
-- 
Abdurrahman Hussain <abdurrahman@nexthop.ai>




^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH v2 1/2] i2c: xiic: switch to generic device property accessors
  2026-01-22  8:32 [PATCH v2 0/2] i2c: xiic: use generic device property accessors Abdurrahman Hussain via B4 Relay
@ 2026-01-22  8:32 ` Abdurrahman Hussain via B4 Relay
  2026-01-22  8:59   ` Andy Shevchenko
  2026-01-22  8:32 ` [PATCH v2 2/2] i2c: xiic: make the clock optional Abdurrahman Hussain via B4 Relay
  1 sibling, 1 reply; 6+ messages in thread
From: Abdurrahman Hussain via B4 Relay @ 2026-01-22  8:32 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 | 60 +++++++++++++++++++------------------------
 1 file changed, 27 insertions(+), 33 deletions(-)

diff --git a/drivers/i2c/busses/i2c-xiic.c b/drivers/i2c/busses/i2c-xiic.c
index 28015d77599d..2ca736cbf688 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,28 +1417,25 @@ 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;
 	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);
-	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))
@@ -1450,26 +1445,26 @@ 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;
+	device_set_node(&i2c->adap.dev, dev_fwnode(dev));
 	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;
+	i2c->dev = dev;
 	pm_runtime_set_autosuspend_delay(i2c->dev, XIIC_PM_TIMEOUT);
 	pm_runtime_use_autosuspend(i2c->dev);
 	pm_runtime_set_active(i2c->dev);
@@ -1477,23 +1472,21 @@ 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(pdev->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;
 
-	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");
+	i2c->singlemaster = device_property_read_bool(dev, "single-master");
 
 	/*
 	 * Detect endianness
@@ -1509,7 +1502,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;
 	}
 
@@ -1532,8 +1525,8 @@ static int xiic_i2c_probe(struct platform_device *pdev)
 	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;
 }
@@ -1541,23 +1534,24 @@ static int xiic_i2c_probe(struct platform_device *pdev)
 static void xiic_i2c_remove(struct platform_device *pdev)
 {
 	struct xiic_i2c *i2c = platform_get_drvdata(pdev);
+	struct device *dev = &pdev->dev;
 	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] 6+ messages in thread

* [PATCH v2 2/2] i2c: xiic: make the clock optional
  2026-01-22  8:32 [PATCH v2 0/2] i2c: xiic: use generic device property accessors Abdurrahman Hussain via B4 Relay
  2026-01-22  8:32 ` [PATCH v2 1/2] i2c: xiic: switch to " Abdurrahman Hussain via B4 Relay
@ 2026-01-22  8:32 ` Abdurrahman Hussain via B4 Relay
  2026-01-22  9:01   ` Andy Shevchenko
  1 sibling, 1 reply; 6+ messages in thread
From: Abdurrahman Hussain via B4 Relay @ 2026-01-22  8:32 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 2ca736cbf688..3d86b2077d6b 100644
--- a/drivers/i2c/busses/i2c-xiic.c
+++ b/drivers/i2c/busses/i2c-xiic.c
@@ -1459,7 +1459,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] 6+ messages in thread

* Re: [PATCH v2 1/2] i2c: xiic: switch to generic device property accessors
  2026-01-22  8:32 ` [PATCH v2 1/2] i2c: xiic: switch to " Abdurrahman Hussain via B4 Relay
@ 2026-01-22  8:59   ` Andy Shevchenko
  2026-01-22  9:03     ` Andy Shevchenko
  0 siblings, 1 reply; 6+ messages in thread
From: Andy Shevchenko @ 2026-01-22  8:59 UTC (permalink / raw)
  To: abdurrahman
  Cc: Michal Simek, Andi Shyti, linux-arm-kernel, linux-i2c,
	linux-kernel

On Thu, Jan 22, 2026 at 08:32:31AM +0000, Abdurrahman Hussain via B4 Relay wrote:

> Use generic device property accessors.

...

> -	i2c = devm_kzalloc(&pdev->dev, sizeof(*i2c), GFP_KERNEL);
> +	i2c = devm_kzalloc(dev, sizeof(*i2c), GFP_KERNEL);
>  	if (!i2c)
>  		return -ENOMEM;

This type of changes should go in a separate patch after this one.

...

>  	mutex_init(&i2c->lock);

Please, consider also switching this (in yet another separate patch) to
devm_mutex_init().

...

> -	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;

Before doing it, just kill the message, it is a dup since devm_request_*irq*()
already prints the similar one on the error cases.

>  	}

...

So, this patch should be transformed to three
- removing a dup message
- converting to device propries
- utilising the temporary 'dev' variable elsewhere

-- 
With Best Regards,
Andy Shevchenko




^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2 2/2] i2c: xiic: make the clock optional
  2026-01-22  8:32 ` [PATCH v2 2/2] i2c: xiic: make the clock optional Abdurrahman Hussain via B4 Relay
@ 2026-01-22  9:01   ` Andy Shevchenko
  0 siblings, 0 replies; 6+ messages in thread
From: Andy Shevchenko @ 2026-01-22  9:01 UTC (permalink / raw)
  To: abdurrahman
  Cc: Michal Simek, Andi Shyti, linux-arm-kernel, linux-i2c,
	linux-kernel

On Thu, Jan 22, 2026 at 08:32:32AM +0000, Abdurrahman Hussain via B4 Relay wrote:

> 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.

Hmm... Sounds to me like a fix to the early introduced feature.
Might worth to add Fixes tag and make this to be the first patch in the series.

Either way, LGTM,
Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com>

-- 
With Best Regards,
Andy Shevchenko




^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2 1/2] i2c: xiic: switch to generic device property accessors
  2026-01-22  8:59   ` Andy Shevchenko
@ 2026-01-22  9:03     ` Andy Shevchenko
  0 siblings, 0 replies; 6+ messages in thread
From: Andy Shevchenko @ 2026-01-22  9:03 UTC (permalink / raw)
  To: abdurrahman
  Cc: Michal Simek, Andi Shyti, linux-arm-kernel, linux-i2c,
	linux-kernel

On Thu, Jan 22, 2026 at 11:00:01AM +0200, Andy Shevchenko wrote:
> On Thu, Jan 22, 2026 at 08:32:31AM +0000, Abdurrahman Hussain via B4 Relay wrote:

...

> > -	i2c = devm_kzalloc(&pdev->dev, sizeof(*i2c), GFP_KERNEL);
> > +	i2c = devm_kzalloc(dev, sizeof(*i2c), GFP_KERNEL);
> >  	if (!i2c)
> >  		return -ENOMEM;
> 
> This type of changes should go in a separate patch after this one.

...

> >  	mutex_init(&i2c->lock);
> 
> Please, consider also switching this (in yet another separate patch) to
> devm_mutex_init().

...

> > -	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;
> 
> Before doing it, just kill the message, it is a dup since devm_request_*irq*()
> already prints the similar one on the error cases.
> 
> >  	}

...

> So, this patch should be transformed to three

Ah, to four!

(in the following order)

- convert to devm_mutex_init()

> - removing a dup message
> - converting to device propries
> - utilising the temporary 'dev' variable elsewhere

-- 
With Best Regards,
Andy Shevchenko




^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2026-01-22  9:04 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-01-22  8:32 [PATCH v2 0/2] i2c: xiic: use generic device property accessors Abdurrahman Hussain via B4 Relay
2026-01-22  8:32 ` [PATCH v2 1/2] i2c: xiic: switch to " Abdurrahman Hussain via B4 Relay
2026-01-22  8:59   ` Andy Shevchenko
2026-01-22  9:03     ` Andy Shevchenko
2026-01-22  8:32 ` [PATCH v2 2/2] i2c: xiic: make the clock optional Abdurrahman Hussain via B4 Relay
2026-01-22  9:01   ` Andy Shevchenko

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox