1/* The industrial I/O core 2 * 3 * Copyright (c) 2008 Jonathan Cameron 4 * 5 * This program is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 as published by 7 * the Free Software Foundation. 8 * 9 * Based on elements of hwmon and input subsystems. 10 */ 11 12#define pr_fmt(fmt) "iio-core: " fmt 13 14#include <linux/kernel.h> 15#include <linux/module.h> 16#include <linux/idr.h> 17#include <linux/kdev_t.h> 18#include <linux/err.h> 19#include <linux/device.h> 20#include <linux/fs.h> 21#include <linux/poll.h> 22#include <linux/sched.h> 23#include <linux/wait.h> 24#include <linux/cdev.h> 25#include <linux/slab.h> 26#include <linux/anon_inodes.h> 27#include <linux/debugfs.h> 28#include <linux/iio/iio.h> 29#include "iio_core.h" 30#include "iio_core_trigger.h" 31#include <linux/iio/sysfs.h> 32#include <linux/iio/events.h> 33#include <linux/iio/buffer.h> 34 35/* IDA to assign each registered device a unique id */ 36static DEFINE_IDA(iio_ida); 37 38static dev_t iio_devt; 39 40#define IIO_DEV_MAX 256 41struct bus_type iio_bus_type = { 42 .name = "iio", 43}; 44EXPORT_SYMBOL(iio_bus_type); 45 46static struct dentry *iio_debugfs_dentry; 47 48static const char * const iio_direction[] = { 49 [0] = "in", 50 [1] = "out", 51}; 52 53static const char * const iio_chan_type_name_spec[] = { 54 [IIO_VOLTAGE] = "voltage", 55 [IIO_CURRENT] = "current", 56 [IIO_POWER] = "power", 57 [IIO_ACCEL] = "accel", 58 [IIO_ANGL_VEL] = "anglvel", 59 [IIO_MAGN] = "magn", 60 [IIO_LIGHT] = "illuminance", 61 [IIO_INTENSITY] = "intensity", 62 [IIO_PROXIMITY] = "proximity", 63 [IIO_TEMP] = "temp", 64 [IIO_INCLI] = "incli", 65 [IIO_ROT] = "rot", 66 [IIO_ANGL] = "angl", 67 [IIO_TIMESTAMP] = "timestamp", 68 [IIO_CAPACITANCE] = "capacitance", 69 [IIO_ALTVOLTAGE] = "altvoltage", 70 [IIO_CCT] = "cct", 71 [IIO_PRESSURE] = "pressure", 72 [IIO_HUMIDITYRELATIVE] = "humidityrelative", 73 [IIO_ACTIVITY] = "activity", 74 [IIO_STEPS] = "steps", 75 [IIO_ENERGY] = "energy", 76 [IIO_DISTANCE] = "distance", 77 [IIO_VELOCITY] = "velocity", 78 [IIO_CONCENTRATION] = "concentration", 79 [IIO_RESISTANCE] = "resistance", 80}; 81 82static const char * const iio_modifier_names[] = { 83 [IIO_MOD_X] = "x", 84 [IIO_MOD_Y] = "y", 85 [IIO_MOD_Z] = "z", 86 [IIO_MOD_X_AND_Y] = "x&y", 87 [IIO_MOD_X_AND_Z] = "x&z", 88 [IIO_MOD_Y_AND_Z] = "y&z", 89 [IIO_MOD_X_AND_Y_AND_Z] = "x&y&z", 90 [IIO_MOD_X_OR_Y] = "x|y", 91 [IIO_MOD_X_OR_Z] = "x|z", 92 [IIO_MOD_Y_OR_Z] = "y|z", 93 [IIO_MOD_X_OR_Y_OR_Z] = "x|y|z", 94 [IIO_MOD_ROOT_SUM_SQUARED_X_Y] = "sqrt(x^2+y^2)", 95 [IIO_MOD_SUM_SQUARED_X_Y_Z] = "x^2+y^2+z^2", 96 [IIO_MOD_LIGHT_BOTH] = "both", 97 [IIO_MOD_LIGHT_IR] = "ir", 98 [IIO_MOD_LIGHT_CLEAR] = "clear", 99 [IIO_MOD_LIGHT_RED] = "red", 100 [IIO_MOD_LIGHT_GREEN] = "green", 101 [IIO_MOD_LIGHT_BLUE] = "blue", 102 [IIO_MOD_QUATERNION] = "quaternion", 103 [IIO_MOD_TEMP_AMBIENT] = "ambient", 104 [IIO_MOD_TEMP_OBJECT] = "object", 105 [IIO_MOD_NORTH_MAGN] = "from_north_magnetic", 106 [IIO_MOD_NORTH_TRUE] = "from_north_true", 107 [IIO_MOD_NORTH_MAGN_TILT_COMP] = "from_north_magnetic_tilt_comp", 108 [IIO_MOD_NORTH_TRUE_TILT_COMP] = "from_north_true_tilt_comp", 109 [IIO_MOD_RUNNING] = "running", 110 [IIO_MOD_JOGGING] = "jogging", 111 [IIO_MOD_WALKING] = "walking", 112 [IIO_MOD_STILL] = "still", 113 [IIO_MOD_ROOT_SUM_SQUARED_X_Y_Z] = "sqrt(x^2+y^2+z^2)", 114 [IIO_MOD_I] = "i", 115 [IIO_MOD_Q] = "q", 116 [IIO_MOD_CO2] = "co2", 117 [IIO_MOD_VOC] = "voc", 118}; 119 120/* relies on pairs of these shared then separate */ 121static const char * const iio_chan_info_postfix[] = { 122 [IIO_CHAN_INFO_RAW] = "raw", 123 [IIO_CHAN_INFO_PROCESSED] = "input", 124 [IIO_CHAN_INFO_SCALE] = "scale", 125 [IIO_CHAN_INFO_OFFSET] = "offset", 126 [IIO_CHAN_INFO_CALIBSCALE] = "calibscale", 127 [IIO_CHAN_INFO_CALIBBIAS] = "calibbias", 128 [IIO_CHAN_INFO_PEAK] = "peak_raw", 129 [IIO_CHAN_INFO_PEAK_SCALE] = "peak_scale", 130 [IIO_CHAN_INFO_QUADRATURE_CORRECTION_RAW] = "quadrature_correction_raw", 131 [IIO_CHAN_INFO_AVERAGE_RAW] = "mean_raw", 132 [IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY] 133 = "filter_low_pass_3db_frequency", 134 [IIO_CHAN_INFO_HIGH_PASS_FILTER_3DB_FREQUENCY] 135 = "filter_high_pass_3db_frequency", 136 [IIO_CHAN_INFO_SAMP_FREQ] = "sampling_frequency", 137 [IIO_CHAN_INFO_FREQUENCY] = "frequency", 138 [IIO_CHAN_INFO_PHASE] = "phase", 139 [IIO_CHAN_INFO_HARDWAREGAIN] = "hardwaregain", 140 [IIO_CHAN_INFO_HYSTERESIS] = "hysteresis", 141 [IIO_CHAN_INFO_INT_TIME] = "integration_time", 142 [IIO_CHAN_INFO_ENABLE] = "en", 143 [IIO_CHAN_INFO_CALIBHEIGHT] = "calibheight", 144 [IIO_CHAN_INFO_CALIBWEIGHT] = "calibweight", 145 [IIO_CHAN_INFO_DEBOUNCE_COUNT] = "debounce_count", 146 [IIO_CHAN_INFO_DEBOUNCE_TIME] = "debounce_time", 147 [IIO_CHAN_INFO_CALIBEMISSIVITY] = "calibemissivity", 148 [IIO_CHAN_INFO_OVERSAMPLING_RATIO] = "oversampling_ratio", 149}; 150 151/** 152 * iio_find_channel_from_si() - get channel from its scan index 153 * @indio_dev: device 154 * @si: scan index to match 155 */ 156const struct iio_chan_spec 157*iio_find_channel_from_si(struct iio_dev *indio_dev, int si) 158{ 159 int i; 160 161 for (i = 0; i < indio_dev->num_channels; i++) 162 if (indio_dev->channels[i].scan_index == si) 163 return &indio_dev->channels[i]; 164 return NULL; 165} 166 167/* This turns up an awful lot */ 168ssize_t iio_read_const_attr(struct device *dev, 169 struct device_attribute *attr, 170 char *buf) 171{ 172 return sprintf(buf, "%s\n", to_iio_const_attr(attr)->string); 173} 174EXPORT_SYMBOL(iio_read_const_attr); 175 176static int __init iio_init(void) 177{ 178 int ret; 179 180 /* Register sysfs bus */ 181 ret = bus_register(&iio_bus_type); 182 if (ret < 0) { 183 pr_err("could not register bus type\n"); 184 goto error_nothing; 185 } 186 187 ret = alloc_chrdev_region(&iio_devt, 0, IIO_DEV_MAX, "iio"); 188 if (ret < 0) { 189 pr_err("failed to allocate char dev region\n"); 190 goto error_unregister_bus_type; 191 } 192 193 iio_debugfs_dentry = debugfs_create_dir("iio", NULL); 194 195 return 0; 196 197error_unregister_bus_type: 198 bus_unregister(&iio_bus_type); 199error_nothing: 200 return ret; 201} 202 203static void __exit iio_exit(void) 204{ 205 if (iio_devt) 206 unregister_chrdev_region(iio_devt, IIO_DEV_MAX); 207 bus_unregister(&iio_bus_type); 208 debugfs_remove(iio_debugfs_dentry); 209} 210 211#if defined(CONFIG_DEBUG_FS) 212static ssize_t iio_debugfs_read_reg(struct file *file, char __user *userbuf, 213 size_t count, loff_t *ppos) 214{ 215 struct iio_dev *indio_dev = file->private_data; 216 char buf[20]; 217 unsigned val = 0; 218 ssize_t len; 219 int ret; 220 221 ret = indio_dev->info->debugfs_reg_access(indio_dev, 222 indio_dev->cached_reg_addr, 223 0, &val); 224 if (ret) 225 dev_err(indio_dev->dev.parent, "%s: read failed\n", __func__); 226 227 len = snprintf(buf, sizeof(buf), "0x%X\n", val); 228 229 return simple_read_from_buffer(userbuf, count, ppos, buf, len); 230} 231 232static ssize_t iio_debugfs_write_reg(struct file *file, 233 const char __user *userbuf, size_t count, loff_t *ppos) 234{ 235 struct iio_dev *indio_dev = file->private_data; 236 unsigned reg, val; 237 char buf[80]; 238 int ret; 239 240 count = min_t(size_t, count, (sizeof(buf)-1)); 241 if (copy_from_user(buf, userbuf, count)) 242 return -EFAULT; 243 244 buf[count] = 0; 245 246 ret = sscanf(buf, "%i %i", ®, &val); 247 248 switch (ret) { 249 case 1: 250 indio_dev->cached_reg_addr = reg; 251 break; 252 case 2: 253 indio_dev->cached_reg_addr = reg; 254 ret = indio_dev->info->debugfs_reg_access(indio_dev, reg, 255 val, NULL); 256 if (ret) { 257 dev_err(indio_dev->dev.parent, "%s: write failed\n", 258 __func__); 259 return ret; 260 } 261 break; 262 default: 263 return -EINVAL; 264 } 265 266 return count; 267} 268 269static const struct file_operations iio_debugfs_reg_fops = { 270 .open = simple_open, 271 .read = iio_debugfs_read_reg, 272 .write = iio_debugfs_write_reg, 273}; 274 275static void iio_device_unregister_debugfs(struct iio_dev *indio_dev) 276{ 277 debugfs_remove_recursive(indio_dev->debugfs_dentry); 278} 279 280static int iio_device_register_debugfs(struct iio_dev *indio_dev) 281{ 282 struct dentry *d; 283 284 if (indio_dev->info->debugfs_reg_access == NULL) 285 return 0; 286 287 if (!iio_debugfs_dentry) 288 return 0; 289 290 indio_dev->debugfs_dentry = 291 debugfs_create_dir(dev_name(&indio_dev->dev), 292 iio_debugfs_dentry); 293 if (indio_dev->debugfs_dentry == NULL) { 294 dev_warn(indio_dev->dev.parent, 295 "Failed to create debugfs directory\n"); 296 return -EFAULT; 297 } 298 299 d = debugfs_create_file("direct_reg_access", 0644, 300 indio_dev->debugfs_dentry, 301 indio_dev, &iio_debugfs_reg_fops); 302 if (!d) { 303 iio_device_unregister_debugfs(indio_dev); 304 return -ENOMEM; 305 } 306 307 return 0; 308} 309#else 310static int iio_device_register_debugfs(struct iio_dev *indio_dev) 311{ 312 return 0; 313} 314 315static void iio_device_unregister_debugfs(struct iio_dev *indio_dev) 316{ 317} 318#endif /* CONFIG_DEBUG_FS */ 319 320static ssize_t iio_read_channel_ext_info(struct device *dev, 321 struct device_attribute *attr, 322 char *buf) 323{ 324 struct iio_dev *indio_dev = dev_to_iio_dev(dev); 325 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); 326 const struct iio_chan_spec_ext_info *ext_info; 327 328 ext_info = &this_attr->c->ext_info[this_attr->address]; 329 330 return ext_info->read(indio_dev, ext_info->private, this_attr->c, buf); 331} 332 333static ssize_t iio_write_channel_ext_info(struct device *dev, 334 struct device_attribute *attr, 335 const char *buf, 336 size_t len) 337{ 338 struct iio_dev *indio_dev = dev_to_iio_dev(dev); 339 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); 340 const struct iio_chan_spec_ext_info *ext_info; 341 342 ext_info = &this_attr->c->ext_info[this_attr->address]; 343 344 return ext_info->write(indio_dev, ext_info->private, 345 this_attr->c, buf, len); 346} 347 348ssize_t iio_enum_available_read(struct iio_dev *indio_dev, 349 uintptr_t priv, const struct iio_chan_spec *chan, char *buf) 350{ 351 const struct iio_enum *e = (const struct iio_enum *)priv; 352 unsigned int i; 353 size_t len = 0; 354 355 if (!e->num_items) 356 return 0; 357 358 for (i = 0; i < e->num_items; ++i) 359 len += scnprintf(buf + len, PAGE_SIZE - len, "%s ", e->items[i]); 360 361 /* replace last space with a newline */ 362 buf[len - 1] = '\n'; 363 364 return len; 365} 366EXPORT_SYMBOL_GPL(iio_enum_available_read); 367 368ssize_t iio_enum_read(struct iio_dev *indio_dev, 369 uintptr_t priv, const struct iio_chan_spec *chan, char *buf) 370{ 371 const struct iio_enum *e = (const struct iio_enum *)priv; 372 int i; 373 374 if (!e->get) 375 return -EINVAL; 376 377 i = e->get(indio_dev, chan); 378 if (i < 0) 379 return i; 380 else if (i >= e->num_items) 381 return -EINVAL; 382 383 return snprintf(buf, PAGE_SIZE, "%s\n", e->items[i]); 384} 385EXPORT_SYMBOL_GPL(iio_enum_read); 386 387ssize_t iio_enum_write(struct iio_dev *indio_dev, 388 uintptr_t priv, const struct iio_chan_spec *chan, const char *buf, 389 size_t len) 390{ 391 const struct iio_enum *e = (const struct iio_enum *)priv; 392 unsigned int i; 393 int ret; 394 395 if (!e->set) 396 return -EINVAL; 397 398 for (i = 0; i < e->num_items; i++) { 399 if (sysfs_streq(buf, e->items[i])) 400 break; 401 } 402 403 if (i == e->num_items) 404 return -EINVAL; 405 406 ret = e->set(indio_dev, chan, i); 407 return ret ? ret : len; 408} 409EXPORT_SYMBOL_GPL(iio_enum_write); 410 411/** 412 * iio_format_value() - Formats a IIO value into its string representation 413 * @buf: The buffer to which the formatted value gets written 414 * @type: One of the IIO_VAL_... constants. This decides how the val 415 * and val2 parameters are formatted. 416 * @size: Number of IIO value entries contained in vals 417 * @vals: Pointer to the values, exact meaning depends on the 418 * type parameter. 419 * 420 * Return: 0 by default, a negative number on failure or the 421 * total number of characters written for a type that belongs 422 * to the IIO_VAL_... constant. 423 */ 424ssize_t iio_format_value(char *buf, unsigned int type, int size, int *vals) 425{ 426 unsigned long long tmp; 427 bool scale_db = false; 428 429 switch (type) { 430 case IIO_VAL_INT: 431 return sprintf(buf, "%d\n", vals[0]); 432 case IIO_VAL_INT_PLUS_MICRO_DB: 433 scale_db = true; 434 case IIO_VAL_INT_PLUS_MICRO: 435 if (vals[1] < 0) 436 return sprintf(buf, "-%ld.%06u%s\n", abs(vals[0]), 437 -vals[1], 438 scale_db ? " dB" : ""); 439 else 440 return sprintf(buf, "%d.%06u%s\n", vals[0], vals[1], 441 scale_db ? " dB" : ""); 442 case IIO_VAL_INT_PLUS_NANO: 443 if (vals[1] < 0) 444 return sprintf(buf, "-%ld.%09u\n", abs(vals[0]), 445 -vals[1]); 446 else 447 return sprintf(buf, "%d.%09u\n", vals[0], vals[1]); 448 case IIO_VAL_FRACTIONAL: 449 tmp = div_s64((s64)vals[0] * 1000000000LL, vals[1]); 450 vals[1] = do_div(tmp, 1000000000LL); 451 vals[0] = tmp; 452 return sprintf(buf, "%d.%09u\n", vals[0], vals[1]); 453 case IIO_VAL_FRACTIONAL_LOG2: 454 tmp = (s64)vals[0] * 1000000000LL >> vals[1]; 455 vals[1] = do_div(tmp, 1000000000LL); 456 vals[0] = tmp; 457 return sprintf(buf, "%d.%09u\n", vals[0], vals[1]); 458 case IIO_VAL_INT_MULTIPLE: 459 { 460 int i; 461 int len = 0; 462 463 for (i = 0; i < size; ++i) 464 len += snprintf(&buf[len], PAGE_SIZE - len, "%d ", 465 vals[i]); 466 len += snprintf(&buf[len], PAGE_SIZE - len, "\n"); 467 return len; 468 } 469 default: 470 return 0; 471 } 472} 473 474static ssize_t iio_read_channel_info(struct device *dev, 475 struct device_attribute *attr, 476 char *buf) 477{ 478 struct iio_dev *indio_dev = dev_to_iio_dev(dev); 479 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); 480 int vals[INDIO_MAX_RAW_ELEMENTS]; 481 int ret; 482 int val_len = 2; 483 484 if (indio_dev->info->read_raw_multi) 485 ret = indio_dev->info->read_raw_multi(indio_dev, this_attr->c, 486 INDIO_MAX_RAW_ELEMENTS, 487 vals, &val_len, 488 this_attr->address); 489 else 490 ret = indio_dev->info->read_raw(indio_dev, this_attr->c, 491 &vals[0], &vals[1], this_attr->address); 492 493 if (ret < 0) 494 return ret; 495 496 return iio_format_value(buf, ret, val_len, vals); 497} 498 499/** 500 * iio_str_to_fixpoint() - Parse a fixed-point number from a string 501 * @str: The string to parse 502 * @fract_mult: Multiplier for the first decimal place, should be a power of 10 503 * @integer: The integer part of the number 504 * @fract: The fractional part of the number 505 * 506 * Returns 0 on success, or a negative error code if the string could not be 507 * parsed. 508 */ 509int iio_str_to_fixpoint(const char *str, int fract_mult, 510 int *integer, int *fract) 511{ 512 int i = 0, f = 0; 513 bool integer_part = true, negative = false; 514 515 if (str[0] == '-') { 516 negative = true; 517 str++; 518 } else if (str[0] == '+') { 519 str++; 520 } 521 522 while (*str) { 523 if ('0' <= *str && *str <= '9') { 524 if (integer_part) { 525 i = i * 10 + *str - '0'; 526 } else { 527 f += fract_mult * (*str - '0'); 528 fract_mult /= 10; 529 } 530 } else if (*str == '\n') { 531 if (*(str + 1) == '\0') 532 break; 533 else 534 return -EINVAL; 535 } else if (*str == '.' && integer_part) { 536 integer_part = false; 537 } else { 538 return -EINVAL; 539 } 540 str++; 541 } 542 543 if (negative) { 544 if (i) 545 i = -i; 546 else 547 f = -f; 548 } 549 550 *integer = i; 551 *fract = f; 552 553 return 0; 554} 555EXPORT_SYMBOL_GPL(iio_str_to_fixpoint); 556 557static ssize_t iio_write_channel_info(struct device *dev, 558 struct device_attribute *attr, 559 const char *buf, 560 size_t len) 561{ 562 struct iio_dev *indio_dev = dev_to_iio_dev(dev); 563 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); 564 int ret, fract_mult = 100000; 565 int integer, fract; 566 567 /* Assumes decimal - precision based on number of digits */ 568 if (!indio_dev->info->write_raw) 569 return -EINVAL; 570 571 if (indio_dev->info->write_raw_get_fmt) 572 switch (indio_dev->info->write_raw_get_fmt(indio_dev, 573 this_attr->c, this_attr->address)) { 574 case IIO_VAL_INT_PLUS_MICRO: 575 fract_mult = 100000; 576 break; 577 case IIO_VAL_INT_PLUS_NANO: 578 fract_mult = 100000000; 579 break; 580 default: 581 return -EINVAL; 582 } 583 584 ret = iio_str_to_fixpoint(buf, fract_mult, &integer, &fract); 585 if (ret) 586 return ret; 587 588 ret = indio_dev->info->write_raw(indio_dev, this_attr->c, 589 integer, fract, this_attr->address); 590 if (ret) 591 return ret; 592 593 return len; 594} 595 596static 597int __iio_device_attr_init(struct device_attribute *dev_attr, 598 const char *postfix, 599 struct iio_chan_spec const *chan, 600 ssize_t (*readfunc)(struct device *dev, 601 struct device_attribute *attr, 602 char *buf), 603 ssize_t (*writefunc)(struct device *dev, 604 struct device_attribute *attr, 605 const char *buf, 606 size_t len), 607 enum iio_shared_by shared_by) 608{ 609 int ret = 0; 610 char *name = NULL; 611 char *full_postfix; 612 sysfs_attr_init(&dev_attr->attr); 613 614 /* Build up postfix of <extend_name>_<modifier>_postfix */ 615 if (chan->modified && (shared_by == IIO_SEPARATE)) { 616 if (chan->extend_name) 617 full_postfix = kasprintf(GFP_KERNEL, "%s_%s_%s", 618 iio_modifier_names[chan 619 ->channel2], 620 chan->extend_name, 621 postfix); 622 else 623 full_postfix = kasprintf(GFP_KERNEL, "%s_%s", 624 iio_modifier_names[chan 625 ->channel2], 626 postfix); 627 } else { 628 if (chan->extend_name == NULL || shared_by != IIO_SEPARATE) 629 full_postfix = kstrdup(postfix, GFP_KERNEL); 630 else 631 full_postfix = kasprintf(GFP_KERNEL, 632 "%s_%s", 633 chan->extend_name, 634 postfix); 635 } 636 if (full_postfix == NULL) 637 return -ENOMEM; 638 639 if (chan->differential) { /* Differential can not have modifier */ 640 switch (shared_by) { 641 case IIO_SHARED_BY_ALL: 642 name = kasprintf(GFP_KERNEL, "%s", full_postfix); 643 break; 644 case IIO_SHARED_BY_DIR: 645 name = kasprintf(GFP_KERNEL, "%s_%s", 646 iio_direction[chan->output], 647 full_postfix); 648 break; 649 case IIO_SHARED_BY_TYPE: 650 name = kasprintf(GFP_KERNEL, "%s_%s-%s_%s", 651 iio_direction[chan->output], 652 iio_chan_type_name_spec[chan->type], 653 iio_chan_type_name_spec[chan->type], 654 full_postfix); 655 break; 656 case IIO_SEPARATE: 657 if (!chan->indexed) { 658 WARN(1, "Differential channels must be indexed\n"); 659 ret = -EINVAL; 660 goto error_free_full_postfix; 661 } 662 name = kasprintf(GFP_KERNEL, 663 "%s_%s%d-%s%d_%s", 664 iio_direction[chan->output], 665 iio_chan_type_name_spec[chan->type], 666 chan->channel, 667 iio_chan_type_name_spec[chan->type], 668 chan->channel2, 669 full_postfix); 670 break; 671 } 672 } else { /* Single ended */ 673 switch (shared_by) { 674 case IIO_SHARED_BY_ALL: 675 name = kasprintf(GFP_KERNEL, "%s", full_postfix); 676 break; 677 case IIO_SHARED_BY_DIR: 678 name = kasprintf(GFP_KERNEL, "%s_%s", 679 iio_direction[chan->output], 680 full_postfix); 681 break; 682 case IIO_SHARED_BY_TYPE: 683 name = kasprintf(GFP_KERNEL, "%s_%s_%s", 684 iio_direction[chan->output], 685 iio_chan_type_name_spec[chan->type], 686 full_postfix); 687 break; 688 689 case IIO_SEPARATE: 690 if (chan->indexed) 691 name = kasprintf(GFP_KERNEL, "%s_%s%d_%s", 692 iio_direction[chan->output], 693 iio_chan_type_name_spec[chan->type], 694 chan->channel, 695 full_postfix); 696 else 697 name = kasprintf(GFP_KERNEL, "%s_%s_%s", 698 iio_direction[chan->output], 699 iio_chan_type_name_spec[chan->type], 700 full_postfix); 701 break; 702 } 703 } 704 if (name == NULL) { 705 ret = -ENOMEM; 706 goto error_free_full_postfix; 707 } 708 dev_attr->attr.name = name; 709 710 if (readfunc) { 711 dev_attr->attr.mode |= S_IRUGO; 712 dev_attr->show = readfunc; 713 } 714 715 if (writefunc) { 716 dev_attr->attr.mode |= S_IWUSR; 717 dev_attr->store = writefunc; 718 } 719 720error_free_full_postfix: 721 kfree(full_postfix); 722 723 return ret; 724} 725 726static void __iio_device_attr_deinit(struct device_attribute *dev_attr) 727{ 728 kfree(dev_attr->attr.name); 729} 730 731int __iio_add_chan_devattr(const char *postfix, 732 struct iio_chan_spec const *chan, 733 ssize_t (*readfunc)(struct device *dev, 734 struct device_attribute *attr, 735 char *buf), 736 ssize_t (*writefunc)(struct device *dev, 737 struct device_attribute *attr, 738 const char *buf, 739 size_t len), 740 u64 mask, 741 enum iio_shared_by shared_by, 742 struct device *dev, 743 struct list_head *attr_list) 744{ 745 int ret; 746 struct iio_dev_attr *iio_attr, *t; 747 748 iio_attr = kzalloc(sizeof(*iio_attr), GFP_KERNEL); 749 if (iio_attr == NULL) 750 return -ENOMEM; 751 ret = __iio_device_attr_init(&iio_attr->dev_attr, 752 postfix, chan, 753 readfunc, writefunc, shared_by); 754 if (ret) 755 goto error_iio_dev_attr_free; 756 iio_attr->c = chan; 757 iio_attr->address = mask; 758 list_for_each_entry(t, attr_list, l) 759 if (strcmp(t->dev_attr.attr.name, 760 iio_attr->dev_attr.attr.name) == 0) { 761 if (shared_by == IIO_SEPARATE) 762 dev_err(dev, "tried to double register : %s\n", 763 t->dev_attr.attr.name); 764 ret = -EBUSY; 765 goto error_device_attr_deinit; 766 } 767 list_add(&iio_attr->l, attr_list); 768 769 return 0; 770 771error_device_attr_deinit: 772 __iio_device_attr_deinit(&iio_attr->dev_attr); 773error_iio_dev_attr_free: 774 kfree(iio_attr); 775 return ret; 776} 777 778static int iio_device_add_info_mask_type(struct iio_dev *indio_dev, 779 struct iio_chan_spec const *chan, 780 enum iio_shared_by shared_by, 781 const long *infomask) 782{ 783 int i, ret, attrcount = 0; 784 785 for_each_set_bit(i, infomask, sizeof(infomask)*8) { 786 if (i >= ARRAY_SIZE(iio_chan_info_postfix)) 787 return -EINVAL; 788 ret = __iio_add_chan_devattr(iio_chan_info_postfix[i], 789 chan, 790 &iio_read_channel_info, 791 &iio_write_channel_info, 792 i, 793 shared_by, 794 &indio_dev->dev, 795 &indio_dev->channel_attr_list); 796 if ((ret == -EBUSY) && (shared_by != IIO_SEPARATE)) 797 continue; 798 else if (ret < 0) 799 return ret; 800 attrcount++; 801 } 802 803 return attrcount; 804} 805 806static int iio_device_add_channel_sysfs(struct iio_dev *indio_dev, 807 struct iio_chan_spec const *chan) 808{ 809 int ret, attrcount = 0; 810 const struct iio_chan_spec_ext_info *ext_info; 811 812 if (chan->channel < 0) 813 return 0; 814 ret = iio_device_add_info_mask_type(indio_dev, chan, 815 IIO_SEPARATE, 816 &chan->info_mask_separate); 817 if (ret < 0) 818 return ret; 819 attrcount += ret; 820 821 ret = iio_device_add_info_mask_type(indio_dev, chan, 822 IIO_SHARED_BY_TYPE, 823 &chan->info_mask_shared_by_type); 824 if (ret < 0) 825 return ret; 826 attrcount += ret; 827 828 ret = iio_device_add_info_mask_type(indio_dev, chan, 829 IIO_SHARED_BY_DIR, 830 &chan->info_mask_shared_by_dir); 831 if (ret < 0) 832 return ret; 833 attrcount += ret; 834 835 ret = iio_device_add_info_mask_type(indio_dev, chan, 836 IIO_SHARED_BY_ALL, 837 &chan->info_mask_shared_by_all); 838 if (ret < 0) 839 return ret; 840 attrcount += ret; 841 842 if (chan->ext_info) { 843 unsigned int i = 0; 844 for (ext_info = chan->ext_info; ext_info->name; ext_info++) { 845 ret = __iio_add_chan_devattr(ext_info->name, 846 chan, 847 ext_info->read ? 848 &iio_read_channel_ext_info : NULL, 849 ext_info->write ? 850 &iio_write_channel_ext_info : NULL, 851 i, 852 ext_info->shared, 853 &indio_dev->dev, 854 &indio_dev->channel_attr_list); 855 i++; 856 if (ret == -EBUSY && ext_info->shared) 857 continue; 858 859 if (ret) 860 return ret; 861 862 attrcount++; 863 } 864 } 865 866 return attrcount; 867} 868 869/** 870 * iio_free_chan_devattr_list() - Free a list of IIO device attributes 871 * @attr_list: List of IIO device attributes 872 * 873 * This function frees the memory allocated for each of the IIO device 874 * attributes in the list. 875 */ 876void iio_free_chan_devattr_list(struct list_head *attr_list) 877{ 878 struct iio_dev_attr *p, *n; 879 880 list_for_each_entry_safe(p, n, attr_list, l) { 881 kfree(p->dev_attr.attr.name); 882 list_del(&p->l); 883 kfree(p); 884 } 885} 886 887static ssize_t iio_show_dev_name(struct device *dev, 888 struct device_attribute *attr, 889 char *buf) 890{ 891 struct iio_dev *indio_dev = dev_to_iio_dev(dev); 892 return snprintf(buf, PAGE_SIZE, "%s\n", indio_dev->name); 893} 894 895static DEVICE_ATTR(name, S_IRUGO, iio_show_dev_name, NULL); 896 897static int iio_device_register_sysfs(struct iio_dev *indio_dev) 898{ 899 int i, ret = 0, attrcount, attrn, attrcount_orig = 0; 900 struct iio_dev_attr *p; 901 struct attribute **attr; 902 903 /* First count elements in any existing group */ 904 if (indio_dev->info->attrs) { 905 attr = indio_dev->info->attrs->attrs; 906 while (*attr++ != NULL) 907 attrcount_orig++; 908 } 909 attrcount = attrcount_orig; 910 /* 911 * New channel registration method - relies on the fact a group does 912 * not need to be initialized if its name is NULL. 913 */ 914 if (indio_dev->channels) 915 for (i = 0; i < indio_dev->num_channels; i++) { 916 ret = iio_device_add_channel_sysfs(indio_dev, 917 &indio_dev 918 ->channels[i]); 919 if (ret < 0) 920 goto error_clear_attrs; 921 attrcount += ret; 922 } 923 924 if (indio_dev->name) 925 attrcount++; 926 927 indio_dev->chan_attr_group.attrs = kcalloc(attrcount + 1, 928 sizeof(indio_dev->chan_attr_group.attrs[0]), 929 GFP_KERNEL); 930 if (indio_dev->chan_attr_group.attrs == NULL) { 931 ret = -ENOMEM; 932 goto error_clear_attrs; 933 } 934 /* Copy across original attributes */ 935 if (indio_dev->info->attrs) 936 memcpy(indio_dev->chan_attr_group.attrs, 937 indio_dev->info->attrs->attrs, 938 sizeof(indio_dev->chan_attr_group.attrs[0]) 939 *attrcount_orig); 940 attrn = attrcount_orig; 941 /* Add all elements from the list. */ 942 list_for_each_entry(p, &indio_dev->channel_attr_list, l) 943 indio_dev->chan_attr_group.attrs[attrn++] = &p->dev_attr.attr; 944 if (indio_dev->name) 945 indio_dev->chan_attr_group.attrs[attrn++] = &dev_attr_name.attr; 946 947 indio_dev->groups[indio_dev->groupcounter++] = 948 &indio_dev->chan_attr_group; 949 950 return 0; 951 952error_clear_attrs: 953 iio_free_chan_devattr_list(&indio_dev->channel_attr_list); 954 955 return ret; 956} 957 958static void iio_device_unregister_sysfs(struct iio_dev *indio_dev) 959{ 960 961 iio_free_chan_devattr_list(&indio_dev->channel_attr_list); 962 kfree(indio_dev->chan_attr_group.attrs); 963 indio_dev->chan_attr_group.attrs = NULL; 964} 965 966static void iio_dev_release(struct device *device) 967{ 968 struct iio_dev *indio_dev = dev_to_iio_dev(device); 969 if (indio_dev->modes & (INDIO_BUFFER_TRIGGERED | INDIO_EVENT_TRIGGERED)) 970 iio_device_unregister_trigger_consumer(indio_dev); 971 iio_device_unregister_eventset(indio_dev); 972 iio_device_unregister_sysfs(indio_dev); 973 974 iio_buffer_put(indio_dev->buffer); 975 976 ida_simple_remove(&iio_ida, indio_dev->id); 977 kfree(indio_dev); 978} 979 980struct device_type iio_device_type = { 981 .name = "iio_device", 982 .release = iio_dev_release, 983}; 984 985/** 986 * iio_device_alloc() - allocate an iio_dev from a driver 987 * @sizeof_priv: Space to allocate for private structure. 988 **/ 989struct iio_dev *iio_device_alloc(int sizeof_priv) 990{ 991 struct iio_dev *dev; 992 size_t alloc_size; 993 994 alloc_size = sizeof(struct iio_dev); 995 if (sizeof_priv) { 996 alloc_size = ALIGN(alloc_size, IIO_ALIGN); 997 alloc_size += sizeof_priv; 998 } 999 /* ensure 32-byte alignment of whole construct ? */ 1000 alloc_size += IIO_ALIGN - 1; 1001 1002 dev = kzalloc(alloc_size, GFP_KERNEL); 1003 1004 if (dev) { 1005 dev->dev.groups = dev->groups; 1006 dev->dev.type = &iio_device_type; 1007 dev->dev.bus = &iio_bus_type; 1008 device_initialize(&dev->dev); 1009 dev_set_drvdata(&dev->dev, (void *)dev); 1010 mutex_init(&dev->mlock); 1011 mutex_init(&dev->info_exist_lock); 1012 INIT_LIST_HEAD(&dev->channel_attr_list); 1013 1014 dev->id = ida_simple_get(&iio_ida, 0, 0, GFP_KERNEL); 1015 if (dev->id < 0) { 1016 /* cannot use a dev_err as the name isn't available */ 1017 pr_err("failed to get device id\n"); 1018 kfree(dev); 1019 return NULL; 1020 } 1021 dev_set_name(&dev->dev, "iio:device%d", dev->id); 1022 INIT_LIST_HEAD(&dev->buffer_list); 1023 } 1024 1025 return dev; 1026} 1027EXPORT_SYMBOL(iio_device_alloc); 1028 1029/** 1030 * iio_device_free() - free an iio_dev from a driver 1031 * @dev: the iio_dev associated with the device 1032 **/ 1033void iio_device_free(struct iio_dev *dev) 1034{ 1035 if (dev) 1036 put_device(&dev->dev); 1037} 1038EXPORT_SYMBOL(iio_device_free); 1039 1040static void devm_iio_device_release(struct device *dev, void *res) 1041{ 1042 iio_device_free(*(struct iio_dev **)res); 1043} 1044 1045static int devm_iio_device_match(struct device *dev, void *res, void *data) 1046{ 1047 struct iio_dev **r = res; 1048 if (!r || !*r) { 1049 WARN_ON(!r || !*r); 1050 return 0; 1051 } 1052 return *r == data; 1053} 1054 1055/** 1056 * devm_iio_device_alloc - Resource-managed iio_device_alloc() 1057 * @dev: Device to allocate iio_dev for 1058 * @sizeof_priv: Space to allocate for private structure. 1059 * 1060 * Managed iio_device_alloc. iio_dev allocated with this function is 1061 * automatically freed on driver detach. 1062 * 1063 * If an iio_dev allocated with this function needs to be freed separately, 1064 * devm_iio_device_free() must be used. 1065 * 1066 * RETURNS: 1067 * Pointer to allocated iio_dev on success, NULL on failure. 1068 */ 1069struct iio_dev *devm_iio_device_alloc(struct device *dev, int sizeof_priv) 1070{ 1071 struct iio_dev **ptr, *iio_dev; 1072 1073 ptr = devres_alloc(devm_iio_device_release, sizeof(*ptr), 1074 GFP_KERNEL); 1075 if (!ptr) 1076 return NULL; 1077 1078 iio_dev = iio_device_alloc(sizeof_priv); 1079 if (iio_dev) { 1080 *ptr = iio_dev; 1081 devres_add(dev, ptr); 1082 } else { 1083 devres_free(ptr); 1084 } 1085 1086 return iio_dev; 1087} 1088EXPORT_SYMBOL_GPL(devm_iio_device_alloc); 1089 1090/** 1091 * devm_iio_device_free - Resource-managed iio_device_free() 1092 * @dev: Device this iio_dev belongs to 1093 * @iio_dev: the iio_dev associated with the device 1094 * 1095 * Free iio_dev allocated with devm_iio_device_alloc(). 1096 */ 1097void devm_iio_device_free(struct device *dev, struct iio_dev *iio_dev) 1098{ 1099 int rc; 1100 1101 rc = devres_release(dev, devm_iio_device_release, 1102 devm_iio_device_match, iio_dev); 1103 WARN_ON(rc); 1104} 1105EXPORT_SYMBOL_GPL(devm_iio_device_free); 1106 1107/** 1108 * iio_chrdev_open() - chrdev file open for buffer access and ioctls 1109 * @inode: Inode structure for identifying the device in the file system 1110 * @filp: File structure for iio device used to keep and later access 1111 * private data 1112 * 1113 * Return: 0 on success or -EBUSY if the device is already opened 1114 **/ 1115static int iio_chrdev_open(struct inode *inode, struct file *filp) 1116{ 1117 struct iio_dev *indio_dev = container_of(inode->i_cdev, 1118 struct iio_dev, chrdev); 1119 1120 if (test_and_set_bit(IIO_BUSY_BIT_POS, &indio_dev->flags)) 1121 return -EBUSY; 1122 1123 iio_device_get(indio_dev); 1124 1125 filp->private_data = indio_dev; 1126 1127 return 0; 1128} 1129 1130/** 1131 * iio_chrdev_release() - chrdev file close buffer access and ioctls 1132 * @inode: Inode structure pointer for the char device 1133 * @filp: File structure pointer for the char device 1134 * 1135 * Return: 0 for successful release 1136 */ 1137static int iio_chrdev_release(struct inode *inode, struct file *filp) 1138{ 1139 struct iio_dev *indio_dev = container_of(inode->i_cdev, 1140 struct iio_dev, chrdev); 1141 clear_bit(IIO_BUSY_BIT_POS, &indio_dev->flags); 1142 iio_device_put(indio_dev); 1143 1144 return 0; 1145} 1146 1147/* Somewhat of a cross file organization violation - ioctls here are actually 1148 * event related */ 1149static long iio_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) 1150{ 1151 struct iio_dev *indio_dev = filp->private_data; 1152 int __user *ip = (int __user *)arg; 1153 int fd; 1154 1155 if (!indio_dev->info) 1156 return -ENODEV; 1157 1158 if (cmd == IIO_GET_EVENT_FD_IOCTL) { 1159 fd = iio_event_getfd(indio_dev); 1160 if (fd < 0) 1161 return fd; 1162 if (copy_to_user(ip, &fd, sizeof(fd))) 1163 return -EFAULT; 1164 return 0; 1165 } 1166 return -EINVAL; 1167} 1168 1169static const struct file_operations iio_buffer_fileops = { 1170 .read = iio_buffer_read_first_n_outer_addr, 1171 .release = iio_chrdev_release, 1172 .open = iio_chrdev_open, 1173 .poll = iio_buffer_poll_addr, 1174 .owner = THIS_MODULE, 1175 .llseek = noop_llseek, 1176 .unlocked_ioctl = iio_ioctl, 1177 .compat_ioctl = iio_ioctl, 1178}; 1179 1180static int iio_check_unique_scan_index(struct iio_dev *indio_dev) 1181{ 1182 int i, j; 1183 const struct iio_chan_spec *channels = indio_dev->channels; 1184 1185 if (!(indio_dev->modes & INDIO_ALL_BUFFER_MODES)) 1186 return 0; 1187 1188 for (i = 0; i < indio_dev->num_channels - 1; i++) { 1189 if (channels[i].scan_index < 0) 1190 continue; 1191 for (j = i + 1; j < indio_dev->num_channels; j++) 1192 if (channels[i].scan_index == channels[j].scan_index) { 1193 dev_err(&indio_dev->dev, 1194 "Duplicate scan index %d\n", 1195 channels[i].scan_index); 1196 return -EINVAL; 1197 } 1198 } 1199 1200 return 0; 1201} 1202 1203static const struct iio_buffer_setup_ops noop_ring_setup_ops; 1204 1205/** 1206 * iio_device_register() - register a device with the IIO subsystem 1207 * @indio_dev: Device structure filled by the device driver 1208 **/ 1209int iio_device_register(struct iio_dev *indio_dev) 1210{ 1211 int ret; 1212 1213 /* If the calling driver did not initialize of_node, do it here */ 1214 if (!indio_dev->dev.of_node && indio_dev->dev.parent) 1215 indio_dev->dev.of_node = indio_dev->dev.parent->of_node; 1216 1217 ret = iio_check_unique_scan_index(indio_dev); 1218 if (ret < 0) 1219 return ret; 1220 1221 /* configure elements for the chrdev */ 1222 indio_dev->dev.devt = MKDEV(MAJOR(iio_devt), indio_dev->id); 1223 1224 ret = iio_device_register_debugfs(indio_dev); 1225 if (ret) { 1226 dev_err(indio_dev->dev.parent, 1227 "Failed to register debugfs interfaces\n"); 1228 return ret; 1229 } 1230 1231 ret = iio_buffer_alloc_sysfs_and_mask(indio_dev); 1232 if (ret) { 1233 dev_err(indio_dev->dev.parent, 1234 "Failed to create buffer sysfs interfaces\n"); 1235 goto error_unreg_debugfs; 1236 } 1237 1238 ret = iio_device_register_sysfs(indio_dev); 1239 if (ret) { 1240 dev_err(indio_dev->dev.parent, 1241 "Failed to register sysfs interfaces\n"); 1242 goto error_buffer_free_sysfs; 1243 } 1244 ret = iio_device_register_eventset(indio_dev); 1245 if (ret) { 1246 dev_err(indio_dev->dev.parent, 1247 "Failed to register event set\n"); 1248 goto error_free_sysfs; 1249 } 1250 if (indio_dev->modes & (INDIO_BUFFER_TRIGGERED | INDIO_EVENT_TRIGGERED)) 1251 iio_device_register_trigger_consumer(indio_dev); 1252 1253 if ((indio_dev->modes & INDIO_ALL_BUFFER_MODES) && 1254 indio_dev->setup_ops == NULL) 1255 indio_dev->setup_ops = &noop_ring_setup_ops; 1256 1257 cdev_init(&indio_dev->chrdev, &iio_buffer_fileops); 1258 indio_dev->chrdev.owner = indio_dev->info->driver_module; 1259 indio_dev->chrdev.kobj.parent = &indio_dev->dev.kobj; 1260 ret = cdev_add(&indio_dev->chrdev, indio_dev->dev.devt, 1); 1261 if (ret < 0) 1262 goto error_unreg_eventset; 1263 1264 ret = device_add(&indio_dev->dev); 1265 if (ret < 0) 1266 goto error_cdev_del; 1267 1268 return 0; 1269error_cdev_del: 1270 cdev_del(&indio_dev->chrdev); 1271error_unreg_eventset: 1272 iio_device_unregister_eventset(indio_dev); 1273error_free_sysfs: 1274 iio_device_unregister_sysfs(indio_dev); 1275error_buffer_free_sysfs: 1276 iio_buffer_free_sysfs_and_mask(indio_dev); 1277error_unreg_debugfs: 1278 iio_device_unregister_debugfs(indio_dev); 1279 return ret; 1280} 1281EXPORT_SYMBOL(iio_device_register); 1282 1283/** 1284 * iio_device_unregister() - unregister a device from the IIO subsystem 1285 * @indio_dev: Device structure representing the device. 1286 **/ 1287void iio_device_unregister(struct iio_dev *indio_dev) 1288{ 1289 mutex_lock(&indio_dev->info_exist_lock); 1290 1291 device_del(&indio_dev->dev); 1292 1293 if (indio_dev->chrdev.dev) 1294 cdev_del(&indio_dev->chrdev); 1295 iio_device_unregister_debugfs(indio_dev); 1296 1297 iio_disable_all_buffers(indio_dev); 1298 1299 indio_dev->info = NULL; 1300 1301 iio_device_wakeup_eventset(indio_dev); 1302 iio_buffer_wakeup_poll(indio_dev); 1303 1304 mutex_unlock(&indio_dev->info_exist_lock); 1305 1306 iio_buffer_free_sysfs_and_mask(indio_dev); 1307} 1308EXPORT_SYMBOL(iio_device_unregister); 1309 1310static void devm_iio_device_unreg(struct device *dev, void *res) 1311{ 1312 iio_device_unregister(*(struct iio_dev **)res); 1313} 1314 1315/** 1316 * devm_iio_device_register - Resource-managed iio_device_register() 1317 * @dev: Device to allocate iio_dev for 1318 * @indio_dev: Device structure filled by the device driver 1319 * 1320 * Managed iio_device_register. The IIO device registered with this 1321 * function is automatically unregistered on driver detach. This function 1322 * calls iio_device_register() internally. Refer to that function for more 1323 * information. 1324 * 1325 * If an iio_dev registered with this function needs to be unregistered 1326 * separately, devm_iio_device_unregister() must be used. 1327 * 1328 * RETURNS: 1329 * 0 on success, negative error number on failure. 1330 */ 1331int devm_iio_device_register(struct device *dev, struct iio_dev *indio_dev) 1332{ 1333 struct iio_dev **ptr; 1334 int ret; 1335 1336 ptr = devres_alloc(devm_iio_device_unreg, sizeof(*ptr), GFP_KERNEL); 1337 if (!ptr) 1338 return -ENOMEM; 1339 1340 *ptr = indio_dev; 1341 ret = iio_device_register(indio_dev); 1342 if (!ret) 1343 devres_add(dev, ptr); 1344 else 1345 devres_free(ptr); 1346 1347 return ret; 1348} 1349EXPORT_SYMBOL_GPL(devm_iio_device_register); 1350 1351/** 1352 * devm_iio_device_unregister - Resource-managed iio_device_unregister() 1353 * @dev: Device this iio_dev belongs to 1354 * @indio_dev: the iio_dev associated with the device 1355 * 1356 * Unregister iio_dev registered with devm_iio_device_register(). 1357 */ 1358void devm_iio_device_unregister(struct device *dev, struct iio_dev *indio_dev) 1359{ 1360 int rc; 1361 1362 rc = devres_release(dev, devm_iio_device_unreg, 1363 devm_iio_device_match, indio_dev); 1364 WARN_ON(rc); 1365} 1366EXPORT_SYMBOL_GPL(devm_iio_device_unregister); 1367 1368subsys_initcall(iio_init); 1369module_exit(iio_exit); 1370 1371MODULE_AUTHOR("Jonathan Cameron <jic23@kernel.org>"); 1372MODULE_DESCRIPTION("Industrial I/O core"); 1373MODULE_LICENSE("GPL"); 1374