ret = at91_adc_read_position(st, chan->channel,
                                             &tmp_val);
                *val = tmp_val;
-               mutex_unlock(&st->lock);
-               iio_device_release_direct_mode(indio_dev);
                if (ret > 0)
                        ret = at91_adc_adjust_val_osr(st, val);
+               mutex_unlock(&st->lock);
+               iio_device_release_direct_mode(indio_dev);
 
                return ret;
        }
                ret = at91_adc_read_pressure(st, chan->channel,
                                             &tmp_val);
                *val = tmp_val;
-               mutex_unlock(&st->lock);
-               iio_device_release_direct_mode(indio_dev);
                if (ret > 0)
                        ret = at91_adc_adjust_val_osr(st, val);
+               mutex_unlock(&st->lock);
+               iio_device_release_direct_mode(indio_dev);
 
                return ret;
        }
                /* if no change, optimize out */
                if (val == st->oversampling_ratio)
                        return 0;
+               mutex_lock(&st->lock);
                st->oversampling_ratio = val;
                /* update ratio */
                at91_adc_config_emr(st);
+               mutex_unlock(&st->lock);
                return 0;
        case IIO_CHAN_INFO_SAMP_FREQ:
                if (val < st->soc_info.min_sample_rate ||
                    val > st->soc_info.max_sample_rate)
                        return -EINVAL;
 
+               mutex_lock(&st->lock);
                at91_adc_setup_samp_freq(indio_dev, val);
+               mutex_unlock(&st->lock);
                return 0;
        default:
                return -EINVAL;