0001
0002
0003
0004
0005
0006 #include <linux/export.h>
0007 #include <linux/i2c.h>
0008 #include <linux/kernel.h>
0009 #include <linux/property.h>
0010 #include <linux/rwsem.h>
0011 #include <linux/slab.h>
0012
0013 #include "i2c-core.h"
0014
0015
0016
0017
0018
0019 DECLARE_RWSEM(__i2c_board_lock);
0020 EXPORT_SYMBOL_GPL(__i2c_board_lock);
0021
0022 LIST_HEAD(__i2c_board_list);
0023 EXPORT_SYMBOL_GPL(__i2c_board_list);
0024
0025 int __i2c_first_dynamic_bus_num;
0026 EXPORT_SYMBOL_GPL(__i2c_first_dynamic_bus_num);
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051 int i2c_register_board_info(int busnum, struct i2c_board_info const *info, unsigned len)
0052 {
0053 int status;
0054
0055 down_write(&__i2c_board_lock);
0056
0057
0058 if (busnum >= __i2c_first_dynamic_bus_num)
0059 __i2c_first_dynamic_bus_num = busnum + 1;
0060
0061 for (status = 0; len; len--, info++) {
0062 struct i2c_devinfo *devinfo;
0063
0064 devinfo = kzalloc(sizeof(*devinfo), GFP_KERNEL);
0065 if (!devinfo) {
0066 pr_debug("i2c-core: can't register boardinfo!\n");
0067 status = -ENOMEM;
0068 break;
0069 }
0070
0071 devinfo->busnum = busnum;
0072 devinfo->board_info = *info;
0073
0074 if (info->resources) {
0075 devinfo->board_info.resources =
0076 kmemdup(info->resources,
0077 info->num_resources *
0078 sizeof(*info->resources),
0079 GFP_KERNEL);
0080 if (!devinfo->board_info.resources) {
0081 status = -ENOMEM;
0082 kfree(devinfo);
0083 break;
0084 }
0085 }
0086
0087 list_add_tail(&devinfo->list, &__i2c_board_list);
0088 }
0089
0090 up_write(&__i2c_board_lock);
0091
0092 return status;
0093 }