**/
 static int iio_chrdev_open(struct inode *inode, struct file *filp)
 {
-       struct iio_dev *indio_dev = container_of(inode->i_cdev,
-                                               struct iio_dev, chrdev);
+       struct iio_dev_opaque *iio_dev_opaque =
+               container_of(inode->i_cdev, struct iio_dev_opaque, chrdev);
+       struct iio_dev *indio_dev = &iio_dev_opaque->indio_dev;
        struct iio_dev_buffer_pair *ib;
 
        if (test_and_set_bit(IIO_BUSY_BIT_POS, &indio_dev->flags))
 static int iio_chrdev_release(struct inode *inode, struct file *filp)
 {
        struct iio_dev_buffer_pair *ib = filp->private_data;
-       struct iio_dev *indio_dev = container_of(inode->i_cdev,
-                                               struct iio_dev, chrdev);
+       struct iio_dev_opaque *iio_dev_opaque =
+               container_of(inode->i_cdev, struct iio_dev_opaque, chrdev);
+       struct iio_dev *indio_dev = &iio_dev_opaque->indio_dev;
        kfree(ib);
        clear_bit(IIO_BUSY_BIT_POS, &indio_dev->flags);
        iio_device_put(indio_dev);
                indio_dev->setup_ops = &noop_ring_setup_ops;
 
        if (iio_dev_opaque->attached_buffers_cnt)
-               cdev_init(&indio_dev->chrdev, &iio_buffer_fileops);
+               cdev_init(&iio_dev_opaque->chrdev, &iio_buffer_fileops);
        else if (iio_dev_opaque->event_interface)
-               cdev_init(&indio_dev->chrdev, &iio_event_fileops);
+               cdev_init(&iio_dev_opaque->chrdev, &iio_event_fileops);
 
        if (iio_dev_opaque->attached_buffers_cnt || iio_dev_opaque->event_interface) {
                indio_dev->dev.devt = MKDEV(MAJOR(iio_devt), iio_dev_opaque->id);
-               indio_dev->chrdev.owner = this_mod;
+               iio_dev_opaque->chrdev.owner = this_mod;
        }
 
        /* assign device groups now; they should be all registered now */
        indio_dev->dev.groups = iio_dev_opaque->groups;
 
-       ret = cdev_device_add(&indio_dev->chrdev, &indio_dev->dev);
+       ret = cdev_device_add(&iio_dev_opaque->chrdev, &indio_dev->dev);
        if (ret < 0)
                goto error_unreg_eventset;
 
  **/
 void iio_device_unregister(struct iio_dev *indio_dev)
 {
-       cdev_device_del(&indio_dev->chrdev, &indio_dev->dev);
+       struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(indio_dev);
+
+       cdev_device_del(&iio_dev_opaque->chrdev, &indio_dev->dev);
 
        mutex_lock(&iio_dev_opaque->info_exist_lock);
 
 
  * @legacy_scan_el_group:      attribute group for legacy scan elements attribute group
  * @legacy_buffer_group:       attribute group for legacy buffer attributes group
  * @scan_index_timestamp:      cache of the index to the timestamp
+ * @chrdev:                    associated character device
  * @debugfs_dentry:            device specific debugfs dentry
  * @cached_reg_addr:           cached register address for debugfs reads
  * @read_buf:                  read buffer to be used for the initial reg read
        struct attribute_group          legacy_buffer_group;
 
        unsigned int                    scan_index_timestamp;
+       struct cdev                     chrdev;
 
 #if defined(CONFIG_DEBUG_FS)
        struct dentry                   *debugfs_dentry;