iio: locking: introduce __cleanup() based direct mode claiming infrastructure
Allows use of: iio_device_claim_direct_scoped(return -EBUSY, indio_dev) { } to automatically call iio_device_release_direct_mode() based on scope. Typically seen in combination with local device specific locks which are already have automated cleanup options via guard(mutex)(&st->lock) and scoped_guard(). Using both together allows most error handling to be automated. Reviewed-by: Nuno Sa <nuno.a@analog.com> Link: https://lore.kernel.org/r/20240128150537.44592-2-jic23@kernel.org Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
This commit is contained in:
parent
f7b6443f34
commit
1dae0cb79c
@ -9,6 +9,7 @@
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/cdev.h>
|
||||
#include <linux/cleanup.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/iio/types.h>
|
||||
/* IIO TODO LIST */
|
||||
@ -638,6 +639,33 @@ int __devm_iio_device_register(struct device *dev, struct iio_dev *indio_dev,
|
||||
int iio_push_event(struct iio_dev *indio_dev, u64 ev_code, s64 timestamp);
|
||||
int iio_device_claim_direct_mode(struct iio_dev *indio_dev);
|
||||
void iio_device_release_direct_mode(struct iio_dev *indio_dev);
|
||||
|
||||
/*
|
||||
* This autocleanup logic is normally used via
|
||||
* iio_device_claim_direct_scoped().
|
||||
*/
|
||||
DEFINE_GUARD(iio_claim_direct, struct iio_dev *, iio_device_claim_direct_mode(_T),
|
||||
iio_device_release_direct_mode(_T))
|
||||
|
||||
DEFINE_GUARD_COND(iio_claim_direct, _try, ({
|
||||
struct iio_dev *dev;
|
||||
int d = iio_device_claim_direct_mode(_T);
|
||||
|
||||
if (d < 0)
|
||||
dev = NULL;
|
||||
else
|
||||
dev = _T;
|
||||
dev;
|
||||
}))
|
||||
|
||||
/**
|
||||
* iio_device_claim_direct_scoped() - Scoped call to iio_device_claim_direct.
|
||||
* @fail: What to do on failure to claim device.
|
||||
* @iio_dev: Pointer to the IIO devices structure
|
||||
*/
|
||||
#define iio_device_claim_direct_scoped(fail, iio_dev) \
|
||||
scoped_cond_guard(iio_claim_direct_try, fail, iio_dev)
|
||||
|
||||
int iio_device_claim_buffer_mode(struct iio_dev *indio_dev);
|
||||
void iio_device_release_buffer_mode(struct iio_dev *indio_dev);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user