.. | .. |
---|
5 | 5 | */ |
---|
6 | 6 | |
---|
7 | 7 | #include <linux/module.h> |
---|
| 8 | +#include <linux/mutex.h> |
---|
8 | 9 | #include <linux/platform_device.h> |
---|
9 | 10 | #include <linux/interrupt.h> |
---|
10 | 11 | #include <linux/io.h> |
---|
.. | .. |
---|
68 | 69 | struct clk *clk; |
---|
69 | 70 | struct completion completion; |
---|
70 | 71 | struct regulator *vref; |
---|
| 72 | + /* lock to protect against multiple access to the device */ |
---|
| 73 | + struct mutex lock; |
---|
71 | 74 | int uv_vref; |
---|
72 | 75 | struct reset_control *reset; |
---|
73 | 76 | const struct rockchip_saradc_data *data; |
---|
.. | .. |
---|
189 | 192 | #endif |
---|
190 | 193 | switch (mask) { |
---|
191 | 194 | case IIO_CHAN_INFO_RAW: |
---|
192 | | - mutex_lock(&indio_dev->mlock); |
---|
| 195 | + mutex_lock(&info->lock); |
---|
193 | 196 | |
---|
194 | 197 | if (info->suspended) { |
---|
195 | | - mutex_unlock(&indio_dev->mlock); |
---|
| 198 | + mutex_unlock(&info->lock); |
---|
196 | 199 | return -EBUSY; |
---|
197 | 200 | } |
---|
198 | 201 | |
---|
199 | 202 | ret = rockchip_saradc_conversion(info, chan); |
---|
200 | 203 | if (ret) { |
---|
201 | 204 | rockchip_saradc_power_down(info); |
---|
202 | | - mutex_unlock(&indio_dev->mlock); |
---|
| 205 | + mutex_unlock(&info->lock); |
---|
203 | 206 | return ret; |
---|
204 | 207 | } |
---|
205 | 208 | |
---|
206 | 209 | *val = info->last_val; |
---|
207 | | - mutex_unlock(&indio_dev->mlock); |
---|
| 210 | + mutex_unlock(&info->lock); |
---|
208 | 211 | return IIO_VAL_INT; |
---|
209 | 212 | case IIO_CHAN_INFO_SCALE: |
---|
210 | 213 | /* It is a dummy regulator */ |
---|
.. | .. |
---|
476 | 479 | int ret; |
---|
477 | 480 | int i, j = 0; |
---|
478 | 481 | |
---|
479 | | - mutex_lock(&i_dev->mlock); |
---|
| 482 | + mutex_lock(&info->lock); |
---|
480 | 483 | |
---|
481 | 484 | for_each_set_bit(i, i_dev->active_scan_mask, i_dev->masklength) { |
---|
482 | 485 | const struct iio_chan_spec *chan = &i_dev->channels[i]; |
---|
.. | .. |
---|
493 | 496 | |
---|
494 | 497 | iio_push_to_buffers_with_timestamp(i_dev, &data, iio_get_time_ns(i_dev)); |
---|
495 | 498 | out: |
---|
496 | | - mutex_unlock(&i_dev->mlock); |
---|
| 499 | + mutex_unlock(&info->lock); |
---|
497 | 500 | |
---|
498 | 501 | iio_trigger_notify_done(i_dev->trig); |
---|
499 | 502 | |
---|
.. | .. |
---|
784 | 787 | return ret; |
---|
785 | 788 | } |
---|
786 | 789 | #endif |
---|
| 790 | + mutex_init(&info->lock); |
---|
| 791 | + |
---|
787 | 792 | return devm_iio_device_register(&pdev->dev, indio_dev); |
---|
788 | 793 | } |
---|
789 | 794 | |
---|
.. | .. |
---|
794 | 799 | struct rockchip_saradc *info = iio_priv(indio_dev); |
---|
795 | 800 | |
---|
796 | 801 | /* Avoid reading saradc when suspending */ |
---|
797 | | - mutex_lock(&indio_dev->mlock); |
---|
| 802 | + mutex_lock(&info->lock); |
---|
798 | 803 | |
---|
799 | 804 | clk_disable_unprepare(info->clk); |
---|
800 | 805 | clk_disable_unprepare(info->pclk); |
---|
801 | 806 | regulator_disable(info->vref); |
---|
802 | 807 | |
---|
803 | 808 | info->suspended = true; |
---|
804 | | - mutex_unlock(&indio_dev->mlock); |
---|
| 809 | + mutex_unlock(&info->lock); |
---|
805 | 810 | |
---|
806 | 811 | return 0; |
---|
807 | 812 | } |
---|