]> Pileus Git - ~andy/linux/blobdiff - drivers/iio/industrialio-core.c
drm/i915: Always load the display palette before enabling the pipe
[~andy/linux] / drivers / iio / industrialio-core.c
index 8848f16c547b07a44e2de1f1834283b8f88e8fb5..e145931ef1b82906478c5a32505cada2d8eb1547 100644 (file)
@@ -691,21 +691,34 @@ static int iio_device_add_channel_sysfs(struct iio_dev *indio_dev,
 
        if (chan->channel < 0)
                return 0;
-       for_each_set_bit(i, &chan->info_mask, sizeof(long)*8) {
-               ret = __iio_add_chan_devattr(iio_chan_info_postfix[i/2],
+       for_each_set_bit(i, &chan->info_mask_separate, sizeof(long)*8) {
+               ret = __iio_add_chan_devattr(iio_chan_info_postfix[i],
                                             chan,
                                             &iio_read_channel_info,
                                             &iio_write_channel_info,
-                                            i/2,
-                                            !(i%2),
+                                            i,
+                                            0,
                                             &indio_dev->dev,
                                             &indio_dev->channel_attr_list);
-               if (ret == -EBUSY && (i%2 == 0)) {
+               if (ret < 0)
+                       goto error_ret;
+               attrcount++;
+       }
+       for_each_set_bit(i, &chan->info_mask_shared_by_type, sizeof(long)*8) {
+               ret = __iio_add_chan_devattr(iio_chan_info_postfix[i],
+                                            chan,
+                                            &iio_read_channel_info,
+                                            &iio_write_channel_info,
+                                            i,
+                                            1,
+                                            &indio_dev->dev,
+                                            &indio_dev->channel_attr_list);
+               if (ret == -EBUSY) {
                        ret = 0;
                        continue;
-               }
-               if (ret < 0)
+               } else if (ret < 0) {
                        goto error_ret;
+               }
                attrcount++;
        }
 
@@ -847,7 +860,7 @@ static void iio_dev_release(struct device *device)
        kfree(indio_dev);
 }
 
-static struct device_type iio_dev_type = {
+struct device_type iio_device_type = {
        .name = "iio_device",
        .release = iio_dev_release,
 };
@@ -869,7 +882,7 @@ struct iio_dev *iio_device_alloc(int sizeof_priv)
 
        if (dev) {
                dev->dev.groups = dev->groups;
-               dev->dev.type = &iio_dev_type;
+               dev->dev.type = &iio_device_type;
                dev->dev.bus = &iio_bus_type;
                device_initialize(&dev->dev);
                dev_set_drvdata(&dev->dev, (void *)dev);
@@ -960,6 +973,10 @@ int iio_device_register(struct iio_dev *indio_dev)
 {
        int ret;
 
+       /* If the calling driver did not initialize of_node, do it here */
+       if (!indio_dev->dev.of_node && indio_dev->dev.parent)
+               indio_dev->dev.of_node = indio_dev->dev.parent->of_node;
+
        /* configure elements for the chrdev */
        indio_dev->dev.devt = MKDEV(MAJOR(iio_devt), indio_dev->id);