Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

gpio: mockup: support irqmask and irqunmask

Even though this is a testing module, be nice and actually implement
these functions.

Signed-off-by: Bartosz Golaszewski <brgl@bgdev.pl>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>

authored by

Bartosz Golaszewski and committed by
Linus Walleij
c7f5326f 01a3f23c

+20 -6
+20 -6
drivers/gpio/gpio-mockup.c
··· 41 41 struct gpio_mockup_line_status { 42 42 int dir; 43 43 bool value; 44 + bool irq_enabled; 44 45 }; 45 46 46 47 struct gpio_mockup_irq_context { ··· 143 142 return chip->irq_base + offset; 144 143 } 145 144 146 - /* 147 - * While we should generally support irqmask and irqunmask, this driver is 148 - * for testing purposes only so we don't care. 149 - */ 150 - static void gpio_mockup_irqmask(struct irq_data *d) { } 151 - static void gpio_mockup_irqunmask(struct irq_data *d) { } 145 + static void gpio_mockup_irqmask(struct irq_data *data) 146 + { 147 + struct gpio_chip *gc = irq_data_get_irq_chip_data(data); 148 + struct gpio_mockup_chip *chip = gpiochip_get_data(gc); 149 + 150 + chip->lines[data->irq - gc->irq_base].irq_enabled = false; 151 + } 152 + 153 + static void gpio_mockup_irqunmask(struct irq_data *data) 154 + { 155 + struct gpio_chip *gc = irq_data_get_irq_chip_data(data); 156 + struct gpio_mockup_chip *chip = gpiochip_get_data(gc); 157 + 158 + chip->lines[data->irq - gc->irq_base].irq_enabled = true; 159 + } 152 160 153 161 static struct irq_chip gpio_mockup_irqchip = { 154 162 .name = GPIO_MOCKUP_NAME, ··· 188 178 189 179 for (i = 0; i < gc->ngpio; i++) { 190 180 irq_set_chip(irq_base + i, gc->irqchip); 181 + irq_set_chip_data(irq_base + i, gc); 191 182 irq_set_handler(irq_base + i, &handle_simple_irq); 192 183 irq_modify_status(irq_base + i, 193 184 IRQ_NOREQUEST | IRQ_NOAUTOEN, IRQ_NOPROBE); ··· 216 205 desc = priv->desc; 217 206 chip = priv->chip; 218 207 gc = &chip->gc; 208 + 209 + if (!chip->lines[priv->offset].irq_enabled) 210 + return size; 219 211 220 212 if (copy_from_user(&buf, usr_buf, 1)) 221 213 return -EFAULT;