1 // SPDX-License-Identifier: GPL-2.0-only
2 /* MCP23S08 SPI/I2C GPIO driver */
4 #include <linux/bitops.h>
5 #include <linux/kernel.h>
6 #include <linux/device.h>
7 #include <linux/mutex.h>
8 #include <linux/mod_devicetable.h>
9 #include <linux/module.h>
10 #include <linux/export.h>
11 #include <linux/gpio/driver.h>
12 #include <linux/gpio/consumer.h>
13 #include <linux/seq_file.h>
14 #include <linux/slab.h>
15 #include <asm/byteorder.h>
16 #include <linux/interrupt.h>
17 #include <linux/regmap.h>
18 #include <linux/pinctrl/pinctrl.h>
19 #include <linux/pinctrl/pinconf.h>
20 #include <linux/pinctrl/pinconf-generic.h>
22 #include "pinctrl-mcp23s08.h"
24 /* Registers are all 8 bits wide.
26 * The mcp23s17 has twice as many bits, and can be configured to work
27 * with either 16 bit registers or with two adjacent 8 bit banks.
29 #define MCP_IODIR 0x00 /* init/reset: all ones */
31 #define MCP_GPINTEN 0x02
32 #define MCP_DEFVAL 0x03
33 #define MCP_INTCON 0x04
34 #define MCP_IOCON 0x05
35 # define IOCON_MIRROR (1 << 6)
36 # define IOCON_SEQOP (1 << 5)
37 # define IOCON_HAEN (1 << 3)
38 # define IOCON_ODR (1 << 2)
39 # define IOCON_INTPOL (1 << 1)
40 # define IOCON_INTCC (1)
43 #define MCP_INTCAP 0x08
47 static const struct reg_default mcp23x08_defaults
[] = {
48 {.reg
= MCP_IODIR
, .def
= 0xff},
49 {.reg
= MCP_IPOL
, .def
= 0x00},
50 {.reg
= MCP_GPINTEN
, .def
= 0x00},
51 {.reg
= MCP_DEFVAL
, .def
= 0x00},
52 {.reg
= MCP_INTCON
, .def
= 0x00},
53 {.reg
= MCP_IOCON
, .def
= 0x00},
54 {.reg
= MCP_GPPU
, .def
= 0x00},
55 {.reg
= MCP_OLAT
, .def
= 0x00},
58 static const struct regmap_range mcp23x08_volatile_range
= {
59 .range_min
= MCP_INTF
,
60 .range_max
= MCP_GPIO
,
63 static const struct regmap_access_table mcp23x08_volatile_table
= {
64 .yes_ranges
= &mcp23x08_volatile_range
,
68 static const struct regmap_range mcp23x08_precious_range
= {
69 .range_min
= MCP_GPIO
,
70 .range_max
= MCP_GPIO
,
73 static const struct regmap_access_table mcp23x08_precious_table
= {
74 .yes_ranges
= &mcp23x08_precious_range
,
78 const struct regmap_config mcp23x08_regmap
= {
83 .volatile_table
= &mcp23x08_volatile_table
,
84 .precious_table
= &mcp23x08_precious_table
,
85 .reg_defaults
= mcp23x08_defaults
,
86 .num_reg_defaults
= ARRAY_SIZE(mcp23x08_defaults
),
87 .cache_type
= REGCACHE_FLAT
,
88 .max_register
= MCP_OLAT
,
89 .disable_locking
= true, /* mcp->lock protects the regmap */
91 EXPORT_SYMBOL_GPL(mcp23x08_regmap
);
93 static const struct reg_default mcp23x17_defaults
[] = {
94 {.reg
= MCP_IODIR
<< 1, .def
= 0xffff},
95 {.reg
= MCP_IPOL
<< 1, .def
= 0x0000},
96 {.reg
= MCP_GPINTEN
<< 1, .def
= 0x0000},
97 {.reg
= MCP_DEFVAL
<< 1, .def
= 0x0000},
98 {.reg
= MCP_INTCON
<< 1, .def
= 0x0000},
99 {.reg
= MCP_IOCON
<< 1, .def
= 0x0000},
100 {.reg
= MCP_GPPU
<< 1, .def
= 0x0000},
101 {.reg
= MCP_OLAT
<< 1, .def
= 0x0000},
104 static const struct regmap_range mcp23x17_volatile_range
= {
105 .range_min
= MCP_INTF
<< 1,
106 .range_max
= MCP_GPIO
<< 1,
109 static const struct regmap_access_table mcp23x17_volatile_table
= {
110 .yes_ranges
= &mcp23x17_volatile_range
,
114 static const struct regmap_range mcp23x17_precious_range
= {
115 .range_min
= MCP_INTCAP
<< 1,
116 .range_max
= MCP_GPIO
<< 1,
119 static const struct regmap_access_table mcp23x17_precious_table
= {
120 .yes_ranges
= &mcp23x17_precious_range
,
124 const struct regmap_config mcp23x17_regmap
= {
129 .max_register
= MCP_OLAT
<< 1,
130 .volatile_table
= &mcp23x17_volatile_table
,
131 .precious_table
= &mcp23x17_precious_table
,
132 .reg_defaults
= mcp23x17_defaults
,
133 .num_reg_defaults
= ARRAY_SIZE(mcp23x17_defaults
),
134 .cache_type
= REGCACHE_FLAT
,
135 .val_format_endian
= REGMAP_ENDIAN_LITTLE
,
136 .disable_locking
= true, /* mcp->lock protects the regmap */
138 EXPORT_SYMBOL_GPL(mcp23x17_regmap
);
140 static int mcp_read(struct mcp23s08
*mcp
, unsigned int reg
, unsigned int *val
)
142 return regmap_read(mcp
->regmap
, reg
<< mcp
->reg_shift
, val
);
145 static int mcp_write(struct mcp23s08
*mcp
, unsigned int reg
, unsigned int val
)
147 return regmap_write(mcp
->regmap
, reg
<< mcp
->reg_shift
, val
);
150 static int mcp_update_bits(struct mcp23s08
*mcp
, unsigned int reg
,
151 unsigned int mask
, unsigned int val
)
153 return regmap_update_bits(mcp
->regmap
, reg
<< mcp
->reg_shift
,
157 static int mcp_set_bit(struct mcp23s08
*mcp
, unsigned int reg
,
158 unsigned int pin
, bool enabled
)
161 return mcp_update_bits(mcp
, reg
, mask
, enabled
? mask
: 0);
164 static const struct pinctrl_pin_desc mcp23x08_pins
[] = {
165 PINCTRL_PIN(0, "gpio0"),
166 PINCTRL_PIN(1, "gpio1"),
167 PINCTRL_PIN(2, "gpio2"),
168 PINCTRL_PIN(3, "gpio3"),
169 PINCTRL_PIN(4, "gpio4"),
170 PINCTRL_PIN(5, "gpio5"),
171 PINCTRL_PIN(6, "gpio6"),
172 PINCTRL_PIN(7, "gpio7"),
175 static const struct pinctrl_pin_desc mcp23x17_pins
[] = {
176 PINCTRL_PIN(0, "gpio0"),
177 PINCTRL_PIN(1, "gpio1"),
178 PINCTRL_PIN(2, "gpio2"),
179 PINCTRL_PIN(3, "gpio3"),
180 PINCTRL_PIN(4, "gpio4"),
181 PINCTRL_PIN(5, "gpio5"),
182 PINCTRL_PIN(6, "gpio6"),
183 PINCTRL_PIN(7, "gpio7"),
184 PINCTRL_PIN(8, "gpio8"),
185 PINCTRL_PIN(9, "gpio9"),
186 PINCTRL_PIN(10, "gpio10"),
187 PINCTRL_PIN(11, "gpio11"),
188 PINCTRL_PIN(12, "gpio12"),
189 PINCTRL_PIN(13, "gpio13"),
190 PINCTRL_PIN(14, "gpio14"),
191 PINCTRL_PIN(15, "gpio15"),
194 static int mcp_pinctrl_get_groups_count(struct pinctrl_dev
*pctldev
)
199 static const char *mcp_pinctrl_get_group_name(struct pinctrl_dev
*pctldev
,
205 static int mcp_pinctrl_get_group_pins(struct pinctrl_dev
*pctldev
,
207 const unsigned int **pins
,
208 unsigned int *num_pins
)
213 static const struct pinctrl_ops mcp_pinctrl_ops
= {
214 .get_groups_count
= mcp_pinctrl_get_groups_count
,
215 .get_group_name
= mcp_pinctrl_get_group_name
,
216 .get_group_pins
= mcp_pinctrl_get_group_pins
,
218 .dt_node_to_map
= pinconf_generic_dt_node_to_map_pin
,
219 .dt_free_map
= pinconf_generic_dt_free_map
,
223 static int mcp_pinconf_get(struct pinctrl_dev
*pctldev
, unsigned int pin
,
224 unsigned long *config
)
226 struct mcp23s08
*mcp
= pinctrl_dev_get_drvdata(pctldev
);
227 enum pin_config_param param
= pinconf_to_config_param(*config
);
228 unsigned int data
, status
;
232 case PIN_CONFIG_BIAS_PULL_UP
:
233 mutex_lock(&mcp
->lock
);
234 ret
= mcp_read(mcp
, MCP_GPPU
, &data
);
235 mutex_unlock(&mcp
->lock
);
238 status
= (data
& BIT(pin
)) ? 1 : 0;
246 return status
? 0 : -EINVAL
;
249 static int mcp_pinconf_set(struct pinctrl_dev
*pctldev
, unsigned int pin
,
250 unsigned long *configs
, unsigned int num_configs
)
252 struct mcp23s08
*mcp
= pinctrl_dev_get_drvdata(pctldev
);
253 enum pin_config_param param
;
258 for (i
= 0; i
< num_configs
; i
++) {
259 param
= pinconf_to_config_param(configs
[i
]);
260 arg
= pinconf_to_config_argument(configs
[i
]);
263 case PIN_CONFIG_BIAS_PULL_UP
:
264 mutex_lock(&mcp
->lock
);
265 ret
= mcp_set_bit(mcp
, MCP_GPPU
, pin
, arg
);
266 mutex_unlock(&mcp
->lock
);
269 dev_dbg(mcp
->dev
, "Invalid config param %04x\n", param
);
277 static const struct pinconf_ops mcp_pinconf_ops
= {
278 .pin_config_get
= mcp_pinconf_get
,
279 .pin_config_set
= mcp_pinconf_set
,
283 /*----------------------------------------------------------------------*/
285 static int mcp23s08_direction_input(struct gpio_chip
*chip
, unsigned offset
)
287 struct mcp23s08
*mcp
= gpiochip_get_data(chip
);
290 mutex_lock(&mcp
->lock
);
291 status
= mcp_set_bit(mcp
, MCP_IODIR
, offset
, true);
292 mutex_unlock(&mcp
->lock
);
297 static int mcp23s08_get(struct gpio_chip
*chip
, unsigned offset
)
299 struct mcp23s08
*mcp
= gpiochip_get_data(chip
);
302 mutex_lock(&mcp
->lock
);
304 /* REVISIT reading this clears any IRQ ... */
305 ret
= mcp_read(mcp
, MCP_GPIO
, &status
);
309 mcp
->cached_gpio
= status
;
310 status
= !!(status
& (1 << offset
));
313 mutex_unlock(&mcp
->lock
);
317 static int mcp23s08_get_multiple(struct gpio_chip
*chip
,
318 unsigned long *mask
, unsigned long *bits
)
320 struct mcp23s08
*mcp
= gpiochip_get_data(chip
);
324 mutex_lock(&mcp
->lock
);
326 /* REVISIT reading this clears any IRQ ... */
327 ret
= mcp_read(mcp
, MCP_GPIO
, &status
);
331 mcp
->cached_gpio
= status
;
335 mutex_unlock(&mcp
->lock
);
339 static int __mcp23s08_set(struct mcp23s08
*mcp
, unsigned mask
, bool value
)
341 return mcp_update_bits(mcp
, MCP_OLAT
, mask
, value
? mask
: 0);
344 static void mcp23s08_set(struct gpio_chip
*chip
, unsigned offset
, int value
)
346 struct mcp23s08
*mcp
= gpiochip_get_data(chip
);
347 unsigned mask
= BIT(offset
);
349 mutex_lock(&mcp
->lock
);
350 __mcp23s08_set(mcp
, mask
, !!value
);
351 mutex_unlock(&mcp
->lock
);
354 static void mcp23s08_set_multiple(struct gpio_chip
*chip
,
355 unsigned long *mask
, unsigned long *bits
)
357 struct mcp23s08
*mcp
= gpiochip_get_data(chip
);
359 mutex_lock(&mcp
->lock
);
360 mcp_update_bits(mcp
, MCP_OLAT
, *mask
, *bits
);
361 mutex_unlock(&mcp
->lock
);
365 mcp23s08_direction_output(struct gpio_chip
*chip
, unsigned offset
, int value
)
367 struct mcp23s08
*mcp
= gpiochip_get_data(chip
);
368 unsigned mask
= BIT(offset
);
371 mutex_lock(&mcp
->lock
);
372 status
= __mcp23s08_set(mcp
, mask
, value
);
374 status
= mcp_update_bits(mcp
, MCP_IODIR
, mask
, 0);
376 mutex_unlock(&mcp
->lock
);
380 /*----------------------------------------------------------------------*/
381 static irqreturn_t
mcp23s08_irq(int irq
, void *data
)
383 struct mcp23s08
*mcp
= data
;
384 int intcap
, intcon
, intf
, i
, gpio
, gpio_orig
, intcap_mask
, defval
, gpinten
;
385 unsigned long int enabled_interrupts
;
386 unsigned int child_irq
;
387 bool intf_set
, intcap_changed
, gpio_bit_changed
,
388 defval_changed
, gpio_set
;
390 mutex_lock(&mcp
->lock
);
391 if (mcp_read(mcp
, MCP_INTF
, &intf
))
395 /* There is no interrupt pending */
399 if (mcp_read(mcp
, MCP_INTCAP
, &intcap
))
402 if (mcp_read(mcp
, MCP_INTCON
, &intcon
))
405 if (mcp_read(mcp
, MCP_GPINTEN
, &gpinten
))
408 if (mcp_read(mcp
, MCP_DEFVAL
, &defval
))
411 /* This clears the interrupt(configurable on S18) */
412 if (mcp_read(mcp
, MCP_GPIO
, &gpio
))
415 gpio_orig
= mcp
->cached_gpio
;
416 mcp
->cached_gpio
= gpio
;
417 mutex_unlock(&mcp
->lock
);
419 dev_dbg(mcp
->chip
.parent
,
420 "intcap 0x%04X intf 0x%04X gpio_orig 0x%04X gpio 0x%04X\n",
421 intcap
, intf
, gpio_orig
, gpio
);
423 enabled_interrupts
= gpinten
;
424 for_each_set_bit(i
, &enabled_interrupts
, mcp
->chip
.ngpio
) {
426 * We must check all of the inputs with enabled interrupts
427 * on the chip, otherwise we may not notice a change
428 * on more than one pin.
430 * On at least the mcp23s17, INTCAP is only updated
431 * one byte at a time(INTCAPA and INTCAPB are
432 * not written to at the same time - only on a per-bank
435 * INTF only contains the single bit that caused the
436 * interrupt per-bank. On the mcp23s17, there is
437 * INTFA and INTFB. If two pins are changed on the A
438 * side at the same time, INTF will only have one bit
439 * set. If one pin on the A side and one pin on the B
440 * side are changed at the same time, INTF will have
441 * two bits set. Thus, INTF can't be the only check
442 * to see if the input has changed.
445 intf_set
= intf
& BIT(i
);
446 if (i
< 8 && intf_set
)
447 intcap_mask
= 0x00FF;
448 else if (i
>= 8 && intf_set
)
449 intcap_mask
= 0xFF00;
453 intcap_changed
= (intcap_mask
&
454 (intcap
& BIT(i
))) !=
455 (intcap_mask
& (BIT(i
) & gpio_orig
));
456 gpio_set
= BIT(i
) & gpio
;
457 gpio_bit_changed
= (BIT(i
) & gpio_orig
) !=
459 defval_changed
= (BIT(i
) & intcon
) &&
463 if (((gpio_bit_changed
|| intcap_changed
) &&
464 (BIT(i
) & mcp
->irq_rise
) && gpio_set
) ||
465 ((gpio_bit_changed
|| intcap_changed
) &&
466 (BIT(i
) & mcp
->irq_fall
) && !gpio_set
) ||
468 child_irq
= irq_find_mapping(mcp
->chip
.irq
.domain
, i
);
469 handle_nested_irq(child_irq
);
476 mutex_unlock(&mcp
->lock
);
480 static void mcp23s08_irq_mask(struct irq_data
*data
)
482 struct gpio_chip
*gc
= irq_data_get_irq_chip_data(data
);
483 struct mcp23s08
*mcp
= gpiochip_get_data(gc
);
484 unsigned int pos
= irqd_to_hwirq(data
);
486 mcp_set_bit(mcp
, MCP_GPINTEN
, pos
, false);
487 gpiochip_disable_irq(gc
, pos
);
490 static void mcp23s08_irq_unmask(struct irq_data
*data
)
492 struct gpio_chip
*gc
= irq_data_get_irq_chip_data(data
);
493 struct mcp23s08
*mcp
= gpiochip_get_data(gc
);
494 unsigned int pos
= irqd_to_hwirq(data
);
496 gpiochip_enable_irq(gc
, pos
);
497 mcp_set_bit(mcp
, MCP_GPINTEN
, pos
, true);
500 static int mcp23s08_irq_set_type(struct irq_data
*data
, unsigned int type
)
502 struct gpio_chip
*gc
= irq_data_get_irq_chip_data(data
);
503 struct mcp23s08
*mcp
= gpiochip_get_data(gc
);
504 unsigned int pos
= irqd_to_hwirq(data
);
506 if ((type
& IRQ_TYPE_EDGE_BOTH
) == IRQ_TYPE_EDGE_BOTH
) {
507 mcp_set_bit(mcp
, MCP_INTCON
, pos
, false);
508 mcp
->irq_rise
|= BIT(pos
);
509 mcp
->irq_fall
|= BIT(pos
);
510 } else if (type
& IRQ_TYPE_EDGE_RISING
) {
511 mcp_set_bit(mcp
, MCP_INTCON
, pos
, false);
512 mcp
->irq_rise
|= BIT(pos
);
513 mcp
->irq_fall
&= ~BIT(pos
);
514 } else if (type
& IRQ_TYPE_EDGE_FALLING
) {
515 mcp_set_bit(mcp
, MCP_INTCON
, pos
, false);
516 mcp
->irq_rise
&= ~BIT(pos
);
517 mcp
->irq_fall
|= BIT(pos
);
518 } else if (type
& IRQ_TYPE_LEVEL_HIGH
) {
519 mcp_set_bit(mcp
, MCP_INTCON
, pos
, true);
520 mcp_set_bit(mcp
, MCP_DEFVAL
, pos
, false);
521 } else if (type
& IRQ_TYPE_LEVEL_LOW
) {
522 mcp_set_bit(mcp
, MCP_INTCON
, pos
, true);
523 mcp_set_bit(mcp
, MCP_DEFVAL
, pos
, true);
530 static void mcp23s08_irq_bus_lock(struct irq_data
*data
)
532 struct gpio_chip
*gc
= irq_data_get_irq_chip_data(data
);
533 struct mcp23s08
*mcp
= gpiochip_get_data(gc
);
535 mutex_lock(&mcp
->lock
);
536 regcache_cache_only(mcp
->regmap
, true);
539 static void mcp23s08_irq_bus_unlock(struct irq_data
*data
)
541 struct gpio_chip
*gc
= irq_data_get_irq_chip_data(data
);
542 struct mcp23s08
*mcp
= gpiochip_get_data(gc
);
544 regcache_cache_only(mcp
->regmap
, false);
545 regcache_sync(mcp
->regmap
);
547 mutex_unlock(&mcp
->lock
);
550 static int mcp23s08_irq_setup(struct mcp23s08
*mcp
)
552 struct gpio_chip
*chip
= &mcp
->chip
;
554 unsigned long irqflags
= IRQF_ONESHOT
| IRQF_SHARED
;
556 if (mcp
->irq_active_high
)
557 irqflags
|= IRQF_TRIGGER_HIGH
;
559 irqflags
|= IRQF_TRIGGER_LOW
;
561 err
= devm_request_threaded_irq(chip
->parent
, mcp
->irq
, NULL
,
563 irqflags
, dev_name(chip
->parent
), mcp
);
565 dev_err(chip
->parent
, "unable to request IRQ#%d: %d\n",
573 static void mcp23s08_irq_print_chip(struct irq_data
*d
, struct seq_file
*p
)
575 struct gpio_chip
*gc
= irq_data_get_irq_chip_data(d
);
576 struct mcp23s08
*mcp
= gpiochip_get_data(gc
);
578 seq_puts(p
, dev_name(mcp
->dev
));
581 static const struct irq_chip mcp23s08_irq_chip
= {
582 .irq_mask
= mcp23s08_irq_mask
,
583 .irq_unmask
= mcp23s08_irq_unmask
,
584 .irq_set_type
= mcp23s08_irq_set_type
,
585 .irq_bus_lock
= mcp23s08_irq_bus_lock
,
586 .irq_bus_sync_unlock
= mcp23s08_irq_bus_unlock
,
587 .irq_print_chip
= mcp23s08_irq_print_chip
,
588 .flags
= IRQCHIP_IMMUTABLE
,
589 GPIOCHIP_IRQ_RESOURCE_HELPERS
,
592 /*----------------------------------------------------------------------*/
594 int mcp23s08_probe_one(struct mcp23s08
*mcp
, struct device
*dev
,
595 unsigned int addr
, unsigned int type
, unsigned int base
)
599 bool open_drain
= false;
601 mutex_init(&mcp
->lock
);
606 mcp
->irq_active_high
= false;
608 mcp
->chip
.direction_input
= mcp23s08_direction_input
;
609 mcp
->chip
.get
= mcp23s08_get
;
610 mcp
->chip
.get_multiple
= mcp23s08_get_multiple
;
611 mcp
->chip
.direction_output
= mcp23s08_direction_output
;
612 mcp
->chip
.set
= mcp23s08_set
;
613 mcp
->chip
.set_multiple
= mcp23s08_set_multiple
;
615 mcp
->chip
.base
= base
;
616 mcp
->chip
.can_sleep
= true;
617 mcp
->chip
.parent
= dev
;
618 mcp
->chip
.owner
= THIS_MODULE
;
620 mcp
->reset_gpio
= devm_gpiod_get_optional(dev
, "reset", GPIOD_OUT_LOW
);
622 /* verify MCP_IOCON.SEQOP = 0, so sequential reads work,
623 * and MCP_IOCON.HAEN = 1, so we work with all chips.
626 ret
= mcp_read(mcp
, MCP_IOCON
, &status
);
628 return dev_err_probe(dev
, ret
, "can't identify chip %d\n", addr
);
630 mcp
->irq_controller
=
631 device_property_read_bool(dev
, "interrupt-controller");
632 if (mcp
->irq
&& mcp
->irq_controller
) {
633 mcp
->irq_active_high
=
634 device_property_read_bool(dev
,
635 "microchip,irq-active-high");
637 mirror
= device_property_read_bool(dev
, "microchip,irq-mirror");
638 open_drain
= device_property_read_bool(dev
, "drive-open-drain");
641 if ((status
& IOCON_SEQOP
) || !(status
& IOCON_HAEN
) || mirror
||
642 mcp
->irq_active_high
|| open_drain
) {
643 /* mcp23s17 has IOCON twice, make sure they are in sync */
644 status
&= ~(IOCON_SEQOP
| (IOCON_SEQOP
<< 8));
645 status
|= IOCON_HAEN
| (IOCON_HAEN
<< 8);
646 if (mcp
->irq_active_high
)
647 status
|= IOCON_INTPOL
| (IOCON_INTPOL
<< 8);
649 status
&= ~(IOCON_INTPOL
| (IOCON_INTPOL
<< 8));
652 status
|= IOCON_MIRROR
| (IOCON_MIRROR
<< 8);
655 status
|= IOCON_ODR
| (IOCON_ODR
<< 8);
657 if (type
== MCP_TYPE_S18
|| type
== MCP_TYPE_018
)
658 status
|= IOCON_INTCC
| (IOCON_INTCC
<< 8);
660 ret
= mcp_write(mcp
, MCP_IOCON
, status
);
662 return dev_err_probe(dev
, ret
, "can't write IOCON %d\n", addr
);
665 if (mcp
->irq
&& mcp
->irq_controller
) {
666 struct gpio_irq_chip
*girq
= &mcp
->chip
.irq
;
668 gpio_irq_chip_set_chip(girq
, &mcp23s08_irq_chip
);
669 /* This will let us handle the parent IRQ in the driver */
670 girq
->parent_handler
= NULL
;
671 girq
->num_parents
= 0;
672 girq
->parents
= NULL
;
673 girq
->default_type
= IRQ_TYPE_NONE
;
674 girq
->handler
= handle_simple_irq
;
675 girq
->threaded
= true;
678 ret
= devm_gpiochip_add_data(dev
, &mcp
->chip
, mcp
);
680 return dev_err_probe(dev
, ret
, "can't add GPIO chip\n");
682 mcp
->pinctrl_desc
.pctlops
= &mcp_pinctrl_ops
;
683 mcp
->pinctrl_desc
.confops
= &mcp_pinconf_ops
;
684 mcp
->pinctrl_desc
.npins
= mcp
->chip
.ngpio
;
685 if (mcp
->pinctrl_desc
.npins
== 8)
686 mcp
->pinctrl_desc
.pins
= mcp23x08_pins
;
687 else if (mcp
->pinctrl_desc
.npins
== 16)
688 mcp
->pinctrl_desc
.pins
= mcp23x17_pins
;
689 mcp
->pinctrl_desc
.owner
= THIS_MODULE
;
691 mcp
->pctldev
= devm_pinctrl_register(dev
, &mcp
->pinctrl_desc
, mcp
);
692 if (IS_ERR(mcp
->pctldev
))
693 return dev_err_probe(dev
, PTR_ERR(mcp
->pctldev
), "can't register controller\n");
696 ret
= mcp23s08_irq_setup(mcp
);
698 return dev_err_probe(dev
, ret
, "can't setup IRQ\n");
703 EXPORT_SYMBOL_GPL(mcp23s08_probe_one
);
705 MODULE_DESCRIPTION("MCP23S08 SPI/I2C GPIO driver");
706 MODULE_LICENSE("GPL");