device_initialize(&indio_dev->dev);
        iio_device_set_drvdata(indio_dev, (void *)indio_dev);
        mutex_init(&indio_dev->mlock);
-       mutex_init(&indio_dev->info_exist_lock);
+       mutex_init(&iio_dev_opaque->info_exist_lock);
        INIT_LIST_HEAD(&iio_dev_opaque->channel_attr_list);
 
        iio_dev_opaque->id = ida_simple_get(&iio_ida, 0, 0, GFP_KERNEL);
        struct iio_ioctl_handler *h;
        int ret = -ENODEV;
 
-       mutex_lock(&indio_dev->info_exist_lock);
+       mutex_lock(&iio_dev_opaque->info_exist_lock);
 
        /**
         * The NULL check here is required to prevent crashing when a device
                ret = -ENODEV;
 
 out_unlock:
-       mutex_unlock(&indio_dev->info_exist_lock);
+       mutex_unlock(&iio_dev_opaque->info_exist_lock);
 
        return ret;
 }
 {
        cdev_device_del(&indio_dev->chrdev, &indio_dev->dev);
 
-       mutex_lock(&indio_dev->info_exist_lock);
+       mutex_lock(&iio_dev_opaque->info_exist_lock);
 
        iio_device_unregister_debugfs(indio_dev);
 
        iio_device_wakeup_eventset(indio_dev);
        iio_buffer_wakeup_poll(indio_dev);
 
-       mutex_unlock(&indio_dev->info_exist_lock);
+       mutex_unlock(&iio_dev_opaque->info_exist_lock);
 
        iio_buffers_free_sysfs_and_mask(indio_dev);
 }
 
 #include <linux/of.h>
 
 #include <linux/iio/iio.h>
+#include <linux/iio/iio-opaque.h>
 #include "iio_core.h"
 #include <linux/iio/machine.h>
 #include <linux/iio/driver.h>
 
 int iio_read_channel_raw(struct iio_channel *chan, int *val)
 {
+       struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev);
        int ret;
 
-       mutex_lock(&chan->indio_dev->info_exist_lock);
+       mutex_lock(&iio_dev_opaque->info_exist_lock);
        if (chan->indio_dev->info == NULL) {
                ret = -ENODEV;
                goto err_unlock;
 
        ret = iio_channel_read(chan, val, NULL, IIO_CHAN_INFO_RAW);
 err_unlock:
-       mutex_unlock(&chan->indio_dev->info_exist_lock);
+       mutex_unlock(&iio_dev_opaque->info_exist_lock);
 
        return ret;
 }
 
 int iio_read_channel_average_raw(struct iio_channel *chan, int *val)
 {
+       struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev);
        int ret;
 
-       mutex_lock(&chan->indio_dev->info_exist_lock);
+       mutex_lock(&iio_dev_opaque->info_exist_lock);
        if (chan->indio_dev->info == NULL) {
                ret = -ENODEV;
                goto err_unlock;
 
        ret = iio_channel_read(chan, val, NULL, IIO_CHAN_INFO_AVERAGE_RAW);
 err_unlock:
-       mutex_unlock(&chan->indio_dev->info_exist_lock);
+       mutex_unlock(&iio_dev_opaque->info_exist_lock);
 
        return ret;
 }
 int iio_convert_raw_to_processed(struct iio_channel *chan, int raw,
        int *processed, unsigned int scale)
 {
+       struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev);
        int ret;
 
-       mutex_lock(&chan->indio_dev->info_exist_lock);
+       mutex_lock(&iio_dev_opaque->info_exist_lock);
        if (chan->indio_dev->info == NULL) {
                ret = -ENODEV;
                goto err_unlock;
        ret = iio_convert_raw_to_processed_unlocked(chan, raw, processed,
                                                        scale);
 err_unlock:
-       mutex_unlock(&chan->indio_dev->info_exist_lock);
+       mutex_unlock(&iio_dev_opaque->info_exist_lock);
 
        return ret;
 }
 int iio_read_channel_attribute(struct iio_channel *chan, int *val, int *val2,
                               enum iio_chan_info_enum attribute)
 {
+       struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev);
        int ret;
 
-       mutex_lock(&chan->indio_dev->info_exist_lock);
+       mutex_lock(&iio_dev_opaque->info_exist_lock);
        if (chan->indio_dev->info == NULL) {
                ret = -ENODEV;
                goto err_unlock;
 
        ret = iio_channel_read(chan, val, val2, attribute);
 err_unlock:
-       mutex_unlock(&chan->indio_dev->info_exist_lock);
+       mutex_unlock(&iio_dev_opaque->info_exist_lock);
 
        return ret;
 }
 int iio_read_channel_processed_scale(struct iio_channel *chan, int *val,
                                     unsigned int scale)
 {
+       struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev);
        int ret;
 
-       mutex_lock(&chan->indio_dev->info_exist_lock);
+       mutex_lock(&iio_dev_opaque->info_exist_lock);
        if (chan->indio_dev->info == NULL) {
                ret = -ENODEV;
                goto err_unlock;
        }
 
 err_unlock:
-       mutex_unlock(&chan->indio_dev->info_exist_lock);
+       mutex_unlock(&iio_dev_opaque->info_exist_lock);
 
        return ret;
 }
                                     const int **vals, int *type, int *length,
                                     enum iio_chan_info_enum attribute)
 {
+       struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev);
        int ret;
 
-       mutex_lock(&chan->indio_dev->info_exist_lock);
+       mutex_lock(&iio_dev_opaque->info_exist_lock);
        if (!chan->indio_dev->info) {
                ret = -ENODEV;
                goto err_unlock;
 
        ret = iio_channel_read_avail(chan, vals, type, length, attribute);
 err_unlock:
-       mutex_unlock(&chan->indio_dev->info_exist_lock);
+       mutex_unlock(&iio_dev_opaque->info_exist_lock);
 
        return ret;
 }
 
 int iio_read_max_channel_raw(struct iio_channel *chan, int *val)
 {
+       struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev);
        int ret;
        int type;
 
-       mutex_lock(&chan->indio_dev->info_exist_lock);
+       mutex_lock(&iio_dev_opaque->info_exist_lock);
        if (!chan->indio_dev->info) {
                ret = -ENODEV;
                goto err_unlock;
 
        ret = iio_channel_read_max(chan, val, NULL, &type, IIO_CHAN_INFO_RAW);
 err_unlock:
-       mutex_unlock(&chan->indio_dev->info_exist_lock);
+       mutex_unlock(&iio_dev_opaque->info_exist_lock);
 
        return ret;
 }
 
 int iio_get_channel_type(struct iio_channel *chan, enum iio_chan_type *type)
 {
+       struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev);
        int ret = 0;
        /* Need to verify underlying driver has not gone away */
 
-       mutex_lock(&chan->indio_dev->info_exist_lock);
+       mutex_lock(&iio_dev_opaque->info_exist_lock);
        if (chan->indio_dev->info == NULL) {
                ret = -ENODEV;
                goto err_unlock;
 
        *type = chan->channel->type;
 err_unlock:
-       mutex_unlock(&chan->indio_dev->info_exist_lock);
+       mutex_unlock(&iio_dev_opaque->info_exist_lock);
 
        return ret;
 }
 int iio_write_channel_attribute(struct iio_channel *chan, int val, int val2,
                                enum iio_chan_info_enum attribute)
 {
+       struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev);
        int ret;
 
-       mutex_lock(&chan->indio_dev->info_exist_lock);
+       mutex_lock(&iio_dev_opaque->info_exist_lock);
        if (chan->indio_dev->info == NULL) {
                ret = -ENODEV;
                goto err_unlock;
 
        ret = iio_channel_write(chan, val, val2, attribute);
 err_unlock:
-       mutex_unlock(&chan->indio_dev->info_exist_lock);
+       mutex_unlock(&iio_dev_opaque->info_exist_lock);
 
        return ret;
 }