1010#include <linux/export.h>
1111#include <linux/gpio/driver.h>
1212#include <linux/gpio/consumer.h>
13+ #include <linux/seq_file.h>
1314#include <linux/slab.h>
1415#include <asm/byteorder.h>
1516#include <linux/interrupt.h>
@@ -467,25 +468,27 @@ static void mcp23s08_irq_mask(struct irq_data *data)
467468{
468469 struct gpio_chip * gc = irq_data_get_irq_chip_data (data );
469470 struct mcp23s08 * mcp = gpiochip_get_data (gc );
470- unsigned int pos = data -> hwirq ;
471+ unsigned int pos = irqd_to_hwirq ( data ) ;
471472
472473 mcp_set_bit (mcp , MCP_GPINTEN , pos , false);
474+ gpiochip_disable_irq (gc , pos );
473475}
474476
475477static void mcp23s08_irq_unmask (struct irq_data * data )
476478{
477479 struct gpio_chip * gc = irq_data_get_irq_chip_data (data );
478480 struct mcp23s08 * mcp = gpiochip_get_data (gc );
479- unsigned int pos = data -> hwirq ;
481+ unsigned int pos = irqd_to_hwirq ( data ) ;
480482
483+ gpiochip_enable_irq (gc , pos );
481484 mcp_set_bit (mcp , MCP_GPINTEN , pos , true);
482485}
483486
484487static int mcp23s08_irq_set_type (struct irq_data * data , unsigned int type )
485488{
486489 struct gpio_chip * gc = irq_data_get_irq_chip_data (data );
487490 struct mcp23s08 * mcp = gpiochip_get_data (gc );
488- unsigned int pos = data -> hwirq ;
491+ unsigned int pos = irqd_to_hwirq ( data ) ;
489492
490493 if ((type & IRQ_TYPE_EDGE_BOTH ) == IRQ_TYPE_EDGE_BOTH ) {
491494 mcp_set_bit (mcp , MCP_INTCON , pos , false);
@@ -554,6 +557,25 @@ static int mcp23s08_irq_setup(struct mcp23s08 *mcp)
554557 return 0 ;
555558}
556559
560+ static void mcp23s08_irq_print_chip (struct irq_data * d , struct seq_file * p )
561+ {
562+ struct gpio_chip * gc = irq_data_get_irq_chip_data (d );
563+ struct mcp23s08 * mcp = gpiochip_get_data (gc );
564+
565+ seq_printf (p , dev_name (mcp -> dev ));
566+ }
567+
568+ static const struct irq_chip mcp23s08_irq_chip = {
569+ .irq_mask = mcp23s08_irq_mask ,
570+ .irq_unmask = mcp23s08_irq_unmask ,
571+ .irq_set_type = mcp23s08_irq_set_type ,
572+ .irq_bus_lock = mcp23s08_irq_bus_lock ,
573+ .irq_bus_sync_unlock = mcp23s08_irq_bus_unlock ,
574+ .irq_print_chip = mcp23s08_irq_print_chip ,
575+ .flags = IRQCHIP_IMMUTABLE ,
576+ GPIOCHIP_IRQ_RESOURCE_HELPERS ,
577+ };
578+
557579/*----------------------------------------------------------------------*/
558580
559581int mcp23s08_probe_one (struct mcp23s08 * mcp , struct device * dev ,
@@ -569,12 +591,6 @@ int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev,
569591 mcp -> addr = addr ;
570592
571593 mcp -> irq_active_high = false;
572- mcp -> irq_chip .name = dev_name (dev );
573- mcp -> irq_chip .irq_mask = mcp23s08_irq_mask ;
574- mcp -> irq_chip .irq_unmask = mcp23s08_irq_unmask ;
575- mcp -> irq_chip .irq_set_type = mcp23s08_irq_set_type ;
576- mcp -> irq_chip .irq_bus_lock = mcp23s08_irq_bus_lock ;
577- mcp -> irq_chip .irq_bus_sync_unlock = mcp23s08_irq_bus_unlock ;
578594
579595 mcp -> chip .direction_input = mcp23s08_direction_input ;
580596 mcp -> chip .get = mcp23s08_get ;
@@ -636,7 +652,7 @@ int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev,
636652 if (mcp -> irq && mcp -> irq_controller ) {
637653 struct gpio_irq_chip * girq = & mcp -> chip .irq ;
638654
639- girq -> chip = & mcp -> irq_chip ;
655+ gpio_irq_chip_set_chip ( girq , & mcp23s08_irq_chip ) ;
640656 /* This will let us handle the parent IRQ in the driver */
641657 girq -> parent_handler = NULL ;
642658 girq -> num_parents = 0 ;
0 commit comments