summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorViresh Kumar <viresh.kumar@linaro.org>2021-12-13 13:18:46 +0530
committerViresh Kumar <viresh.kumar@linaro.org>2021-12-13 13:42:04 +0530
commitea8448427fba5ec1ba4c5bdc5a43a63a4ff2efdb (patch)
tree0ea93260cbcf9c23537faeeb1c9f5ce5943fec0a
parent9798369a9dc474b73fe162fbdc73c59253061a8a (diff)
irq
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
-rw-r--r--gpio-mock.c51
1 files changed, 23 insertions, 28 deletions
diff --git a/gpio-mock.c b/gpio-mock.c
index c9c6b33..fee3d83 100644
--- a/gpio-mock.c
+++ b/gpio-mock.c
@@ -17,6 +17,7 @@
#include <linux/device.h>
#include <linux/platform_device.h>
#include <linux/gpio/driver.h>
+#include <linux/irq_work.h>
#define NGPIO 64
@@ -30,7 +31,9 @@ struct mock_gpio_chip {
struct gpio_line lines[NGPIO];
};
static struct mock_gpio_chip *mock_gc;
-unsigned int val = 0;
+static struct irq_work irq_work;
+static unsigned int irq_offset;
+static struct dentry *rootdir;
static const char *gpio_line_names[NGPIO] = {
"gpio0",
@@ -94,42 +97,27 @@ static int mock_gpio_direction_output(struct gpio_chip *gc,
static void mock_gpio_irq_enable(struct irq_data *d)
{
- struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
- struct mock_gpio_chip *mock_gc = gpiochip_get_data(gc);
-
- pr_info("%s: %d: %u\n", __func__, __LINE__, d->hwirq);
+ pr_info("%s: %d: %lu\n", __func__, __LINE__, d->hwirq);
}
static void mock_gpio_irq_disable(struct irq_data *d)
{
- struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
- struct mock_gpio_chip *mock_gc = gpiochip_get_data(gc);
-
- pr_info("%s: %d: %u\n", __func__, __LINE__, d->hwirq);
+ pr_info("%s: %d: %lu\n", __func__, __LINE__, d->hwirq);
}
static void mock_gpio_irq_mask(struct irq_data *d)
{
- struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
- struct mock_gpio_chip *mock_gc = gpiochip_get_data(gc);
-
- pr_info("%s: %d: %u\n", __func__, __LINE__, d->hwirq);
+ pr_info("%s: %d: %lu\n", __func__, __LINE__, d->hwirq);
}
static void mock_gpio_irq_unmask(struct irq_data *d)
{
- struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
- struct mock_gpio_chip *mock_gc = gpiochip_get_data(gc);
-
- pr_info("%s: %d: %u\n", __func__, __LINE__, d->hwirq);
+ pr_info("%s: %d: %lu\n", __func__, __LINE__, d->hwirq);
}
static int mock_gpio_irq_set_type(struct irq_data *d, unsigned int type)
{
- struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
- struct mock_gpio_chip *mock_gc = gpiochip_get_data(gc);
-
- pr_info("%s: %d: %u\n", __func__, __LINE__, d->hwirq);
+ pr_info("%s: %d: %lu\n", __func__, __LINE__, d->hwirq);
return 0;
}
@@ -143,14 +131,19 @@ static struct irq_chip irq_chip = {
.irq_set_type = mock_gpio_irq_set_type,
};
-static int mock_gpio_irq(void *data, u64 val)
+static void mock_gpio_irq(struct irq_work *irq_work)
{
- pr_info("%s: %d: %u\n", __func__, __LINE__, val);
- generic_handle_domain_irq(mock_gc->gc.irq.domain, val);
- return 0;
+ pr_info("%s: %d: %u\n", __func__, __LINE__, irq_offset);
+ generic_handle_domain_irq(mock_gc->gc.irq.domain, irq_offset);
}
-DEFINE_DEBUGFS_ATTRIBUTE(mock_gpio_fops, NULL, mock_gpio_irq, "%llu\n");
+static int mock_gpio_debugfs(void *data, u64 val)
+{
+ irq_offset = val;
+ irq_work_queue(&irq_work);
+ return 0;
+}
+DEFINE_DEBUGFS_ATTRIBUTE(mock_gpio_fops, NULL, mock_gpio_debugfs, "%llu\n");
static int mock_gpio_probe(struct platform_device *pdev)
{
@@ -225,9 +218,10 @@ static int __init mock_gpio_init(void)
}
+ init_irq_work(&irq_work, mock_gpio_irq);
rootdir = debugfs_create_dir("mockgpio", NULL);
- file = debugfs_create_file("gpio", S_IRUGO | S_IWUSR, rootdir,
- NULL, &mock_gpio_fops);
+ debugfs_create_file("gpio", S_IRUGO | S_IWUSR, rootdir, NULL,
+ &mock_gpio_fops);
pr_info("%s: %d: %d\n", __func__, __LINE__, ret);
return ret;
@@ -239,6 +233,7 @@ static void __exit mock_gpio_exit(void)
pr_info("%s: %d\n", __func__, __LINE__);
platform_driver_unregister(&mock_gpio_driver);
platform_device_unregister(gpdev);
+ debugfs_remove_recursive(rootdir);
}
module_exit(mock_gpio_exit);