linux/drivers/of/of_i2c.c
<<
>>
Prefs
   1/*
   2 * OF helpers for the I2C API
   3 *
   4 * Copyright (c) 2008 Jochen Friedrich <jochen@scram.de>
   5 *
   6 * Based on a previous patch from Jon Smirl <jonsmirl@gmail.com>
   7 *
   8 * This program is free software; you can redistribute it and/or modify
   9 * it under the terms of the GNU General Public License as published by
  10 * the Free Software Foundation; either version 2 of the License, or
  11 * (at your option) any later version.
  12 */
  13
  14#include <linux/i2c.h>
  15#include <linux/of.h>
  16#include <linux/of_i2c.h>
  17#include <linux/module.h>
  18
  19void of_register_i2c_devices(struct i2c_adapter *adap,
  20                             struct device_node *adap_node)
  21{
  22        void *result;
  23        struct device_node *node;
  24
  25        for_each_child_of_node(adap_node, node) {
  26                struct i2c_board_info info = {};
  27                struct dev_archdata dev_ad = {};
  28                const u32 *addr;
  29                int len;
  30
  31                if (of_modalias_node(node, info.type, sizeof(info.type)) < 0)
  32                        continue;
  33
  34                addr = of_get_property(node, "reg", &len);
  35                if (!addr || len < sizeof(int) || *addr > (1 << 10) - 1) {
  36                        printk(KERN_ERR
  37                               "of-i2c: invalid i2c device entry\n");
  38                        continue;
  39                }
  40
  41                info.irq = irq_of_parse_and_map(node, 0);
  42
  43                info.addr = *addr;
  44
  45                dev_archdata_set_node(&dev_ad, node);
  46                info.archdata = &dev_ad;
  47
  48                request_module("%s", info.type);
  49
  50                result = i2c_new_device(adap, &info);
  51                if (result == NULL) {
  52                        printk(KERN_ERR
  53                               "of-i2c: Failed to load driver for %s\n",
  54                               info.type);
  55                        irq_dispose_mapping(info.irq);
  56                        continue;
  57                }
  58
  59                /*
  60                 * Get the node to not lose the dev_archdata->of_node.
  61                 * Currently there is no way to put it back, as well as no
  62                 * of_unregister_i2c_devices() call.
  63                 */
  64                of_node_get(node);
  65        }
  66}
  67EXPORT_SYMBOL(of_register_i2c_devices);
  68
  69static int of_dev_node_match(struct device *dev, void *data)
  70{
  71        return dev_archdata_get_node(&dev->archdata) == data;
  72}
  73
  74/* must call put_device() when done with returned i2c_client device */
  75struct i2c_client *of_find_i2c_device_by_node(struct device_node *node)
  76{
  77        struct device *dev;
  78
  79        dev = bus_find_device(&i2c_bus_type, NULL, node,
  80                                         of_dev_node_match);
  81        if (!dev)
  82                return NULL;
  83
  84        return to_i2c_client(dev);
  85}
  86EXPORT_SYMBOL(of_find_i2c_device_by_node);
  87
  88MODULE_LICENSE("GPL");
  89