summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpio/gpio-104-idi-48.c28
1 files changed, 5 insertions, 23 deletions
diff --git a/drivers/gpio/gpio-104-idi-48.c b/drivers/gpio/gpio-104-idi-48.c
index 2d2763ea1a68..eafbf053f3e8 100644
--- a/drivers/gpio/gpio-104-idi-48.c
+++ b/drivers/gpio/gpio-104-idi-48.c
@@ -47,7 +47,6 @@ MODULE_PARM_DESC(irq, "ACCES 104-IDI-48 interrupt line numbers");
47 * @ack_lock: synchronization lock to prevent IRQ handler race conditions 47 * @ack_lock: synchronization lock to prevent IRQ handler race conditions
48 * @irq_mask: input bits affected by interrupts 48 * @irq_mask: input bits affected by interrupts
49 * @base: base port address of the GPIO device 49 * @base: base port address of the GPIO device
50 * @irq: Interrupt line number
51 * @cos_enb: Change-Of-State IRQ enable boundaries mask 50 * @cos_enb: Change-Of-State IRQ enable boundaries mask
52 */ 51 */
53struct idi_48_gpio { 52struct idi_48_gpio {
@@ -56,7 +55,6 @@ struct idi_48_gpio {
56 spinlock_t ack_lock; 55 spinlock_t ack_lock;
57 unsigned char irq_mask[6]; 56 unsigned char irq_mask[6];
58 unsigned base; 57 unsigned base;
59 unsigned irq;
60 unsigned char cos_enb; 58 unsigned char cos_enb;
61}; 59};
62 60
@@ -244,14 +242,13 @@ static int idi_48_probe(struct device *dev, unsigned int id)
244 idi48gpio->chip.direction_input = idi_48_gpio_direction_input; 242 idi48gpio->chip.direction_input = idi_48_gpio_direction_input;
245 idi48gpio->chip.get = idi_48_gpio_get; 243 idi48gpio->chip.get = idi_48_gpio_get;
246 idi48gpio->base = base[id]; 244 idi48gpio->base = base[id];
247 idi48gpio->irq = irq[id];
248 245
249 spin_lock_init(&idi48gpio->lock); 246 spin_lock_init(&idi48gpio->lock);
250 spin_lock_init(&idi48gpio->ack_lock); 247 spin_lock_init(&idi48gpio->ack_lock);
251 248
252 dev_set_drvdata(dev, idi48gpio); 249 dev_set_drvdata(dev, idi48gpio);
253 250
254 err = gpiochip_add_data(&idi48gpio->chip, idi48gpio); 251 err = devm_gpiochip_add_data(dev, &idi48gpio->chip, idi48gpio);
255 if (err) { 252 if (err) {
256 dev_err(dev, "GPIO registering failed (%d)\n", err); 253 dev_err(dev, "GPIO registering failed (%d)\n", err);
257 return err; 254 return err;
@@ -265,31 +262,17 @@ static int idi_48_probe(struct device *dev, unsigned int id)
265 handle_edge_irq, IRQ_TYPE_NONE); 262 handle_edge_irq, IRQ_TYPE_NONE);
266 if (err) { 263 if (err) {
267 dev_err(dev, "Could not add irqchip (%d)\n", err); 264 dev_err(dev, "Could not add irqchip (%d)\n", err);
268 goto err_gpiochip_remove; 265 return err;
269 } 266 }
270 267
271 err = request_irq(irq[id], idi_48_irq_handler, IRQF_SHARED, name, 268 err = devm_request_irq(dev, irq[id], idi_48_irq_handler, IRQF_SHARED,
272 idi48gpio); 269 name, idi48gpio);
273 if (err) { 270 if (err) {
274 dev_err(dev, "IRQ handler registering failed (%d)\n", err); 271 dev_err(dev, "IRQ handler registering failed (%d)\n", err);
275 goto err_gpiochip_remove; 272 return err;
276 } 273 }
277 274
278 return 0; 275 return 0;
279
280err_gpiochip_remove:
281 gpiochip_remove(&idi48gpio->chip);
282 return err;
283}
284
285static int idi_48_remove(struct device *dev, unsigned int id)
286{
287 struct idi_48_gpio *const idi48gpio = dev_get_drvdata(dev);
288
289 free_irq(idi48gpio->irq, idi48gpio);
290 gpiochip_remove(&idi48gpio->chip);
291
292 return 0;
293} 276}
294 277
295static struct isa_driver idi_48_driver = { 278static struct isa_driver idi_48_driver = {
@@ -297,7 +280,6 @@ static struct isa_driver idi_48_driver = {
297 .driver = { 280 .driver = {
298 .name = "104-idi-48" 281 .name = "104-idi-48"
299 }, 282 },
300 .remove = idi_48_remove
301}; 283};
302module_isa_driver(idi_48_driver, num_idi_48); 284module_isa_driver(idi_48_driver, num_idi_48);
303 285