* @current_mode:      the scan mode of this chip
  * @requestedmask:     a valid requested set of channels
  * @reg:               supply regulator
+ * @lock               lock to ensure state is consistent
  * @monitor_on:                whether monitor mode is enabled
  * @monitor_speed:     parameter corresponding to device monitor speed setting
  * @mask_high:         bitmask for enabled high thresholds
        const struct max1363_mode       *current_mode;
        u32                             requestedmask;
        struct regulator                *reg;
+       struct mutex                    lock;
 
        /* Using monitor modes and buffer at the same time is
           currently not supported */
        struct max1363_state *st = iio_priv(indio_dev);
        struct i2c_client *client = st->client;
 
-       mutex_lock(&indio_dev->mlock);
+       ret = iio_device_claim_direct_mode(indio_dev);
+       if (ret)
+               return ret;
+       mutex_lock(&st->lock);
+
        /*
         * If monitor mode is enabled, the method for reading a single
         * channel will have to be rather different and has not yet
         *
         * Also, cannot read directly if buffered capture enabled.
         */
-       if (st->monitor_on || iio_buffer_enabled(indio_dev)) {
+       if (st->monitor_on) {
                ret = -EBUSY;
                goto error_ret;
        }
                data = rxbuf[0];
        }
        *val = data;
+
 error_ret:
-       mutex_unlock(&indio_dev->mlock);
+       mutex_unlock(&st->lock);
+       iio_device_release_direct_mode(indio_dev);
        return ret;
 
 }
        if (!found)
                return -EINVAL;
 
-       mutex_lock(&indio_dev->mlock);
+       mutex_lock(&st->lock);
        st->monitor_speed = i;
-       mutex_unlock(&indio_dev->mlock);
+       mutex_unlock(&st->lock);
 
        return 0;
 }
        int val;
        int number = chan->channel;
 
-       mutex_lock(&indio_dev->mlock);
+       mutex_lock(&st->lock);
        if (dir == IIO_EV_DIR_FALLING)
                val = (1 << number) & st->mask_low;
        else
                val = (1 << number) & st->mask_high;
-       mutex_unlock(&indio_dev->mlock);
+       mutex_unlock(&st->lock);
 
        return val;
 }
        u16 unifiedmask;
        int number = chan->channel;
 
-       mutex_lock(&indio_dev->mlock);
+       ret = iio_device_claim_direct_mode(indio_dev);
+       if (ret)
+               return ret;
+       mutex_lock(&st->lock);
+
        unifiedmask = st->mask_low | st->mask_high;
        if (dir == IIO_EV_DIR_FALLING) {
 
 
        max1363_monitor_mode_update(st, !!(st->mask_high | st->mask_low));
 error_ret:
-       mutex_unlock(&indio_dev->mlock);
+       mutex_unlock(&st->lock);
+       iio_device_release_direct_mode(indio_dev);
 
        return ret;
 }
 
        st = iio_priv(indio_dev);
 
+       mutex_init(&st->lock);
        st->reg = devm_regulator_get(&client->dev, "vcc");
        if (IS_ERR(st->reg)) {
                ret = PTR_ERR(st->reg);