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