]> Pileus Git - ~andy/linux/blobdiff - drivers/iio/inkern.c
Merge tag 'pm+acpi-fixes-3.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git...
[~andy/linux] / drivers / iio / inkern.c
index d55e98fb300ec18cfd96b37830dfd7b6bbedb326..b289915b8469774664ccd181cc0fa9883dda35d8 100644 (file)
@@ -54,39 +54,25 @@ error_ret:
 EXPORT_SYMBOL_GPL(iio_map_array_register);
 
 
-/* Assumes the exact same array (e.g. memory locations)
- * used at unregistration as used at registration rather than
- * more complex checking of contents.
+/*
+ * Remove all map entries associated with the given iio device
  */
-int iio_map_array_unregister(struct iio_dev *indio_dev,
-                            struct iio_map *maps)
+int iio_map_array_unregister(struct iio_dev *indio_dev)
 {
-       int i = 0, ret = 0;
-       bool found_it;
+       int ret = -ENODEV;
        struct iio_map_internal *mapi;
-
-       if (maps == NULL)
-               return 0;
+       struct list_head *pos, *tmp;
 
        mutex_lock(&iio_map_list_lock);
-       while (maps[i].consumer_dev_name != NULL) {
-               found_it = false;
-               list_for_each_entry(mapi, &iio_map_list, l)
-                       if (&maps[i] == mapi->map) {
-                               list_del(&mapi->l);
-                               kfree(mapi);
-                               found_it = true;
-                               break;
-                       }
-               if (!found_it) {
-                       ret = -ENODEV;
-                       goto error_ret;
+       list_for_each_safe(pos, tmp, &iio_map_list) {
+               mapi = list_entry(pos, struct iio_map_internal, l);
+               if (indio_dev == mapi->indio_dev) {
+                       list_del(&mapi->l);
+                       kfree(mapi);
+                       ret = 0;
                }
-               i++;
        }
-error_ret:
        mutex_unlock(&iio_map_list_lock);
-
        return ret;
 }
 EXPORT_SYMBOL_GPL(iio_map_array_unregister);
@@ -107,7 +93,8 @@ static const struct iio_chan_spec
 }
 
 
-struct iio_channel *iio_channel_get(const char *name, const char *channel_name)
+static struct iio_channel *iio_channel_get_sys(const char *name,
+                                              const char *channel_name)
 {
        struct iio_map_internal *c_i = NULL, *c = NULL;
        struct iio_channel *channel;
@@ -158,6 +145,14 @@ error_no_mem:
        iio_device_put(c->indio_dev);
        return ERR_PTR(err);
 }
+
+struct iio_channel *iio_channel_get(struct device *dev,
+                                   const char *channel_name)
+{
+       const char *name = dev ? dev_name(dev) : NULL;
+
+       return iio_channel_get_sys(name, channel_name);
+}
 EXPORT_SYMBOL_GPL(iio_channel_get);
 
 void iio_channel_release(struct iio_channel *channel)
@@ -167,16 +162,18 @@ void iio_channel_release(struct iio_channel *channel)
 }
 EXPORT_SYMBOL_GPL(iio_channel_release);
 
-struct iio_channel *iio_channel_get_all(const char *name)
+struct iio_channel *iio_channel_get_all(struct device *dev)
 {
+       const char *name;
        struct iio_channel *chans;
        struct iio_map_internal *c = NULL;
        int nummaps = 0;
        int mapind = 0;
        int i, ret;
 
-       if (name == NULL)
+       if (dev == NULL)
                return ERR_PTR(-EINVAL);
+       name = dev_name(dev);
 
        mutex_lock(&iio_map_list_lock);
        /* first count the matching maps */