forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-13 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e
kernel/drivers/iio/dummy/iio_dummy_evgen.c
....@@ -1,9 +1,6 @@
1
-/**
1
+// SPDX-License-Identifier: GPL-2.0-only
2
+/*
23 * Copyright (c) 2011 Jonathan Cameron
3
- *
4
- * This program is free software; you can redistribute it and/or modify it
5
- * under the terms of the GNU General Public License version 2 as published by
6
- * the Free Software Foundation.
74 *
85 * Companion module to the iio simple dummy example driver.
96 * The purpose of this is to generate 'fake' event interrupts thus
....@@ -30,18 +27,19 @@
3027 #define IIO_EVENTGEN_NO 10
3128
3229 /**
30
+ * struct iio_dummy_eventgen - event generator specific state
3331 * @regs: irq regs we are faking
3432 * @lock: protect the evgen state
3533 * @inuse: mask of which irqs are connected
3634 * @irq_sim: interrupt simulator
3735 * @base: base of irq range
36
+ * @irq_sim_domain: irq simulator domain
3837 */
3938 struct iio_dummy_eventgen {
4039 struct iio_dummy_regs regs[IIO_EVENTGEN_NO];
4140 struct mutex lock;
4241 bool inuse[IIO_EVENTGEN_NO];
43
- struct irq_sim irq_sim;
44
- int base;
42
+ struct irq_domain *irq_sim_domain;
4543 };
4644
4745 /* We can only ever have one instance of this 'device' */
....@@ -55,13 +53,14 @@
5553 if (!iio_evgen)
5654 return -ENOMEM;
5755
58
- ret = irq_sim_init(&iio_evgen->irq_sim, IIO_EVENTGEN_NO);
59
- if (ret < 0) {
56
+ iio_evgen->irq_sim_domain = irq_domain_create_sim(NULL,
57
+ IIO_EVENTGEN_NO);
58
+ if (IS_ERR(iio_evgen->irq_sim_domain)) {
59
+ ret = PTR_ERR(iio_evgen->irq_sim_domain);
6060 kfree(iio_evgen);
6161 return ret;
6262 }
6363
64
- iio_evgen->base = irq_sim_irqnum(&iio_evgen->irq_sim, 0);
6564 mutex_init(&iio_evgen->lock);
6665
6766 return 0;
....@@ -83,7 +82,7 @@
8382 mutex_lock(&iio_evgen->lock);
8483 for (i = 0; i < IIO_EVENTGEN_NO; i++) {
8584 if (!iio_evgen->inuse[i]) {
86
- ret = irq_sim_irqnum(&iio_evgen->irq_sim, i);
85
+ ret = irq_create_mapping(iio_evgen->irq_sim_domain, i);
8786 iio_evgen->inuse[i] = true;
8887 break;
8988 }
....@@ -104,21 +103,27 @@
104103 */
105104 void iio_dummy_evgen_release_irq(int irq)
106105 {
106
+ struct irq_data *irqd = irq_get_irq_data(irq);
107
+
107108 mutex_lock(&iio_evgen->lock);
108
- iio_evgen->inuse[irq - iio_evgen->base] = false;
109
+ iio_evgen->inuse[irqd_to_hwirq(irqd)] = false;
110
+ irq_dispose_mapping(irq);
109111 mutex_unlock(&iio_evgen->lock);
110112 }
111113 EXPORT_SYMBOL_GPL(iio_dummy_evgen_release_irq);
112114
113115 struct iio_dummy_regs *iio_dummy_evgen_get_regs(int irq)
114116 {
115
- return &iio_evgen->regs[irq - iio_evgen->base];
117
+ struct irq_data *irqd = irq_get_irq_data(irq);
118
+
119
+ return &iio_evgen->regs[irqd_to_hwirq(irqd)];
120
+
116121 }
117122 EXPORT_SYMBOL_GPL(iio_dummy_evgen_get_regs);
118123
119124 static void iio_dummy_evgen_free(void)
120125 {
121
- irq_sim_fini(&iio_evgen->irq_sim);
126
+ irq_domain_remove_sim(iio_evgen->irq_sim_domain);
122127 kfree(iio_evgen);
123128 }
124129
....@@ -134,7 +139,7 @@
134139 {
135140 struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
136141 unsigned long event;
137
- int ret;
142
+ int ret, irq;
138143
139144 ret = kstrtoul(buf, 10, &event);
140145 if (ret)
....@@ -143,7 +148,10 @@
143148 iio_evgen->regs[this_attr->address].reg_id = this_attr->address;
144149 iio_evgen->regs[this_attr->address].reg_data = event;
145150
146
- irq_sim_fire(&iio_evgen->irq_sim, this_attr->address);
151
+ irq = irq_find_mapping(iio_evgen->irq_sim_domain, this_attr->address);
152
+ ret = irq_set_irqchip_state(irq, IRQCHIP_STATE_PENDING, true);
153
+ if (ret)
154
+ return ret;
147155
148156 return len;
149157 }
....@@ -196,7 +204,10 @@
196204 return ret;
197205 device_initialize(&iio_evgen_dev);
198206 dev_set_name(&iio_evgen_dev, "iio_evgen");
199
- return device_add(&iio_evgen_dev);
207
+ ret = device_add(&iio_evgen_dev);
208
+ if (ret)
209
+ put_device(&iio_evgen_dev);
210
+ return ret;
200211 }
201212 module_init(iio_dummy_evgen_init);
202213