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