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

iio: accel: mma8452: claim direct mode during write raw

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 write raw operations.

Signed-off-by: Alison Schofield <amsfield22@gmail.com>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>

+38 -22
+38 -22
drivers/iio/accel/mma8452.c
··· 666 666 struct mma8452_data *data = iio_priv(indio_dev); 667 667 int i, ret; 668 668 669 - if (iio_buffer_enabled(indio_dev)) 670 - return -EBUSY; 669 + ret = iio_device_claim_direct_mode(indio_dev); 670 + if (ret) 671 + return ret; 671 672 672 673 switch (mask) { 673 674 case IIO_CHAN_INFO_SAMP_FREQ: 674 675 i = mma8452_get_samp_freq_index(data, val, val2); 675 - if (i < 0) 676 - return i; 677 - 676 + if (i < 0) { 677 + ret = i; 678 + break; 679 + } 678 680 data->ctrl_reg1 &= ~MMA8452_CTRL_DR_MASK; 679 681 data->ctrl_reg1 |= i << MMA8452_CTRL_DR_SHIFT; 680 682 681 - return mma8452_change_config(data, MMA8452_CTRL_REG1, 682 - data->ctrl_reg1); 683 + ret = mma8452_change_config(data, MMA8452_CTRL_REG1, 684 + data->ctrl_reg1); 685 + break; 683 686 case IIO_CHAN_INFO_SCALE: 684 687 i = mma8452_get_scale_index(data, val, val2); 685 - if (i < 0) 686 - return i; 688 + if (i < 0) { 689 + ret = i; 690 + break; 691 + } 687 692 688 693 data->data_cfg &= ~MMA8452_DATA_CFG_FS_MASK; 689 694 data->data_cfg |= i; 690 695 691 - return mma8452_change_config(data, MMA8452_DATA_CFG, 692 - data->data_cfg); 696 + ret = mma8452_change_config(data, MMA8452_DATA_CFG, 697 + data->data_cfg); 698 + break; 693 699 case IIO_CHAN_INFO_CALIBBIAS: 694 - if (val < -128 || val > 127) 695 - return -EINVAL; 700 + if (val < -128 || val > 127) { 701 + ret = -EINVAL; 702 + break; 703 + } 696 704 697 - return mma8452_change_config(data, 698 - MMA8452_OFF_X + chan->scan_index, 699 - val); 705 + ret = mma8452_change_config(data, 706 + MMA8452_OFF_X + chan->scan_index, 707 + val); 708 + break; 700 709 701 710 case IIO_CHAN_INFO_HIGH_PASS_FILTER_3DB_FREQUENCY: 702 711 if (val == 0 && val2 == 0) { ··· 714 705 data->data_cfg |= MMA8452_DATA_CFG_HPF_MASK; 715 706 ret = mma8452_set_hp_filter_frequency(data, val, val2); 716 707 if (ret < 0) 717 - return ret; 708 + break; 718 709 } 719 710 720 - return mma8452_change_config(data, MMA8452_DATA_CFG, 711 + ret = mma8452_change_config(data, MMA8452_DATA_CFG, 721 712 data->data_cfg); 713 + break; 722 714 723 715 case IIO_CHAN_INFO_OVERSAMPLING_RATIO: 724 716 ret = mma8452_get_odr_index(data); 725 717 726 718 for (i = 0; i < ARRAY_SIZE(mma8452_os_ratio); i++) { 727 - if (mma8452_os_ratio[i][ret] == val) 728 - return mma8452_set_power_mode(data, i); 719 + if (mma8452_os_ratio[i][ret] == val) { 720 + ret = mma8452_set_power_mode(data, i); 721 + break; 722 + } 729 723 } 730 - 724 + break; 731 725 default: 732 - return -EINVAL; 726 + ret = -EINVAL; 727 + break; 733 728 } 729 + 730 + iio_device_release_direct_mode(indio_dev); 731 + return ret; 734 732 } 735 733 736 734 static int mma8452_read_thresh(struct iio_dev *indio_dev,