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 --- |