inkern.c (7349e8a36caa11c07e71b05f42c384bc540446c8) inkern.c (b804e2b76ac6d5559b99588e0190ac97b5597497)
1// SPDX-License-Identifier: GPL-2.0-only
2/* The industrial I/O core in kernel channel mapping
3 *
4 * Copyright (c) 2011 Jonathan Cameron
5 */
6#include <linux/err.h>
7#include <linux/export.h>
8#include <linux/slab.h>
9#include <linux/mutex.h>
10#include <linux/of.h>
11
12#include <linux/iio/iio.h>
1// SPDX-License-Identifier: GPL-2.0-only
2/* The industrial I/O core in kernel channel mapping
3 *
4 * Copyright (c) 2011 Jonathan Cameron
5 */
6#include <linux/err.h>
7#include <linux/export.h>
8#include <linux/slab.h>
9#include <linux/mutex.h>
10#include <linux/of.h>
11
12#include <linux/iio/iio.h>
13#include <linux/iio/iio-opaque.h>
13#include "iio_core.h"
14#include <linux/iio/machine.h>
15#include <linux/iio/driver.h>
16#include <linux/iio/consumer.h>
17
18struct iio_map_internal {
19 struct iio_dev *indio_dev;
20 struct iio_map *map;

--- 512 unchanged lines hidden (view full) ---

533 ret = chan->indio_dev->info->read_raw(chan->indio_dev,
534 chan->channel, val, val2, info);
535
536 return ret;
537}
538
539int iio_read_channel_raw(struct iio_channel *chan, int *val)
540{
14#include "iio_core.h"
15#include <linux/iio/machine.h>
16#include <linux/iio/driver.h>
17#include <linux/iio/consumer.h>
18
19struct iio_map_internal {
20 struct iio_dev *indio_dev;
21 struct iio_map *map;

--- 512 unchanged lines hidden (view full) ---

534 ret = chan->indio_dev->info->read_raw(chan->indio_dev,
535 chan->channel, val, val2, info);
536
537 return ret;
538}
539
540int iio_read_channel_raw(struct iio_channel *chan, int *val)
541{
542 struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev);
541 int ret;
542
543 int ret;
544
543 mutex_lock(&chan->indio_dev->info_exist_lock);
545 mutex_lock(&iio_dev_opaque->info_exist_lock);
544 if (chan->indio_dev->info == NULL) {
545 ret = -ENODEV;
546 goto err_unlock;
547 }
548
549 ret = iio_channel_read(chan, val, NULL, IIO_CHAN_INFO_RAW);
550err_unlock:
546 if (chan->indio_dev->info == NULL) {
547 ret = -ENODEV;
548 goto err_unlock;
549 }
550
551 ret = iio_channel_read(chan, val, NULL, IIO_CHAN_INFO_RAW);
552err_unlock:
551 mutex_unlock(&chan->indio_dev->info_exist_lock);
553 mutex_unlock(&iio_dev_opaque->info_exist_lock);
552
553 return ret;
554}
555EXPORT_SYMBOL_GPL(iio_read_channel_raw);
556
557int iio_read_channel_average_raw(struct iio_channel *chan, int *val)
558{
554
555 return ret;
556}
557EXPORT_SYMBOL_GPL(iio_read_channel_raw);
558
559int iio_read_channel_average_raw(struct iio_channel *chan, int *val)
560{
561 struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev);
559 int ret;
560
562 int ret;
563
561 mutex_lock(&chan->indio_dev->info_exist_lock);
564 mutex_lock(&iio_dev_opaque->info_exist_lock);
562 if (chan->indio_dev->info == NULL) {
563 ret = -ENODEV;
564 goto err_unlock;
565 }
566
567 ret = iio_channel_read(chan, val, NULL, IIO_CHAN_INFO_AVERAGE_RAW);
568err_unlock:
565 if (chan->indio_dev->info == NULL) {
566 ret = -ENODEV;
567 goto err_unlock;
568 }
569
570 ret = iio_channel_read(chan, val, NULL, IIO_CHAN_INFO_AVERAGE_RAW);
571err_unlock:
569 mutex_unlock(&chan->indio_dev->info_exist_lock);
572 mutex_unlock(&iio_dev_opaque->info_exist_lock);
570
571 return ret;
572}
573EXPORT_SYMBOL_GPL(iio_read_channel_average_raw);
574
575static int iio_convert_raw_to_processed_unlocked(struct iio_channel *chan,
576 int raw, int *processed, unsigned int scale)
577{

--- 48 unchanged lines hidden (view full) ---

626 }
627
628 return 0;
629}
630
631int iio_convert_raw_to_processed(struct iio_channel *chan, int raw,
632 int *processed, unsigned int scale)
633{
573
574 return ret;
575}
576EXPORT_SYMBOL_GPL(iio_read_channel_average_raw);
577
578static int iio_convert_raw_to_processed_unlocked(struct iio_channel *chan,
579 int raw, int *processed, unsigned int scale)
580{

--- 48 unchanged lines hidden (view full) ---

629 }
630
631 return 0;
632}
633
634int iio_convert_raw_to_processed(struct iio_channel *chan, int raw,
635 int *processed, unsigned int scale)
636{
637 struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev);
634 int ret;
635
638 int ret;
639
636 mutex_lock(&chan->indio_dev->info_exist_lock);
640 mutex_lock(&iio_dev_opaque->info_exist_lock);
637 if (chan->indio_dev->info == NULL) {
638 ret = -ENODEV;
639 goto err_unlock;
640 }
641
642 ret = iio_convert_raw_to_processed_unlocked(chan, raw, processed,
643 scale);
644err_unlock:
641 if (chan->indio_dev->info == NULL) {
642 ret = -ENODEV;
643 goto err_unlock;
644 }
645
646 ret = iio_convert_raw_to_processed_unlocked(chan, raw, processed,
647 scale);
648err_unlock:
645 mutex_unlock(&chan->indio_dev->info_exist_lock);
649 mutex_unlock(&iio_dev_opaque->info_exist_lock);
646
647 return ret;
648}
649EXPORT_SYMBOL_GPL(iio_convert_raw_to_processed);
650
651int iio_read_channel_attribute(struct iio_channel *chan, int *val, int *val2,
652 enum iio_chan_info_enum attribute)
653{
650
651 return ret;
652}
653EXPORT_SYMBOL_GPL(iio_convert_raw_to_processed);
654
655int iio_read_channel_attribute(struct iio_channel *chan, int *val, int *val2,
656 enum iio_chan_info_enum attribute)
657{
658 struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev);
654 int ret;
655
659 int ret;
660
656 mutex_lock(&chan->indio_dev->info_exist_lock);
661 mutex_lock(&iio_dev_opaque->info_exist_lock);
657 if (chan->indio_dev->info == NULL) {
658 ret = -ENODEV;
659 goto err_unlock;
660 }
661
662 ret = iio_channel_read(chan, val, val2, attribute);
663err_unlock:
662 if (chan->indio_dev->info == NULL) {
663 ret = -ENODEV;
664 goto err_unlock;
665 }
666
667 ret = iio_channel_read(chan, val, val2, attribute);
668err_unlock:
664 mutex_unlock(&chan->indio_dev->info_exist_lock);
669 mutex_unlock(&iio_dev_opaque->info_exist_lock);
665
666 return ret;
667}
668EXPORT_SYMBOL_GPL(iio_read_channel_attribute);
669
670int iio_read_channel_offset(struct iio_channel *chan, int *val, int *val2)
671{
672 return iio_read_channel_attribute(chan, val, val2, IIO_CHAN_INFO_OFFSET);
673}
674EXPORT_SYMBOL_GPL(iio_read_channel_offset);
675
676int iio_read_channel_processed_scale(struct iio_channel *chan, int *val,
677 unsigned int scale)
678{
670
671 return ret;
672}
673EXPORT_SYMBOL_GPL(iio_read_channel_attribute);
674
675int iio_read_channel_offset(struct iio_channel *chan, int *val, int *val2)
676{
677 return iio_read_channel_attribute(chan, val, val2, IIO_CHAN_INFO_OFFSET);
678}
679EXPORT_SYMBOL_GPL(iio_read_channel_offset);
680
681int iio_read_channel_processed_scale(struct iio_channel *chan, int *val,
682 unsigned int scale)
683{
684 struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev);
679 int ret;
680
685 int ret;
686
681 mutex_lock(&chan->indio_dev->info_exist_lock);
687 mutex_lock(&iio_dev_opaque->info_exist_lock);
682 if (chan->indio_dev->info == NULL) {
683 ret = -ENODEV;
684 goto err_unlock;
685 }
686
687 if (iio_channel_has_info(chan->channel, IIO_CHAN_INFO_PROCESSED)) {
688 ret = iio_channel_read(chan, val, NULL,
689 IIO_CHAN_INFO_PROCESSED);

--- 4 unchanged lines hidden (view full) ---

694 ret = iio_channel_read(chan, val, NULL, IIO_CHAN_INFO_RAW);
695 if (ret < 0)
696 goto err_unlock;
697 ret = iio_convert_raw_to_processed_unlocked(chan, *val, val,
698 scale);
699 }
700
701err_unlock:
688 if (chan->indio_dev->info == NULL) {
689 ret = -ENODEV;
690 goto err_unlock;
691 }
692
693 if (iio_channel_has_info(chan->channel, IIO_CHAN_INFO_PROCESSED)) {
694 ret = iio_channel_read(chan, val, NULL,
695 IIO_CHAN_INFO_PROCESSED);

--- 4 unchanged lines hidden (view full) ---

700 ret = iio_channel_read(chan, val, NULL, IIO_CHAN_INFO_RAW);
701 if (ret < 0)
702 goto err_unlock;
703 ret = iio_convert_raw_to_processed_unlocked(chan, *val, val,
704 scale);
705 }
706
707err_unlock:
702 mutex_unlock(&chan->indio_dev->info_exist_lock);
708 mutex_unlock(&iio_dev_opaque->info_exist_lock);
703
704 return ret;
705}
706EXPORT_SYMBOL_GPL(iio_read_channel_processed_scale);
707
708int iio_read_channel_processed(struct iio_channel *chan, int *val)
709{
710 /* This is just a special case with scale factor 1 */

--- 17 unchanged lines hidden (view full) ---

728 return chan->indio_dev->info->read_avail(chan->indio_dev, chan->channel,
729 vals, type, length, info);
730}
731
732int iio_read_avail_channel_attribute(struct iio_channel *chan,
733 const int **vals, int *type, int *length,
734 enum iio_chan_info_enum attribute)
735{
709
710 return ret;
711}
712EXPORT_SYMBOL_GPL(iio_read_channel_processed_scale);
713
714int iio_read_channel_processed(struct iio_channel *chan, int *val)
715{
716 /* This is just a special case with scale factor 1 */

--- 17 unchanged lines hidden (view full) ---

734 return chan->indio_dev->info->read_avail(chan->indio_dev, chan->channel,
735 vals, type, length, info);
736}
737
738int iio_read_avail_channel_attribute(struct iio_channel *chan,
739 const int **vals, int *type, int *length,
740 enum iio_chan_info_enum attribute)
741{
742 struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev);
736 int ret;
737
743 int ret;
744
738 mutex_lock(&chan->indio_dev->info_exist_lock);
745 mutex_lock(&iio_dev_opaque->info_exist_lock);
739 if (!chan->indio_dev->info) {
740 ret = -ENODEV;
741 goto err_unlock;
742 }
743
744 ret = iio_channel_read_avail(chan, vals, type, length, attribute);
745err_unlock:
746 if (!chan->indio_dev->info) {
747 ret = -ENODEV;
748 goto err_unlock;
749 }
750
751 ret = iio_channel_read_avail(chan, vals, type, length, attribute);
752err_unlock:
746 mutex_unlock(&chan->indio_dev->info_exist_lock);
753 mutex_unlock(&iio_dev_opaque->info_exist_lock);
747
748 return ret;
749}
750EXPORT_SYMBOL_GPL(iio_read_avail_channel_attribute);
751
752int iio_read_avail_channel_raw(struct iio_channel *chan,
753 const int **vals, int *length)
754{

--- 55 unchanged lines hidden (view full) ---

810
811 default:
812 return ret;
813 }
814}
815
816int iio_read_max_channel_raw(struct iio_channel *chan, int *val)
817{
754
755 return ret;
756}
757EXPORT_SYMBOL_GPL(iio_read_avail_channel_attribute);
758
759int iio_read_avail_channel_raw(struct iio_channel *chan,
760 const int **vals, int *length)
761{

--- 55 unchanged lines hidden (view full) ---

817
818 default:
819 return ret;
820 }
821}
822
823int iio_read_max_channel_raw(struct iio_channel *chan, int *val)
824{
825 struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev);
818 int ret;
819 int type;
820
826 int ret;
827 int type;
828
821 mutex_lock(&chan->indio_dev->info_exist_lock);
829 mutex_lock(&iio_dev_opaque->info_exist_lock);
822 if (!chan->indio_dev->info) {
823 ret = -ENODEV;
824 goto err_unlock;
825 }
826
827 ret = iio_channel_read_max(chan, val, NULL, &type, IIO_CHAN_INFO_RAW);
828err_unlock:
830 if (!chan->indio_dev->info) {
831 ret = -ENODEV;
832 goto err_unlock;
833 }
834
835 ret = iio_channel_read_max(chan, val, NULL, &type, IIO_CHAN_INFO_RAW);
836err_unlock:
829 mutex_unlock(&chan->indio_dev->info_exist_lock);
837 mutex_unlock(&iio_dev_opaque->info_exist_lock);
830
831 return ret;
832}
833EXPORT_SYMBOL_GPL(iio_read_max_channel_raw);
834
835int iio_get_channel_type(struct iio_channel *chan, enum iio_chan_type *type)
836{
838
839 return ret;
840}
841EXPORT_SYMBOL_GPL(iio_read_max_channel_raw);
842
843int iio_get_channel_type(struct iio_channel *chan, enum iio_chan_type *type)
844{
845 struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev);
837 int ret = 0;
838 /* Need to verify underlying driver has not gone away */
839
846 int ret = 0;
847 /* Need to verify underlying driver has not gone away */
848
840 mutex_lock(&chan->indio_dev->info_exist_lock);
849 mutex_lock(&iio_dev_opaque->info_exist_lock);
841 if (chan->indio_dev->info == NULL) {
842 ret = -ENODEV;
843 goto err_unlock;
844 }
845
846 *type = chan->channel->type;
847err_unlock:
850 if (chan->indio_dev->info == NULL) {
851 ret = -ENODEV;
852 goto err_unlock;
853 }
854
855 *type = chan->channel->type;
856err_unlock:
848 mutex_unlock(&chan->indio_dev->info_exist_lock);
857 mutex_unlock(&iio_dev_opaque->info_exist_lock);
849
850 return ret;
851}
852EXPORT_SYMBOL_GPL(iio_get_channel_type);
853
854static int iio_channel_write(struct iio_channel *chan, int val, int val2,
855 enum iio_chan_info_enum info)
856{
857 return chan->indio_dev->info->write_raw(chan->indio_dev,
858 chan->channel, val, val2, info);
859}
860
861int iio_write_channel_attribute(struct iio_channel *chan, int val, int val2,
862 enum iio_chan_info_enum attribute)
863{
858
859 return ret;
860}
861EXPORT_SYMBOL_GPL(iio_get_channel_type);
862
863static int iio_channel_write(struct iio_channel *chan, int val, int val2,
864 enum iio_chan_info_enum info)
865{
866 return chan->indio_dev->info->write_raw(chan->indio_dev,
867 chan->channel, val, val2, info);
868}
869
870int iio_write_channel_attribute(struct iio_channel *chan, int val, int val2,
871 enum iio_chan_info_enum attribute)
872{
873 struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev);
864 int ret;
865
874 int ret;
875
866 mutex_lock(&chan->indio_dev->info_exist_lock);
876 mutex_lock(&iio_dev_opaque->info_exist_lock);
867 if (chan->indio_dev->info == NULL) {
868 ret = -ENODEV;
869 goto err_unlock;
870 }
871
872 ret = iio_channel_write(chan, val, val2, attribute);
873err_unlock:
877 if (chan->indio_dev->info == NULL) {
878 ret = -ENODEV;
879 goto err_unlock;
880 }
881
882 ret = iio_channel_write(chan, val, val2, attribute);
883err_unlock:
874 mutex_unlock(&chan->indio_dev->info_exist_lock);
884 mutex_unlock(&iio_dev_opaque->info_exist_lock);
875
876 return ret;
877}
878EXPORT_SYMBOL_GPL(iio_write_channel_attribute);
879
880int iio_write_channel_raw(struct iio_channel *chan, int val)
881{
882 return iio_write_channel_attribute(chan, val, 0, IIO_CHAN_INFO_RAW);

--- 62 unchanged lines hidden ---
885
886 return ret;
887}
888EXPORT_SYMBOL_GPL(iio_write_channel_attribute);
889
890int iio_write_channel_raw(struct iio_channel *chan, int val)
891{
892 return iio_write_channel_attribute(chan, val, 0, IIO_CHAN_INFO_RAW);

--- 62 unchanged lines hidden ---