* at24.c, how to get kobject for sysfs/bin_attribute methods?
@ 2008-07-28 6:20 Matti Kaasinen
[not found] ` <488D6513.6070701-91aMuT3/2DXHOG6cAo2yLw@public.gmane.org>
0 siblings, 1 reply; 2+ messages in thread
From: Matti Kaasinen @ 2008-07-28 6:20 UTC (permalink / raw)
To: i2c-GZX6beZjE8VD60Wz+7aTrA
Hi all!
Background first (quite a lot of it) --------------
At24.c seems supporting:
ssize_t (*read)(struct kobject *, char *, loff_t, size_t) and
ssize_t (*write)(struct kobject *, char *, loff_t, size_t) methods to
provide access to i2c clients through sysfs/bin_attribute interface. It
expects "struct kobject *" parameter to be the embedded kobject of
struct i2c_client (->dev->kobj). Based on this facet at24.c expands
koject parameter to i2c_client (container_of .. container_of) and
executes required i2c_transfer transactions. Therefore, kernel modules
wanting to access i2c devices through at24.c should be able to point the
kobject embedded within the i2c_client structure.
I have not found quite solid method for this purpose in this "new"
device model where drivers and devices get paired somewhere after boot
up. Best choice I've found so far is using following helper functions
iterating over devices and drivers on i2c_bus_type to find i2c_device
matching required name/address:
int bus_for_each_dev(struct bus_type *bus, struct device *start,
void *data, int (*fn)(struct device *, void *));
int bus_for_each_drv(struct bus_type *bus, struct device_driver *start,
void *data, int (*fn)(struct device_driver *, void *));
Problem with these functions at the moment is that i2_bus_type is not
exported at least in 2.6.24 kernel that I'm playing with. I've seen
export patches around and discussion for exporting/not exporting it.
Questions ----------
Do anyone know plans for exporting it in future releases? Do anyone know
better solution for other kernel module finding the correct kobject
reference for selected i2c device (e.g. by name) to be used as parameter
to bin_attribute read/write method?
thanks, Matti Kaasinen
_______________________________________________
i2c mailing list
i2c-GZX6beZjE8VD60Wz+7aTrA@public.gmane.org
http://lists.lm-sensors.org/mailman/listinfo/i2c
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: at24.c, how to get kobject for sysfs/bin_attribute methods?
[not found] ` <488D6513.6070701-91aMuT3/2DXHOG6cAo2yLw@public.gmane.org>
@ 2008-07-28 13:25 ` Jon Smirl
0 siblings, 0 replies; 2+ messages in thread
From: Jon Smirl @ 2008-07-28 13:25 UTC (permalink / raw)
To: Matti Kaasinen; +Cc: i2c-GZX6beZjE8VD60Wz+7aTrA
PowerPC is going to use this....
Add the of_find_i2c_device_by_node function
From: Jon Smirl <jonsmirl-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
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-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
drivers/of/of_i2c.c | 28 ++++++++++++++++++++++++----
include/linux/of_i2c.h | 2 ++
2 files changed, 26 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 */
--
Jon Smirl
jonsmirl-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org
_______________________________________________
i2c mailing list
i2c-GZX6beZjE8VD60Wz+7aTrA@public.gmane.org
http://lists.lm-sensors.org/mailman/listinfo/i2c
^ permalink raw reply related [flat|nested] 2+ messages in thread
end of thread, other threads:[~2008-07-28 13:25 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-07-28 6:20 at24.c, how to get kobject for sysfs/bin_attribute methods? Matti Kaasinen
[not found] ` <488D6513.6070701-91aMuT3/2DXHOG6cAo2yLw@public.gmane.org>
2008-07-28 13:25 ` Jon Smirl
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox