Message ID | 20170801145028.7558-4-brgl@bgdev.pl |
---|---|
State | New |
Headers | show |
On Tue, 1 Aug 2017 16:50:28 +0200 Bartosz Golaszewski <brgl@bgdev.pl> wrote: > Shrink the driver by removing the code dealing with dummy interrupts > and replacing it with calls to the irq_sim API. > > Signed-off-by: Bartosz Golaszewski <brgl@bgdev.pl> Looks straight forward to me. Acked-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> > --- > drivers/gpio/Kconfig | 2 +- > drivers/gpio/gpio-mockup.c | 77 +++++----------------------------------------- > 2 files changed, 8 insertions(+), 71 deletions(-) > > diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig > index f235eae04c16..e2264fb31f87 100644 > --- a/drivers/gpio/Kconfig > +++ b/drivers/gpio/Kconfig > @@ -311,7 +311,7 @@ config GPIO_MOCKUP > depends on GPIOLIB && SYSFS > select GPIO_SYSFS > select GPIOLIB_IRQCHIP > - select IRQ_WORK > + select IRQ_SIM > help > This enables GPIO Testing driver, which provides a way to test GPIO > subsystem through sysfs(or char device) and debugfs. GPIO_SYSFS > diff --git a/drivers/gpio/gpio-mockup.c b/drivers/gpio/gpio-mockup.c > index a6565e128f9e..6db7163e6d98 100644 > --- a/drivers/gpio/gpio-mockup.c > +++ b/drivers/gpio/gpio-mockup.c > @@ -20,7 +20,7 @@ > #include <linux/slab.h> > #include <linux/interrupt.h> > #include <linux/irq.h> > -#include <linux/irq_work.h> > +#include <linux/irq_sim.h> > #include <linux/debugfs.h> > #include <linux/uaccess.h> > > @@ -47,18 +47,12 @@ enum { > struct gpio_mockup_line_status { > int dir; > bool value; > - bool irq_enabled; > -}; > - > -struct gpio_mockup_irq_context { > - struct irq_work work; > - int irq; > }; > > struct gpio_mockup_chip { > struct gpio_chip gc; > struct gpio_mockup_line_status *lines; > - struct gpio_mockup_irq_context irq_ctx; > + struct irq_sim irqsim; > struct dentry *dbg_dir; > }; > > @@ -144,65 +138,11 @@ static int gpio_mockup_name_lines(struct device *dev, > return 0; > } > > -static int gpio_mockup_to_irq(struct gpio_chip *chip, unsigned int offset) > -{ > - return chip->irq_base + offset; > -} > - > -static void gpio_mockup_irqmask(struct irq_data *data) > +static int gpio_mockup_to_irq(struct gpio_chip *gc, unsigned int offset) > { > - struct gpio_chip *gc = irq_data_get_irq_chip_data(data); > struct gpio_mockup_chip *chip = gpiochip_get_data(gc); > > - chip->lines[data->irq - gc->irq_base].irq_enabled = false; > -} > - > -static void gpio_mockup_irqunmask(struct irq_data *data) > -{ > - struct gpio_chip *gc = irq_data_get_irq_chip_data(data); > - struct gpio_mockup_chip *chip = gpiochip_get_data(gc); > - > - chip->lines[data->irq - gc->irq_base].irq_enabled = true; > -} > - > -static struct irq_chip gpio_mockup_irqchip = { > - .name = GPIO_MOCKUP_NAME, > - .irq_mask = gpio_mockup_irqmask, > - .irq_unmask = gpio_mockup_irqunmask, > -}; > - > -static void gpio_mockup_handle_irq(struct irq_work *work) > -{ > - struct gpio_mockup_irq_context *irq_ctx; > - > - irq_ctx = container_of(work, struct gpio_mockup_irq_context, work); > - handle_simple_irq(irq_to_desc(irq_ctx->irq)); > -} > - > -static int gpio_mockup_irqchip_setup(struct device *dev, > - struct gpio_mockup_chip *chip) > -{ > - struct gpio_chip *gc = &chip->gc; > - int irq_base, i; > - > - irq_base = devm_irq_alloc_descs(dev, -1, 0, gc->ngpio, 0); > - if (irq_base < 0) > - return irq_base; > - > - gc->irq_base = irq_base; > - gc->irqchip = &gpio_mockup_irqchip; > - > - for (i = 0; i < gc->ngpio; i++) { > - irq_set_chip(irq_base + i, gc->irqchip); > - irq_set_chip_data(irq_base + i, gc); > - irq_set_handler(irq_base + i, &handle_simple_irq); > - irq_modify_status(irq_base + i, > - IRQ_NOREQUEST | IRQ_NOAUTOEN, IRQ_NOPROBE); > - } > - > - init_irq_work(&chip->irq_ctx.work, gpio_mockup_handle_irq); > - > - return 0; > + return irq_sim_irqnum(&chip->irqsim, offset); > } > > static ssize_t gpio_mockup_event_write(struct file *file, > @@ -228,11 +168,8 @@ static ssize_t gpio_mockup_event_write(struct file *file, > chip = priv->chip; > gc = &chip->gc; > > - if (chip->lines[priv->offset].irq_enabled) { > - gpiod_set_value_cansleep(desc, val); > - priv->chip->irq_ctx.irq = gc->irq_base + priv->offset; > - irq_work_queue(&priv->chip->irq_ctx.work); > - } > + gpiod_set_value_cansleep(desc, val); > + irq_sim_fire(&chip->irqsim, priv->offset); > > return size; > } > @@ -319,7 +256,7 @@ static int gpio_mockup_add(struct device *dev, > return ret; > } > > - ret = gpio_mockup_irqchip_setup(dev, chip); > + ret = devm_irq_sim_init(dev, &chip->irqsim, gc->ngpio); > if (ret) > return ret; > -- To unsubscribe from this list: send the line "unsubscribe linux-gpio" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Tue, Aug 1, 2017 at 4:50 PM, Bartosz Golaszewski <brgl@bgdev.pl> wrote: > Shrink the driver by removing the code dealing with dummy interrupts > and replacing it with calls to the irq_sim API. > > Signed-off-by: Bartosz Golaszewski <brgl@bgdev.pl> Reviewed-by: Linus Walleij <linus.walleij@linaro.org> Tglx/Marc: feel free to merge this with the rest into the irqchip tree. Yours, Linus Walleij -- To unsubscribe from this list: send the line "unsubscribe linux-gpio" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig index f235eae04c16..e2264fb31f87 100644 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig @@ -311,7 +311,7 @@ config GPIO_MOCKUP depends on GPIOLIB && SYSFS select GPIO_SYSFS select GPIOLIB_IRQCHIP - select IRQ_WORK + select IRQ_SIM help This enables GPIO Testing driver, which provides a way to test GPIO subsystem through sysfs(or char device) and debugfs. GPIO_SYSFS diff --git a/drivers/gpio/gpio-mockup.c b/drivers/gpio/gpio-mockup.c index a6565e128f9e..6db7163e6d98 100644 --- a/drivers/gpio/gpio-mockup.c +++ b/drivers/gpio/gpio-mockup.c @@ -20,7 +20,7 @@ #include <linux/slab.h> #include <linux/interrupt.h> #include <linux/irq.h> -#include <linux/irq_work.h> +#include <linux/irq_sim.h> #include <linux/debugfs.h> #include <linux/uaccess.h> @@ -47,18 +47,12 @@ enum { struct gpio_mockup_line_status { int dir; bool value; - bool irq_enabled; -}; - -struct gpio_mockup_irq_context { - struct irq_work work; - int irq; }; struct gpio_mockup_chip { struct gpio_chip gc; struct gpio_mockup_line_status *lines; - struct gpio_mockup_irq_context irq_ctx; + struct irq_sim irqsim; struct dentry *dbg_dir; }; @@ -144,65 +138,11 @@ static int gpio_mockup_name_lines(struct device *dev, return 0; } -static int gpio_mockup_to_irq(struct gpio_chip *chip, unsigned int offset) -{ - return chip->irq_base + offset; -} - -static void gpio_mockup_irqmask(struct irq_data *data) +static int gpio_mockup_to_irq(struct gpio_chip *gc, unsigned int offset) { - struct gpio_chip *gc = irq_data_get_irq_chip_data(data); struct gpio_mockup_chip *chip = gpiochip_get_data(gc); - chip->lines[data->irq - gc->irq_base].irq_enabled = false; -} - -static void gpio_mockup_irqunmask(struct irq_data *data) -{ - struct gpio_chip *gc = irq_data_get_irq_chip_data(data); - struct gpio_mockup_chip *chip = gpiochip_get_data(gc); - - chip->lines[data->irq - gc->irq_base].irq_enabled = true; -} - -static struct irq_chip gpio_mockup_irqchip = { - .name = GPIO_MOCKUP_NAME, - .irq_mask = gpio_mockup_irqmask, - .irq_unmask = gpio_mockup_irqunmask, -}; - -static void gpio_mockup_handle_irq(struct irq_work *work) -{ - struct gpio_mockup_irq_context *irq_ctx; - - irq_ctx = container_of(work, struct gpio_mockup_irq_context, work); - handle_simple_irq(irq_to_desc(irq_ctx->irq)); -} - -static int gpio_mockup_irqchip_setup(struct device *dev, - struct gpio_mockup_chip *chip) -{ - struct gpio_chip *gc = &chip->gc; - int irq_base, i; - - irq_base = devm_irq_alloc_descs(dev, -1, 0, gc->ngpio, 0); - if (irq_base < 0) - return irq_base; - - gc->irq_base = irq_base; - gc->irqchip = &gpio_mockup_irqchip; - - for (i = 0; i < gc->ngpio; i++) { - irq_set_chip(irq_base + i, gc->irqchip); - irq_set_chip_data(irq_base + i, gc); - irq_set_handler(irq_base + i, &handle_simple_irq); - irq_modify_status(irq_base + i, - IRQ_NOREQUEST | IRQ_NOAUTOEN, IRQ_NOPROBE); - } - - init_irq_work(&chip->irq_ctx.work, gpio_mockup_handle_irq); - - return 0; + return irq_sim_irqnum(&chip->irqsim, offset); } static ssize_t gpio_mockup_event_write(struct file *file, @@ -228,11 +168,8 @@ static ssize_t gpio_mockup_event_write(struct file *file, chip = priv->chip; gc = &chip->gc; - if (chip->lines[priv->offset].irq_enabled) { - gpiod_set_value_cansleep(desc, val); - priv->chip->irq_ctx.irq = gc->irq_base + priv->offset; - irq_work_queue(&priv->chip->irq_ctx.work); - } + gpiod_set_value_cansleep(desc, val); + irq_sim_fire(&chip->irqsim, priv->offset); return size; } @@ -319,7 +256,7 @@ static int gpio_mockup_add(struct device *dev, return ret; } - ret = gpio_mockup_irqchip_setup(dev, chip); + ret = devm_irq_sim_init(dev, &chip->irqsim, gc->ngpio); if (ret) return ret;
Shrink the driver by removing the code dealing with dummy interrupts and replacing it with calls to the irq_sim API. Signed-off-by: Bartosz Golaszewski <brgl@bgdev.pl> --- drivers/gpio/Kconfig | 2 +- drivers/gpio/gpio-mockup.c | 77 +++++----------------------------------------- 2 files changed, 8 insertions(+), 71 deletions(-)