industrialio-buffer.c (623d74e37f12c9276b15c2c0540b438e684af0d2) industrialio-buffer.c (1250186a936a169a32f5101392deec18788877b9)
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 *

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

534
535static void iio_buffer_deactivate(struct iio_buffer *buffer)
536{
537 list_del_init(&buffer->buffer_list);
538 wake_up_interruptible(&buffer->pollq);
539 iio_buffer_put(buffer);
540}
541
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 *

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

534
535static void iio_buffer_deactivate(struct iio_buffer *buffer)
536{
537 list_del_init(&buffer->buffer_list);
538 wake_up_interruptible(&buffer->pollq);
539 iio_buffer_put(buffer);
540}
541
542static void iio_buffer_deactivate_all(struct iio_dev *indio_dev)
543{
544 struct iio_buffer *buffer, *_buffer;
545
546 list_for_each_entry_safe(buffer, _buffer,
547 &indio_dev->buffer_list, buffer_list)
548 iio_buffer_deactivate(buffer);
549}
550
542static void iio_buffer_update_bytes_per_datum(struct iio_dev *indio_dev,
543 struct iio_buffer *buffer)
544{
545 unsigned int bytes;
546
547 if (!buffer->access->set_bytes_per_datum)
548 return;
549

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

714err_undo_config:
715 indio_dev->active_scan_mask = NULL;
716
717 return ret;
718}
719
720static int iio_disable_buffers(struct iio_dev *indio_dev)
721{
551static void iio_buffer_update_bytes_per_datum(struct iio_dev *indio_dev,
552 struct iio_buffer *buffer)
553{
554 unsigned int bytes;
555
556 if (!buffer->access->set_bytes_per_datum)
557 return;
558

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

723err_undo_config:
724 indio_dev->active_scan_mask = NULL;
725
726 return ret;
727}
728
729static int iio_disable_buffers(struct iio_dev *indio_dev)
730{
722 int ret;
731 int ret = 0;
732 int ret2;
723
724 /* Wind down existing buffers - iff there are any */
725 if (list_empty(&indio_dev->buffer_list))
726 return 0;
727
733
734 /* Wind down existing buffers - iff there are any */
735 if (list_empty(&indio_dev->buffer_list))
736 return 0;
737
738 /*
739 * If things go wrong at some step in disable we still need to continue
740 * to perform the other steps, otherwise we leave the device in a
741 * inconsistent state. We return the error code for the first error we
742 * encountered.
743 */
744
728 if (indio_dev->setup_ops->predisable) {
745 if (indio_dev->setup_ops->predisable) {
729 ret = indio_dev->setup_ops->predisable(indio_dev);
730 if (ret)
731 return ret;
746 ret2 = indio_dev->setup_ops->predisable(indio_dev);
747 if (ret2 && !ret)
748 ret = ret2;
732 }
733
734 indio_dev->currentmode = INDIO_DIRECT_MODE;
735
736 if (indio_dev->setup_ops->postdisable) {
749 }
750
751 indio_dev->currentmode = INDIO_DIRECT_MODE;
752
753 if (indio_dev->setup_ops->postdisable) {
737 ret = indio_dev->setup_ops->postdisable(indio_dev);
738 if (ret)
739 return ret;
754 ret2 = indio_dev->setup_ops->postdisable(indio_dev);
755 if (ret2 && !ret)
756 ret = ret2;
740 }
741
757 }
758
742 return 0;
759 iio_free_scan_mask(indio_dev, indio_dev->active_scan_mask);
760 indio_dev->active_scan_mask = NULL;
761
762 return ret;
743}
744
745static int __iio_update_buffers(struct iio_dev *indio_dev,
746 struct iio_buffer *insert_buffer,
747 struct iio_buffer *remove_buffer)
748{
763}
764
765static int __iio_update_buffers(struct iio_dev *indio_dev,
766 struct iio_buffer *insert_buffer,
767 struct iio_buffer *remove_buffer)
768{
749 int ret;
750 const unsigned long *old_mask;
751 struct iio_device_config new_config;
769 struct iio_device_config new_config;
770 int ret;
752
753 ret = iio_verify_update(indio_dev, insert_buffer, remove_buffer,
754 &new_config);
755 if (ret)
756 return ret;
757
758 if (insert_buffer) {
759 ret = iio_buffer_request_update(indio_dev, insert_buffer);
760 if (ret)
761 goto err_free_config;
762 }
763
771
772 ret = iio_verify_update(indio_dev, insert_buffer, remove_buffer,
773 &new_config);
774 if (ret)
775 return ret;
776
777 if (insert_buffer) {
778 ret = iio_buffer_request_update(indio_dev, insert_buffer);
779 if (ret)
780 goto err_free_config;
781 }
782
764 /* Keep a copy of current setup to allow roll back */
765 old_mask = indio_dev->active_scan_mask;
766 indio_dev->active_scan_mask = NULL;
767
768 ret = iio_disable_buffers(indio_dev);
783 ret = iio_disable_buffers(indio_dev);
769 if (ret) {
770 iio_free_scan_mask(indio_dev, old_mask);
771 goto err_free_config;
772 }
784 if (ret)
785 goto err_deactivate_all;
773
774 if (remove_buffer)
775 iio_buffer_deactivate(remove_buffer);
776 if (insert_buffer)
777 iio_buffer_activate(indio_dev, insert_buffer);
778
779 /* If no buffers in list, we are done */
786
787 if (remove_buffer)
788 iio_buffer_deactivate(remove_buffer);
789 if (insert_buffer)
790 iio_buffer_activate(indio_dev, insert_buffer);
791
792 /* If no buffers in list, we are done */
780 if (list_empty(&indio_dev->buffer_list)) {
781 iio_free_scan_mask(indio_dev, old_mask);
793 if (list_empty(&indio_dev->buffer_list))
782 return 0;
794 return 0;
783 }
784
785 ret = iio_enable_buffers(indio_dev, &new_config);
795
796 ret = iio_enable_buffers(indio_dev, &new_config);
786 if (ret) {
787 if (insert_buffer)
788 iio_buffer_deactivate(insert_buffer);
789 indio_dev->active_scan_mask = old_mask;
790 goto err_free_config;
791 }
797 if (ret)
798 goto err_deactivate_all;
792
799
793 iio_free_scan_mask(indio_dev, old_mask);
794 return 0;
795
800 return 0;
801
802err_deactivate_all:
803 /*
804 * We've already verified that the config is valid earlier. If things go
805 * wrong in either enable or disable the most likely reason is an IO
806 * error from the device. In this case there is no good recovery
807 * strategy. Just make sure to disable everything and leave the device
808 * in a sane state. With a bit of luck the device might come back to
809 * life again later and userspace can try again.
810 */
811 iio_buffer_deactivate_all(indio_dev);
812
796err_free_config:
797 iio_free_scan_mask(indio_dev, new_config.scan_mask);
798 return ret;
799}
800
801int iio_update_buffers(struct iio_dev *indio_dev,
802 struct iio_buffer *insert_buffer,
803 struct iio_buffer *remove_buffer)

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

833 mutex_unlock(&indio_dev->info_exist_lock);
834
835 return ret;
836}
837EXPORT_SYMBOL_GPL(iio_update_buffers);
838
839void iio_disable_all_buffers(struct iio_dev *indio_dev)
840{
813err_free_config:
814 iio_free_scan_mask(indio_dev, new_config.scan_mask);
815 return ret;
816}
817
818int iio_update_buffers(struct iio_dev *indio_dev,
819 struct iio_buffer *insert_buffer,
820 struct iio_buffer *remove_buffer)

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

850 mutex_unlock(&indio_dev->info_exist_lock);
851
852 return ret;
853}
854EXPORT_SYMBOL_GPL(iio_update_buffers);
855
856void iio_disable_all_buffers(struct iio_dev *indio_dev)
857{
841 struct iio_buffer *buffer, *_buffer;
842
843 iio_disable_buffers(indio_dev);
858 iio_disable_buffers(indio_dev);
844 iio_free_scan_mask(indio_dev, indio_dev->active_scan_mask);
845 indio_dev->active_scan_mask = NULL;
846
847 list_for_each_entry_safe(buffer, _buffer,
848 &indio_dev->buffer_list, buffer_list)
849 iio_buffer_deactivate(buffer);
859 iio_buffer_deactivate_all(indio_dev);
850}
851
852static ssize_t iio_buffer_store_enable(struct device *dev,
853 struct device_attribute *attr,
854 const char *buf,
855 size_t len)
856{
857 int ret;

--- 477 unchanged lines hidden ---
860}
861
862static ssize_t iio_buffer_store_enable(struct device *dev,
863 struct device_attribute *attr,
864 const char *buf,
865 size_t len)
866{
867 int ret;

--- 477 unchanged lines hidden ---