@@ -626,13 +626,13 @@ static struct iio_sw_device *iio_dummy_probe(const char *name)
/* Specify that device provides sysfs type interfaces */
indio_dev->modes = INDIO_DIRECT_MODE;
- ret = iio_simple_dummy_events_register(indio_dev);
+ ret = iio_simple_dummy_events_register(parent, indio_dev);
if (ret < 0)
return ERR_PTR(ret);
ret = iio_simple_dummy_configure_buffer(indio_dev);
if (ret < 0)
- goto error_unregister_events;
+ return ERR_PTR(ret);
ret = iio_device_register(indio_dev);
if (ret < 0)
@@ -643,8 +643,6 @@ static struct iio_sw_device *iio_dummy_probe(const char *name)
return swd;
error_unconfigure_buffer:
iio_simple_dummy_unconfigure_buffer(indio_dev);
-error_unregister_events:
- iio_simple_dummy_events_unregister(indio_dev);
return ERR_PTR(ret);
}
@@ -672,8 +670,6 @@ static int iio_dummy_remove(struct iio_sw_device *swd)
/* Buffered capture related cleanup */
iio_simple_dummy_unconfigure_buffer(indio_dev);
- iio_simple_dummy_events_unregister(indio_dev);
-
return 0;
}
@@ -76,21 +76,16 @@ int iio_simple_dummy_write_event_value(struct iio_dev *indio_dev,
enum iio_event_info info, int val,
int val2);
-int iio_simple_dummy_events_register(struct iio_dev *indio_dev);
-void iio_simple_dummy_events_unregister(struct iio_dev *indio_dev);
+int iio_simple_dummy_events_register(struct device *parent, struct iio_dev *indio_dev);
#else /* Stubs for when events are disabled at compile time */
static inline int
-iio_simple_dummy_events_register(struct iio_dev *indio_dev)
+iio_simple_dummy_events_register(struct device *parent, struct iio_dev *indio_dev)
{
return 0;
}
-static inline void
-iio_simple_dummy_events_unregister(struct iio_dev *indio_dev)
-{}
-
#endif /* CONFIG_IIO_SIMPLE_DUMMY_EVENTS*/
/**
@@ -222,6 +222,13 @@ static irqreturn_t iio_simple_dummy_event_handler(int irq, void *private)
return IRQ_HANDLED;
}
+static void iio_simple_dummy_events_release_irq(void *data)
+{
+ struct iio_dummy_state *st = data;
+
+ iio_dummy_evgen_release_irq(st->event_irq);
+}
+
/**
* iio_simple_dummy_events_register() - setup interrupt handling for events
* @indio_dev: device instance data
@@ -233,44 +240,28 @@ static irqreturn_t iio_simple_dummy_event_handler(int irq, void *private)
* no way forms part of this example. Just assume that events magically
* appear via the provided interrupt.
*/
-int iio_simple_dummy_events_register(struct iio_dev *indio_dev)
+int iio_simple_dummy_events_register(struct device *parent,
+ struct iio_dev *indio_dev)
{
struct iio_dummy_state *st = iio_priv(indio_dev);
int ret;
/* Fire up event source - normally not present */
st->event_irq = iio_dummy_evgen_get_irq();
- if (st->event_irq < 0) {
- ret = st->event_irq;
- goto error_ret;
- }
- st->regs = iio_dummy_evgen_get_regs(st->event_irq);
-
- ret = request_threaded_irq(st->event_irq,
- &iio_simple_dummy_get_timestamp,
- &iio_simple_dummy_event_handler,
- IRQF_ONESHOT,
- "iio_simple_event",
- indio_dev);
- if (ret < 0)
- goto error_free_evgen;
- return 0;
+ if (st->event_irq < 0)
+ return st->event_irq;
-error_free_evgen:
- iio_dummy_evgen_release_irq(st->event_irq);
-error_ret:
- return ret;
-}
+ ret = devm_add_action_or_reset(parent,
+ iio_simple_dummy_events_release_irq, st);
+ if (ret)
+ return ret;
-/**
- * iio_simple_dummy_events_unregister() - tidy up interrupt handling on remove
- * @indio_dev: device instance data
- */
-void iio_simple_dummy_events_unregister(struct iio_dev *indio_dev)
-{
- struct iio_dummy_state *st = iio_priv(indio_dev);
+ st->regs = iio_dummy_evgen_get_regs(st->event_irq);
- free_irq(st->event_irq, indio_dev);
- /* Not part of normal driver */
- iio_dummy_evgen_release_irq(st->event_irq);
+ return devm_request_threaded_irq(parent, st->event_irq,
+ &iio_simple_dummy_get_timestamp,
+ &iio_simple_dummy_event_handler,
+ IRQF_ONESHOT,
+ "iio_simple_event",
+ indio_dev);
}
This change converts the iio_simple_dummy_events_register() function to use device-managed functions/equivalents. The iio_dummy_evgen_release_irq() function needs to be carried over a devm_add_action_or_reset() handler. With this the iio_simple_dummy_events_unregister() function can be removed, and so can it's usage/call. Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com> --- drivers/iio/dummy/iio_simple_dummy.c | 8 +--- drivers/iio/dummy/iio_simple_dummy.h | 9 +--- drivers/iio/dummy/iio_simple_dummy_events.c | 53 +++++++++------------ 3 files changed, 26 insertions(+), 44 deletions(-)