linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] Add the of_find_i2c_device_by_node function
@ 2008-10-19 14:00 Jon Smirl
  2008-10-19 21:20 ` Anton Vorontsov
  0 siblings, 1 reply; 8+ messages in thread
From: Jon Smirl @ 2008-10-19 14:00 UTC (permalink / raw)
  To: linuxppc-dev, i2c

Add the of_find_i2c_device_by_node function. This allows you to follow
a reference in the device tree to an i2c device node and then locate
the linux device instantiated by the device tree. Example use, an i2s
codec controlled by i2c. Depends on patch exporting i2c root bus symbol.

Signed-off-by: Jon Smirl <jonsmirl@gmail.com>
---
 drivers/of/of_i2c.c |   28 ++++++++++++++++++++++++----
 1 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/drivers/of/of_i2c.c b/drivers/of/of_i2c.c
index 6a98dc8..ba7b394 100644
--- a/drivers/of/of_i2c.c
+++ b/drivers/of/of_i2c.c
@@ -19,7 +19,7 @@
 void of_register_i2c_devices(struct i2c_adapter *adap,
 			     struct device_node *adap_node)
 {
-	void *result;
+	struct i2c_client *i2c_dev;
 	struct device_node *node;
 
 	for_each_child_of_node(adap_node, node) {
@@ -41,18 +41,38 @@ void of_register_i2c_devices(struct i2c_adapter *adap,
 
 		info.addr = *addr;
 
-		request_module(info.type);
+		request_module("%s", info.type);
 
-		result = i2c_new_device(adap, &info);
-		if (result == NULL) {
+		i2c_dev = i2c_new_device(adap, &info);
+		if (i2c_dev == NULL) {
 			printk(KERN_ERR
 			       "of-i2c: Failed to load driver for %s\n",
 			       info.type);
 			irq_dispose_mapping(info.irq);
 			continue;
 		}
+		
+		i2c_dev->dev.archdata.of_node = of_node_get(node);
 	}
 }
 EXPORT_SYMBOL(of_register_i2c_devices);
 
+static int of_dev_node_match(struct device *dev, void *data)
+{
+        return dev->archdata.of_node == data;
+}
+
+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);
+	if (!dev)
+		return NULL;
+		
+	return to_i2c_client(dev);
+}
+EXPORT_SYMBOL(of_find_i2c_device_by_node);
+
 MODULE_LICENSE("GPL");
diff --git a/include/linux/of_i2c.h b/include/linux/of_i2c.h
index bd2a870..17d5897 100644
--- a/include/linux/of_i2c.h
+++ b/include/linux/of_i2c.h
@@ -16,5 +16,7 @@
 
 void of_register_i2c_devices(struct i2c_adapter *adap,
 			     struct device_node *adap_node);
+struct i2c_client *of_find_i2c_device_by_node(struct device_node *node);
+			     
 
 #endif /* __LINUX_OF_I2C_H */

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

* Re: [PATCH] Add the of_find_i2c_device_by_node function
  2008-10-19 14:00 [PATCH] Add the of_find_i2c_device_by_node function Jon Smirl
@ 2008-10-19 21:20 ` Anton Vorontsov
  2008-10-19 21:50   ` Jon Smirl
  0 siblings, 1 reply; 8+ messages in thread
From: Anton Vorontsov @ 2008-10-19 21:20 UTC (permalink / raw)
  To: Jon Smirl; +Cc: linuxppc-dev, i2c

Hi Jon,

On Sun, Oct 19, 2008 at 10:00:40AM -0400, Jon Smirl wrote:
> Add the of_find_i2c_device_by_node function. This allows you to follow
> a reference in the device tree to an i2c device node and then locate
> the linux device instantiated by the device tree. Example use, an i2s
> codec controlled by i2c. Depends on patch exporting i2c root bus symbol.
> 
> Signed-off-by: Jon Smirl <jonsmirl@gmail.com>

Few comments are below.

> ---
>  drivers/of/of_i2c.c |   28 ++++++++++++++++++++++++----
>  1 files changed, 24 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/of/of_i2c.c b/drivers/of/of_i2c.c
> index 6a98dc8..ba7b394 100644
> --- a/drivers/of/of_i2c.c
> +++ b/drivers/of/of_i2c.c
> @@ -19,7 +19,7 @@
>  void of_register_i2c_devices(struct i2c_adapter *adap,
>  			     struct device_node *adap_node)
>  {
> -	void *result;
> +	struct i2c_client *i2c_dev;
>  	struct device_node *node;
>  
>  	for_each_child_of_node(adap_node, node) {
> @@ -41,18 +41,38 @@ void of_register_i2c_devices(struct i2c_adapter *adap,
>  
>  		info.addr = *addr;
>  
> -		request_module(info.type);
> +		request_module("%s", info.type);

Patch description doesn't mention this change.

>  
> -		result = i2c_new_device(adap, &info);
> -		if (result == NULL) {
> +		i2c_dev = i2c_new_device(adap, &info);
> +		if (i2c_dev == NULL) {
>  			printk(KERN_ERR
>  			       "of-i2c: Failed to load driver for %s\n",
>  			       info.type);
>  			irq_dispose_mapping(info.irq);
>  			continue;
>  		}
> +		
> +		i2c_dev->dev.archdata.of_node = of_node_get(node);

Would break sparc build. Plus setting this after i2c_new_device() isn't
right... Recently I sent few patches to deal with the archdata, could
you please rebase your patch against these three patches?

http://lkml.org/lkml/2008/10/16/250
http://lkml.org/lkml/2008/10/16/251
http://lkml.org/lkml/2008/10/16/252

>  	}
>  }
>  EXPORT_SYMBOL(of_register_i2c_devices);
>  
> +static int of_dev_node_match(struct device *dev, void *data)
> +{
> +        return dev->archdata.of_node == data;
> +}
> +
> +struct i2c_client *of_find_i2c_device_by_node(struct device_node *node)

This should be documented. Especially the fact that every time you
call this function, you must call device_put() when you're done with
the returned i2c_client.

> +{
> +	struct device *dev;
> +	
> +	dev = bus_find_device(&i2c_bus_type, NULL, node, 
> +					 of_dev_node_match);
> +	if (!dev)
> +		return NULL;
> +		
> +	return to_i2c_client(dev);
> +}
> +EXPORT_SYMBOL(of_find_i2c_device_by_node);
> +
>  MODULE_LICENSE("GPL");
> diff --git a/include/linux/of_i2c.h b/include/linux/of_i2c.h
> index bd2a870..17d5897 100644
> --- a/include/linux/of_i2c.h
> +++ b/include/linux/of_i2c.h
> @@ -16,5 +16,7 @@
>  
>  void of_register_i2c_devices(struct i2c_adapter *adap,
>  			     struct device_node *adap_node);
> +struct i2c_client *of_find_i2c_device_by_node(struct device_node *node);
> +			     
>  
>  #endif /* __LINUX_OF_I2C_H */

Thanks,

-- 
Anton Vorontsov
email: cbouatmailru@gmail.com
irc://irc.freenode.net/bd2

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

* Re: [PATCH] Add the of_find_i2c_device_by_node function
  2008-10-19 21:20 ` Anton Vorontsov
@ 2008-10-19 21:50   ` Jon Smirl
  2008-10-19 22:03     ` Anton Vorontsov
  0 siblings, 1 reply; 8+ messages in thread
From: Jon Smirl @ 2008-10-19 21:50 UTC (permalink / raw)
  To: avorontsov; +Cc: linuxppc-dev, i2c

On Sun, Oct 19, 2008 at 5:20 PM, Anton Vorontsov
<avorontsov@ru.mvista.com> wrote:
> Hi Jon,
>
> On Sun, Oct 19, 2008 at 10:00:40AM -0400, Jon Smirl wrote:
>> Add the of_find_i2c_device_by_node function. This allows you to follow
>> a reference in the device tree to an i2c device node and then locate
>> the linux device instantiated by the device tree. Example use, an i2s
>> codec controlled by i2c. Depends on patch exporting i2c root bus symbol.
>>
>> Signed-off-by: Jon Smirl <jonsmirl@gmail.com>
>
> Few comments are below.
>
>> ---
>>  drivers/of/of_i2c.c |   28 ++++++++++++++++++++++++----
>>  1 files changed, 24 insertions(+), 4 deletions(-)
>>
>> diff --git a/drivers/of/of_i2c.c b/drivers/of/of_i2c.c
>> index 6a98dc8..ba7b394 100644
>> --- a/drivers/of/of_i2c.c
>> +++ b/drivers/of/of_i2c.c
>> @@ -19,7 +19,7 @@
>>  void of_register_i2c_devices(struct i2c_adapter *adap,
>>                            struct device_node *adap_node)
>>  {
>> -     void *result;
>> +     struct i2c_client *i2c_dev;
>>       struct device_node *node;
>>
>>       for_each_child_of_node(adap_node, node) {
>> @@ -41,18 +41,38 @@ void of_register_i2c_devices(struct i2c_adapter *adap,
>>
>>               info.addr = *addr;
>>
>> -             request_module(info.type);
>> +             request_module("%s", info.type);
>
> Patch description doesn't mention this change.

Patches for this have been posted before by other people and they
aren't making it in.

This is the original mail....
http://lkml.org/lkml/2008/6/13/290
http://lkml.org/lkml/2008/6/12/8
I can't find the ones patching i2c.


>
>>
>> -             result = i2c_new_device(adap, &info);
>> -             if (result == NULL) {
>> +             i2c_dev = i2c_new_device(adap, &info);
>> +             if (i2c_dev == NULL) {
>>                       printk(KERN_ERR
>>                              "of-i2c: Failed to load driver for %s\n",
>>                              info.type);
>>                       irq_dispose_mapping(info.irq);
>>                       continue;
>>               }
>> +
>> +             i2c_dev->dev.archdata.of_node = of_node_get(node);
>
> Would break sparc build. Plus setting this after i2c_new_device() isn't
> right... Recently I sent few patches to deal with the archdata, could
> you please rebase your patch against these three patches?
>
> http://lkml.org/lkml/2008/10/16/250
> http://lkml.org/lkml/2008/10/16/251
> http://lkml.org/lkml/2008/10/16/252
>
>>       }
>>  }
>>  EXPORT_SYMBOL(of_register_i2c_devices);
>>
>> +static int of_dev_node_match(struct device *dev, void *data)
>> +{
>> +        return dev->archdata.of_node == data;
>> +}
>> +
>> +struct i2c_client *of_find_i2c_device_by_node(struct device_node *node)
>
> This should be documented. Especially the fact that every time you
> call this function, you must call device_put() when you're done with
> the returned i2c_client.
>
>> +{
>> +     struct device *dev;
>> +
>> +     dev = bus_find_device(&i2c_bus_type, NULL, node,
>> +                                      of_dev_node_match);
>> +     if (!dev)
>> +             return NULL;
>> +
>> +     return to_i2c_client(dev);
>> +}
>> +EXPORT_SYMBOL(of_find_i2c_device_by_node);
>> +
>>  MODULE_LICENSE("GPL");
>> diff --git a/include/linux/of_i2c.h b/include/linux/of_i2c.h
>> index bd2a870..17d5897 100644
>> --- a/include/linux/of_i2c.h
>> +++ b/include/linux/of_i2c.h
>> @@ -16,5 +16,7 @@
>>
>>  void of_register_i2c_devices(struct i2c_adapter *adap,
>>                            struct device_node *adap_node);
>> +struct i2c_client *of_find_i2c_device_by_node(struct device_node *node);
>> +
>>
>>  #endif /* __LINUX_OF_I2C_H */
>
> Thanks,
>
> --
> Anton Vorontsov
> email: cbouatmailru@gmail.com
> irc://irc.freenode.net/bd2
>



-- 
Jon Smirl
jonsmirl@gmail.com

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

* Re: [PATCH] Add the of_find_i2c_device_by_node function
  2008-10-19 21:50   ` Jon Smirl
@ 2008-10-19 22:03     ` Anton Vorontsov
  2008-10-20  5:19       ` Benjamin Herrenschmidt
  0 siblings, 1 reply; 8+ messages in thread
From: Anton Vorontsov @ 2008-10-19 22:03 UTC (permalink / raw)
  To: Jon Smirl; +Cc: linuxppc-dev, i2c

On Sun, Oct 19, 2008 at 05:50:15PM -0400, Jon Smirl wrote:
> On Sun, Oct 19, 2008 at 5:20 PM, Anton Vorontsov
> <avorontsov@ru.mvista.com> wrote:
> > Hi Jon,
> >
> > On Sun, Oct 19, 2008 at 10:00:40AM -0400, Jon Smirl wrote:
> >> Add the of_find_i2c_device_by_node function. This allows you to follow
> >> a reference in the device tree to an i2c device node and then locate
> >> the linux device instantiated by the device tree. Example use, an i2s
> >> codec controlled by i2c. Depends on patch exporting i2c root bus symbol.
> >>
> >> Signed-off-by: Jon Smirl <jonsmirl@gmail.com>
> >
> > Few comments are below.
> >
> >> ---
> >>  drivers/of/of_i2c.c |   28 ++++++++++++++++++++++++----
> >>  1 files changed, 24 insertions(+), 4 deletions(-)
> >>
> >> diff --git a/drivers/of/of_i2c.c b/drivers/of/of_i2c.c
> >> index 6a98dc8..ba7b394 100644
> >> --- a/drivers/of/of_i2c.c
> >> +++ b/drivers/of/of_i2c.c
> >> @@ -19,7 +19,7 @@
> >>  void of_register_i2c_devices(struct i2c_adapter *adap,
> >>                            struct device_node *adap_node)
> >>  {
> >> -     void *result;
> >> +     struct i2c_client *i2c_dev;
> >>       struct device_node *node;
> >>
> >>       for_each_child_of_node(adap_node, node) {
> >> @@ -41,18 +41,38 @@ void of_register_i2c_devices(struct i2c_adapter *adap,
> >>
> >>               info.addr = *addr;
> >>
> >> -             request_module(info.type);
> >> +             request_module("%s", info.type);
> >
> > Patch description doesn't mention this change.
> 
> Patches for this have been posted before by other people and they
> aren't making it in.
> 
> This is the original mail....
> http://lkml.org/lkml/2008/6/13/290
> http://lkml.org/lkml/2008/6/12/8
> I can't find the ones patching i2c.

Well, I didn't disagree with the change. I think this is good change
(and good catch, btw).

Just mention it in the patch description (or better yet, you could send
a separate patch for this particular issue, it seems quite serious).


Thanks,

-- 
Anton Vorontsov
email: cbouatmailru@gmail.com
irc://irc.freenode.net/bd2

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

* Re: [PATCH] Add the of_find_i2c_device_by_node function
  2008-10-19 22:03     ` Anton Vorontsov
@ 2008-10-20  5:19       ` Benjamin Herrenschmidt
  0 siblings, 0 replies; 8+ messages in thread
From: Benjamin Herrenschmidt @ 2008-10-20  5:19 UTC (permalink / raw)
  To: avorontsov; +Cc: linuxppc-dev, i2c

On Mon, 2008-10-20 at 02:03 +0400, Anton Vorontsov wrote:
> > This is the original mail....
> > http://lkml.org/lkml/2008/6/13/290
> > http://lkml.org/lkml/2008/6/12/8
> > I can't find the ones patching i2c.
> 
> Well, I didn't disagree with the change. I think this is good change
> (and good catch, btw).
> 
> Just mention it in the patch description (or better yet, you could send
> a separate patch for this particular issue, it seems quite serious).

Yes, it should most definitely be a separate patch.

Cheers,
Ben.

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

* Re: [PATCH] Add the of_find_i2c_device_by_node function.
  2008-12-30 20:11 Jon Smirl
@ 2009-01-06 16:29 ` Jon Smirl
  0 siblings, 0 replies; 8+ messages in thread
From: Jon Smirl @ 2009-01-06 16:29 UTC (permalink / raw)
  To: linuxppc-dev

On Tue, Dec 30, 2008 at 3:11 PM, Jon Smirl <jonsmirl@gmail.com> wrote:
> Add the of_find_i2c_device_by_node function. This allows you to follow
> a reference in the device tree to an i2c device node and then locate
> the linux device instantiated by the device tree. Example use, an i2s
> codec controlled by i2c.

Did anyone pick this patch up? You need it to write ALSA ASOC drivers.

-- 
Jon Smirl
jonsmirl@gmail.com

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

* [PATCH] Add the of_find_i2c_device_by_node function.
@ 2008-12-30 20:11 Jon Smirl
  2009-01-06 16:29 ` Jon Smirl
  0 siblings, 1 reply; 8+ messages in thread
From: Jon Smirl @ 2008-12-30 20:11 UTC (permalink / raw)
  To: linuxppc-dev

Add the of_find_i2c_device_by_node function. This allows you to follow
a reference in the device tree to an i2c device node and then locate
the linux device instantiated by the device tree. Example use, an i2s
codec controlled by i2c.

This was waiting for Anton's i2c patches that were just added.

Signed-off-by: Jon Smirl <jonsmirl@gmail.com>
---
 drivers/of/of_i2c.c    |   19 +++++++++++++++++++
 include/linux/of_i2c.h |    3 +++
 2 files changed, 22 insertions(+), 0 deletions(-)

diff --git a/drivers/of/of_i2c.c b/drivers/of/of_i2c.c
index e1b0ad6..fa65a2b 100644
--- a/drivers/of/of_i2c.c
+++ b/drivers/of/of_i2c.c
@@ -66,4 +66,23 @@ void of_register_i2c_devices(struct i2c_adapter *adap,
 }
 EXPORT_SYMBOL(of_register_i2c_devices);
 
+static int of_dev_node_match(struct device *dev, void *data)
+{
+        return dev_archdata_get_node(&dev->archdata) == data;
+}
+
+/* must call put_device() when done with returned i2c_client device */
+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);
+	if (!dev)
+		return NULL;
+
+	return to_i2c_client(dev);
+}
+EXPORT_SYMBOL(of_find_i2c_device_by_node);
+
 MODULE_LICENSE("GPL");
diff --git a/include/linux/of_i2c.h b/include/linux/of_i2c.h
index bd2a870..34974b5 100644
--- a/include/linux/of_i2c.h
+++ b/include/linux/of_i2c.h
@@ -17,4 +17,7 @@
 void of_register_i2c_devices(struct i2c_adapter *adap,
 			     struct device_node *adap_node);
 
+/* must call put_device() when done with returned i2c_client device */
+struct i2c_client *of_find_i2c_device_by_node(struct device_node *node);
+
 #endif /* __LINUX_OF_I2C_H */

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

* [PATCH] Add the of_find_i2c_device_by_node function.
@ 2008-10-21  0:23 Jon Smirl
  0 siblings, 0 replies; 8+ messages in thread
From: Jon Smirl @ 2008-10-21  0:23 UTC (permalink / raw)
  To: linuxppc-dev, avorontsov

Add the of_find_i2c_device_by_node function. This allows you to follow
a reference in the device tree to an i2c device node and then locate
the linux device instantiated by the device tree. Example use, an i2s
codec controlled by i2c.

Anton - this version is based off from your patches

Signed-off-by: Jon Smirl <jonsmirl@gmail.com>
---
 drivers/of/of_i2c.c    |   19 +++++++++++++++++++
 include/linux/of_i2c.h |    3 +++
 2 files changed, 22 insertions(+), 0 deletions(-)

diff --git a/drivers/of/of_i2c.c b/drivers/of/of_i2c.c
index e1b0ad6..fa65a2b 100644
--- a/drivers/of/of_i2c.c
+++ b/drivers/of/of_i2c.c
@@ -66,4 +66,23 @@ void of_register_i2c_devices(struct i2c_adapter *adap,
 }
 EXPORT_SYMBOL(of_register_i2c_devices);
 
+static int of_dev_node_match(struct device *dev, void *data)
+{
+        return dev_archdata_get_node(&dev->archdata) == data;
+}
+
+/* must call put_device() when done with returned i2c_client device */
+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);
+	if (!dev)
+		return NULL;
+
+	return to_i2c_client(dev);
+}
+EXPORT_SYMBOL(of_find_i2c_device_by_node);
+
 MODULE_LICENSE("GPL");
diff --git a/include/linux/of_i2c.h b/include/linux/of_i2c.h
index bd2a870..34974b5 100644
--- a/include/linux/of_i2c.h
+++ b/include/linux/of_i2c.h
@@ -17,4 +17,7 @@
 void of_register_i2c_devices(struct i2c_adapter *adap,
 			     struct device_node *adap_node);
 
+/* must call put_device() when done with returned i2c_client device */
+struct i2c_client *of_find_i2c_device_by_node(struct device_node *node);
+
 #endif /* __LINUX_OF_I2C_H */

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

end of thread, other threads:[~2009-01-06 16:29 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-10-19 14:00 [PATCH] Add the of_find_i2c_device_by_node function Jon Smirl
2008-10-19 21:20 ` Anton Vorontsov
2008-10-19 21:50   ` Jon Smirl
2008-10-19 22:03     ` Anton Vorontsov
2008-10-20  5:19       ` Benjamin Herrenschmidt
2008-10-21  0:23 Jon Smirl
2008-12-30 20:11 Jon Smirl
2009-01-06 16:29 ` Jon Smirl

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