|
@@ -33,6 +33,7 @@
|
|
|
* @base: base of irq range
|
|
|
* @enabled: mask of which irqs are enabled
|
|
|
* @inuse: mask of which irqs are connected
|
|
|
+ * @regs: irq regs we are faking
|
|
|
* @lock: protect the evgen state
|
|
|
*/
|
|
|
struct iio_dummy_eventgen {
|
|
@@ -40,6 +41,7 @@ struct iio_dummy_eventgen {
|
|
|
int base;
|
|
|
bool enabled[IIO_EVENTGEN_NO];
|
|
|
bool inuse[IIO_EVENTGEN_NO];
|
|
|
+ struct iio_dummy_regs regs[IIO_EVENTGEN_NO];
|
|
|
struct mutex lock;
|
|
|
};
|
|
|
|
|
@@ -136,6 +138,12 @@ int iio_dummy_evgen_release_irq(int irq)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(iio_dummy_evgen_release_irq);
|
|
|
|
|
|
+struct iio_dummy_regs *iio_dummy_evgen_get_regs(int irq)
|
|
|
+{
|
|
|
+ return &iio_evgen->regs[irq - iio_evgen->base];
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(iio_dummy_evgen_get_regs);
|
|
|
+
|
|
|
static void iio_dummy_evgen_free(void)
|
|
|
{
|
|
|
irq_free_descs(iio_evgen->base, IIO_EVENTGEN_NO);
|
|
@@ -153,6 +161,15 @@ static ssize_t iio_evgen_poke(struct device *dev,
|
|
|
size_t len)
|
|
|
{
|
|
|
struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
|
|
|
+ unsigned long event;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ ret = kstrtoul(buf, 10, &event);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ iio_evgen->regs[this_attr->address].reg_id = this_attr->address;
|
|
|
+ iio_evgen->regs[this_attr->address].reg_data = event;
|
|
|
|
|
|
if (iio_evgen->enabled[this_attr->address])
|
|
|
handle_nested_irq(iio_evgen->base + this_attr->address);
|