]> Pileus Git - ~andy/linux/blob - drivers/iio/industrialio-core.c
Merge branch 'fixes-togreg' of git://git.kernel.org/pub/scm/linux/kernel/git/jic23...
[~andy/linux] / drivers / iio / industrialio-core.c
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*/
33 static DEFINE_IDA(iio_ida);
34
35 static dev_t iio_devt;
36
37 #define IIO_DEV_MAX 256
38 struct bus_type iio_bus_type = {
39         .name = "iio",
40 };
41 EXPORT_SYMBOL(iio_bus_type);
42
43 static struct dentry *iio_debugfs_dentry;
44
45 static const char * const iio_direction[] = {
46         [0] = "in",
47         [1] = "out",
48 };
49
50 static 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
69 static 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 */
78 static 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
97 const 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 */
109 ssize_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 }
115 EXPORT_SYMBOL(iio_read_const_attr);
116
117 static 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
141 error_unregister_bus_type:
142         bus_unregister(&iio_bus_type);
143 error_nothing:
144         return ret;
145 }
146
147 static 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)
156 static 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
176 static 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
213 static 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
219 static void iio_device_unregister_debugfs(struct iio_dev *indio_dev)
220 {
221         debugfs_remove_recursive(indio_dev->debugfs_dentry);
222 }
223
224 static 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
254 static int iio_device_register_debugfs(struct iio_dev *indio_dev)
255 {
256         return 0;
257 }
258
259 static void iio_device_unregister_debugfs(struct iio_dev *indio_dev)
260 {
261 }
262 #endif /* CONFIG_DEBUG_FS */
263
264 static 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
277 static 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
292 ssize_t iio_enum_available_read(struct iio_dev *indio_dev,
293         uintptr_t priv, const struct iio_chan_spec *chan, char *buf)
294 {
295         const struct iio_enum *e = (const struct iio_enum *)priv;
296         unsigned int i;
297         size_t len = 0;
298
299         if (!e->num_items)
300                 return 0;
301
302         for (i = 0; i < e->num_items; ++i)
303                 len += scnprintf(buf + len, PAGE_SIZE - len, "%s ", e->items[i]);
304
305         /* replace last space with a newline */
306         buf[len - 1] = '\n';
307
308         return len;
309 }
310 EXPORT_SYMBOL_GPL(iio_enum_available_read);
311
312 ssize_t iio_enum_read(struct iio_dev *indio_dev,
313         uintptr_t priv, const struct iio_chan_spec *chan, char *buf)
314 {
315         const struct iio_enum *e = (const struct iio_enum *)priv;
316         int i;
317
318         if (!e->get)
319                 return -EINVAL;
320
321         i = e->get(indio_dev, chan);
322         if (i < 0)
323                 return i;
324         else if (i >= e->num_items)
325                 return -EINVAL;
326
327         return sprintf(buf, "%s\n", e->items[i]);
328 }
329 EXPORT_SYMBOL_GPL(iio_enum_read);
330
331 ssize_t iio_enum_write(struct iio_dev *indio_dev,
332         uintptr_t priv, const struct iio_chan_spec *chan, const char *buf,
333         size_t len)
334 {
335         const struct iio_enum *e = (const struct iio_enum *)priv;
336         unsigned int i;
337         int ret;
338
339         if (!e->set)
340                 return -EINVAL;
341
342         for (i = 0; i < e->num_items; i++) {
343                 if (sysfs_streq(buf, e->items[i]))
344                         break;
345         }
346
347         if (i == e->num_items)
348                 return -EINVAL;
349
350         ret = e->set(indio_dev, chan, i);
351         return ret ? ret : len;
352 }
353 EXPORT_SYMBOL_GPL(iio_enum_write);
354
355 static ssize_t iio_read_channel_info(struct device *dev,
356                                      struct device_attribute *attr,
357                                      char *buf)
358 {
359         struct iio_dev *indio_dev = dev_to_iio_dev(dev);
360         struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
361         int val, val2;
362         bool scale_db = false;
363         int ret = indio_dev->info->read_raw(indio_dev, this_attr->c,
364                                             &val, &val2, this_attr->address);
365
366         if (ret < 0)
367                 return ret;
368
369         switch (ret) {
370         case IIO_VAL_INT:
371                 return sprintf(buf, "%d\n", val);
372         case IIO_VAL_INT_PLUS_MICRO_DB:
373                 scale_db = true;
374         case IIO_VAL_INT_PLUS_MICRO:
375                 if (val2 < 0)
376                         return sprintf(buf, "-%d.%06u%s\n", val, -val2,
377                                 scale_db ? " dB" : "");
378                 else
379                         return sprintf(buf, "%d.%06u%s\n", val, val2,
380                                 scale_db ? " dB" : "");
381         case IIO_VAL_INT_PLUS_NANO:
382                 if (val2 < 0)
383                         return sprintf(buf, "-%d.%09u\n", val, -val2);
384                 else
385                         return sprintf(buf, "%d.%09u\n", val, val2);
386         default:
387                 return 0;
388         }
389 }
390
391 static ssize_t iio_write_channel_info(struct device *dev,
392                                       struct device_attribute *attr,
393                                       const char *buf,
394                                       size_t len)
395 {
396         struct iio_dev *indio_dev = dev_to_iio_dev(dev);
397         struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
398         int ret, integer = 0, fract = 0, fract_mult = 100000;
399         bool integer_part = true, negative = false;
400
401         /* Assumes decimal - precision based on number of digits */
402         if (!indio_dev->info->write_raw)
403                 return -EINVAL;
404
405         if (indio_dev->info->write_raw_get_fmt)
406                 switch (indio_dev->info->write_raw_get_fmt(indio_dev,
407                         this_attr->c, this_attr->address)) {
408                 case IIO_VAL_INT_PLUS_MICRO:
409                         fract_mult = 100000;
410                         break;
411                 case IIO_VAL_INT_PLUS_NANO:
412                         fract_mult = 100000000;
413                         break;
414                 default:
415                         return -EINVAL;
416                 }
417
418         if (buf[0] == '-') {
419                 negative = true;
420                 buf++;
421         }
422
423         while (*buf) {
424                 if ('0' <= *buf && *buf <= '9') {
425                         if (integer_part)
426                                 integer = integer*10 + *buf - '0';
427                         else {
428                                 fract += fract_mult*(*buf - '0');
429                                 if (fract_mult == 1)
430                                         break;
431                                 fract_mult /= 10;
432                         }
433                 } else if (*buf == '\n') {
434                         if (*(buf + 1) == '\0')
435                                 break;
436                         else
437                                 return -EINVAL;
438                 } else if (*buf == '.') {
439                         integer_part = false;
440                 } else {
441                         return -EINVAL;
442                 }
443                 buf++;
444         }
445         if (negative) {
446                 if (integer)
447                         integer = -integer;
448                 else
449                         fract = -fract;
450         }
451
452         ret = indio_dev->info->write_raw(indio_dev, this_attr->c,
453                                          integer, fract, this_attr->address);
454         if (ret)
455                 return ret;
456
457         return len;
458 }
459
460 static
461 int __iio_device_attr_init(struct device_attribute *dev_attr,
462                            const char *postfix,
463                            struct iio_chan_spec const *chan,
464                            ssize_t (*readfunc)(struct device *dev,
465                                                struct device_attribute *attr,
466                                                char *buf),
467                            ssize_t (*writefunc)(struct device *dev,
468                                                 struct device_attribute *attr,
469                                                 const char *buf,
470                                                 size_t len),
471                            bool generic)
472 {
473         int ret;
474         char *name_format, *full_postfix;
475         sysfs_attr_init(&dev_attr->attr);
476
477         /* Build up postfix of <extend_name>_<modifier>_postfix */
478         if (chan->modified && !generic) {
479                 if (chan->extend_name)
480                         full_postfix = kasprintf(GFP_KERNEL, "%s_%s_%s",
481                                                  iio_modifier_names[chan
482                                                                     ->channel2],
483                                                  chan->extend_name,
484                                                  postfix);
485                 else
486                         full_postfix = kasprintf(GFP_KERNEL, "%s_%s",
487                                                  iio_modifier_names[chan
488                                                                     ->channel2],
489                                                  postfix);
490         } else {
491                 if (chan->extend_name == NULL)
492                         full_postfix = kstrdup(postfix, GFP_KERNEL);
493                 else
494                         full_postfix = kasprintf(GFP_KERNEL,
495                                                  "%s_%s",
496                                                  chan->extend_name,
497                                                  postfix);
498         }
499         if (full_postfix == NULL) {
500                 ret = -ENOMEM;
501                 goto error_ret;
502         }
503
504         if (chan->differential) { /* Differential can not have modifier */
505                 if (generic)
506                         name_format
507                                 = kasprintf(GFP_KERNEL, "%s_%s-%s_%s",
508                                             iio_direction[chan->output],
509                                             iio_chan_type_name_spec[chan->type],
510                                             iio_chan_type_name_spec[chan->type],
511                                             full_postfix);
512                 else if (chan->indexed)
513                         name_format
514                                 = kasprintf(GFP_KERNEL, "%s_%s%d-%s%d_%s",
515                                             iio_direction[chan->output],
516                                             iio_chan_type_name_spec[chan->type],
517                                             chan->channel,
518                                             iio_chan_type_name_spec[chan->type],
519                                             chan->channel2,
520                                             full_postfix);
521                 else {
522                         WARN_ON("Differential channels must be indexed\n");
523                         ret = -EINVAL;
524                         goto error_free_full_postfix;
525                 }
526         } else { /* Single ended */
527                 if (generic)
528                         name_format
529                                 = kasprintf(GFP_KERNEL, "%s_%s_%s",
530                                             iio_direction[chan->output],
531                                             iio_chan_type_name_spec[chan->type],
532                                             full_postfix);
533                 else if (chan->indexed)
534                         name_format
535                                 = kasprintf(GFP_KERNEL, "%s_%s%d_%s",
536                                             iio_direction[chan->output],
537                                             iio_chan_type_name_spec[chan->type],
538                                             chan->channel,
539                                             full_postfix);
540                 else
541                         name_format
542                                 = kasprintf(GFP_KERNEL, "%s_%s_%s",
543                                             iio_direction[chan->output],
544                                             iio_chan_type_name_spec[chan->type],
545                                             full_postfix);
546         }
547         if (name_format == NULL) {
548                 ret = -ENOMEM;
549                 goto error_free_full_postfix;
550         }
551         dev_attr->attr.name = kasprintf(GFP_KERNEL,
552                                         name_format,
553                                         chan->channel,
554                                         chan->channel2);
555         if (dev_attr->attr.name == NULL) {
556                 ret = -ENOMEM;
557                 goto error_free_name_format;
558         }
559
560         if (readfunc) {
561                 dev_attr->attr.mode |= S_IRUGO;
562                 dev_attr->show = readfunc;
563         }
564
565         if (writefunc) {
566                 dev_attr->attr.mode |= S_IWUSR;
567                 dev_attr->store = writefunc;
568         }
569         kfree(name_format);
570         kfree(full_postfix);
571
572         return 0;
573
574 error_free_name_format:
575         kfree(name_format);
576 error_free_full_postfix:
577         kfree(full_postfix);
578 error_ret:
579         return ret;
580 }
581
582 static void __iio_device_attr_deinit(struct device_attribute *dev_attr)
583 {
584         kfree(dev_attr->attr.name);
585 }
586
587 int __iio_add_chan_devattr(const char *postfix,
588                            struct iio_chan_spec const *chan,
589                            ssize_t (*readfunc)(struct device *dev,
590                                                struct device_attribute *attr,
591                                                char *buf),
592                            ssize_t (*writefunc)(struct device *dev,
593                                                 struct device_attribute *attr,
594                                                 const char *buf,
595                                                 size_t len),
596                            u64 mask,
597                            bool generic,
598                            struct device *dev,
599                            struct list_head *attr_list)
600 {
601         int ret;
602         struct iio_dev_attr *iio_attr, *t;
603
604         iio_attr = kzalloc(sizeof *iio_attr, GFP_KERNEL);
605         if (iio_attr == NULL) {
606                 ret = -ENOMEM;
607                 goto error_ret;
608         }
609         ret = __iio_device_attr_init(&iio_attr->dev_attr,
610                                      postfix, chan,
611                                      readfunc, writefunc, generic);
612         if (ret)
613                 goto error_iio_dev_attr_free;
614         iio_attr->c = chan;
615         iio_attr->address = mask;
616         list_for_each_entry(t, attr_list, l)
617                 if (strcmp(t->dev_attr.attr.name,
618                            iio_attr->dev_attr.attr.name) == 0) {
619                         if (!generic)
620                                 dev_err(dev, "tried to double register : %s\n",
621                                         t->dev_attr.attr.name);
622                         ret = -EBUSY;
623                         goto error_device_attr_deinit;
624                 }
625         list_add(&iio_attr->l, attr_list);
626
627         return 0;
628
629 error_device_attr_deinit:
630         __iio_device_attr_deinit(&iio_attr->dev_attr);
631 error_iio_dev_attr_free:
632         kfree(iio_attr);
633 error_ret:
634         return ret;
635 }
636
637 static int iio_device_add_channel_sysfs(struct iio_dev *indio_dev,
638                                         struct iio_chan_spec const *chan)
639 {
640         int ret, attrcount = 0;
641         int i;
642         const struct iio_chan_spec_ext_info *ext_info;
643
644         if (chan->channel < 0)
645                 return 0;
646         for_each_set_bit(i, &chan->info_mask, sizeof(long)*8) {
647                 ret = __iio_add_chan_devattr(iio_chan_info_postfix[i/2],
648                                              chan,
649                                              &iio_read_channel_info,
650                                              &iio_write_channel_info,
651                                              i/2,
652                                              !(i%2),
653                                              &indio_dev->dev,
654                                              &indio_dev->channel_attr_list);
655                 if (ret == -EBUSY && (i%2 == 0)) {
656                         ret = 0;
657                         continue;
658                 }
659                 if (ret < 0)
660                         goto error_ret;
661                 attrcount++;
662         }
663
664         if (chan->ext_info) {
665                 unsigned int i = 0;
666                 for (ext_info = chan->ext_info; ext_info->name; ext_info++) {
667                         ret = __iio_add_chan_devattr(ext_info->name,
668                                         chan,
669                                         ext_info->read ?
670                                             &iio_read_channel_ext_info : NULL,
671                                         ext_info->write ?
672                                             &iio_write_channel_ext_info : NULL,
673                                         i,
674                                         ext_info->shared,
675                                         &indio_dev->dev,
676                                         &indio_dev->channel_attr_list);
677                         i++;
678                         if (ret == -EBUSY && ext_info->shared)
679                                 continue;
680
681                         if (ret)
682                                 goto error_ret;
683
684                         attrcount++;
685                 }
686         }
687
688         ret = attrcount;
689 error_ret:
690         return ret;
691 }
692
693 static void iio_device_remove_and_free_read_attr(struct iio_dev *indio_dev,
694                                                  struct iio_dev_attr *p)
695 {
696         kfree(p->dev_attr.attr.name);
697         kfree(p);
698 }
699
700 static ssize_t iio_show_dev_name(struct device *dev,
701                                  struct device_attribute *attr,
702                                  char *buf)
703 {
704         struct iio_dev *indio_dev = dev_to_iio_dev(dev);
705         return sprintf(buf, "%s\n", indio_dev->name);
706 }
707
708 static DEVICE_ATTR(name, S_IRUGO, iio_show_dev_name, NULL);
709
710 static int iio_device_register_sysfs(struct iio_dev *indio_dev)
711 {
712         int i, ret = 0, attrcount, attrn, attrcount_orig = 0;
713         struct iio_dev_attr *p, *n;
714         struct attribute **attr;
715
716         /* First count elements in any existing group */
717         if (indio_dev->info->attrs) {
718                 attr = indio_dev->info->attrs->attrs;
719                 while (*attr++ != NULL)
720                         attrcount_orig++;
721         }
722         attrcount = attrcount_orig;
723         /*
724          * New channel registration method - relies on the fact a group does
725          * not need to be initialized if it is name is NULL.
726          */
727         if (indio_dev->channels)
728                 for (i = 0; i < indio_dev->num_channels; i++) {
729                         ret = iio_device_add_channel_sysfs(indio_dev,
730                                                            &indio_dev
731                                                            ->channels[i]);
732                         if (ret < 0)
733                                 goto error_clear_attrs;
734                         attrcount += ret;
735                 }
736
737         if (indio_dev->name)
738                 attrcount++;
739
740         indio_dev->chan_attr_group.attrs = kcalloc(attrcount + 1,
741                                                    sizeof(indio_dev->chan_attr_group.attrs[0]),
742                                                    GFP_KERNEL);
743         if (indio_dev->chan_attr_group.attrs == NULL) {
744                 ret = -ENOMEM;
745                 goto error_clear_attrs;
746         }
747         /* Copy across original attributes */
748         if (indio_dev->info->attrs)
749                 memcpy(indio_dev->chan_attr_group.attrs,
750                        indio_dev->info->attrs->attrs,
751                        sizeof(indio_dev->chan_attr_group.attrs[0])
752                        *attrcount_orig);
753         attrn = attrcount_orig;
754         /* Add all elements from the list. */
755         list_for_each_entry(p, &indio_dev->channel_attr_list, l)
756                 indio_dev->chan_attr_group.attrs[attrn++] = &p->dev_attr.attr;
757         if (indio_dev->name)
758                 indio_dev->chan_attr_group.attrs[attrn++] = &dev_attr_name.attr;
759
760         indio_dev->groups[indio_dev->groupcounter++] =
761                 &indio_dev->chan_attr_group;
762
763         return 0;
764
765 error_clear_attrs:
766         list_for_each_entry_safe(p, n,
767                                  &indio_dev->channel_attr_list, l) {
768                 list_del(&p->l);
769                 iio_device_remove_and_free_read_attr(indio_dev, p);
770         }
771
772         return ret;
773 }
774
775 static void iio_device_unregister_sysfs(struct iio_dev *indio_dev)
776 {
777
778         struct iio_dev_attr *p, *n;
779
780         list_for_each_entry_safe(p, n, &indio_dev->channel_attr_list, l) {
781                 list_del(&p->l);
782                 iio_device_remove_and_free_read_attr(indio_dev, p);
783         }
784         kfree(indio_dev->chan_attr_group.attrs);
785 }
786
787 static void iio_dev_release(struct device *device)
788 {
789         struct iio_dev *indio_dev = dev_to_iio_dev(device);
790         if (indio_dev->chrdev.dev)
791                 cdev_del(&indio_dev->chrdev);
792         if (indio_dev->modes & INDIO_BUFFER_TRIGGERED)
793                 iio_device_unregister_trigger_consumer(indio_dev);
794         iio_device_unregister_eventset(indio_dev);
795         iio_device_unregister_sysfs(indio_dev);
796         iio_device_unregister_debugfs(indio_dev);
797
798         ida_simple_remove(&iio_ida, indio_dev->id);
799         kfree(indio_dev);
800 }
801
802 static struct device_type iio_dev_type = {
803         .name = "iio_device",
804         .release = iio_dev_release,
805 };
806
807 struct iio_dev *iio_device_alloc(int sizeof_priv)
808 {
809         struct iio_dev *dev;
810         size_t alloc_size;
811
812         alloc_size = sizeof(struct iio_dev);
813         if (sizeof_priv) {
814                 alloc_size = ALIGN(alloc_size, IIO_ALIGN);
815                 alloc_size += sizeof_priv;
816         }
817         /* ensure 32-byte alignment of whole construct ? */
818         alloc_size += IIO_ALIGN - 1;
819
820         dev = kzalloc(alloc_size, GFP_KERNEL);
821
822         if (dev) {
823                 dev->dev.groups = dev->groups;
824                 dev->dev.type = &iio_dev_type;
825                 dev->dev.bus = &iio_bus_type;
826                 device_initialize(&dev->dev);
827                 dev_set_drvdata(&dev->dev, (void *)dev);
828                 mutex_init(&dev->mlock);
829                 mutex_init(&dev->info_exist_lock);
830                 INIT_LIST_HEAD(&dev->channel_attr_list);
831
832                 dev->id = ida_simple_get(&iio_ida, 0, 0, GFP_KERNEL);
833                 if (dev->id < 0) {
834                         /* cannot use a dev_err as the name isn't available */
835                         printk(KERN_ERR "Failed to get id\n");
836                         kfree(dev);
837                         return NULL;
838                 }
839                 dev_set_name(&dev->dev, "iio:device%d", dev->id);
840         }
841
842         return dev;
843 }
844 EXPORT_SYMBOL(iio_device_alloc);
845
846 void iio_device_free(struct iio_dev *dev)
847 {
848         if (dev)
849                 put_device(&dev->dev);
850 }
851 EXPORT_SYMBOL(iio_device_free);
852
853 /**
854  * iio_chrdev_open() - chrdev file open for buffer access and ioctls
855  **/
856 static int iio_chrdev_open(struct inode *inode, struct file *filp)
857 {
858         struct iio_dev *indio_dev = container_of(inode->i_cdev,
859                                                 struct iio_dev, chrdev);
860
861         if (test_and_set_bit(IIO_BUSY_BIT_POS, &indio_dev->flags))
862                 return -EBUSY;
863
864         filp->private_data = indio_dev;
865
866         return 0;
867 }
868
869 /**
870  * iio_chrdev_release() - chrdev file close buffer access and ioctls
871  **/
872 static int iio_chrdev_release(struct inode *inode, struct file *filp)
873 {
874         struct iio_dev *indio_dev = container_of(inode->i_cdev,
875                                                 struct iio_dev, chrdev);
876         clear_bit(IIO_BUSY_BIT_POS, &indio_dev->flags);
877         return 0;
878 }
879
880 /* Somewhat of a cross file organization violation - ioctls here are actually
881  * event related */
882 static long iio_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
883 {
884         struct iio_dev *indio_dev = filp->private_data;
885         int __user *ip = (int __user *)arg;
886         int fd;
887
888         if (cmd == IIO_GET_EVENT_FD_IOCTL) {
889                 fd = iio_event_getfd(indio_dev);
890                 if (copy_to_user(ip, &fd, sizeof(fd)))
891                         return -EFAULT;
892                 return 0;
893         }
894         return -EINVAL;
895 }
896
897 static const struct file_operations iio_buffer_fileops = {
898         .read = iio_buffer_read_first_n_outer_addr,
899         .release = iio_chrdev_release,
900         .open = iio_chrdev_open,
901         .poll = iio_buffer_poll_addr,
902         .owner = THIS_MODULE,
903         .llseek = noop_llseek,
904         .unlocked_ioctl = iio_ioctl,
905         .compat_ioctl = iio_ioctl,
906 };
907
908 static const struct iio_buffer_setup_ops noop_ring_setup_ops;
909
910 int iio_device_register(struct iio_dev *indio_dev)
911 {
912         int ret;
913
914         /* configure elements for the chrdev */
915         indio_dev->dev.devt = MKDEV(MAJOR(iio_devt), indio_dev->id);
916
917         ret = iio_device_register_debugfs(indio_dev);
918         if (ret) {
919                 dev_err(indio_dev->dev.parent,
920                         "Failed to register debugfs interfaces\n");
921                 goto error_ret;
922         }
923         ret = iio_device_register_sysfs(indio_dev);
924         if (ret) {
925                 dev_err(indio_dev->dev.parent,
926                         "Failed to register sysfs interfaces\n");
927                 goto error_unreg_debugfs;
928         }
929         ret = iio_device_register_eventset(indio_dev);
930         if (ret) {
931                 dev_err(indio_dev->dev.parent,
932                         "Failed to register event set\n");
933                 goto error_free_sysfs;
934         }
935         if (indio_dev->modes & INDIO_BUFFER_TRIGGERED)
936                 iio_device_register_trigger_consumer(indio_dev);
937
938         if ((indio_dev->modes & INDIO_ALL_BUFFER_MODES) &&
939                 indio_dev->setup_ops == NULL)
940                 indio_dev->setup_ops = &noop_ring_setup_ops;
941
942         ret = device_add(&indio_dev->dev);
943         if (ret < 0)
944                 goto error_unreg_eventset;
945         cdev_init(&indio_dev->chrdev, &iio_buffer_fileops);
946         indio_dev->chrdev.owner = indio_dev->info->driver_module;
947         ret = cdev_add(&indio_dev->chrdev, indio_dev->dev.devt, 1);
948         if (ret < 0)
949                 goto error_del_device;
950         return 0;
951
952 error_del_device:
953         device_del(&indio_dev->dev);
954 error_unreg_eventset:
955         iio_device_unregister_eventset(indio_dev);
956 error_free_sysfs:
957         iio_device_unregister_sysfs(indio_dev);
958 error_unreg_debugfs:
959         iio_device_unregister_debugfs(indio_dev);
960 error_ret:
961         return ret;
962 }
963 EXPORT_SYMBOL(iio_device_register);
964
965 void iio_device_unregister(struct iio_dev *indio_dev)
966 {
967         mutex_lock(&indio_dev->info_exist_lock);
968         indio_dev->info = NULL;
969         mutex_unlock(&indio_dev->info_exist_lock);
970         device_del(&indio_dev->dev);
971 }
972 EXPORT_SYMBOL(iio_device_unregister);
973 subsys_initcall(iio_init);
974 module_exit(iio_exit);
975
976 MODULE_AUTHOR("Jonathan Cameron <jic23@cam.ac.uk>");
977 MODULE_DESCRIPTION("Industrial I/O core");
978 MODULE_LICENSE("GPL");