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

Configure Feed

Select the types of activity you want to include in your feed.

iio: light: rpr0521: Factor out handling of IIO_INFO_RAW and use guard()

Factor out the code which is only called with the direct mode claimed.
This and the use of guard(mutex) allows direct returns simplifying
code flow.

Reviewed-by: David Lechner <dlechner@baylibre.com>
Link: https://patch.msgid.link/20250309170633.1347476-12-jic23@kernel.org
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

+34 -23
+34 -23
drivers/iio/light/rpr0521.c
··· 11 11 12 12 #include <linux/module.h> 13 13 #include <linux/mod_devicetable.h> 14 + #include <linux/cleanup.h> 14 15 #include <linux/init.h> 15 16 #include <linux/i2c.h> 16 17 #include <linux/regmap.h> ··· 705 704 return ret; 706 705 } 707 706 707 + static int rpr0521_read_info_raw(struct rpr0521_data *data, 708 + struct iio_chan_spec const *chan, 709 + int *val) 710 + { 711 + u8 device_mask; 712 + __le16 raw_data; 713 + int ret; 714 + 715 + device_mask = rpr0521_data_reg[chan->address].device_mask; 716 + 717 + guard(mutex)(&data->lock); 718 + ret = rpr0521_set_power_state(data, true, device_mask); 719 + if (ret < 0) 720 + return ret; 721 + 722 + ret = regmap_bulk_read(data->regmap, 723 + rpr0521_data_reg[chan->address].address, 724 + &raw_data, sizeof(raw_data)); 725 + if (ret < 0) { 726 + rpr0521_set_power_state(data, false, device_mask); 727 + return ret; 728 + } 729 + 730 + ret = rpr0521_set_power_state(data, false, device_mask); 731 + if (ret < 0) 732 + return ret; 733 + 734 + *val = le16_to_cpu(raw_data); 735 + 736 + return 0; 737 + } 738 + 708 739 static int rpr0521_read_raw(struct iio_dev *indio_dev, 709 740 struct iio_chan_spec const *chan, int *val, 710 741 int *val2, long mask) ··· 744 711 struct rpr0521_data *data = iio_priv(indio_dev); 745 712 int ret; 746 713 int busy; 747 - u8 device_mask; 748 - __le16 raw_data; 749 714 750 715 switch (mask) { 751 716 case IIO_CHAN_INFO_RAW: ··· 754 723 if (busy) 755 724 return -EBUSY; 756 725 757 - device_mask = rpr0521_data_reg[chan->address].device_mask; 758 - 759 - mutex_lock(&data->lock); 760 - ret = rpr0521_set_power_state(data, true, device_mask); 761 - if (ret < 0) 762 - goto rpr0521_read_raw_out; 763 - 764 - ret = regmap_bulk_read(data->regmap, 765 - rpr0521_data_reg[chan->address].address, 766 - &raw_data, sizeof(raw_data)); 767 - if (ret < 0) { 768 - rpr0521_set_power_state(data, false, device_mask); 769 - goto rpr0521_read_raw_out; 770 - } 771 - 772 - ret = rpr0521_set_power_state(data, false, device_mask); 773 - 774 - rpr0521_read_raw_out: 775 - mutex_unlock(&data->lock); 726 + ret = rpr0521_read_info_raw(data, chan, val); 776 727 iio_device_release_direct_mode(indio_dev); 777 728 if (ret < 0) 778 729 return ret; 779 - 780 - *val = le16_to_cpu(raw_data); 781 730 782 731 return IIO_VAL_INT; 783 732