* [PATCH 0/2] Rework OF i2c support code
@ 2010-06-10 5:22 Grant Likely
2010-06-10 5:22 ` [PATCH 1/2] of/i2c: Generalize OF support Grant Likely
2010-06-10 5:22 ` [PATCH 2/2] i2c: Add OF-style registration and binding Grant Likely
0 siblings, 2 replies; 5+ messages in thread
From: Grant Likely @ 2010-06-10 5:22 UTC (permalink / raw)
Cc: linux-kernel-u79uwXL29TY76Z2rM5mHXA,
jeremy.kerr-Z7WLFzj8eWMS+FvcfC7Uqw,
devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ,
ben-linux-elnMNo+KYs3YtjvyW6yDsg,
linux-i2c-u79uwXL29TY76Z2rM5mHXA
The following series reworks the of_i2c support code so that i2c drivers
can be matched to devices using the struct device_driver of_match table,
and so that i2c devices described in a device tree node will be
transparently registered if the i2c adapter of_node pointer is set.
The OF hooks used in the second patch are entirely compiled out when
CONFIG_OF is not set.
---
Ben, these changes probably should go through my devicetree branch. They
are currently sitting in the following branch, and I'll move it over to
next-devicetree in a week or so if I don't receive any objections (it
can always come out again if there are, but I want the test coverage).
git://git.secretlab.ca/git/linux-2.6 test-devicetree
Grant Likely (2):
of/i2c: Generalize OF support
i2c: Add OF-style registration and binding
drivers/i2c/busses/i2c-cpm.c | 6 +----
drivers/i2c/busses/i2c-ibm_iic.c | 4 +--
drivers/i2c/busses/i2c-mpc.c | 2 +-
drivers/i2c/i2c-core.c | 9 ++++++++
drivers/of/Kconfig | 2 +-
drivers/of/of_i2c.c | 44 ++++++++++++++++++++++++--------------
include/linux/of_i2c.h | 13 +++++++++--
7 files changed, 51 insertions(+), 29 deletions(-)
^ permalink raw reply [flat|nested] 5+ messages in thread* [PATCH 1/2] of/i2c: Generalize OF support 2010-06-10 5:22 [PATCH 0/2] Rework OF i2c support code Grant Likely @ 2010-06-10 5:22 ` Grant Likely 2010-06-10 9:52 ` Wolfram Sang 2010-06-10 5:22 ` [PATCH 2/2] i2c: Add OF-style registration and binding Grant Likely 1 sibling, 1 reply; 5+ messages in thread From: Grant Likely @ 2010-06-10 5:22 UTC (permalink / raw) Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, jeremy.kerr-Z7WLFzj8eWMS+FvcfC7Uqw, linux-kernel-u79uwXL29TY76Z2rM5mHXA, ben-linux-elnMNo+KYs3YtjvyW6yDsg, linux-i2c-u79uwXL29TY76Z2rM5mHXA This patch cleans up the i2c OF support code to make it selectable by all architectures and allow for automatic registration of i2c devices. Signed-off-by: Grant Likely <grant.likely-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org> --- drivers/i2c/busses/i2c-cpm.c | 3 ++- drivers/i2c/busses/i2c-ibm_iic.c | 3 ++- drivers/i2c/busses/i2c-mpc.c | 3 ++- drivers/of/Kconfig | 2 +- drivers/of/of_i2c.c | 44 ++++++++++++++++++++++++-------------- include/linux/of_i2c.h | 13 +++++++++-- 6 files changed, 45 insertions(+), 23 deletions(-) diff --git a/drivers/i2c/busses/i2c-cpm.c b/drivers/i2c/busses/i2c-cpm.c index b02b453..03ae62e 100644 --- a/drivers/i2c/busses/i2c-cpm.c +++ b/drivers/i2c/busses/i2c-cpm.c @@ -652,6 +652,7 @@ static int __devinit cpm_i2c_probe(struct of_device *ofdev, cpm->adap = cpm_ops; i2c_set_adapdata(&cpm->adap, cpm); cpm->adap.dev.parent = &ofdev->dev; + cpm->adap.dev.of_node = of_node_get(ofdev->dev.of_node); result = cpm_i2c_setup(cpm); if (result) { @@ -679,7 +680,7 @@ static int __devinit cpm_i2c_probe(struct of_device *ofdev, /* * register OF I2C devices */ - of_register_i2c_devices(&cpm->adap, ofdev->dev.of_node); + of_i2c_register_devices(&cpm->adap); return 0; out_shut: diff --git a/drivers/i2c/busses/i2c-ibm_iic.c b/drivers/i2c/busses/i2c-ibm_iic.c index bf34413..d964121 100644 --- a/drivers/i2c/busses/i2c-ibm_iic.c +++ b/drivers/i2c/busses/i2c-ibm_iic.c @@ -745,6 +745,7 @@ static int __devinit iic_probe(struct of_device *ofdev, /* Register it with i2c layer */ adap = &dev->adap; adap->dev.parent = &ofdev->dev; + adap->dev.of_node = of_node_get(np); strlcpy(adap->name, "IBM IIC", sizeof(adap->name)); i2c_set_adapdata(adap, dev); adap->class = I2C_CLASS_HWMON | I2C_CLASS_SPD; @@ -761,7 +762,7 @@ static int __devinit iic_probe(struct of_device *ofdev, dev->fast_mode ? "fast (400 kHz)" : "standard (100 kHz)"); /* Now register all the child nodes */ - of_register_i2c_devices(adap, np); + of_i2c_register_devices(adap); return 0; diff --git a/drivers/i2c/busses/i2c-mpc.c b/drivers/i2c/busses/i2c-mpc.c index df00eb1..d2e26d2 100644 --- a/drivers/i2c/busses/i2c-mpc.c +++ b/drivers/i2c/busses/i2c-mpc.c @@ -600,13 +600,14 @@ static int __devinit fsl_i2c_probe(struct of_device *op, i2c->adap = mpc_ops; i2c_set_adapdata(&i2c->adap, i2c); i2c->adap.dev.parent = &op->dev; + i2c->adap.dev.of_node = of_node_get(op->dev.of_node); result = i2c_add_adapter(&i2c->adap); if (result < 0) { dev_err(i2c->dev, "failed to add adapter\n"); goto fail_add; } - of_register_i2c_devices(&i2c->adap, op->dev.of_node); + of_i2c_register_devices(&i2c->adap); return result; diff --git a/drivers/of/Kconfig b/drivers/of/Kconfig index 097f42a..80dd631 100644 --- a/drivers/of/Kconfig +++ b/drivers/of/Kconfig @@ -26,7 +26,7 @@ config OF_GPIO config OF_I2C def_tristate I2C - depends on (PPC_OF || MICROBLAZE) && I2C + depends on OF && !SPARC && I2C help OpenFirmware I2C accessors diff --git a/drivers/of/of_i2c.c b/drivers/of/of_i2c.c index ab6522c..e05f9a1 100644 --- a/drivers/of/of_i2c.c +++ b/drivers/of/of_i2c.c @@ -14,34 +14,49 @@ #include <linux/i2c.h> #include <linux/of.h> #include <linux/of_i2c.h> +#include <linux/of_irq.h> #include <linux/module.h> -void of_register_i2c_devices(struct i2c_adapter *adap, - struct device_node *adap_node) +void of_i2c_register_devices(struct i2c_adapter *adap) { void *result; struct device_node *node; - for_each_child_of_node(adap_node, node) { + /* Only register child devices if the adapter has a node pointer set */ + if (!adap->dev.of_node) + return; + + dev_dbg(&adap->dev, "of_i2c: walking child nodes\n"); + + for_each_child_of_node(adap->dev.of_node, node) { struct i2c_board_info info = {}; struct dev_archdata dev_ad = {}; const __be32 *addr; int len; - if (of_modalias_node(node, info.type, sizeof(info.type)) < 0) + dev_dbg(&adap->dev, "of_i2c: register %s\n", node->full_name); + + if (of_modalias_node(node, info.type, sizeof(info.type)) < 0) { + dev_err(&adap->dev, "of_i2c: modalias failure on %s\n", + node->full_name); continue; + } addr = of_get_property(node, "reg", &len); - if (!addr || len < sizeof(int) || *addr > (1 << 10) - 1) { - printk(KERN_ERR - "of-i2c: invalid i2c device entry\n"); + if (!addr || (len < sizeof(int))) { + dev_err(&adap->dev, "of_i2c: invalid reg on %s\n", + node->full_name); continue; } - info.irq = irq_of_parse_and_map(node, 0); - info.addr = be32_to_cpup(addr); + if (info.addr > (1 << 10) - 1) { + dev_err(&adap->dev, "of_i2c: invalid addr=%x on %s\n", + info.addr, node->full_name); + continue; + } + info.irq = irq_of_parse_and_map(node, 0); info.of_node = node; info.archdata = &dev_ad; @@ -49,10 +64,8 @@ void of_register_i2c_devices(struct i2c_adapter *adap, result = i2c_new_device(adap, &info); if (result == NULL) { - printk(KERN_ERR - "of-i2c: Failed to load driver for %s\n", - info.type); - irq_dispose_mapping(info.irq); + dev_err(&adap->dev, "of_i2c: Failure registering %s\n", + node->full_name); continue; } @@ -64,7 +77,7 @@ void of_register_i2c_devices(struct i2c_adapter *adap, of_node_get(node); } } -EXPORT_SYMBOL(of_register_i2c_devices); +EXPORT_SYMBOL(of_i2c_register_devices); static int of_dev_node_match(struct device *dev, void *data) { @@ -76,8 +89,7 @@ struct i2c_client *of_find_i2c_device_by_node(struct device_node *node) { struct device *dev; - dev = bus_find_device(&i2c_bus_type, NULL, node, - of_dev_node_match); + dev = bus_find_device(&i2c_bus_type, NULL, node, of_dev_node_match); if (!dev) return NULL; diff --git a/include/linux/of_i2c.h b/include/linux/of_i2c.h index 34974b5..0efe8d4 100644 --- a/include/linux/of_i2c.h +++ b/include/linux/of_i2c.h @@ -12,12 +12,19 @@ #ifndef __LINUX_OF_I2C_H #define __LINUX_OF_I2C_H +#if defined(CONFIG_OF_I2C) || defined(CONFIG_OF_I2C_MODULE) #include <linux/i2c.h> -void of_register_i2c_devices(struct i2c_adapter *adap, - struct device_node *adap_node); +extern void of_i2c_register_devices(struct i2c_adapter *adap); /* must call put_device() when done with returned i2c_client device */ -struct i2c_client *of_find_i2c_device_by_node(struct device_node *node); +extern struct i2c_client *of_find_i2c_device_by_node(struct device_node *node); + +#else +static inline void of_i2c_register_devices(struct i2c_adapter *adap) +{ + return; +} +#endif /* CONFIG_OF_I2C */ #endif /* __LINUX_OF_I2C_H */ ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 1/2] of/i2c: Generalize OF support 2010-06-10 5:22 ` [PATCH 1/2] of/i2c: Generalize OF support Grant Likely @ 2010-06-10 9:52 ` Wolfram Sang [not found] ` <20100610095226.GI5333-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org> 0 siblings, 1 reply; 5+ messages in thread From: Wolfram Sang @ 2010-06-10 9:52 UTC (permalink / raw) To: Grant Likely Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, jeremy.kerr-Z7WLFzj8eWMS+FvcfC7Uqw, linux-kernel-u79uwXL29TY76Z2rM5mHXA, ben-linux-elnMNo+KYs3YtjvyW6yDsg, linux-i2c-u79uwXL29TY76Z2rM5mHXA [-- Attachment #1.1: Type: text/plain, Size: 7908 bytes --] Hi Grant, looks good to me in general. A few questions: On Wed, Jun 09, 2010 at 11:22:32PM -0600, Grant Likely wrote: > This patch cleans up the i2c OF support code to make it selectable by > all architectures and allow for automatic registration of i2c devices. > > Signed-off-by: Grant Likely <grant.likely-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org> > --- > drivers/i2c/busses/i2c-cpm.c | 3 ++- > drivers/i2c/busses/i2c-ibm_iic.c | 3 ++- > drivers/i2c/busses/i2c-mpc.c | 3 ++- > drivers/of/Kconfig | 2 +- > drivers/of/of_i2c.c | 44 ++++++++++++++++++++++++-------------- > include/linux/of_i2c.h | 13 +++++++++-- > 6 files changed, 45 insertions(+), 23 deletions(-) > > diff --git a/drivers/i2c/busses/i2c-cpm.c b/drivers/i2c/busses/i2c-cpm.c > index b02b453..03ae62e 100644 > --- a/drivers/i2c/busses/i2c-cpm.c > +++ b/drivers/i2c/busses/i2c-cpm.c > @@ -652,6 +652,7 @@ static int __devinit cpm_i2c_probe(struct of_device *ofdev, > cpm->adap = cpm_ops; > i2c_set_adapdata(&cpm->adap, cpm); > cpm->adap.dev.parent = &ofdev->dev; > + cpm->adap.dev.of_node = of_node_get(ofdev->dev.of_node); > > result = cpm_i2c_setup(cpm); > if (result) { > @@ -679,7 +680,7 @@ static int __devinit cpm_i2c_probe(struct of_device *ofdev, > /* > * register OF I2C devices > */ > - of_register_i2c_devices(&cpm->adap, ofdev->dev.of_node); > + of_i2c_register_devices(&cpm->adap); > > return 0; > out_shut: > diff --git a/drivers/i2c/busses/i2c-ibm_iic.c b/drivers/i2c/busses/i2c-ibm_iic.c > index bf34413..d964121 100644 > --- a/drivers/i2c/busses/i2c-ibm_iic.c > +++ b/drivers/i2c/busses/i2c-ibm_iic.c > @@ -745,6 +745,7 @@ static int __devinit iic_probe(struct of_device *ofdev, > /* Register it with i2c layer */ > adap = &dev->adap; > adap->dev.parent = &ofdev->dev; > + adap->dev.of_node = of_node_get(np); > strlcpy(adap->name, "IBM IIC", sizeof(adap->name)); > i2c_set_adapdata(adap, dev); > adap->class = I2C_CLASS_HWMON | I2C_CLASS_SPD; > @@ -761,7 +762,7 @@ static int __devinit iic_probe(struct of_device *ofdev, > dev->fast_mode ? "fast (400 kHz)" : "standard (100 kHz)"); > > /* Now register all the child nodes */ > - of_register_i2c_devices(adap, np); > + of_i2c_register_devices(adap); > > return 0; > > diff --git a/drivers/i2c/busses/i2c-mpc.c b/drivers/i2c/busses/i2c-mpc.c > index df00eb1..d2e26d2 100644 > --- a/drivers/i2c/busses/i2c-mpc.c > +++ b/drivers/i2c/busses/i2c-mpc.c > @@ -600,13 +600,14 @@ static int __devinit fsl_i2c_probe(struct of_device *op, > i2c->adap = mpc_ops; > i2c_set_adapdata(&i2c->adap, i2c); > i2c->adap.dev.parent = &op->dev; > + i2c->adap.dev.of_node = of_node_get(op->dev.of_node); > > result = i2c_add_adapter(&i2c->adap); > if (result < 0) { > dev_err(i2c->dev, "failed to add adapter\n"); > goto fail_add; > } > - of_register_i2c_devices(&i2c->adap, op->dev.of_node); > + of_i2c_register_devices(&i2c->adap); > > return result; > > diff --git a/drivers/of/Kconfig b/drivers/of/Kconfig > index 097f42a..80dd631 100644 > --- a/drivers/of/Kconfig > +++ b/drivers/of/Kconfig > @@ -26,7 +26,7 @@ config OF_GPIO > > config OF_I2C > def_tristate I2C > - depends on (PPC_OF || MICROBLAZE) && I2C > + depends on OF && !SPARC && I2C > help > OpenFirmware I2C accessors > > diff --git a/drivers/of/of_i2c.c b/drivers/of/of_i2c.c > index ab6522c..e05f9a1 100644 > --- a/drivers/of/of_i2c.c > +++ b/drivers/of/of_i2c.c > @@ -14,34 +14,49 @@ > #include <linux/i2c.h> > #include <linux/of.h> > #include <linux/of_i2c.h> > +#include <linux/of_irq.h> > #include <linux/module.h> > > -void of_register_i2c_devices(struct i2c_adapter *adap, > - struct device_node *adap_node) > +void of_i2c_register_devices(struct i2c_adapter *adap) > { > void *result; > struct device_node *node; > > - for_each_child_of_node(adap_node, node) { > + /* Only register child devices if the adapter has a node pointer set */ > + if (!adap->dev.of_node) > + return; > + > + dev_dbg(&adap->dev, "of_i2c: walking child nodes\n"); > + > + for_each_child_of_node(adap->dev.of_node, node) { > struct i2c_board_info info = {}; > struct dev_archdata dev_ad = {}; > const __be32 *addr; > int len; > > - if (of_modalias_node(node, info.type, sizeof(info.type)) < 0) > + dev_dbg(&adap->dev, "of_i2c: register %s\n", node->full_name); > + > + if (of_modalias_node(node, info.type, sizeof(info.type)) < 0) { > + dev_err(&adap->dev, "of_i2c: modalias failure on %s\n", > + node->full_name); > continue; > + } > > addr = of_get_property(node, "reg", &len); > - if (!addr || len < sizeof(int) || *addr > (1 << 10) - 1) { > - printk(KERN_ERR > - "of-i2c: invalid i2c device entry\n"); > + if (!addr || (len < sizeof(int))) { > + dev_err(&adap->dev, "of_i2c: invalid reg on %s\n", > + node->full_name); > continue; > } > > - info.irq = irq_of_parse_and_map(node, 0); > - > info.addr = be32_to_cpup(addr); > + if (info.addr > (1 << 10) - 1) { > + dev_err(&adap->dev, "of_i2c: invalid addr=%x on %s\n", > + info.addr, node->full_name); > + continue; > + } > > + info.irq = irq_of_parse_and_map(node, 0); > info.of_node = node; > info.archdata = &dev_ad; > > @@ -49,10 +64,8 @@ void of_register_i2c_devices(struct i2c_adapter *adap, > > result = i2c_new_device(adap, &info); > if (result == NULL) { > - printk(KERN_ERR > - "of-i2c: Failed to load driver for %s\n", > - info.type); > - irq_dispose_mapping(info.irq); Why is the dispose removed? > + dev_err(&adap->dev, "of_i2c: Failure registering %s\n", > + node->full_name); > continue; > } > > @@ -64,7 +77,7 @@ void of_register_i2c_devices(struct i2c_adapter *adap, > of_node_get(node); > } > } > -EXPORT_SYMBOL(of_register_i2c_devices); > +EXPORT_SYMBOL(of_i2c_register_devices); > > static int of_dev_node_match(struct device *dev, void *data) > { > @@ -76,8 +89,7 @@ struct i2c_client *of_find_i2c_device_by_node(struct device_node *node) > { > struct device *dev; > > - dev = bus_find_device(&i2c_bus_type, NULL, node, > - of_dev_node_match); > + dev = bus_find_device(&i2c_bus_type, NULL, node, of_dev_node_match); This change looks unrelated to me; where was this changed? > if (!dev) > return NULL; > > diff --git a/include/linux/of_i2c.h b/include/linux/of_i2c.h > index 34974b5..0efe8d4 100644 > --- a/include/linux/of_i2c.h > +++ b/include/linux/of_i2c.h > @@ -12,12 +12,19 @@ > #ifndef __LINUX_OF_I2C_H > #define __LINUX_OF_I2C_H > > +#if defined(CONFIG_OF_I2C) || defined(CONFIG_OF_I2C_MODULE) > #include <linux/i2c.h> > > -void of_register_i2c_devices(struct i2c_adapter *adap, > - struct device_node *adap_node); > +extern void of_i2c_register_devices(struct i2c_adapter *adap); > > /* must call put_device() when done with returned i2c_client device */ > -struct i2c_client *of_find_i2c_device_by_node(struct device_node *node); > +extern struct i2c_client *of_find_i2c_device_by_node(struct device_node *node); > + > +#else > +static inline void of_i2c_register_devices(struct i2c_adapter *adap) > +{ > + return; > +} > +#endif /* CONFIG_OF_I2C */ > > #endif /* __LINUX_OF_I2C_H */ > > -- > To unsubscribe from this list: send the line "unsubscribe linux-i2c" in > the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- Pengutronix e.K. | Wolfram Sang | Industrial Linux Solutions | http://www.pengutronix.de/ | [-- Attachment #1.2: Digital signature --] [-- Type: application/pgp-signature, Size: 197 bytes --] [-- Attachment #2: Type: text/plain, Size: 192 bytes --] _______________________________________________ devicetree-discuss mailing list devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org https://lists.ozlabs.org/listinfo/devicetree-discuss ^ permalink raw reply [flat|nested] 5+ messages in thread
[parent not found: <20100610095226.GI5333-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>]
* Re: [PATCH 1/2] of/i2c: Generalize OF support [not found] ` <20100610095226.GI5333-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org> @ 2010-06-10 16:58 ` Grant Likely 0 siblings, 0 replies; 5+ messages in thread From: Grant Likely @ 2010-06-10 16:58 UTC (permalink / raw) To: Wolfram Sang Cc: linux-kernel-u79uwXL29TY76Z2rM5mHXA, jeremy.kerr-Z7WLFzj8eWMS+FvcfC7Uqw, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, ben-linux-elnMNo+KYs3YtjvyW6yDsg, linux-i2c-u79uwXL29TY76Z2rM5mHXA On Thu, Jun 10, 2010 at 3:52 AM, Wolfram Sang <w.sang-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org> wrote: > Hi Grant, > > looks good to me in general. A few questions: > > On Wed, Jun 09, 2010 at 11:22:32PM -0600, Grant Likely wrote: >> This patch cleans up the i2c OF support code to make it selectable by >> all architectures and allow for automatic registration of i2c devices. >> >> Signed-off-by: Grant Likely <grant.likely-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org> >> --- >> drivers/i2c/busses/i2c-cpm.c | 3 ++- >> drivers/i2c/busses/i2c-ibm_iic.c | 3 ++- >> drivers/i2c/busses/i2c-mpc.c | 3 ++- >> drivers/of/Kconfig | 2 +- >> drivers/of/of_i2c.c | 44 ++++++++++++++++++++++++-------------- >> include/linux/of_i2c.h | 13 +++++++++-- >> 6 files changed, 45 insertions(+), 23 deletions(-) >> Hi Wolfram, thanks for the review. Replies below. >> @@ -49,10 +64,8 @@ void of_register_i2c_devices(struct i2c_adapter *adap, >> >> result = i2c_new_device(adap, &info); >> if (result == NULL) { >> - printk(KERN_ERR >> - "of-i2c: Failed to load driver for %s\n", >> - info.type); >> - irq_dispose_mapping(info.irq); > > Why is the dispose removed? Hmmm... That looks like a mistake. I'll add it back. > >> + dev_err(&adap->dev, "of_i2c: Failure registering %s\n", >> + node->full_name); >> continue; >> } >> >> @@ -64,7 +77,7 @@ void of_register_i2c_devices(struct i2c_adapter *adap, >> of_node_get(node); >> } >> } >> -EXPORT_SYMBOL(of_register_i2c_devices); >> +EXPORT_SYMBOL(of_i2c_register_devices); >> >> static int of_dev_node_match(struct device *dev, void *data) >> { >> @@ -76,8 +89,7 @@ struct i2c_client *of_find_i2c_device_by_node(struct device_node *node) >> { >> struct device *dev; >> >> - dev = bus_find_device(&i2c_bus_type, NULL, node, >> - of_dev_node_match); >> + dev = bus_find_device(&i2c_bus_type, NULL, node, of_dev_node_match); > > This change looks unrelated to me; where was this changed? You're right; unrelated whitespace damage. I'll remove. g. ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 2/2] i2c: Add OF-style registration and binding 2010-06-10 5:22 [PATCH 0/2] Rework OF i2c support code Grant Likely 2010-06-10 5:22 ` [PATCH 1/2] of/i2c: Generalize OF support Grant Likely @ 2010-06-10 5:22 ` Grant Likely 1 sibling, 0 replies; 5+ messages in thread From: Grant Likely @ 2010-06-10 5:22 UTC (permalink / raw) Cc: linux-kernel, jeremy.kerr, devicetree-discuss, ben-linux, linux-i2c This patch adds OF hooks to the i2c core so that devices can automatically be registered based on device tree data. Signed-off-by: Grant Likely <grant.likely@secretlab.ca> --- drivers/i2c/busses/i2c-cpm.c | 5 ----- drivers/i2c/busses/i2c-ibm_iic.c | 3 --- drivers/i2c/busses/i2c-mpc.c | 1 - drivers/i2c/i2c-core.c | 9 +++++++++ 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/drivers/i2c/busses/i2c-cpm.c b/drivers/i2c/busses/i2c-cpm.c index 03ae62e..e591de1 100644 --- a/drivers/i2c/busses/i2c-cpm.c +++ b/drivers/i2c/busses/i2c-cpm.c @@ -677,11 +677,6 @@ static int __devinit cpm_i2c_probe(struct of_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); diff --git a/drivers/i2c/busses/i2c-ibm_iic.c b/drivers/i2c/busses/i2c-ibm_iic.c index d964121..1168d61 100644 --- a/drivers/i2c/busses/i2c-ibm_iic.c +++ b/drivers/i2c/busses/i2c-ibm_iic.c @@ -761,9 +761,6 @@ static int __devinit iic_probe(struct of_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: diff --git a/drivers/i2c/busses/i2c-mpc.c b/drivers/i2c/busses/i2c-mpc.c index d2e26d2..9f7fef8 100644 --- a/drivers/i2c/busses/i2c-mpc.c +++ b/drivers/i2c/busses/i2c-mpc.c @@ -607,7 +607,6 @@ static int __devinit fsl_i2c_probe(struct of_device *op, dev_err(i2c->dev, "failed to add adapter\n"); goto fail_add; } - of_i2c_register_devices(&i2c->adap); return result; diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index 1cca263..5588ac1 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c @@ -30,6 +30,8 @@ #include <linux/init.h> #include <linux/idr.h> #include <linux/mutex.h> +#include <linux/of_i2c.h> +#include <linux/of_device.h> #include <linux/completion.h> #include <linux/hardirq.h> #include <linux/irqflags.h> @@ -70,6 +72,10 @@ static int i2c_device_match(struct device *dev, struct device_driver *drv) if (!client) return 0; + /* Attempt an OF style match */ + if (of_driver_match_device(dev, drv)) + return 1; + driver = to_i2c_driver(drv); /* match on an id table if there is one */ if (driver->id_table) @@ -790,6 +796,9 @@ static int i2c_register_adapter(struct i2c_adapter *adap) if (adap->nr < __i2c_first_dynamic_bus_num) i2c_scan_static_board_info(adap); + /* Register devices from the device tree */ + of_i2c_register_devices(adap); + /* Notify drivers */ mutex_lock(&core_lock); dummy = bus_for_each_drv(&i2c_bus_type, NULL, adap, ^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2010-06-10 16:58 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-06-10 5:22 [PATCH 0/2] Rework OF i2c support code Grant Likely
2010-06-10 5:22 ` [PATCH 1/2] of/i2c: Generalize OF support Grant Likely
2010-06-10 9:52 ` Wolfram Sang
[not found] ` <20100610095226.GI5333-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
2010-06-10 16:58 ` Grant Likely
2010-06-10 5:22 ` [PATCH 2/2] i2c: Add OF-style registration and binding Grant Likely
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).