]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/i2c/i2c-core-of.c
Merge branch 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[linux.git] / drivers / i2c / i2c-core-of.c
index 15bd51eca37bed5562f322beb2590b1ab9160816..6cb7ad608bcd53d9c966752a342562208aa7617e 100644 (file)
 
 #include "i2c-core.h"
 
-static struct i2c_client *of_i2c_register_device(struct i2c_adapter *adap,
-                                                struct device_node *node)
+int of_i2c_get_board_info(struct device *dev, struct device_node *node,
+                         struct i2c_board_info *info)
 {
-       struct i2c_client *client;
-       struct i2c_board_info info = {};
        u32 addr;
        int ret;
 
-       dev_dbg(&adap->dev, "of_i2c: register %pOF\n", node);
+       memset(info, 0, sizeof(*info));
 
-       if (of_modalias_node(node, info.type, sizeof(info.type)) < 0) {
-               dev_err(&adap->dev, "of_i2c: modalias failure on %pOF\n",
-                       node);
-               return ERR_PTR(-EINVAL);
+       if (of_modalias_node(node, info->type, sizeof(info->type)) < 0) {
+               dev_err(dev, "of_i2c: modalias failure on %pOF\n", node);
+               return -EINVAL;
        }
 
        ret = of_property_read_u32(node, "reg", &addr);
        if (ret) {
-               dev_err(&adap->dev, "of_i2c: invalid reg on %pOF\n", node);
-               return ERR_PTR(ret);
+               dev_err(dev, "of_i2c: invalid reg on %pOF\n", node);
+               return ret;
        }
 
        if (addr & I2C_TEN_BIT_ADDRESS) {
                addr &= ~I2C_TEN_BIT_ADDRESS;
-               info.flags |= I2C_CLIENT_TEN;
+               info->flags |= I2C_CLIENT_TEN;
        }
 
        if (addr & I2C_OWN_SLAVE_ADDRESS) {
                addr &= ~I2C_OWN_SLAVE_ADDRESS;
-               info.flags |= I2C_CLIENT_SLAVE;
+               info->flags |= I2C_CLIENT_SLAVE;
        }
 
-       info.addr = addr;
-       info.of_node = of_node_get(node);
+       info->addr = addr;
+       info->of_node = node;
 
        if (of_property_read_bool(node, "host-notify"))
-               info.flags |= I2C_CLIENT_HOST_NOTIFY;
+               info->flags |= I2C_CLIENT_HOST_NOTIFY;
 
        if (of_get_property(node, "wakeup-source", NULL))
-               info.flags |= I2C_CLIENT_WAKE;
+               info->flags |= I2C_CLIENT_WAKE;
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(of_i2c_get_board_info);
+
+static struct i2c_client *of_i2c_register_device(struct i2c_adapter *adap,
+                                                struct device_node *node)
+{
+       struct i2c_client *client;
+       struct i2c_board_info info;
+       int ret;
+
+       dev_dbg(&adap->dev, "of_i2c: register %pOF\n", node);
+
+       ret = of_i2c_get_board_info(&adap->dev, node, &info);
+       if (ret)
+               return ERR_PTR(ret);
 
        client = i2c_new_device(adap, &info);
        if (!client) {
                dev_err(&adap->dev, "of_i2c: Failure registering %pOF\n", node);
-               of_node_put(node);
                return ERR_PTR(-EINVAL);
        }
        return client;