iio: kfifo: Add resource management devm_iio_kfifo_allocate/free
authorKarol Wrona <k.wrona@samsung.com>
Fri, 19 Dec 2014 17:39:25 +0000 (18:39 +0100)
committerJonathan Cameron <jic23@kernel.org>
Fri, 26 Dec 2014 11:39:57 +0000 (11:39 +0000)
iio kfifo allocate/free gained their devm_ wrappers.

Signed-off-by: Karol Wrona <k.wrona@samsung.com>
Suggested-by: Jonathan Cameron <jic23@kernel.org>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
Documentation/driver-model/devres.txt
drivers/iio/kfifo_buf.c
include/linux/iio/kfifo_buf.h

index b5ab416cd53a694f0b97ab564a05113c477433cd..6d1e8eeb5990363c4441238ef305da3082b94b89 100644 (file)
@@ -258,6 +258,8 @@ IIO
   devm_iio_device_free()
   devm_iio_device_register()
   devm_iio_device_unregister()
+  devm_iio_kfifo_allocate()
+  devm_iio_kfifo_free()
   devm_iio_trigger_alloc()
   devm_iio_trigger_free()
 
index 7f6fad658e8331af048c0ba876b46d04dcdc8921..b2beea01c49b3c891683204b5f30d52c87012285 100644 (file)
@@ -164,4 +164,58 @@ void iio_kfifo_free(struct iio_buffer *r)
 }
 EXPORT_SYMBOL(iio_kfifo_free);
 
+static void devm_iio_kfifo_release(struct device *dev, void *res)
+{
+       iio_kfifo_free(*(struct iio_buffer **)res);
+}
+
+static int devm_iio_kfifo_match(struct device *dev, void *res, void *data)
+{
+       struct iio_buffer **r = res;
+
+       if (WARN_ON(!r || !*r))
+               return 0;
+
+       return *r == data;
+}
+
+/**
+ * devm_iio_fifo_allocate - Resource-managed iio_kfifo_allocate()
+ * @dev:               Device to allocate kfifo buffer for
+ *
+ * RETURNS:
+ * Pointer to allocated iio_buffer on success, NULL on failure.
+ */
+struct iio_buffer *devm_iio_kfifo_allocate(struct device *dev)
+{
+       struct iio_buffer **ptr, *r;
+
+       ptr = devres_alloc(devm_iio_kfifo_release, sizeof(*ptr), GFP_KERNEL);
+       if (!ptr)
+               return NULL;
+
+       r = iio_kfifo_allocate();
+       if (r) {
+               *ptr = r;
+               devres_add(dev, ptr);
+       } else {
+               devres_free(ptr);
+       }
+
+       return r;
+}
+EXPORT_SYMBOL(devm_iio_kfifo_allocate);
+
+/**
+ * devm_iio_fifo_free - Resource-managed iio_kfifo_free()
+ * @dev:               Device the buffer belongs to
+ * @r:                 The buffer associated with the device
+ */
+void devm_iio_kfifo_free(struct device *dev, struct iio_buffer *r)
+{
+       WARN_ON(devres_release(dev, devm_iio_kfifo_release,
+                              devm_iio_kfifo_match, r));
+}
+EXPORT_SYMBOL(devm_iio_kfifo_free);
+
 MODULE_LICENSE("GPL");
index 1a8d57a417387d7bd7843e46ab1ee7f21a63bcf0..1683bc710d1476b5195fd92ac67513fcccf84333 100644 (file)
@@ -8,4 +8,7 @@
 struct iio_buffer *iio_kfifo_allocate(void);
 void iio_kfifo_free(struct iio_buffer *r);
 
+struct iio_buffer *devm_iio_kfifo_allocate(struct device *dev);
+void devm_iio_kfifo_free(struct device *dev, struct iio_buffer *r);
+
 #endif