Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit b688c18d authored by Arnaud Pouliquen's avatar Arnaud Pouliquen Committed by Mark Brown
Browse files

IIO: hw_consumer: add devm_iio_hw_consumer_alloc



Add devm_iio_hw_consumer_alloc function that calls iio_hw_consumer_free
when the device is unbound from the bus.

Signed-off-by: default avatarArnaud Pouliquen <arnaud.pouliquen@st.com>
Reviewed-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 5b178943
Loading
Loading
Loading
Loading
+66 −0
Original line number Diff line number Diff line
@@ -137,6 +137,72 @@ void iio_hw_consumer_free(struct iio_hw_consumer *hwc)
}
EXPORT_SYMBOL_GPL(iio_hw_consumer_free);

static void devm_iio_hw_consumer_release(struct device *dev, void *res)
{
	iio_hw_consumer_free(*(struct iio_hw_consumer **)res);
}

static int devm_iio_hw_consumer_match(struct device *dev, void *res, void *data)
{
	struct iio_hw_consumer **r = res;

	if (!r || !*r) {
		WARN_ON(!r || !*r);
		return 0;
	}
	return *r == data;
}

/**
 * devm_iio_hw_consumer_alloc - Resource-managed iio_hw_consumer_alloc()
 * @dev: Pointer to consumer device.
 *
 * Managed iio_hw_consumer_alloc. iio_hw_consumer allocated with this function
 * is automatically freed on driver detach.
 *
 * If an iio_hw_consumer allocated with this function needs to be freed
 * separately, devm_iio_hw_consumer_free() must be used.
 *
 * returns pointer to allocated iio_hw_consumer on success, NULL on failure.
 */
struct iio_hw_consumer *devm_iio_hw_consumer_alloc(struct device *dev)
{
	struct iio_hw_consumer **ptr, *iio_hwc;

	ptr = devres_alloc(devm_iio_hw_consumer_release, sizeof(*ptr),
			   GFP_KERNEL);
	if (!ptr)
		return NULL;

	iio_hwc = iio_hw_consumer_alloc(dev);
	if (IS_ERR(iio_hwc)) {
		devres_free(ptr);
	} else {
		*ptr = iio_hwc;
		devres_add(dev, ptr);
	}

	return iio_hwc;
}
EXPORT_SYMBOL_GPL(devm_iio_hw_consumer_alloc);

/**
 * devm_iio_hw_consumer_free - Resource-managed iio_hw_consumer_free()
 * @dev: Pointer to consumer device.
 * @hwc: iio_hw_consumer to free.
 *
 * Free iio_hw_consumer allocated with devm_iio_hw_consumer_alloc().
 */
void devm_iio_hw_consumer_free(struct device *dev, struct iio_hw_consumer *hwc)
{
	int rc;

	rc = devres_release(dev, devm_iio_hw_consumer_release,
			    devm_iio_hw_consumer_match, hwc);
	WARN_ON(rc);
}
EXPORT_SYMBOL_GPL(devm_iio_hw_consumer_free);

/**
 * iio_hw_consumer_enable() - Enable IIO hardware consumer
 * @hwc: iio_hw_consumer to enable.
+2 −0
Original line number Diff line number Diff line
@@ -13,6 +13,8 @@ struct iio_hw_consumer;

struct iio_hw_consumer *iio_hw_consumer_alloc(struct device *dev);
void iio_hw_consumer_free(struct iio_hw_consumer *hwc);
struct iio_hw_consumer *devm_iio_hw_consumer_alloc(struct device *dev);
void devm_iio_hw_consumer_free(struct device *dev, struct iio_hw_consumer *hwc);
int iio_hw_consumer_enable(struct iio_hw_consumer *hwc);
void iio_hw_consumer_disable(struct iio_hw_consumer *hwc);