1 /* The industrial I/O core in kernel channel mapping
3 * Copyright (c) 2011 Jonathan Cameron
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.
10 #include <linux/export.h>
11 #include <linux/slab.h>
12 #include <linux/mutex.h>
15 #include <linux/iio/iio.h>
17 #include <linux/iio/machine.h>
18 #include <linux/iio/driver.h>
19 #include <linux/iio/consumer.h>
21 struct iio_map_internal
{
22 struct iio_dev
*indio_dev
;
27 static LIST_HEAD(iio_map_list
);
28 static DEFINE_MUTEX(iio_map_list_lock
);
30 int iio_map_array_register(struct iio_dev
*indio_dev
, struct iio_map
*maps
)
33 struct iio_map_internal
*mapi
;
38 mutex_lock(&iio_map_list_lock
);
39 while (maps
[i
].consumer_dev_name
!= NULL
) {
40 mapi
= kzalloc(sizeof(*mapi
), GFP_KERNEL
);
46 mapi
->indio_dev
= indio_dev
;
47 list_add(&mapi
->l
, &iio_map_list
);
51 mutex_unlock(&iio_map_list_lock
);
55 EXPORT_SYMBOL_GPL(iio_map_array_register
);
59 * Remove all map entries associated with the given iio device
61 int iio_map_array_unregister(struct iio_dev
*indio_dev
)
64 struct iio_map_internal
*mapi
;
65 struct list_head
*pos
, *tmp
;
67 mutex_lock(&iio_map_list_lock
);
68 list_for_each_safe(pos
, tmp
, &iio_map_list
) {
69 mapi
= list_entry(pos
, struct iio_map_internal
, l
);
70 if (indio_dev
== mapi
->indio_dev
) {
76 mutex_unlock(&iio_map_list_lock
);
79 EXPORT_SYMBOL_GPL(iio_map_array_unregister
);
81 static const struct iio_chan_spec
82 *iio_chan_spec_from_name(const struct iio_dev
*indio_dev
, const char *name
)
85 const struct iio_chan_spec
*chan
= NULL
;
87 for (i
= 0; i
< indio_dev
->num_channels
; i
++)
88 if (indio_dev
->channels
[i
].datasheet_name
&&
89 strcmp(name
, indio_dev
->channels
[i
].datasheet_name
) == 0) {
90 chan
= &indio_dev
->channels
[i
];
98 static int iio_dev_node_match(struct device
*dev
, void *data
)
100 return dev
->of_node
== data
&& dev
->type
== &iio_device_type
;
103 static int __of_iio_channel_get(struct iio_channel
*channel
,
104 struct device_node
*np
, int index
)
107 struct iio_dev
*indio_dev
;
109 struct of_phandle_args iiospec
;
111 err
= of_parse_phandle_with_args(np
, "io-channels",
117 idev
= bus_find_device(&iio_bus_type
, NULL
, iiospec
.np
,
119 of_node_put(iiospec
.np
);
121 return -EPROBE_DEFER
;
123 indio_dev
= dev_to_iio_dev(idev
);
124 channel
->indio_dev
= indio_dev
;
125 index
= iiospec
.args_count
? iiospec
.args
[0] : 0;
126 if (index
>= indio_dev
->num_channels
) {
130 channel
->channel
= &indio_dev
->channels
[index
];
135 iio_device_put(indio_dev
);
139 static struct iio_channel
*of_iio_channel_get(struct device_node
*np
, int index
)
141 struct iio_channel
*channel
;
145 return ERR_PTR(-EINVAL
);
147 channel
= kzalloc(sizeof(*channel
), GFP_KERNEL
);
149 return ERR_PTR(-ENOMEM
);
151 err
= __of_iio_channel_get(channel
, np
, index
);
153 goto err_free_channel
;
162 static struct iio_channel
*of_iio_channel_get_by_name(struct device_node
*np
,
165 struct iio_channel
*chan
= NULL
;
167 /* Walk up the tree of devices looking for a matching iio channel */
172 * For named iio channels, first look up the name in the
173 * "io-channel-names" property. If it cannot be found, the
174 * index will be an error code, and of_iio_channel_get()
178 index
= of_property_match_string(np
, "io-channel-names",
180 chan
= of_iio_channel_get(np
, index
);
183 else if (name
&& index
>= 0) {
184 pr_err("ERROR: could not get IIO channel %s:%s(%i)\n",
185 np
->full_name
, name
? name
: "", index
);
190 * No matching IIO channel found on this node.
191 * If the parent node has a "io-channel-ranges" property,
192 * then we can try one of its channels.
195 if (np
&& !of_get_property(np
, "io-channel-ranges", NULL
))
202 static struct iio_channel
*of_iio_channel_get_all(struct device
*dev
)
204 struct iio_channel
*chans
;
205 int i
, mapind
, nummaps
= 0;
209 ret
= of_parse_phandle_with_args(dev
->of_node
,
217 if (nummaps
== 0) /* no error, return NULL to search map table */
220 /* NULL terminated array to save passing size */
221 chans
= kcalloc(nummaps
+ 1, sizeof(*chans
), GFP_KERNEL
);
223 return ERR_PTR(-ENOMEM
);
225 /* Search for OF matches */
226 for (mapind
= 0; mapind
< nummaps
; mapind
++) {
227 ret
= __of_iio_channel_get(&chans
[mapind
], dev
->of_node
,
230 goto error_free_chans
;
235 for (i
= 0; i
< mapind
; i
++)
236 iio_device_put(chans
[i
].indio_dev
);
241 #else /* CONFIG_OF */
243 static inline struct iio_channel
*
244 of_iio_channel_get_by_name(struct device_node
*np
, const char *name
)
249 static inline struct iio_channel
*of_iio_channel_get_all(struct device
*dev
)
254 #endif /* CONFIG_OF */
256 static struct iio_channel
*iio_channel_get_sys(const char *name
,
257 const char *channel_name
)
259 struct iio_map_internal
*c_i
= NULL
, *c
= NULL
;
260 struct iio_channel
*channel
;
263 if (name
== NULL
&& channel_name
== NULL
)
264 return ERR_PTR(-ENODEV
);
266 /* first find matching entry the channel map */
267 mutex_lock(&iio_map_list_lock
);
268 list_for_each_entry(c_i
, &iio_map_list
, l
) {
269 if ((name
&& strcmp(name
, c_i
->map
->consumer_dev_name
) != 0) ||
271 strcmp(channel_name
, c_i
->map
->consumer_channel
) != 0))
274 iio_device_get(c
->indio_dev
);
277 mutex_unlock(&iio_map_list_lock
);
279 return ERR_PTR(-ENODEV
);
281 channel
= kzalloc(sizeof(*channel
), GFP_KERNEL
);
282 if (channel
== NULL
) {
287 channel
->indio_dev
= c
->indio_dev
;
289 if (c
->map
->adc_channel_label
) {
291 iio_chan_spec_from_name(channel
->indio_dev
,
292 c
->map
->adc_channel_label
);
294 if (channel
->channel
== NULL
) {
305 iio_device_put(c
->indio_dev
);
309 struct iio_channel
*iio_channel_get(struct device
*dev
,
310 const char *channel_name
)
312 const char *name
= dev
? dev_name(dev
) : NULL
;
313 struct iio_channel
*channel
;
316 channel
= of_iio_channel_get_by_name(dev
->of_node
,
322 return iio_channel_get_sys(name
, channel_name
);
324 EXPORT_SYMBOL_GPL(iio_channel_get
);
326 void iio_channel_release(struct iio_channel
*channel
)
328 iio_device_put(channel
->indio_dev
);
331 EXPORT_SYMBOL_GPL(iio_channel_release
);
333 struct iio_channel
*iio_channel_get_all(struct device
*dev
)
336 struct iio_channel
*chans
;
337 struct iio_map_internal
*c
= NULL
;
343 return ERR_PTR(-EINVAL
);
345 chans
= of_iio_channel_get_all(dev
);
349 name
= dev_name(dev
);
351 mutex_lock(&iio_map_list_lock
);
352 /* first count the matching maps */
353 list_for_each_entry(c
, &iio_map_list
, l
)
354 if (name
&& strcmp(name
, c
->map
->consumer_dev_name
) != 0)
364 /* NULL terminated array to save passing size */
365 chans
= kzalloc(sizeof(*chans
)*(nummaps
+ 1), GFP_KERNEL
);
371 /* for each map fill in the chans element */
372 list_for_each_entry(c
, &iio_map_list
, l
) {
373 if (name
&& strcmp(name
, c
->map
->consumer_dev_name
) != 0)
375 chans
[mapind
].indio_dev
= c
->indio_dev
;
376 chans
[mapind
].data
= c
->map
->consumer_data
;
377 chans
[mapind
].channel
=
378 iio_chan_spec_from_name(chans
[mapind
].indio_dev
,
379 c
->map
->adc_channel_label
);
380 if (chans
[mapind
].channel
== NULL
) {
382 goto error_free_chans
;
384 iio_device_get(chans
[mapind
].indio_dev
);
389 goto error_free_chans
;
391 mutex_unlock(&iio_map_list_lock
);
396 for (i
= 0; i
< nummaps
; i
++)
397 iio_device_put(chans
[i
].indio_dev
);
400 mutex_unlock(&iio_map_list_lock
);
404 EXPORT_SYMBOL_GPL(iio_channel_get_all
);
406 void iio_channel_release_all(struct iio_channel
*channels
)
408 struct iio_channel
*chan
= &channels
[0];
410 while (chan
->indio_dev
) {
411 iio_device_put(chan
->indio_dev
);
416 EXPORT_SYMBOL_GPL(iio_channel_release_all
);
418 static int iio_channel_read(struct iio_channel
*chan
, int *val
, int *val2
,
419 enum iio_chan_info_enum info
)
426 return chan
->indio_dev
->info
->read_raw(chan
->indio_dev
, chan
->channel
,
430 int iio_read_channel_raw(struct iio_channel
*chan
, int *val
)
434 mutex_lock(&chan
->indio_dev
->info_exist_lock
);
435 if (chan
->indio_dev
->info
== NULL
) {
440 ret
= iio_channel_read(chan
, val
, NULL
, IIO_CHAN_INFO_RAW
);
442 mutex_unlock(&chan
->indio_dev
->info_exist_lock
);
446 EXPORT_SYMBOL_GPL(iio_read_channel_raw
);
448 static int iio_convert_raw_to_processed_unlocked(struct iio_channel
*chan
,
449 int raw
, int *processed
, unsigned int scale
)
451 int scale_type
, scale_val
, scale_val2
, offset
;
455 ret
= iio_channel_read(chan
, &offset
, NULL
, IIO_CHAN_INFO_OFFSET
);
459 scale_type
= iio_channel_read(chan
, &scale_val
, &scale_val2
,
460 IIO_CHAN_INFO_SCALE
);
464 switch (scale_type
) {
466 *processed
= raw64
* scale_val
;
468 case IIO_VAL_INT_PLUS_MICRO
:
470 *processed
= -raw64
* scale_val
;
472 *processed
= raw64
* scale_val
;
473 *processed
+= div_s64(raw64
* (s64
)scale_val2
* scale
,
476 case IIO_VAL_INT_PLUS_NANO
:
478 *processed
= -raw64
* scale_val
;
480 *processed
= raw64
* scale_val
;
481 *processed
+= div_s64(raw64
* (s64
)scale_val2
* scale
,
484 case IIO_VAL_FRACTIONAL
:
485 *processed
= div_s64(raw64
* (s64
)scale_val
* scale
,
488 case IIO_VAL_FRACTIONAL_LOG2
:
489 *processed
= (raw64
* (s64
)scale_val
* scale
) >> scale_val2
;
498 int iio_convert_raw_to_processed(struct iio_channel
*chan
, int raw
,
499 int *processed
, unsigned int scale
)
503 mutex_lock(&chan
->indio_dev
->info_exist_lock
);
504 if (chan
->indio_dev
->info
== NULL
) {
509 ret
= iio_convert_raw_to_processed_unlocked(chan
, raw
, processed
,
512 mutex_unlock(&chan
->indio_dev
->info_exist_lock
);
516 EXPORT_SYMBOL_GPL(iio_convert_raw_to_processed
);
518 int iio_read_channel_processed(struct iio_channel
*chan
, int *val
)
522 mutex_lock(&chan
->indio_dev
->info_exist_lock
);
523 if (chan
->indio_dev
->info
== NULL
) {
528 if (iio_channel_has_info(chan
->channel
, IIO_CHAN_INFO_PROCESSED
)) {
529 ret
= iio_channel_read(chan
, val
, NULL
,
530 IIO_CHAN_INFO_PROCESSED
);
532 ret
= iio_channel_read(chan
, val
, NULL
, IIO_CHAN_INFO_RAW
);
535 ret
= iio_convert_raw_to_processed_unlocked(chan
, *val
, val
, 1);
539 mutex_unlock(&chan
->indio_dev
->info_exist_lock
);
543 EXPORT_SYMBOL_GPL(iio_read_channel_processed
);
545 int iio_read_channel_scale(struct iio_channel
*chan
, int *val
, int *val2
)
549 mutex_lock(&chan
->indio_dev
->info_exist_lock
);
550 if (chan
->indio_dev
->info
== NULL
) {
555 ret
= iio_channel_read(chan
, val
, val2
, IIO_CHAN_INFO_SCALE
);
557 mutex_unlock(&chan
->indio_dev
->info_exist_lock
);
561 EXPORT_SYMBOL_GPL(iio_read_channel_scale
);
563 int iio_get_channel_type(struct iio_channel
*chan
, enum iio_chan_type
*type
)
566 /* Need to verify underlying driver has not gone away */
568 mutex_lock(&chan
->indio_dev
->info_exist_lock
);
569 if (chan
->indio_dev
->info
== NULL
) {
574 *type
= chan
->channel
->type
;
576 mutex_unlock(&chan
->indio_dev
->info_exist_lock
);
580 EXPORT_SYMBOL_GPL(iio_get_channel_type
);