Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v3.5-rc1 913 lines 23 kB view raw
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#include <linux/kernel.h> 13#include <linux/module.h> 14#include <linux/idr.h> 15#include <linux/kdev_t.h> 16#include <linux/err.h> 17#include <linux/device.h> 18#include <linux/fs.h> 19#include <linux/poll.h> 20#include <linux/sched.h> 21#include <linux/wait.h> 22#include <linux/cdev.h> 23#include <linux/slab.h> 24#include <linux/anon_inodes.h> 25#include <linux/debugfs.h> 26#include <linux/iio/iio.h> 27#include "iio_core.h" 28#include "iio_core_trigger.h" 29#include <linux/iio/sysfs.h> 30#include <linux/iio/events.h> 31 32/* IDA to assign each registered device a unique id*/ 33static DEFINE_IDA(iio_ida); 34 35static dev_t iio_devt; 36 37#define IIO_DEV_MAX 256 38struct bus_type iio_bus_type = { 39 .name = "iio", 40}; 41EXPORT_SYMBOL(iio_bus_type); 42 43static struct dentry *iio_debugfs_dentry; 44 45static const char * const iio_direction[] = { 46 [0] = "in", 47 [1] = "out", 48}; 49 50static const char * const iio_chan_type_name_spec[] = { 51 [IIO_VOLTAGE] = "voltage", 52 [IIO_CURRENT] = "current", 53 [IIO_POWER] = "power", 54 [IIO_ACCEL] = "accel", 55 [IIO_ANGL_VEL] = "anglvel", 56 [IIO_MAGN] = "magn", 57 [IIO_LIGHT] = "illuminance", 58 [IIO_INTENSITY] = "intensity", 59 [IIO_PROXIMITY] = "proximity", 60 [IIO_TEMP] = "temp", 61 [IIO_INCLI] = "incli", 62 [IIO_ROT] = "rot", 63 [IIO_ANGL] = "angl", 64 [IIO_TIMESTAMP] = "timestamp", 65 [IIO_CAPACITANCE] = "capacitance", 66 [IIO_ALTVOLTAGE] = "altvoltage", 67}; 68 69static const char * const iio_modifier_names[] = { 70 [IIO_MOD_X] = "x", 71 [IIO_MOD_Y] = "y", 72 [IIO_MOD_Z] = "z", 73 [IIO_MOD_LIGHT_BOTH] = "both", 74 [IIO_MOD_LIGHT_IR] = "ir", 75}; 76 77/* relies on pairs of these shared then separate */ 78static const char * const iio_chan_info_postfix[] = { 79 [IIO_CHAN_INFO_RAW] = "raw", 80 [IIO_CHAN_INFO_PROCESSED] = "input", 81 [IIO_CHAN_INFO_SCALE] = "scale", 82 [IIO_CHAN_INFO_OFFSET] = "offset", 83 [IIO_CHAN_INFO_CALIBSCALE] = "calibscale", 84 [IIO_CHAN_INFO_CALIBBIAS] = "calibbias", 85 [IIO_CHAN_INFO_PEAK] = "peak_raw", 86 [IIO_CHAN_INFO_PEAK_SCALE] = "peak_scale", 87 [IIO_CHAN_INFO_QUADRATURE_CORRECTION_RAW] = "quadrature_correction_raw", 88 [IIO_CHAN_INFO_AVERAGE_RAW] = "mean_raw", 89 [IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY] 90 = "filter_low_pass_3db_frequency", 91 [IIO_CHAN_INFO_SAMP_FREQ] = "sampling_frequency", 92 [IIO_CHAN_INFO_FREQUENCY] = "frequency", 93 [IIO_CHAN_INFO_PHASE] = "phase", 94 [IIO_CHAN_INFO_HARDWAREGAIN] = "hardwaregain", 95}; 96 97const struct iio_chan_spec 98*iio_find_channel_from_si(struct iio_dev *indio_dev, int si) 99{ 100 int i; 101 102 for (i = 0; i < indio_dev->num_channels; i++) 103 if (indio_dev->channels[i].scan_index == si) 104 return &indio_dev->channels[i]; 105 return NULL; 106} 107 108/* This turns up an awful lot */ 109ssize_t iio_read_const_attr(struct device *dev, 110 struct device_attribute *attr, 111 char *buf) 112{ 113 return sprintf(buf, "%s\n", to_iio_const_attr(attr)->string); 114} 115EXPORT_SYMBOL(iio_read_const_attr); 116 117static int __init iio_init(void) 118{ 119 int ret; 120 121 /* Register sysfs bus */ 122 ret = bus_register(&iio_bus_type); 123 if (ret < 0) { 124 printk(KERN_ERR 125 "%s could not register bus type\n", 126 __FILE__); 127 goto error_nothing; 128 } 129 130 ret = alloc_chrdev_region(&iio_devt, 0, IIO_DEV_MAX, "iio"); 131 if (ret < 0) { 132 printk(KERN_ERR "%s: failed to allocate char dev region\n", 133 __FILE__); 134 goto error_unregister_bus_type; 135 } 136 137 iio_debugfs_dentry = debugfs_create_dir("iio", NULL); 138 139 return 0; 140 141error_unregister_bus_type: 142 bus_unregister(&iio_bus_type); 143error_nothing: 144 return ret; 145} 146 147static void __exit iio_exit(void) 148{ 149 if (iio_devt) 150 unregister_chrdev_region(iio_devt, IIO_DEV_MAX); 151 bus_unregister(&iio_bus_type); 152 debugfs_remove(iio_debugfs_dentry); 153} 154 155#if defined(CONFIG_DEBUG_FS) 156static ssize_t iio_debugfs_read_reg(struct file *file, char __user *userbuf, 157 size_t count, loff_t *ppos) 158{ 159 struct iio_dev *indio_dev = file->private_data; 160 char buf[20]; 161 unsigned val = 0; 162 ssize_t len; 163 int ret; 164 165 ret = indio_dev->info->debugfs_reg_access(indio_dev, 166 indio_dev->cached_reg_addr, 167 0, &val); 168 if (ret) 169 dev_err(indio_dev->dev.parent, "%s: read failed\n", __func__); 170 171 len = snprintf(buf, sizeof(buf), "0x%X\n", val); 172 173 return simple_read_from_buffer(userbuf, count, ppos, buf, len); 174} 175 176static ssize_t iio_debugfs_write_reg(struct file *file, 177 const char __user *userbuf, size_t count, loff_t *ppos) 178{ 179 struct iio_dev *indio_dev = file->private_data; 180 unsigned reg, val; 181 char buf[80]; 182 int ret; 183 184 count = min_t(size_t, count, (sizeof(buf)-1)); 185 if (copy_from_user(buf, userbuf, count)) 186 return -EFAULT; 187 188 buf[count] = 0; 189 190 ret = sscanf(buf, "%i %i", &reg, &val); 191 192 switch (ret) { 193 case 1: 194 indio_dev->cached_reg_addr = reg; 195 break; 196 case 2: 197 indio_dev->cached_reg_addr = reg; 198 ret = indio_dev->info->debugfs_reg_access(indio_dev, reg, 199 val, NULL); 200 if (ret) { 201 dev_err(indio_dev->dev.parent, "%s: write failed\n", 202 __func__); 203 return ret; 204 } 205 break; 206 default: 207 return -EINVAL; 208 } 209 210 return count; 211} 212 213static const struct file_operations iio_debugfs_reg_fops = { 214 .open = simple_open, 215 .read = iio_debugfs_read_reg, 216 .write = iio_debugfs_write_reg, 217}; 218 219static void iio_device_unregister_debugfs(struct iio_dev *indio_dev) 220{ 221 debugfs_remove_recursive(indio_dev->debugfs_dentry); 222} 223 224static int iio_device_register_debugfs(struct iio_dev *indio_dev) 225{ 226 struct dentry *d; 227 228 if (indio_dev->info->debugfs_reg_access == NULL) 229 return 0; 230 231 if (!iio_debugfs_dentry) 232 return 0; 233 234 indio_dev->debugfs_dentry = 235 debugfs_create_dir(dev_name(&indio_dev->dev), 236 iio_debugfs_dentry); 237 if (indio_dev->debugfs_dentry == NULL) { 238 dev_warn(indio_dev->dev.parent, 239 "Failed to create debugfs directory\n"); 240 return -EFAULT; 241 } 242 243 d = debugfs_create_file("direct_reg_access", 0644, 244 indio_dev->debugfs_dentry, 245 indio_dev, &iio_debugfs_reg_fops); 246 if (!d) { 247 iio_device_unregister_debugfs(indio_dev); 248 return -ENOMEM; 249 } 250 251 return 0; 252} 253#else 254static int iio_device_register_debugfs(struct iio_dev *indio_dev) 255{ 256 return 0; 257} 258 259static void iio_device_unregister_debugfs(struct iio_dev *indio_dev) 260{ 261} 262#endif /* CONFIG_DEBUG_FS */ 263 264static ssize_t iio_read_channel_ext_info(struct device *dev, 265 struct device_attribute *attr, 266 char *buf) 267{ 268 struct iio_dev *indio_dev = dev_to_iio_dev(dev); 269 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); 270 const struct iio_chan_spec_ext_info *ext_info; 271 272 ext_info = &this_attr->c->ext_info[this_attr->address]; 273 274 return ext_info->read(indio_dev, ext_info->private, this_attr->c, buf); 275} 276 277static ssize_t iio_write_channel_ext_info(struct device *dev, 278 struct device_attribute *attr, 279 const char *buf, 280 size_t len) 281{ 282 struct iio_dev *indio_dev = dev_to_iio_dev(dev); 283 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); 284 const struct iio_chan_spec_ext_info *ext_info; 285 286 ext_info = &this_attr->c->ext_info[this_attr->address]; 287 288 return ext_info->write(indio_dev, ext_info->private, 289 this_attr->c, buf, len); 290} 291 292static ssize_t iio_read_channel_info(struct device *dev, 293 struct device_attribute *attr, 294 char *buf) 295{ 296 struct iio_dev *indio_dev = dev_to_iio_dev(dev); 297 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); 298 int val, val2; 299 bool scale_db = false; 300 int ret = indio_dev->info->read_raw(indio_dev, this_attr->c, 301 &val, &val2, this_attr->address); 302 303 if (ret < 0) 304 return ret; 305 306 switch (ret) { 307 case IIO_VAL_INT: 308 return sprintf(buf, "%d\n", val); 309 case IIO_VAL_INT_PLUS_MICRO_DB: 310 scale_db = true; 311 case IIO_VAL_INT_PLUS_MICRO: 312 if (val2 < 0) 313 return sprintf(buf, "-%d.%06u%s\n", val, -val2, 314 scale_db ? " dB" : ""); 315 else 316 return sprintf(buf, "%d.%06u%s\n", val, val2, 317 scale_db ? " dB" : ""); 318 case IIO_VAL_INT_PLUS_NANO: 319 if (val2 < 0) 320 return sprintf(buf, "-%d.%09u\n", val, -val2); 321 else 322 return sprintf(buf, "%d.%09u\n", val, val2); 323 default: 324 return 0; 325 } 326} 327 328static ssize_t iio_write_channel_info(struct device *dev, 329 struct device_attribute *attr, 330 const char *buf, 331 size_t len) 332{ 333 struct iio_dev *indio_dev = dev_to_iio_dev(dev); 334 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); 335 int ret, integer = 0, fract = 0, fract_mult = 100000; 336 bool integer_part = true, negative = false; 337 338 /* Assumes decimal - precision based on number of digits */ 339 if (!indio_dev->info->write_raw) 340 return -EINVAL; 341 342 if (indio_dev->info->write_raw_get_fmt) 343 switch (indio_dev->info->write_raw_get_fmt(indio_dev, 344 this_attr->c, this_attr->address)) { 345 case IIO_VAL_INT_PLUS_MICRO: 346 fract_mult = 100000; 347 break; 348 case IIO_VAL_INT_PLUS_NANO: 349 fract_mult = 100000000; 350 break; 351 default: 352 return -EINVAL; 353 } 354 355 if (buf[0] == '-') { 356 negative = true; 357 buf++; 358 } 359 360 while (*buf) { 361 if ('0' <= *buf && *buf <= '9') { 362 if (integer_part) 363 integer = integer*10 + *buf - '0'; 364 else { 365 fract += fract_mult*(*buf - '0'); 366 if (fract_mult == 1) 367 break; 368 fract_mult /= 10; 369 } 370 } else if (*buf == '\n') { 371 if (*(buf + 1) == '\0') 372 break; 373 else 374 return -EINVAL; 375 } else if (*buf == '.') { 376 integer_part = false; 377 } else { 378 return -EINVAL; 379 } 380 buf++; 381 } 382 if (negative) { 383 if (integer) 384 integer = -integer; 385 else 386 fract = -fract; 387 } 388 389 ret = indio_dev->info->write_raw(indio_dev, this_attr->c, 390 integer, fract, this_attr->address); 391 if (ret) 392 return ret; 393 394 return len; 395} 396 397static 398int __iio_device_attr_init(struct device_attribute *dev_attr, 399 const char *postfix, 400 struct iio_chan_spec const *chan, 401 ssize_t (*readfunc)(struct device *dev, 402 struct device_attribute *attr, 403 char *buf), 404 ssize_t (*writefunc)(struct device *dev, 405 struct device_attribute *attr, 406 const char *buf, 407 size_t len), 408 bool generic) 409{ 410 int ret; 411 char *name_format, *full_postfix; 412 sysfs_attr_init(&dev_attr->attr); 413 414 /* Build up postfix of <extend_name>_<modifier>_postfix */ 415 if (chan->modified && !generic) { 416 if (chan->extend_name) 417 full_postfix = kasprintf(GFP_KERNEL, "%s_%s_%s", 418 iio_modifier_names[chan 419 ->channel2], 420 chan->extend_name, 421 postfix); 422 else 423 full_postfix = kasprintf(GFP_KERNEL, "%s_%s", 424 iio_modifier_names[chan 425 ->channel2], 426 postfix); 427 } else { 428 if (chan->extend_name == NULL) 429 full_postfix = kstrdup(postfix, GFP_KERNEL); 430 else 431 full_postfix = kasprintf(GFP_KERNEL, 432 "%s_%s", 433 chan->extend_name, 434 postfix); 435 } 436 if (full_postfix == NULL) { 437 ret = -ENOMEM; 438 goto error_ret; 439 } 440 441 if (chan->differential) { /* Differential can not have modifier */ 442 if (generic) 443 name_format 444 = kasprintf(GFP_KERNEL, "%s_%s-%s_%s", 445 iio_direction[chan->output], 446 iio_chan_type_name_spec[chan->type], 447 iio_chan_type_name_spec[chan->type], 448 full_postfix); 449 else if (chan->indexed) 450 name_format 451 = kasprintf(GFP_KERNEL, "%s_%s%d-%s%d_%s", 452 iio_direction[chan->output], 453 iio_chan_type_name_spec[chan->type], 454 chan->channel, 455 iio_chan_type_name_spec[chan->type], 456 chan->channel2, 457 full_postfix); 458 else { 459 WARN_ON("Differential channels must be indexed\n"); 460 ret = -EINVAL; 461 goto error_free_full_postfix; 462 } 463 } else { /* Single ended */ 464 if (generic) 465 name_format 466 = kasprintf(GFP_KERNEL, "%s_%s_%s", 467 iio_direction[chan->output], 468 iio_chan_type_name_spec[chan->type], 469 full_postfix); 470 else if (chan->indexed) 471 name_format 472 = kasprintf(GFP_KERNEL, "%s_%s%d_%s", 473 iio_direction[chan->output], 474 iio_chan_type_name_spec[chan->type], 475 chan->channel, 476 full_postfix); 477 else 478 name_format 479 = kasprintf(GFP_KERNEL, "%s_%s_%s", 480 iio_direction[chan->output], 481 iio_chan_type_name_spec[chan->type], 482 full_postfix); 483 } 484 if (name_format == NULL) { 485 ret = -ENOMEM; 486 goto error_free_full_postfix; 487 } 488 dev_attr->attr.name = kasprintf(GFP_KERNEL, 489 name_format, 490 chan->channel, 491 chan->channel2); 492 if (dev_attr->attr.name == NULL) { 493 ret = -ENOMEM; 494 goto error_free_name_format; 495 } 496 497 if (readfunc) { 498 dev_attr->attr.mode |= S_IRUGO; 499 dev_attr->show = readfunc; 500 } 501 502 if (writefunc) { 503 dev_attr->attr.mode |= S_IWUSR; 504 dev_attr->store = writefunc; 505 } 506 kfree(name_format); 507 kfree(full_postfix); 508 509 return 0; 510 511error_free_name_format: 512 kfree(name_format); 513error_free_full_postfix: 514 kfree(full_postfix); 515error_ret: 516 return ret; 517} 518 519static void __iio_device_attr_deinit(struct device_attribute *dev_attr) 520{ 521 kfree(dev_attr->attr.name); 522} 523 524int __iio_add_chan_devattr(const char *postfix, 525 struct iio_chan_spec const *chan, 526 ssize_t (*readfunc)(struct device *dev, 527 struct device_attribute *attr, 528 char *buf), 529 ssize_t (*writefunc)(struct device *dev, 530 struct device_attribute *attr, 531 const char *buf, 532 size_t len), 533 u64 mask, 534 bool generic, 535 struct device *dev, 536 struct list_head *attr_list) 537{ 538 int ret; 539 struct iio_dev_attr *iio_attr, *t; 540 541 iio_attr = kzalloc(sizeof *iio_attr, GFP_KERNEL); 542 if (iio_attr == NULL) { 543 ret = -ENOMEM; 544 goto error_ret; 545 } 546 ret = __iio_device_attr_init(&iio_attr->dev_attr, 547 postfix, chan, 548 readfunc, writefunc, generic); 549 if (ret) 550 goto error_iio_dev_attr_free; 551 iio_attr->c = chan; 552 iio_attr->address = mask; 553 list_for_each_entry(t, attr_list, l) 554 if (strcmp(t->dev_attr.attr.name, 555 iio_attr->dev_attr.attr.name) == 0) { 556 if (!generic) 557 dev_err(dev, "tried to double register : %s\n", 558 t->dev_attr.attr.name); 559 ret = -EBUSY; 560 goto error_device_attr_deinit; 561 } 562 list_add(&iio_attr->l, attr_list); 563 564 return 0; 565 566error_device_attr_deinit: 567 __iio_device_attr_deinit(&iio_attr->dev_attr); 568error_iio_dev_attr_free: 569 kfree(iio_attr); 570error_ret: 571 return ret; 572} 573 574static int iio_device_add_channel_sysfs(struct iio_dev *indio_dev, 575 struct iio_chan_spec const *chan) 576{ 577 int ret, attrcount = 0; 578 int i; 579 const struct iio_chan_spec_ext_info *ext_info; 580 581 if (chan->channel < 0) 582 return 0; 583 for_each_set_bit(i, &chan->info_mask, sizeof(long)*8) { 584 ret = __iio_add_chan_devattr(iio_chan_info_postfix[i/2], 585 chan, 586 &iio_read_channel_info, 587 &iio_write_channel_info, 588 i/2, 589 !(i%2), 590 &indio_dev->dev, 591 &indio_dev->channel_attr_list); 592 if (ret == -EBUSY && (i%2 == 0)) { 593 ret = 0; 594 continue; 595 } 596 if (ret < 0) 597 goto error_ret; 598 attrcount++; 599 } 600 601 if (chan->ext_info) { 602 unsigned int i = 0; 603 for (ext_info = chan->ext_info; ext_info->name; ext_info++) { 604 ret = __iio_add_chan_devattr(ext_info->name, 605 chan, 606 ext_info->read ? 607 &iio_read_channel_ext_info : NULL, 608 ext_info->write ? 609 &iio_write_channel_ext_info : NULL, 610 i, 611 ext_info->shared, 612 &indio_dev->dev, 613 &indio_dev->channel_attr_list); 614 i++; 615 if (ret == -EBUSY && ext_info->shared) 616 continue; 617 618 if (ret) 619 goto error_ret; 620 621 attrcount++; 622 } 623 } 624 625 ret = attrcount; 626error_ret: 627 return ret; 628} 629 630static void iio_device_remove_and_free_read_attr(struct iio_dev *indio_dev, 631 struct iio_dev_attr *p) 632{ 633 kfree(p->dev_attr.attr.name); 634 kfree(p); 635} 636 637static ssize_t iio_show_dev_name(struct device *dev, 638 struct device_attribute *attr, 639 char *buf) 640{ 641 struct iio_dev *indio_dev = dev_to_iio_dev(dev); 642 return sprintf(buf, "%s\n", indio_dev->name); 643} 644 645static DEVICE_ATTR(name, S_IRUGO, iio_show_dev_name, NULL); 646 647static int iio_device_register_sysfs(struct iio_dev *indio_dev) 648{ 649 int i, ret = 0, attrcount, attrn, attrcount_orig = 0; 650 struct iio_dev_attr *p, *n; 651 struct attribute **attr; 652 653 /* First count elements in any existing group */ 654 if (indio_dev->info->attrs) { 655 attr = indio_dev->info->attrs->attrs; 656 while (*attr++ != NULL) 657 attrcount_orig++; 658 } 659 attrcount = attrcount_orig; 660 /* 661 * New channel registration method - relies on the fact a group does 662 * not need to be initialized if it is name is NULL. 663 */ 664 INIT_LIST_HEAD(&indio_dev->channel_attr_list); 665 if (indio_dev->channels) 666 for (i = 0; i < indio_dev->num_channels; i++) { 667 ret = iio_device_add_channel_sysfs(indio_dev, 668 &indio_dev 669 ->channels[i]); 670 if (ret < 0) 671 goto error_clear_attrs; 672 attrcount += ret; 673 } 674 675 if (indio_dev->name) 676 attrcount++; 677 678 indio_dev->chan_attr_group.attrs = kcalloc(attrcount + 1, 679 sizeof(indio_dev->chan_attr_group.attrs[0]), 680 GFP_KERNEL); 681 if (indio_dev->chan_attr_group.attrs == NULL) { 682 ret = -ENOMEM; 683 goto error_clear_attrs; 684 } 685 /* Copy across original attributes */ 686 if (indio_dev->info->attrs) 687 memcpy(indio_dev->chan_attr_group.attrs, 688 indio_dev->info->attrs->attrs, 689 sizeof(indio_dev->chan_attr_group.attrs[0]) 690 *attrcount_orig); 691 attrn = attrcount_orig; 692 /* Add all elements from the list. */ 693 list_for_each_entry(p, &indio_dev->channel_attr_list, l) 694 indio_dev->chan_attr_group.attrs[attrn++] = &p->dev_attr.attr; 695 if (indio_dev->name) 696 indio_dev->chan_attr_group.attrs[attrn++] = &dev_attr_name.attr; 697 698 indio_dev->groups[indio_dev->groupcounter++] = 699 &indio_dev->chan_attr_group; 700 701 return 0; 702 703error_clear_attrs: 704 list_for_each_entry_safe(p, n, 705 &indio_dev->channel_attr_list, l) { 706 list_del(&p->l); 707 iio_device_remove_and_free_read_attr(indio_dev, p); 708 } 709 710 return ret; 711} 712 713static void iio_device_unregister_sysfs(struct iio_dev *indio_dev) 714{ 715 716 struct iio_dev_attr *p, *n; 717 718 list_for_each_entry_safe(p, n, &indio_dev->channel_attr_list, l) { 719 list_del(&p->l); 720 iio_device_remove_and_free_read_attr(indio_dev, p); 721 } 722 kfree(indio_dev->chan_attr_group.attrs); 723} 724 725static void iio_dev_release(struct device *device) 726{ 727 struct iio_dev *indio_dev = dev_to_iio_dev(device); 728 cdev_del(&indio_dev->chrdev); 729 if (indio_dev->modes & INDIO_BUFFER_TRIGGERED) 730 iio_device_unregister_trigger_consumer(indio_dev); 731 iio_device_unregister_eventset(indio_dev); 732 iio_device_unregister_sysfs(indio_dev); 733 iio_device_unregister_debugfs(indio_dev); 734} 735 736static struct device_type iio_dev_type = { 737 .name = "iio_device", 738 .release = iio_dev_release, 739}; 740 741struct iio_dev *iio_device_alloc(int sizeof_priv) 742{ 743 struct iio_dev *dev; 744 size_t alloc_size; 745 746 alloc_size = sizeof(struct iio_dev); 747 if (sizeof_priv) { 748 alloc_size = ALIGN(alloc_size, IIO_ALIGN); 749 alloc_size += sizeof_priv; 750 } 751 /* ensure 32-byte alignment of whole construct ? */ 752 alloc_size += IIO_ALIGN - 1; 753 754 dev = kzalloc(alloc_size, GFP_KERNEL); 755 756 if (dev) { 757 dev->dev.groups = dev->groups; 758 dev->dev.type = &iio_dev_type; 759 dev->dev.bus = &iio_bus_type; 760 device_initialize(&dev->dev); 761 dev_set_drvdata(&dev->dev, (void *)dev); 762 mutex_init(&dev->mlock); 763 mutex_init(&dev->info_exist_lock); 764 765 dev->id = ida_simple_get(&iio_ida, 0, 0, GFP_KERNEL); 766 if (dev->id < 0) { 767 /* cannot use a dev_err as the name isn't available */ 768 printk(KERN_ERR "Failed to get id\n"); 769 kfree(dev); 770 return NULL; 771 } 772 dev_set_name(&dev->dev, "iio:device%d", dev->id); 773 } 774 775 return dev; 776} 777EXPORT_SYMBOL(iio_device_alloc); 778 779void iio_device_free(struct iio_dev *dev) 780{ 781 if (dev) { 782 ida_simple_remove(&iio_ida, dev->id); 783 kfree(dev); 784 } 785} 786EXPORT_SYMBOL(iio_device_free); 787 788/** 789 * iio_chrdev_open() - chrdev file open for buffer access and ioctls 790 **/ 791static int iio_chrdev_open(struct inode *inode, struct file *filp) 792{ 793 struct iio_dev *indio_dev = container_of(inode->i_cdev, 794 struct iio_dev, chrdev); 795 796 if (test_and_set_bit(IIO_BUSY_BIT_POS, &indio_dev->flags)) 797 return -EBUSY; 798 799 filp->private_data = indio_dev; 800 801 return 0; 802} 803 804/** 805 * iio_chrdev_release() - chrdev file close buffer access and ioctls 806 **/ 807static int iio_chrdev_release(struct inode *inode, struct file *filp) 808{ 809 struct iio_dev *indio_dev = container_of(inode->i_cdev, 810 struct iio_dev, chrdev); 811 clear_bit(IIO_BUSY_BIT_POS, &indio_dev->flags); 812 return 0; 813} 814 815/* Somewhat of a cross file organization violation - ioctls here are actually 816 * event related */ 817static long iio_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) 818{ 819 struct iio_dev *indio_dev = filp->private_data; 820 int __user *ip = (int __user *)arg; 821 int fd; 822 823 if (cmd == IIO_GET_EVENT_FD_IOCTL) { 824 fd = iio_event_getfd(indio_dev); 825 if (copy_to_user(ip, &fd, sizeof(fd))) 826 return -EFAULT; 827 return 0; 828 } 829 return -EINVAL; 830} 831 832static const struct file_operations iio_buffer_fileops = { 833 .read = iio_buffer_read_first_n_outer_addr, 834 .release = iio_chrdev_release, 835 .open = iio_chrdev_open, 836 .poll = iio_buffer_poll_addr, 837 .owner = THIS_MODULE, 838 .llseek = noop_llseek, 839 .unlocked_ioctl = iio_ioctl, 840 .compat_ioctl = iio_ioctl, 841}; 842 843static const struct iio_buffer_setup_ops noop_ring_setup_ops; 844 845int iio_device_register(struct iio_dev *indio_dev) 846{ 847 int ret; 848 849 /* configure elements for the chrdev */ 850 indio_dev->dev.devt = MKDEV(MAJOR(iio_devt), indio_dev->id); 851 852 ret = iio_device_register_debugfs(indio_dev); 853 if (ret) { 854 dev_err(indio_dev->dev.parent, 855 "Failed to register debugfs interfaces\n"); 856 goto error_ret; 857 } 858 ret = iio_device_register_sysfs(indio_dev); 859 if (ret) { 860 dev_err(indio_dev->dev.parent, 861 "Failed to register sysfs interfaces\n"); 862 goto error_unreg_debugfs; 863 } 864 ret = iio_device_register_eventset(indio_dev); 865 if (ret) { 866 dev_err(indio_dev->dev.parent, 867 "Failed to register event set\n"); 868 goto error_free_sysfs; 869 } 870 if (indio_dev->modes & INDIO_BUFFER_TRIGGERED) 871 iio_device_register_trigger_consumer(indio_dev); 872 873 if ((indio_dev->modes & INDIO_ALL_BUFFER_MODES) && 874 indio_dev->setup_ops == NULL) 875 indio_dev->setup_ops = &noop_ring_setup_ops; 876 877 ret = device_add(&indio_dev->dev); 878 if (ret < 0) 879 goto error_unreg_eventset; 880 cdev_init(&indio_dev->chrdev, &iio_buffer_fileops); 881 indio_dev->chrdev.owner = indio_dev->info->driver_module; 882 ret = cdev_add(&indio_dev->chrdev, indio_dev->dev.devt, 1); 883 if (ret < 0) 884 goto error_del_device; 885 return 0; 886 887error_del_device: 888 device_del(&indio_dev->dev); 889error_unreg_eventset: 890 iio_device_unregister_eventset(indio_dev); 891error_free_sysfs: 892 iio_device_unregister_sysfs(indio_dev); 893error_unreg_debugfs: 894 iio_device_unregister_debugfs(indio_dev); 895error_ret: 896 return ret; 897} 898EXPORT_SYMBOL(iio_device_register); 899 900void iio_device_unregister(struct iio_dev *indio_dev) 901{ 902 mutex_lock(&indio_dev->info_exist_lock); 903 indio_dev->info = NULL; 904 mutex_unlock(&indio_dev->info_exist_lock); 905 device_unregister(&indio_dev->dev); 906} 907EXPORT_SYMBOL(iio_device_unregister); 908subsys_initcall(iio_init); 909module_exit(iio_exit); 910 911MODULE_AUTHOR("Jonathan Cameron <jic23@cam.ac.uk>"); 912MODULE_DESCRIPTION("Industrial I/O core"); 913MODULE_LICENSE("GPL");