From: Jon Smirl <jonsmirl@gmail.com>
To: i2c@lm-sensors.org, Linuxppc-dev@ozlabs.org
Subject: [PATCH 2/2] Add the of_find_i2c_device_by_node function, V4
Date: Mon, 30 Jun 2008 19:01:28 -0400 [thread overview]
Message-ID: <20080630230128.12482.79570.stgit@terra> (raw)
In-Reply-To: <20080630230126.12482.87927.stgit@terra>
Add the of_find_i2c_device_by_node function. This allows you to follow a reference in the device to an i2c device node and then locate the linux device instantiated by the device tree. Example use, an i2s codec controlled by i2c.
---
drivers/i2c/i2c-core.c | 2 +-
drivers/of/of_i2c.c | 37 ++++++++++++++++++++++++++-----------
include/linux/i2c.h | 3 +++
include/linux/of_i2c.h | 2 ++
4 files changed, 32 insertions(+), 12 deletions(-)
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c
index d0175f4..e3abe1b 100644
--- a/drivers/i2c/i2c-core.c
+++ b/drivers/i2c/i2c-core.c
@@ -208,7 +208,7 @@ static struct device_attribute i2c_dev_attrs[] = {
{ },
};
-static struct bus_type i2c_bus_type = {
+struct bus_type i2c_bus_type = {
.name = "i2c",
.dev_attrs = i2c_dev_attrs,
.match = i2c_device_match,
diff --git a/drivers/of/of_i2c.c b/drivers/of/of_i2c.c
index 715a444..ca69a16 100644
--- a/drivers/of/of_i2c.c
+++ b/drivers/of/of_i2c.c
@@ -75,7 +75,7 @@ static int of_find_i2c_driver(struct device_node *node,
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) {
@@ -90,29 +90,44 @@ void of_register_i2c_devices(struct i2c_adapter *adap,
continue;
}
- info.irq = irq_of_parse_and_map(node, 0);
- if (info.irq == NO_IRQ)
- info.irq = -1;
-
- if (of_find_i2c_driver(node, &info) < 0) {
- irq_dispose_mapping(info.irq);
+ if (of_find_i2c_driver(node, &info) < 0)
continue;
- }
+ info.irq = irq_of_parse_and_map(node, 0);
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/i2c.h b/include/linux/i2c.h
index fb9af6a..186b22d 100644
--- a/include/linux/i2c.h
+++ b/include/linux/i2c.h
@@ -92,6 +92,9 @@ extern s32 i2c_smbus_read_i2c_block_data(struct i2c_client * client,
extern s32 i2c_smbus_write_i2c_block_data(struct i2c_client * client,
u8 command, u8 length,
const u8 *values);
+
+/* Base of the i2c bus */
+extern struct bus_type i2c_bus_type;
/*
* A driver is capable of handling one or more physical devices present on
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 */
next prev parent reply other threads:[~2008-06-30 23:01 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-06-30 23:01 [PATCH 1/2] Convert i2c-mpc from a platform driver into a of_platform driver, V4 Jon Smirl
2008-06-30 23:01 ` Jon Smirl
2008-06-30 23:01 ` Jon Smirl [this message]
2008-07-01 15:05 ` [PATCH 2/2] Add the of_find_i2c_device_by_node function, V4 Jean Delvare
2008-07-01 15:12 ` Jon Smirl
2008-07-01 16:29 ` Jean Delvare
[not found] ` <20080701182949.12119d6e-ig7AzVSIIG7kN2dkZ6Wm7A@public.gmane.org>
2008-07-01 16:38 ` Jon Smirl
2008-07-01 16:38 ` Jon Smirl
[not found] ` <9e4733910807010938w67bab979tfba888641debe72f-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2008-07-01 16:44 ` Jean Delvare
2008-07-01 16:44 ` Jean Delvare
2008-07-01 16:45 ` Grant Likely
2008-07-01 16:45 ` Grant Likely
[not found] ` <20080701164518.GG6918-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org>
2008-07-01 17:01 ` Jean Delvare
2008-07-01 17:01 ` Jean Delvare
[not found] ` <20080701190151.76782bbd-ig7AzVSIIG7kN2dkZ6Wm7A@public.gmane.org>
2008-07-01 17:06 ` Jon Smirl
2008-07-01 17:06 ` Jon Smirl
[not found] ` <9e4733910807011006t20c7689ctfe26931f96c84092-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2008-07-01 18:24 ` Jean Delvare
2008-07-01 18:24 ` Jean Delvare
2008-07-01 16:43 ` Grant Likely
2008-07-01 17:00 ` Jon Smirl
2008-07-01 17:12 ` Jean Delvare
2008-07-01 17:27 ` Jon Smirl
2008-07-01 18:18 ` Jon Smirl
2008-07-01 18:51 ` Jean Delvare
2008-07-01 15:48 ` Jochen Friedrich
2008-07-01 16:29 ` Jon Smirl
2008-07-01 16:35 ` Jean Delvare
2008-07-01 16:14 ` [PATCH 1/2] Convert i2c-mpc from a platform driver into a of_platform driver, V4 Jean Delvare
2008-07-02 13:33 ` [i2c] " Wolfram Sang
2008-07-02 13:33 ` Wolfram Sang
2008-07-02 14:36 ` Jean Delvare
2008-07-09 17:22 ` Grant Likely
[not found] ` <fa686aa40807091022q22f6be99j89f311780bd3d369-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2008-07-10 16:36 ` Timur Tabi
2008-07-10 16:36 ` Timur Tabi
2008-07-11 18:12 ` Grant Likely
2008-07-11 18:45 ` Anton Vorontsov
2008-07-11 18:54 ` Grant Likely
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20080630230128.12482.79570.stgit@terra \
--to=jonsmirl@gmail.com \
--cc=Linuxppc-dev@ozlabs.org \
--cc=i2c@lm-sensors.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.