Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

iio: light: ltr501: claim direct mode during raw writes

Driver was checking for direct mode but not locking it. Use
claim/release helper functions to guarantee the device stays
in direct mode during all raw write operations.

Signed-off-by: Alison Schofield <amsfield22@gmail.com>
Acked-by: Peter Meerwald-Stadler <pmeerw@pmeerw.net>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>

authored by

Alison Schofield and committed by
Jonathan Cameron
4aee9873 218e95e9

+51 -30
+51 -30
drivers/iio/light/ltr501.c
··· 739 739 int i, ret, freq_val, freq_val2; 740 740 struct ltr501_chip_info *info = data->chip_info; 741 741 742 - if (iio_buffer_enabled(indio_dev)) 743 - return -EBUSY; 742 + ret = iio_device_claim_direct_mode(indio_dev); 743 + if (ret) 744 + return ret; 744 745 745 746 switch (mask) { 746 747 case IIO_CHAN_INFO_SCALE: ··· 750 749 i = ltr501_get_gain_index(info->als_gain, 751 750 info->als_gain_tbl_size, 752 751 val, val2); 753 - if (i < 0) 754 - return -EINVAL; 752 + if (i < 0) { 753 + ret = -EINVAL; 754 + break; 755 + } 755 756 756 757 data->als_contr &= ~info->als_gain_mask; 757 758 data->als_contr |= i << info->als_gain_shift; 758 759 759 - return regmap_write(data->regmap, LTR501_ALS_CONTR, 760 - data->als_contr); 760 + ret = regmap_write(data->regmap, LTR501_ALS_CONTR, 761 + data->als_contr); 762 + break; 761 763 case IIO_PROXIMITY: 762 764 i = ltr501_get_gain_index(info->ps_gain, 763 765 info->ps_gain_tbl_size, 764 766 val, val2); 765 - if (i < 0) 766 - return -EINVAL; 767 + if (i < 0) { 768 + ret = -EINVAL; 769 + break; 770 + } 767 771 data->ps_contr &= ~LTR501_CONTR_PS_GAIN_MASK; 768 772 data->ps_contr |= i << LTR501_CONTR_PS_GAIN_SHIFT; 769 773 770 - return regmap_write(data->regmap, LTR501_PS_CONTR, 771 - data->ps_contr); 774 + ret = regmap_write(data->regmap, LTR501_PS_CONTR, 775 + data->ps_contr); 776 + break; 772 777 default: 773 - return -EINVAL; 778 + ret = -EINVAL; 779 + break; 774 780 } 781 + break; 782 + 775 783 case IIO_CHAN_INFO_INT_TIME: 776 784 switch (chan->type) { 777 785 case IIO_INTENSITY: 778 - if (val != 0) 779 - return -EINVAL; 786 + if (val != 0) { 787 + ret = -EINVAL; 788 + break; 789 + } 780 790 mutex_lock(&data->lock_als); 781 - i = ltr501_set_it_time(data, val2); 791 + ret = ltr501_set_it_time(data, val2); 782 792 mutex_unlock(&data->lock_als); 783 - return i; 793 + break; 784 794 default: 785 - return -EINVAL; 795 + ret = -EINVAL; 796 + break; 786 797 } 798 + break; 799 + 787 800 case IIO_CHAN_INFO_SAMP_FREQ: 788 801 switch (chan->type) { 789 802 case IIO_INTENSITY: 790 803 ret = ltr501_als_read_samp_freq(data, &freq_val, 791 804 &freq_val2); 792 805 if (ret < 0) 793 - return ret; 806 + break; 794 807 795 808 ret = ltr501_als_write_samp_freq(data, val, val2); 796 809 if (ret < 0) 797 - return ret; 810 + break; 798 811 799 812 /* update persistence count when changing frequency */ 800 813 ret = ltr501_write_intr_prst(data, chan->type, 801 814 0, data->als_period); 802 815 803 816 if (ret < 0) 804 - return ltr501_als_write_samp_freq(data, 805 - freq_val, 806 - freq_val2); 807 - return ret; 817 + ret = ltr501_als_write_samp_freq(data, freq_val, 818 + freq_val2); 819 + break; 808 820 case IIO_PROXIMITY: 809 821 ret = ltr501_ps_read_samp_freq(data, &freq_val, 810 822 &freq_val2); 811 823 if (ret < 0) 812 - return ret; 824 + break; 813 825 814 826 ret = ltr501_ps_write_samp_freq(data, val, val2); 815 827 if (ret < 0) 816 - return ret; 828 + break; 817 829 818 830 /* update persistence count when changing frequency */ 819 831 ret = ltr501_write_intr_prst(data, chan->type, 820 832 0, data->ps_period); 821 833 822 834 if (ret < 0) 823 - return ltr501_ps_write_samp_freq(data, 824 - freq_val, 825 - freq_val2); 826 - return ret; 835 + ret = ltr501_ps_write_samp_freq(data, freq_val, 836 + freq_val2); 837 + break; 827 838 default: 828 - return -EINVAL; 839 + ret = -EINVAL; 840 + break; 829 841 } 842 + break; 843 + 844 + default: 845 + ret = -EINVAL; 846 + break; 830 847 } 831 - return -EINVAL; 848 + 849 + iio_device_release_direct_mode(indio_dev); 850 + return ret; 832 851 } 833 852 834 853 static int ltr501_read_thresh(struct iio_dev *indio_dev,