diff options
author | Viresh Kumar <viresh.kumar@linaro.org> | 2021-12-13 13:18:46 +0530 |
---|---|---|
committer | Viresh Kumar <viresh.kumar@linaro.org> | 2021-12-13 13:42:04 +0530 |
commit | ea8448427fba5ec1ba4c5bdc5a43a63a4ff2efdb (patch) | |
tree | 0ea93260cbcf9c23537faeeb1c9f5ce5943fec0a | |
parent | 9798369a9dc474b73fe162fbdc73c59253061a8a (diff) |
irq
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
-rw-r--r-- | gpio-mock.c | 51 |
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); |