Skip to contentSkip to conversation

i2c: let the core register devices from devicetree

PATCH New Wolfram Sang 10 participants 12 messages Jun 13, 2012 – Jun 21, 2012

Subsystems (20)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 i2c: let the core register devices from devicetree

Currently, every driver has to do it on its own, but it should be done in the core, like we already do with board_info structs.

---

Based on v3.5-rc2. Only build tested, I don't have a OF based device around at the moment.

@Peter: Why does ocores do the device registration manually via platform_data instead of using board_info?

 drivers/i2c/busses/i2c-cpm.c                |    5 -----
 drivers/i2c/busses/i2c-designware-platdrv.c |    1 -
 drivers/i2c/busses/i2c-gpio.c               |    2 --
 drivers/i2c/busses/i2c-ibm_iic.c            |    3 ---
 drivers/i2c/busses/i2c-imx.c                |    2 --
 drivers/i2c/busses/i2c-mpc.c                |    1 -
 drivers/i2c/busses/i2c-mxs.c                |    2 --
 drivers/i2c/busses/i2c-ocores.c             |    2 --
 drivers/i2c/busses/i2c-omap.c               |    2 --
 drivers/i2c/busses/i2c-pnx.c                |    2 --
 drivers/i2c/busses/i2c-pxa.c                |    1 -
 drivers/i2c/busses/i2c-s3c2410.c            |    1 -
 drivers/i2c/busses/i2c-sh_mobile.c          |    1 -
 drivers/i2c/busses/i2c-tegra.c              |    2 --
 drivers/i2c/busses/i2c-versatile.c          |    1 -
 drivers/i2c/busses/i2c-xiic.c               |    2 --
 drivers/i2c/i2c-core.c                      |    3 +++
 17 files changed, 3 insertions(+), 30 deletions(-)
drivers/i2c/busses/i2c-cpm.c +0 -5
index c1e1096..749e63c 100644
@@ -673,11 +673,6 @@ static int __devinit cpm_i2c_probe(struct platform_device *ofdev)
 	dev_dbg(&ofdev->dev, "hw routines for %s registered.\n",
 		cpm->adap.name);
 
-	/*
-	 * register OF I2C devices
-	 */
-	of_i2c_register_devices(&cpm->adap);
-
 	return 0;
 out_shut:
 	cpm_i2c_shutdown(cpm);
drivers/i2c/busses/i2c-designware-platdrv.c +0 -1
index 0506fef..cf3b23c 100644
@@ -147,7 +147,6 @@ static int __devinit dw_i2c_probe(struct platform_device *pdev)
 		dev_err(&pdev->dev, "failure adding adapter\n");
 		goto err_free_irq;
 	}
-	of_i2c_register_devices(adap);
 
 	return 0;
 
drivers/i2c/busses/i2c-gpio.c +0 -2
index e62d2d9..75e26b9 100644
@@ -195,8 +195,6 @@ static int __devinit i2c_gpio_probe(struct platform_device *pdev)
 	if (ret)
 		goto err_add_bus;
 
-	of_i2c_register_devices(adap);
-
 	platform_set_drvdata(pdev, priv);
 
 	dev_info(&pdev->dev, "using pins %u (SDA) and %u (SCL%s)\n",
drivers/i2c/busses/i2c-ibm_iic.c +0 -3
index 806e225..8894ab6 100644
@@ -759,9 +759,6 @@ static int __devinit iic_probe(struct platform_device *ofdev)
 	dev_info(&ofdev->dev, "using %s mode\n",
 		 dev->fast_mode ? "fast (400 kHz)" : "standard (100 kHz)");
 
-	/* Now register all the child nodes */
-	of_i2c_register_devices(adap);
-
 	return 0;
 
 error_cleanup:
drivers/i2c/busses/i2c-imx.c +0 -2
index 8d6b504..16d9356 100644
@@ -568,8 +568,6 @@ static int __init i2c_imx_probe(struct platform_device *pdev)
 		goto fail5;
 	}
 
-	of_i2c_register_devices(&i2c_imx->adapter);
-
 	/* Set up platform driver data */
 	platform_set_drvdata(pdev, i2c_imx);
 
drivers/i2c/busses/i2c-mpc.c +0 -1
index b76731e..a86049a 100644
@@ -675,7 +675,6 @@ static int __devinit fsl_i2c_probe(struct platform_device *op)
 		dev_err(i2c->dev, "failed to add adapter\n");
 		goto fail_add;
 	}
-	of_i2c_register_devices(&i2c->adap);
 
 	return result;
 
drivers/i2c/busses/i2c-mxs.c +0 -2
index 04eb441..2bc0ec6 100644
@@ -379,8 +379,6 @@ static int __devinit mxs_i2c_probe(struct platform_device *pdev)
 		return err;
 	}
 
-	of_i2c_register_devices(adap);
-
 	return 0;
 }
 
drivers/i2c/busses/i2c-ocores.c +0 -2
index 75194c5..a6a11cb 100644
@@ -344,8 +344,6 @@ static int __devinit ocores_i2c_probe(struct platform_device *pdev)
 	if (pdata) {
 		for (i = 0; i < pdata->num_devices; i++)
 			i2c_new_device(&i2c->adap, pdata->devices + i);
-	} else {
-		of_i2c_register_devices(&i2c->adap);
 	}
 
 	return 0;
drivers/i2c/busses/i2c-omap.c +0 -2
index 801df60..c290091 100644
@@ -1121,8 +1121,6 @@ omap_i2c_probe(struct platform_device *pdev)
 		goto err_free_irq;
 	}
 
-	of_i2c_register_devices(adap);
-
 	return 0;
 
 err_free_irq:
drivers/i2c/busses/i2c-pnx.c +0 -2
index 99389d2..c64d960 100644
@@ -730,8 +730,6 @@ static int __devinit i2c_pnx_probe(struct platform_device *pdev)
 		goto out_irq;
 	}
 
-	of_i2c_register_devices(&alg_data->adapter);
-
 	dev_dbg(&pdev->dev, "%s: Master at %#8x, irq %d.\n",
 		alg_data->adapter.name, res->start, alg_data->irq);
 
drivers/i2c/busses/i2c-pxa.c +0 -1
index a997c7d..9475235 100644
@@ -1194,7 +1194,6 @@ static int i2c_pxa_probe(struct platform_device *dev)
 		printk(KERN_INFO "I2C: Failed to add bus\n");
 		goto eadapt;
 	}
-	of_i2c_register_devices(&i2c->adap);
 
 	platform_set_drvdata(dev, i2c);
 
drivers/i2c/busses/i2c-s3c2410.c +0 -1
index 0195915..ad3a79b 100644
@@ -1058,7 +1058,6 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev)
 		goto err_cpufreq;
 	}
 
-	of_i2c_register_devices(&i2c->adap);
 	platform_set_drvdata(pdev, i2c);
 
 	pm_runtime_enable(&pdev->dev);
drivers/i2c/busses/i2c-sh_mobile.c +0 -1
index 8110ca4..9acd286 100644
@@ -670,7 +670,6 @@ static int sh_mobile_i2c_probe(struct platform_device *dev)
 	dev_info(&dev->dev, "I2C adapter %d with bus speed %lu Hz\n",
 		 adap->nr, pd->bus_speed);
 
-	of_i2c_register_devices(adap);
 	return 0;
 
  err_all:
drivers/i2c/busses/i2c-tegra.c +0 -2
index 8b2e555..67388cc 100644
@@ -684,8 +684,6 @@ static int __devinit tegra_i2c_probe(struct platform_device *pdev)
 		goto err_free_irq;
 	}
 
-	of_i2c_register_devices(&i2c_dev->adapter);
-
 	return 0;
 err_free_irq:
 	free_irq(i2c_dev->irq, i2c_dev);
drivers/i2c/busses/i2c-versatile.c +0 -1
index eec20db..14a1432 100644
@@ -108,7 +108,6 @@ static int i2c_versatile_probe(struct platform_device *dev)
 	ret = i2c_bit_add_numbered_bus(&i2c->adap);
 	if (ret >= 0) {
 		platform_set_drvdata(dev, i2c);
-		of_i2c_register_devices(&i2c->adap);
 		return 0;
 	}
 
drivers/i2c/busses/i2c-xiic.c +0 -2
index 641d0e5..d76bb71 100644
@@ -754,8 +754,6 @@ static int __devinit xiic_i2c_probe(struct platform_device *pdev)
 			i2c_new_device(&i2c->adap, pdata->devices + i);
 	}
 
-	of_i2c_register_devices(&i2c->adap);
-
 	return 0;
 
 add_adapter_failed:
drivers/i2c/i2c-core.c +3 -0
index a6ad32b..4791833 100644
@@ -39,6 +39,7 @@
 #include <linux/irqflags.h>
 #include <linux/rwsem.h>
 #include <linux/pm_runtime.h>
+#include <linux/of_i2c.h>
 #include <asm/uaccess.h>
 
 #include "i2c-core.h"
@@ -880,6 +881,8 @@ static int i2c_register_adapter(struct i2c_adapter *adap)
 #endif
 
 	/* create pre-declared device nodes */
+	of_i2c_register_devices(adap);
+
 	if (adap->nr < __i2c_first_dynamic_bus_num)
 		i2c_scan_static_board_info(adap);
 
Signature · 1 line
1.7.10
#1 lore raw

PATCH 1/1 i2c: let the core register devices from devicetree

Quoted 8 lines · Wolfram Sang

Currently, every driver has to do it on its own, but it should be done in the core, like we already do with board_info structs.

---

Based on v3.5-rc2. Only build tested, I don't have a OF based device around at the moment.

Won't that conflict with i2c-powermac doing it its own way ?

Cheers,
Ben.

Quoted 249 lines

@Peter: Why does ocores do the device registration manually via platform_data instead of using board_info?

 drivers/i2c/busses/i2c-cpm.c                |    5 -----
 drivers/i2c/busses/i2c-designware-platdrv.c |    1 -
 drivers/i2c/busses/i2c-gpio.c               |    2 --
 drivers/i2c/busses/i2c-ibm_iic.c            |    3 ---
 drivers/i2c/busses/i2c-imx.c                |    2 --
 drivers/i2c/busses/i2c-mpc.c                |    1 -
 drivers/i2c/busses/i2c-mxs.c                |    2 --
 drivers/i2c/busses/i2c-ocores.c             |    2 --
 drivers/i2c/busses/i2c-omap.c               |    2 --
 drivers/i2c/busses/i2c-pnx.c                |    2 --
 drivers/i2c/busses/i2c-pxa.c                |    1 -
 drivers/i2c/busses/i2c-s3c2410.c            |    1 -
 drivers/i2c/busses/i2c-sh_mobile.c          |    1 -
 drivers/i2c/busses/i2c-tegra.c              |    2 --
 drivers/i2c/busses/i2c-versatile.c          |    1 -
 drivers/i2c/busses/i2c-xiic.c               |    2 --
 drivers/i2c/i2c-core.c                      |    3 +++
 17 files changed, 3 insertions(+), 30 deletions(-)
drivers/i2c/busses/i2c-cpm.c +0 -5
index c1e1096..749e63c 100644
@@ -673,11 +673,6 @@ static int __devinit cpm_i2c_probe(struct platform_device *ofdev)
 	dev_dbg(&ofdev->dev, "hw routines for %s registered.\n",
 		cpm->adap.name);
 
-	/*
-	 * register OF I2C devices
-	 */
-	of_i2c_register_devices(&cpm->adap);
-
 	return 0;
 out_shut:
 	cpm_i2c_shutdown(cpm);
drivers/i2c/busses/i2c-designware-platdrv.c +0 -1
index 0506fef..cf3b23c 100644
@@ -147,7 +147,6 @@ static int __devinit dw_i2c_probe(struct platform_device *pdev)
 		dev_err(&pdev->dev, "failure adding adapter\n");
 		goto err_free_irq;
 	}
-	of_i2c_register_devices(adap);
 
 	return 0;
 
drivers/i2c/busses/i2c-gpio.c +0 -2
index e62d2d9..75e26b9 100644
@@ -195,8 +195,6 @@ static int __devinit i2c_gpio_probe(struct platform_device *pdev)
 	if (ret)
 		goto err_add_bus;
 
-	of_i2c_register_devices(adap);
-
 	platform_set_drvdata(pdev, priv);
 
 	dev_info(&pdev->dev, "using pins %u (SDA) and %u (SCL%s)\n",
drivers/i2c/busses/i2c-ibm_iic.c +0 -3
index 806e225..8894ab6 100644
@@ -759,9 +759,6 @@ static int __devinit iic_probe(struct platform_device *ofdev)
 	dev_info(&ofdev->dev, "using %s mode\n",
 		 dev->fast_mode ? "fast (400 kHz)" : "standard (100 kHz)");
 
-	/* Now register all the child nodes */
-	of_i2c_register_devices(adap);
-
 	return 0;
 
 error_cleanup:
drivers/i2c/busses/i2c-imx.c +0 -2
index 8d6b504..16d9356 100644
@@ -568,8 +568,6 @@ static int __init i2c_imx_probe(struct platform_device *pdev)
 		goto fail5;
 	}
 
-	of_i2c_register_devices(&i2c_imx->adapter);
-
 	/* Set up platform driver data */
 	platform_set_drvdata(pdev, i2c_imx);
 
drivers/i2c/busses/i2c-mpc.c +0 -1
index b76731e..a86049a 100644
@@ -675,7 +675,6 @@ static int __devinit fsl_i2c_probe(struct platform_device *op)
 		dev_err(i2c->dev, "failed to add adapter\n");
 		goto fail_add;
 	}
-	of_i2c_register_devices(&i2c->adap);
 
 	return result;
 
drivers/i2c/busses/i2c-mxs.c +0 -2
index 04eb441..2bc0ec6 100644
@@ -379,8 +379,6 @@ static int __devinit mxs_i2c_probe(struct platform_device *pdev)
 		return err;
 	}
 
-	of_i2c_register_devices(adap);
-
 	return 0;
 }
 
drivers/i2c/busses/i2c-ocores.c +0 -2
index 75194c5..a6a11cb 100644
@@ -344,8 +344,6 @@ static int __devinit ocores_i2c_probe(struct platform_device *pdev)
 	if (pdata) {
 		for (i = 0; i < pdata->num_devices; i++)
 			i2c_new_device(&i2c->adap, pdata->devices + i);
-	} else {
-		of_i2c_register_devices(&i2c->adap);
 	}
 
 	return 0;
drivers/i2c/busses/i2c-omap.c +0 -2
index 801df60..c290091 100644
@@ -1121,8 +1121,6 @@ omap_i2c_probe(struct platform_device *pdev)
 		goto err_free_irq;
 	}
 
-	of_i2c_register_devices(adap);
-
 	return 0;
 
 err_free_irq:
drivers/i2c/busses/i2c-pnx.c +0 -2
index 99389d2..c64d960 100644
@@ -730,8 +730,6 @@ static int __devinit i2c_pnx_probe(struct platform_device *pdev)
 		goto out_irq;
 	}
 
-	of_i2c_register_devices(&alg_data->adapter);
-
 	dev_dbg(&pdev->dev, "%s: Master at %#8x, irq %d.\n",
 		alg_data->adapter.name, res->start, alg_data->irq);
 
drivers/i2c/busses/i2c-pxa.c +0 -1
index a997c7d..9475235 100644
@@ -1194,7 +1194,6 @@ static int i2c_pxa_probe(struct platform_device *dev)
 		printk(KERN_INFO "I2C: Failed to add bus\n");
 		goto eadapt;
 	}
-	of_i2c_register_devices(&i2c->adap);
 
 	platform_set_drvdata(dev, i2c);
 
drivers/i2c/busses/i2c-s3c2410.c +0 -1
index 0195915..ad3a79b 100644
@@ -1058,7 +1058,6 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev)
 		goto err_cpufreq;
 	}
 
-	of_i2c_register_devices(&i2c->adap);
 	platform_set_drvdata(pdev, i2c);
 
 	pm_runtime_enable(&pdev->dev);
drivers/i2c/busses/i2c-sh_mobile.c +0 -1
index 8110ca4..9acd286 100644
@@ -670,7 +670,6 @@ static int sh_mobile_i2c_probe(struct platform_device *dev)
 	dev_info(&dev->dev, "I2C adapter %d with bus speed %lu Hz\n",
 		 adap->nr, pd->bus_speed);
 
-	of_i2c_register_devices(adap);
 	return 0;
 
  err_all:
drivers/i2c/busses/i2c-tegra.c +0 -2
index 8b2e555..67388cc 100644
@@ -684,8 +684,6 @@ static int __devinit tegra_i2c_probe(struct platform_device *pdev)
 		goto err_free_irq;
 	}
 
-	of_i2c_register_devices(&i2c_dev->adapter);
-
 	return 0;
 err_free_irq:
 	free_irq(i2c_dev->irq, i2c_dev);
drivers/i2c/busses/i2c-versatile.c +0 -1
index eec20db..14a1432 100644
@@ -108,7 +108,6 @@ static int i2c_versatile_probe(struct platform_device *dev)
 	ret = i2c_bit_add_numbered_bus(&i2c->adap);
 	if (ret >= 0) {
 		platform_set_drvdata(dev, i2c);
-		of_i2c_register_devices(&i2c->adap);
 		return 0;
 	}
 
drivers/i2c/busses/i2c-xiic.c +0 -2
index 641d0e5..d76bb71 100644
@@ -754,8 +754,6 @@ static int __devinit xiic_i2c_probe(struct platform_device *pdev)
 			i2c_new_device(&i2c->adap, pdata->devices + i);
 	}
 
-	of_i2c_register_devices(&i2c->adap);
-
 	return 0;
 
 add_adapter_failed:
drivers/i2c/i2c-core.c +3 -0
index a6ad32b..4791833 100644
@@ -39,6 +39,7 @@
 #include <linux/irqflags.h>
 #include <linux/rwsem.h>
 #include <linux/pm_runtime.h>
+#include <linux/of_i2c.h>
 #include <asm/uaccess.h>
 
 #include "i2c-core.h"
@@ -880,6 +881,8 @@ static int i2c_register_adapter(struct i2c_adapter *adap)
 #endif
 
 	/* create pre-declared device nodes */
+	of_i2c_register_devices(adap);
+
 	if (adap->nr < __i2c_first_dynamic_bus_num)
 		i2c_scan_static_board_info(adap);
 
#2 lore raw

PATCH 1/1 i2c: let the core register devices from devicetree

Quoted 11 lines · Benjamin Herrenschmidt
Quoted 8 lines · Wolfram Sang

Currently, every driver has to do it on its own, but it should be done in the core, like we already do with board_info structs.

---

Based on v3.5-rc2. Only build tested, I don't have a OF based device around at the moment.

Won't that conflict with i2c-powermac doing it its own way ?

Yup :(

I assume there is no chance that the powermac devicetree can be pre-processed to be compatible with of_i2c_register_devices?

Regards,

Wolfram

Signature · 9 lines
Pengutronix e.K.                           | Wolfram Sang                |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20120614/3bc4eeb9/attachment.sig>
#3 lore raw

PATCH 1/1 i2c: let the core register devices from devicetree

Quoted 11 lines · Wolfram Sang
Quoted 10 lines · Benjamin Herrenschmidt
Quoted 8 lines · Wolfram Sang

Currently, every driver has to do it on its own, but it should be done in the core, like we already do with board_info structs.

---

Based on v3.5-rc2. Only build tested, I don't have a OF based device around at the moment.

Quoted 6 lines
Quoted 1 line

Won't that conflict with i2c-powermac doing it its own way ?

Yup :(

I assume there is no chance that the powermac devicetree can be pre-processed to be compatible with of_i2c_register_devices?

That would be nasty and need a lot of testing on all sort of machines I don't have direct access to.

Maybe we can set a flag somewhere to indicate to the core not to run the default probing on that controller ?

Cheers,
Ben.

#5 lore raw

PATCH 1/1 i2c: let the core register devices from devicetree

In reply to Wolfram Sang
Quoted 4 lines · Wolfram Sang

Currently, every driver has to do it on its own, but it should be done in the core, like we already do with board_info structs.

FWIW, and without any actual compiling or testing:

On this topic, I'd also like to see all of drivers/of/of_i2c.c move into drivers/i2c. I've done the same for spi and gpio and I think the result is cleaner.

g.

Quoted 257 lines

---

Based on v3.5-rc2. Only build tested, I don't have a OF based device around at the moment.

@Peter: Why does ocores do the device registration manually via platform_data instead of using board_info?

 drivers/i2c/busses/i2c-cpm.c                |    5 -----
 drivers/i2c/busses/i2c-designware-platdrv.c |    1 -
 drivers/i2c/busses/i2c-gpio.c               |    2 --
 drivers/i2c/busses/i2c-ibm_iic.c            |    3 ---
 drivers/i2c/busses/i2c-imx.c                |    2 --
 drivers/i2c/busses/i2c-mpc.c                |    1 -
 drivers/i2c/busses/i2c-mxs.c                |    2 --
 drivers/i2c/busses/i2c-ocores.c             |    2 --
 drivers/i2c/busses/i2c-omap.c               |    2 --
 drivers/i2c/busses/i2c-pnx.c                |    2 --
 drivers/i2c/busses/i2c-pxa.c                |    1 -
 drivers/i2c/busses/i2c-s3c2410.c            |    1 -
 drivers/i2c/busses/i2c-sh_mobile.c          |    1 -
 drivers/i2c/busses/i2c-tegra.c              |    2 --
 drivers/i2c/busses/i2c-versatile.c          |    1 -
 drivers/i2c/busses/i2c-xiic.c               |    2 --
 drivers/i2c/i2c-core.c                      |    3 +++
 17 files changed, 3 insertions(+), 30 deletions(-)
drivers/i2c/busses/i2c-cpm.c +0 -5
index c1e1096..749e63c 100644
@@ -673,11 +673,6 @@ static int __devinit cpm_i2c_probe(struct platform_device *ofdev)
 	dev_dbg(&ofdev->dev, "hw routines for %s registered.\n",
 		cpm->adap.name);
 
-	/*
-	 * register OF I2C devices
-	 */
-	of_i2c_register_devices(&cpm->adap);
-
 	return 0;
 out_shut:
 	cpm_i2c_shutdown(cpm);
drivers/i2c/busses/i2c-designware-platdrv.c +0 -1
index 0506fef..cf3b23c 100644
@@ -147,7 +147,6 @@ static int __devinit dw_i2c_probe(struct platform_device *pdev)
 		dev_err(&pdev->dev, "failure adding adapter\n");
 		goto err_free_irq;
 	}
-	of_i2c_register_devices(adap);
 
 	return 0;
 
drivers/i2c/busses/i2c-gpio.c +0 -2
index e62d2d9..75e26b9 100644
@@ -195,8 +195,6 @@ static int __devinit i2c_gpio_probe(struct platform_device *pdev)
 	if (ret)
 		goto err_add_bus;
 
-	of_i2c_register_devices(adap);
-
 	platform_set_drvdata(pdev, priv);
 
 	dev_info(&pdev->dev, "using pins %u (SDA) and %u (SCL%s)\n",
drivers/i2c/busses/i2c-ibm_iic.c +0 -3
index 806e225..8894ab6 100644
@@ -759,9 +759,6 @@ static int __devinit iic_probe(struct platform_device *ofdev)
 	dev_info(&ofdev->dev, "using %s mode\n",
 		 dev->fast_mode ? "fast (400 kHz)" : "standard (100 kHz)");
 
-	/* Now register all the child nodes */
-	of_i2c_register_devices(adap);
-
 	return 0;
 
 error_cleanup:
drivers/i2c/busses/i2c-imx.c +0 -2
index 8d6b504..16d9356 100644
@@ -568,8 +568,6 @@ static int __init i2c_imx_probe(struct platform_device *pdev)
 		goto fail5;
 	}
 
-	of_i2c_register_devices(&i2c_imx->adapter);
-
 	/* Set up platform driver data */
 	platform_set_drvdata(pdev, i2c_imx);
 
drivers/i2c/busses/i2c-mpc.c +0 -1
index b76731e..a86049a 100644
@@ -675,7 +675,6 @@ static int __devinit fsl_i2c_probe(struct platform_device *op)
 		dev_err(i2c->dev, "failed to add adapter\n");
 		goto fail_add;
 	}
-	of_i2c_register_devices(&i2c->adap);
 
 	return result;
 
drivers/i2c/busses/i2c-mxs.c +0 -2
index 04eb441..2bc0ec6 100644
@@ -379,8 +379,6 @@ static int __devinit mxs_i2c_probe(struct platform_device *pdev)
 		return err;
 	}
 
-	of_i2c_register_devices(adap);
-
 	return 0;
 }
 
drivers/i2c/busses/i2c-ocores.c +0 -2
index 75194c5..a6a11cb 100644
@@ -344,8 +344,6 @@ static int __devinit ocores_i2c_probe(struct platform_device *pdev)
 	if (pdata) {
 		for (i = 0; i < pdata->num_devices; i++)
 			i2c_new_device(&i2c->adap, pdata->devices + i);
-	} else {
-		of_i2c_register_devices(&i2c->adap);
 	}
 
 	return 0;
drivers/i2c/busses/i2c-omap.c +0 -2
index 801df60..c290091 100644
@@ -1121,8 +1121,6 @@ omap_i2c_probe(struct platform_device *pdev)
 		goto err_free_irq;
 	}
 
-	of_i2c_register_devices(adap);
-
 	return 0;
 
 err_free_irq:
drivers/i2c/busses/i2c-pnx.c +0 -2
index 99389d2..c64d960 100644
@@ -730,8 +730,6 @@ static int __devinit i2c_pnx_probe(struct platform_device *pdev)
 		goto out_irq;
 	}
 
-	of_i2c_register_devices(&alg_data->adapter);
-
 	dev_dbg(&pdev->dev, "%s: Master at %#8x, irq %d.\n",
 		alg_data->adapter.name, res->start, alg_data->irq);
 
drivers/i2c/busses/i2c-pxa.c +0 -1
index a997c7d..9475235 100644
@@ -1194,7 +1194,6 @@ static int i2c_pxa_probe(struct platform_device *dev)
 		printk(KERN_INFO "I2C: Failed to add bus\n");
 		goto eadapt;
 	}
-	of_i2c_register_devices(&i2c->adap);
 
 	platform_set_drvdata(dev, i2c);
 
drivers/i2c/busses/i2c-s3c2410.c +0 -1
index 0195915..ad3a79b 100644
@@ -1058,7 +1058,6 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev)
 		goto err_cpufreq;
 	}
 
-	of_i2c_register_devices(&i2c->adap);
 	platform_set_drvdata(pdev, i2c);
 
 	pm_runtime_enable(&pdev->dev);
drivers/i2c/busses/i2c-sh_mobile.c +0 -1
index 8110ca4..9acd286 100644
@@ -670,7 +670,6 @@ static int sh_mobile_i2c_probe(struct platform_device *dev)
 	dev_info(&dev->dev, "I2C adapter %d with bus speed %lu Hz\n",
 		 adap->nr, pd->bus_speed);
 
-	of_i2c_register_devices(adap);
 	return 0;
 
  err_all:
drivers/i2c/busses/i2c-tegra.c +0 -2
index 8b2e555..67388cc 100644
@@ -684,8 +684,6 @@ static int __devinit tegra_i2c_probe(struct platform_device *pdev)
 		goto err_free_irq;
 	}
 
-	of_i2c_register_devices(&i2c_dev->adapter);
-
 	return 0;
 err_free_irq:
 	free_irq(i2c_dev->irq, i2c_dev);
drivers/i2c/busses/i2c-versatile.c +0 -1
index eec20db..14a1432 100644
@@ -108,7 +108,6 @@ static int i2c_versatile_probe(struct platform_device *dev)
 	ret = i2c_bit_add_numbered_bus(&i2c->adap);
 	if (ret >= 0) {
 		platform_set_drvdata(dev, i2c);
-		of_i2c_register_devices(&i2c->adap);
 		return 0;
 	}
 
drivers/i2c/busses/i2c-xiic.c +0 -2
index 641d0e5..d76bb71 100644
@@ -754,8 +754,6 @@ static int __devinit xiic_i2c_probe(struct platform_device *pdev)
 			i2c_new_device(&i2c->adap, pdata->devices + i);
 	}
 
-	of_i2c_register_devices(&i2c->adap);
-
 	return 0;
 
 add_adapter_failed:
drivers/i2c/i2c-core.c +3 -0
index a6ad32b..4791833 100644
@@ -39,6 +39,7 @@
 #include <linux/irqflags.h>
 #include <linux/rwsem.h>
 #include <linux/pm_runtime.h>
+#include <linux/of_i2c.h>
 #include <asm/uaccess.h>
 
 #include "i2c-core.h"
@@ -880,6 +881,8 @@ static int i2c_register_adapter(struct i2c_adapter *adap)
 #endif
 
 	/* create pre-declared device nodes */
+	of_i2c_register_devices(adap);
+
 	if (adap->nr < __i2c_first_dynamic_bus_num)
 		i2c_scan_static_board_info(adap);
 
Signature · 1 line
1.7.10
Signature · 2 lines
Grant Likely, B.Sc, P.Eng.
Secret Lab Technologies, Ltd.
#6 lore raw

PATCH 1/1 i2c: let the core register devices from devicetree

In reply to Wolfram Sang
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line

"Wolfram" == Wolfram Sang <[email protected]> writes:

Wolfram> Currently, every driver has to do it on its own, but it should Wolfram> be done in the core, like we already do with board_info Wolfram> structs.

Wolfram> Signed-off-by: Wolfram Sang <[email protected]> Wolfram> ---

Wolfram> Based on v3.5-rc2. Only build tested, I don't have a OF based device Wolfram> around at the moment.

Neither have I, but it looks good.

Wolfram> @Peter: Why does ocores do the device registration manually via Wolfram> platform_data instead of using board_info?

Because of dd14be4c274 (i2c-ocores: Can add I2C devices to the bus), a patch I wasn't CC'ed on and haven't acked. I only noticed it later when the I2C tree got merged into mainline.

Signature · 1 line
Bye, Peter Korsgaard
#7 lore raw

PATCH 1/1 i2c: let the core register devices from devicetree

In reply to Wolfram Sang
Quoted 12 lines · Wolfram Sang

Currently, every driver has to do it on its own, but it should be done in the core, like we already do with board_info structs.

---

drivers/i2c/busses/i2c-designware-platdrv.c +0 -0
index 0506fef..cf3b23c 100644

drivers/i2c/busses/i2c-designware-platdrv.c static int __devinit dw_i2c_probe(struct platform_device *pdev) · line 151

Quoted 6 lines
drivers/i2c/busses/i2c-designware-platdrv.c +0 -1
@@ -147,7 +147,6 @@ static int __devinit dw_i2c_probe(struct platform_device *pdev)
 ? ? ? ? ? ? ? ?dev_err(&pdev->dev, "failure adding adapter\n");
 ? ? ? ? ? ? ? ?goto err_free_irq;
 ? ? ? ?}
- ? ? ? of_i2c_register_devices(adap);
 
 ? ? ? ?return 0;

For SPEAr,

#8 lore raw

PATCH 1/1 i2c: let the core register devices from devicetree

In reply to Wolfram Sang
Quoted 7 lines · Wolfram Sang

Currently, every driver has to do it on its own, but it should be done in the core, like we already do with board_info structs.

---
 drivers/i2c/busses/i2c-versatile.c          |    1 -
 drivers/i2c/i2c-core.c                      |    3 +++

For what it's worth

on Versatile Express.

Regards

Pawe?

#9 lore raw

PATCH 1/1 i2c: let the core register devices from devicetree

In reply to Wolfram Sang

Hi Wolfram,

Quoted 22 lines · Wolfram Sang

Currently, every driver has to do it on its own, but it should be done in the core, like we already do with board_info structs.

---

Based on v3.5-rc2. Only build tested, I don't have a OF based device around at the moment.
(...)

drivers/i2c/i2c-core.c +1 -0
index a6ad32b..4791833 100644
@@ -39,6 +39,7 @@
 #include <linux/irqflags.h>
 #include <linux/rwsem.h>
 #include <linux/pm_runtime.h>
+#include <linux/of_i2c.h>
 #include <asm/uaccess.h>
 
 #include "i2c-core.h"

drivers/i2c/i2c-core.c static int i2c_register_adapter(struct i2c_adapter *adap) · line 888

Quoted 8 lines
drivers/i2c/i2c-core.c +2 -0
@@ -880,6 +881,8 @@ static int i2c_register_adapter(struct i2c_adapter *adap)
 #endif
 
 	/* create pre-declared device nodes */
+	of_i2c_register_devices(adap);
+
 	if (adap->nr < __i2c_first_dynamic_bus_num)
 		i2c_scan_static_board_info(adap);
 

This was proposed in the past, and rejected because of dependency issues. I don't think the situation changed. of_i2c needs i2c-core for i2c_new_device(), and with the change above, i2c-core needs of_i2c for of_i2c_register_devices(). If either is built as a module, it will fail.

This might be the reason why of_spi ended up being merged into drivers/spi according to Grant? I have no objection to the same being done for of_i2c if it makes everybody happy, as long as it does not create additional dependencies (i.e. I2C should not depend on OF.)

Signature · 1 line
Jean Delvare
#10 lore raw

PATCH 1/1 i2c: let the core register devices from devicetree

In reply to Wolfram Sang
Quoted 4 lines · Wolfram Sang

Currently, every driver has to do it on its own, but it should be done in the core, like we already do with board_info structs.

Lee might be able to test this with his DT bindings (and patch them to use the new handling in the core..)

Yours,
Linus Walleij

#11 lore raw

PATCH 1/1 i2c: let the core register devices from devicetree

In reply to Wolfram Sang

2012/6/14 Wolfram Sang <[email protected]>:

Quoted 4 lines

Currently, every driver has to do it on its own, but it should be done in the core, like we already do with board_info structs.

Quoted 25 lines

---

Based on v3.5-rc2. Only build tested, I don't have a OF based device around at the moment.

@Peter: Why does ocores do the device registration manually via platform_data instead of using board_info?

?drivers/i2c/busses/i2c-cpm.c ? ? ? ? ? ? ? ?| ? ?5 -----
?drivers/i2c/busses/i2c-designware-platdrv.c | ? ?1 -
?drivers/i2c/busses/i2c-gpio.c ? ? ? ? ? ? ? | ? ?2 --
?drivers/i2c/busses/i2c-ibm_iic.c ? ? ? ? ? ?| ? ?3 ---
?drivers/i2c/busses/i2c-imx.c ? ? ? ? ? ? ? ?| ? ?2 --
?drivers/i2c/busses/i2c-mpc.c ? ? ? ? ? ? ? ?| ? ?1 -
?drivers/i2c/busses/i2c-mxs.c ? ? ? ? ? ? ? ?| ? ?2 --
?drivers/i2c/busses/i2c-ocores.c ? ? ? ? ? ? | ? ?2 --
?drivers/i2c/busses/i2c-omap.c ? ? ? ? ? ? ? | ? ?2 --
?drivers/i2c/busses/i2c-pnx.c ? ? ? ? ? ? ? ?| ? ?2 --
?drivers/i2c/busses/i2c-pxa.c ? ? ? ? ? ? ? ?| ? ?1 -
?drivers/i2c/busses/i2c-s3c2410.c ? ? ? ? ? ?| ? ?1 -
?drivers/i2c/busses/i2c-sh_mobile.c ? ? ? ? ?| ? ?1 -
?drivers/i2c/busses/i2c-tegra.c ? ? ? ? ? ? ?| ? ?2 --
?drivers/i2c/busses/i2c-versatile.c ? ? ? ? ?| ? ?1 -
?drivers/i2c/busses/i2c-xiic.c ? ? ? ? ? ? ? | ? ?2 --
?drivers/i2c/i2c-core.c ? ? ? ? ? ? ? ? ? ? ?| ? ?3 +++
Quoted 1 line

?17 files changed, 3 insertions(+), 30 deletions(-)

-barry