2 * MCP23S08 SPI/I2C GPIO gpio expander driver
4 * The inputs and outputs of the mcp23s08, mcp23s17, mcp23008 and mcp23017 are
6 * For the I2C versions of the chips (mcp23008 and mcp23017) generation of
7 * interrupts is also supported.
8 * The hardware of the SPI versions of the chips (mcp23s08 and mcp23s17) is
9 * also capable of generating interrupts, but the linux driver does not
13 #include <linux/kernel.h>
14 #include <linux/device.h>
15 #include <linux/mutex.h>
16 #include <linux/module.h>
17 #include <linux/gpio.h>
18 #include <linux/i2c.h>
19 #include <linux/spi/spi.h>
20 #include <linux/spi/mcp23s08.h>
21 #include <linux/slab.h>
22 #include <asm/byteorder.h>
23 #include <linux/interrupt.h>
24 #include <linux/of_irq.h>
25 #include <linux/of_device.h>
28 * MCP types supported by driver
30 #define MCP_TYPE_S08 0
31 #define MCP_TYPE_S17 1
32 #define MCP_TYPE_008 2
33 #define MCP_TYPE_017 3
35 /* Registers are all 8 bits wide.
37 * The mcp23s17 has twice as many bits, and can be configured to work
38 * with either 16 bit registers or with two adjacent 8 bit banks.
40 #define MCP_IODIR 0x00 /* init/reset: all ones */
42 #define MCP_GPINTEN 0x02
43 #define MCP_DEFVAL 0x03
44 #define MCP_INTCON 0x04
45 #define MCP_IOCON 0x05
46 # define IOCON_MIRROR (1 << 6)
47 # define IOCON_SEQOP (1 << 5)
48 # define IOCON_HAEN (1 << 3)
49 # define IOCON_ODR (1 << 2)
50 # define IOCON_INTPOL (1 << 1)
53 #define MCP_INTCAP 0x08
60 int (*read
)(struct mcp23s08
*mcp
, unsigned reg
);
61 int (*write
)(struct mcp23s08
*mcp
, unsigned reg
, unsigned val
);
62 int (*read_regs
)(struct mcp23s08
*mcp
, unsigned reg
,
63 u16
*vals
, unsigned n
);
74 /* lock protects the cached values */
76 struct mutex irq_lock
;
77 struct irq_domain
*irq_domain
;
79 struct gpio_chip chip
;
81 const struct mcp23s08_ops
*ops
;
82 void *data
; /* ops specific data */
85 /* A given spi_device can represent up to eight mcp23sxx chips
86 * sharing the same chipselect but using different addresses
87 * (e.g. chips #0 and #3 might be populated, but not #1 or $2).
88 * Driver data holds all the per-chip data.
90 struct mcp23s08_driver_data
{
92 struct mcp23s08
*mcp
[8];
93 struct mcp23s08 chip
[];
96 /* This lock class tells lockdep that GPIO irqs are in a different
97 * category than their parents, so it won't report false recursion.
99 static struct lock_class_key gpio_lock_class
;
101 /*----------------------------------------------------------------------*/
103 #if IS_ENABLED(CONFIG_I2C)
105 static int mcp23008_read(struct mcp23s08
*mcp
, unsigned reg
)
107 return i2c_smbus_read_byte_data(mcp
->data
, reg
);
110 static int mcp23008_write(struct mcp23s08
*mcp
, unsigned reg
, unsigned val
)
112 return i2c_smbus_write_byte_data(mcp
->data
, reg
, val
);
116 mcp23008_read_regs(struct mcp23s08
*mcp
, unsigned reg
, u16
*vals
, unsigned n
)
119 int ret
= mcp23008_read(mcp
, reg
++);
128 static int mcp23017_read(struct mcp23s08
*mcp
, unsigned reg
)
130 return i2c_smbus_read_word_data(mcp
->data
, reg
<< 1);
133 static int mcp23017_write(struct mcp23s08
*mcp
, unsigned reg
, unsigned val
)
135 return i2c_smbus_write_word_data(mcp
->data
, reg
<< 1, val
);
139 mcp23017_read_regs(struct mcp23s08
*mcp
, unsigned reg
, u16
*vals
, unsigned n
)
142 int ret
= mcp23017_read(mcp
, reg
++);
151 static const struct mcp23s08_ops mcp23008_ops
= {
152 .read
= mcp23008_read
,
153 .write
= mcp23008_write
,
154 .read_regs
= mcp23008_read_regs
,
157 static const struct mcp23s08_ops mcp23017_ops
= {
158 .read
= mcp23017_read
,
159 .write
= mcp23017_write
,
160 .read_regs
= mcp23017_read_regs
,
163 #endif /* CONFIG_I2C */
165 /*----------------------------------------------------------------------*/
167 #ifdef CONFIG_SPI_MASTER
169 static int mcp23s08_read(struct mcp23s08
*mcp
, unsigned reg
)
174 tx
[0] = mcp
->addr
| 0x01;
176 status
= spi_write_then_read(mcp
->data
, tx
, sizeof(tx
), rx
, sizeof(rx
));
177 return (status
< 0) ? status
: rx
[0];
180 static int mcp23s08_write(struct mcp23s08
*mcp
, unsigned reg
, unsigned val
)
187 return spi_write_then_read(mcp
->data
, tx
, sizeof(tx
), NULL
, 0);
191 mcp23s08_read_regs(struct mcp23s08
*mcp
, unsigned reg
, u16
*vals
, unsigned n
)
196 if ((n
+ reg
) > sizeof(mcp
->cache
))
198 tx
[0] = mcp
->addr
| 0x01;
202 status
= spi_write_then_read(mcp
->data
, tx
, sizeof(tx
), tmp
, n
);
205 vals
[n
] = tmp
[n
]; /* expand to 16bit */
210 static int mcp23s17_read(struct mcp23s08
*mcp
, unsigned reg
)
215 tx
[0] = mcp
->addr
| 0x01;
217 status
= spi_write_then_read(mcp
->data
, tx
, sizeof(tx
), rx
, sizeof(rx
));
218 return (status
< 0) ? status
: (rx
[0] | (rx
[1] << 8));
221 static int mcp23s17_write(struct mcp23s08
*mcp
, unsigned reg
, unsigned val
)
229 return spi_write_then_read(mcp
->data
, tx
, sizeof(tx
), NULL
, 0);
233 mcp23s17_read_regs(struct mcp23s08
*mcp
, unsigned reg
, u16
*vals
, unsigned n
)
238 if ((n
+ reg
) > sizeof(mcp
->cache
))
240 tx
[0] = mcp
->addr
| 0x01;
243 status
= spi_write_then_read(mcp
->data
, tx
, sizeof(tx
),
247 vals
[n
] = __le16_to_cpu((__le16
)vals
[n
]);
253 static const struct mcp23s08_ops mcp23s08_ops
= {
254 .read
= mcp23s08_read
,
255 .write
= mcp23s08_write
,
256 .read_regs
= mcp23s08_read_regs
,
259 static const struct mcp23s08_ops mcp23s17_ops
= {
260 .read
= mcp23s17_read
,
261 .write
= mcp23s17_write
,
262 .read_regs
= mcp23s17_read_regs
,
265 #endif /* CONFIG_SPI_MASTER */
267 /*----------------------------------------------------------------------*/
269 static int mcp23s08_direction_input(struct gpio_chip
*chip
, unsigned offset
)
271 struct mcp23s08
*mcp
= container_of(chip
, struct mcp23s08
, chip
);
274 mutex_lock(&mcp
->lock
);
275 mcp
->cache
[MCP_IODIR
] |= (1 << offset
);
276 status
= mcp
->ops
->write(mcp
, MCP_IODIR
, mcp
->cache
[MCP_IODIR
]);
277 mutex_unlock(&mcp
->lock
);
281 static int mcp23s08_get(struct gpio_chip
*chip
, unsigned offset
)
283 struct mcp23s08
*mcp
= container_of(chip
, struct mcp23s08
, chip
);
286 mutex_lock(&mcp
->lock
);
288 /* REVISIT reading this clears any IRQ ... */
289 status
= mcp
->ops
->read(mcp
, MCP_GPIO
);
293 mcp
->cache
[MCP_GPIO
] = status
;
294 status
= !!(status
& (1 << offset
));
296 mutex_unlock(&mcp
->lock
);
300 static int __mcp23s08_set(struct mcp23s08
*mcp
, unsigned mask
, int value
)
302 unsigned olat
= mcp
->cache
[MCP_OLAT
];
308 mcp
->cache
[MCP_OLAT
] = olat
;
309 return mcp
->ops
->write(mcp
, MCP_OLAT
, olat
);
312 static void mcp23s08_set(struct gpio_chip
*chip
, unsigned offset
, int value
)
314 struct mcp23s08
*mcp
= container_of(chip
, struct mcp23s08
, chip
);
315 unsigned mask
= 1 << offset
;
317 mutex_lock(&mcp
->lock
);
318 __mcp23s08_set(mcp
, mask
, value
);
319 mutex_unlock(&mcp
->lock
);
323 mcp23s08_direction_output(struct gpio_chip
*chip
, unsigned offset
, int value
)
325 struct mcp23s08
*mcp
= container_of(chip
, struct mcp23s08
, chip
);
326 unsigned mask
= 1 << offset
;
329 mutex_lock(&mcp
->lock
);
330 status
= __mcp23s08_set(mcp
, mask
, value
);
332 mcp
->cache
[MCP_IODIR
] &= ~mask
;
333 status
= mcp
->ops
->write(mcp
, MCP_IODIR
, mcp
->cache
[MCP_IODIR
]);
335 mutex_unlock(&mcp
->lock
);
339 /*----------------------------------------------------------------------*/
340 static irqreturn_t
mcp23s08_irq(int irq
, void *data
)
342 struct mcp23s08
*mcp
= data
;
344 unsigned int child_irq
;
346 mutex_lock(&mcp
->lock
);
347 intf
= mcp
->ops
->read(mcp
, MCP_INTF
);
349 mutex_unlock(&mcp
->lock
);
353 mcp
->cache
[MCP_INTF
] = intf
;
355 intcap
= mcp
->ops
->read(mcp
, MCP_INTCAP
);
357 mutex_unlock(&mcp
->lock
);
361 mcp
->cache
[MCP_INTCAP
] = intcap
;
362 mutex_unlock(&mcp
->lock
);
365 for (i
= 0; i
< mcp
->chip
.ngpio
; i
++) {
366 if ((BIT(i
) & mcp
->cache
[MCP_INTF
]) &&
367 ((BIT(i
) & intcap
& mcp
->irq_rise
) ||
368 (mcp
->irq_fall
& ~intcap
& BIT(i
)))) {
369 child_irq
= irq_find_mapping(mcp
->irq_domain
, i
);
370 handle_nested_irq(child_irq
);
377 static int mcp23s08_gpio_to_irq(struct gpio_chip
*chip
, unsigned offset
)
379 struct mcp23s08
*mcp
= container_of(chip
, struct mcp23s08
, chip
);
381 return irq_find_mapping(mcp
->irq_domain
, offset
);
384 static void mcp23s08_irq_mask(struct irq_data
*data
)
386 struct mcp23s08
*mcp
= irq_data_get_irq_chip_data(data
);
387 unsigned int pos
= data
->hwirq
;
389 mcp
->cache
[MCP_GPINTEN
] &= ~BIT(pos
);
392 static void mcp23s08_irq_unmask(struct irq_data
*data
)
394 struct mcp23s08
*mcp
= irq_data_get_irq_chip_data(data
);
395 unsigned int pos
= data
->hwirq
;
397 mcp
->cache
[MCP_GPINTEN
] |= BIT(pos
);
400 static int mcp23s08_irq_set_type(struct irq_data
*data
, unsigned int type
)
402 struct mcp23s08
*mcp
= irq_data_get_irq_chip_data(data
);
403 unsigned int pos
= data
->hwirq
;
406 if ((type
& IRQ_TYPE_EDGE_BOTH
) == IRQ_TYPE_EDGE_BOTH
) {
407 mcp
->cache
[MCP_INTCON
] &= ~BIT(pos
);
408 mcp
->irq_rise
|= BIT(pos
);
409 mcp
->irq_fall
|= BIT(pos
);
410 } else if (type
& IRQ_TYPE_EDGE_RISING
) {
411 mcp
->cache
[MCP_INTCON
] &= ~BIT(pos
);
412 mcp
->irq_rise
|= BIT(pos
);
413 mcp
->irq_fall
&= ~BIT(pos
);
414 } else if (type
& IRQ_TYPE_EDGE_FALLING
) {
415 mcp
->cache
[MCP_INTCON
] &= ~BIT(pos
);
416 mcp
->irq_rise
&= ~BIT(pos
);
417 mcp
->irq_fall
|= BIT(pos
);
424 static void mcp23s08_irq_bus_lock(struct irq_data
*data
)
426 struct mcp23s08
*mcp
= irq_data_get_irq_chip_data(data
);
428 mutex_lock(&mcp
->irq_lock
);
431 static void mcp23s08_irq_bus_unlock(struct irq_data
*data
)
433 struct mcp23s08
*mcp
= irq_data_get_irq_chip_data(data
);
435 mutex_lock(&mcp
->lock
);
436 mcp
->ops
->write(mcp
, MCP_GPINTEN
, mcp
->cache
[MCP_GPINTEN
]);
437 mcp
->ops
->write(mcp
, MCP_DEFVAL
, mcp
->cache
[MCP_DEFVAL
]);
438 mcp
->ops
->write(mcp
, MCP_INTCON
, mcp
->cache
[MCP_INTCON
]);
439 mutex_unlock(&mcp
->lock
);
440 mutex_unlock(&mcp
->irq_lock
);
443 static int mcp23s08_irq_reqres(struct irq_data
*data
)
445 struct mcp23s08
*mcp
= irq_data_get_irq_chip_data(data
);
447 if (gpio_lock_as_irq(&mcp
->chip
, data
->hwirq
)) {
448 dev_err(mcp
->chip
.dev
,
449 "unable to lock HW IRQ %lu for IRQ usage\n",
457 static void mcp23s08_irq_relres(struct irq_data
*data
)
459 struct mcp23s08
*mcp
= irq_data_get_irq_chip_data(data
);
461 gpio_unlock_as_irq(&mcp
->chip
, data
->hwirq
);
464 static struct irq_chip mcp23s08_irq_chip
= {
465 .name
= "gpio-mcp23xxx",
466 .irq_mask
= mcp23s08_irq_mask
,
467 .irq_unmask
= mcp23s08_irq_unmask
,
468 .irq_set_type
= mcp23s08_irq_set_type
,
469 .irq_bus_lock
= mcp23s08_irq_bus_lock
,
470 .irq_bus_sync_unlock
= mcp23s08_irq_bus_unlock
,
471 .irq_request_resources
= mcp23s08_irq_reqres
,
472 .irq_release_resources
= mcp23s08_irq_relres
,
475 static int mcp23s08_irq_setup(struct mcp23s08
*mcp
)
477 struct gpio_chip
*chip
= &mcp
->chip
;
480 mutex_init(&mcp
->irq_lock
);
482 mcp
->irq_domain
= irq_domain_add_linear(chip
->dev
->of_node
, chip
->ngpio
,
483 &irq_domain_simple_ops
, mcp
);
484 if (!mcp
->irq_domain
)
487 err
= devm_request_threaded_irq(chip
->dev
, mcp
->irq
, NULL
, mcp23s08_irq
,
488 IRQF_TRIGGER_LOW
| IRQF_ONESHOT
,
489 dev_name(chip
->dev
), mcp
);
491 dev_err(chip
->dev
, "unable to request IRQ#%d: %d\n",
496 chip
->to_irq
= mcp23s08_gpio_to_irq
;
498 for (j
= 0; j
< mcp
->chip
.ngpio
; j
++) {
499 irq
= irq_create_mapping(mcp
->irq_domain
, j
);
500 irq_set_lockdep_class(irq
, &gpio_lock_class
);
501 irq_set_chip_data(irq
, mcp
);
502 irq_set_chip(irq
, &mcp23s08_irq_chip
);
503 irq_set_nested_thread(irq
, true);
505 set_irq_flags(irq
, IRQF_VALID
);
507 irq_set_noprobe(irq
);
513 static void mcp23s08_irq_teardown(struct mcp23s08
*mcp
)
517 free_irq(mcp
->irq
, mcp
);
519 for (i
= 0; i
< mcp
->chip
.ngpio
; i
++) {
520 irq
= irq_find_mapping(mcp
->irq_domain
, i
);
522 irq_dispose_mapping(irq
);
525 irq_domain_remove(mcp
->irq_domain
);
528 /*----------------------------------------------------------------------*/
530 #ifdef CONFIG_DEBUG_FS
532 #include <linux/seq_file.h>
535 * This shows more info than the generic gpio dump code:
536 * pullups, deglitching, open drain drive.
538 static void mcp23s08_dbg_show(struct seq_file
*s
, struct gpio_chip
*chip
)
540 struct mcp23s08
*mcp
;
545 mcp
= container_of(chip
, struct mcp23s08
, chip
);
547 /* NOTE: we only handle one bank for now ... */
548 bank
= '0' + ((mcp
->addr
>> 1) & 0x7);
550 mutex_lock(&mcp
->lock
);
551 t
= mcp
->ops
->read_regs(mcp
, 0, mcp
->cache
, ARRAY_SIZE(mcp
->cache
));
553 seq_printf(s
, " I/O ERROR %d\n", t
);
557 for (t
= 0, mask
= 1; t
< chip
->ngpio
; t
++, mask
<<= 1) {
560 label
= gpiochip_is_requested(chip
, t
);
564 seq_printf(s
, " gpio-%-3d P%c.%d (%-12s) %s %s %s",
565 chip
->base
+ t
, bank
, t
, label
,
566 (mcp
->cache
[MCP_IODIR
] & mask
) ? "in " : "out",
567 (mcp
->cache
[MCP_GPIO
] & mask
) ? "hi" : "lo",
568 (mcp
->cache
[MCP_GPPU
] & mask
) ? "up" : " ");
569 /* NOTE: ignoring the irq-related registers */
573 mutex_unlock(&mcp
->lock
);
577 #define mcp23s08_dbg_show NULL
580 /*----------------------------------------------------------------------*/
582 static int mcp23s08_probe_one(struct mcp23s08
*mcp
, struct device
*dev
,
583 void *data
, unsigned addr
, unsigned type
,
584 struct mcp23s08_platform_data
*pdata
, int cs
)
589 mutex_init(&mcp
->lock
);
594 mcp
->chip
.direction_input
= mcp23s08_direction_input
;
595 mcp
->chip
.get
= mcp23s08_get
;
596 mcp
->chip
.direction_output
= mcp23s08_direction_output
;
597 mcp
->chip
.set
= mcp23s08_set
;
598 mcp
->chip
.dbg_show
= mcp23s08_dbg_show
;
600 mcp
->chip
.of_gpio_n_cells
= 2;
601 mcp
->chip
.of_node
= dev
->of_node
;
605 #ifdef CONFIG_SPI_MASTER
607 mcp
->ops
= &mcp23s08_ops
;
609 mcp
->chip
.label
= "mcp23s08";
613 mcp
->ops
= &mcp23s17_ops
;
614 mcp
->chip
.ngpio
= 16;
615 mcp
->chip
.label
= "mcp23s17";
617 #endif /* CONFIG_SPI_MASTER */
619 #if IS_ENABLED(CONFIG_I2C)
621 mcp
->ops
= &mcp23008_ops
;
623 mcp
->chip
.label
= "mcp23008";
627 mcp
->ops
= &mcp23017_ops
;
628 mcp
->chip
.ngpio
= 16;
629 mcp
->chip
.label
= "mcp23017";
631 #endif /* CONFIG_I2C */
634 dev_err(dev
, "invalid device type (%d)\n", type
);
638 mcp
->chip
.base
= pdata
->base
;
639 mcp
->chip
.can_sleep
= true;
641 mcp
->chip
.owner
= THIS_MODULE
;
643 /* verify MCP_IOCON.SEQOP = 0, so sequential reads work,
644 * and MCP_IOCON.HAEN = 1, so we work with all chips.
647 status
= mcp
->ops
->read(mcp
, MCP_IOCON
);
651 mcp
->irq_controller
= pdata
->irq_controller
;
652 if (mcp
->irq
&& mcp
->irq_controller
&& (type
== MCP_TYPE_017
))
653 mirror
= pdata
->mirror
;
655 if ((status
& IOCON_SEQOP
) || !(status
& IOCON_HAEN
) || mirror
) {
656 /* mcp23s17 has IOCON twice, make sure they are in sync */
657 status
&= ~(IOCON_SEQOP
| (IOCON_SEQOP
<< 8));
658 status
|= IOCON_HAEN
| (IOCON_HAEN
<< 8);
659 status
&= ~(IOCON_INTPOL
| (IOCON_INTPOL
<< 8));
661 status
|= IOCON_MIRROR
| (IOCON_MIRROR
<< 8);
663 status
= mcp
->ops
->write(mcp
, MCP_IOCON
, status
);
668 /* configure ~100K pullups */
669 status
= mcp
->ops
->write(mcp
, MCP_GPPU
, pdata
->chip
[cs
].pullups
);
673 status
= mcp
->ops
->read_regs(mcp
, 0, mcp
->cache
, ARRAY_SIZE(mcp
->cache
));
677 /* disable inverter on input */
678 if (mcp
->cache
[MCP_IPOL
] != 0) {
679 mcp
->cache
[MCP_IPOL
] = 0;
680 status
= mcp
->ops
->write(mcp
, MCP_IPOL
, 0);
686 if (mcp
->cache
[MCP_GPINTEN
] != 0) {
687 mcp
->cache
[MCP_GPINTEN
] = 0;
688 status
= mcp
->ops
->write(mcp
, MCP_GPINTEN
, 0);
693 status
= gpiochip_add(&mcp
->chip
);
697 if (mcp
->irq
&& mcp
->irq_controller
) {
698 status
= mcp23s08_irq_setup(mcp
);
700 mcp23s08_irq_teardown(mcp
);
706 dev_dbg(dev
, "can't setup chip %d, --> %d\n",
711 /*----------------------------------------------------------------------*/
714 #ifdef CONFIG_SPI_MASTER
715 static const struct of_device_id mcp23s08_spi_of_match
[] = {
717 .compatible
= "microchip,mcp23s08",
718 .data
= (void *) MCP_TYPE_S08
,
721 .compatible
= "microchip,mcp23s17",
722 .data
= (void *) MCP_TYPE_S17
,
724 /* NOTE: The use of the mcp prefix is deprecated and will be removed. */
726 .compatible
= "mcp,mcp23s08",
727 .data
= (void *) MCP_TYPE_S08
,
730 .compatible
= "mcp,mcp23s17",
731 .data
= (void *) MCP_TYPE_S17
,
735 MODULE_DEVICE_TABLE(of
, mcp23s08_spi_of_match
);
738 #if IS_ENABLED(CONFIG_I2C)
739 static const struct of_device_id mcp23s08_i2c_of_match
[] = {
741 .compatible
= "microchip,mcp23008",
742 .data
= (void *) MCP_TYPE_008
,
745 .compatible
= "microchip,mcp23017",
746 .data
= (void *) MCP_TYPE_017
,
748 /* NOTE: The use of the mcp prefix is deprecated and will be removed. */
750 .compatible
= "mcp,mcp23008",
751 .data
= (void *) MCP_TYPE_008
,
754 .compatible
= "mcp,mcp23017",
755 .data
= (void *) MCP_TYPE_017
,
759 MODULE_DEVICE_TABLE(of
, mcp23s08_i2c_of_match
);
761 #endif /* CONFIG_OF */
764 #if IS_ENABLED(CONFIG_I2C)
766 static int mcp230xx_probe(struct i2c_client
*client
,
767 const struct i2c_device_id
*id
)
769 struct mcp23s08_platform_data
*pdata
, local_pdata
;
770 struct mcp23s08
*mcp
;
772 const struct of_device_id
*match
;
774 match
= of_match_device(of_match_ptr(mcp23s08_i2c_of_match
),
777 pdata
= &local_pdata
;
779 pdata
->chip
[0].pullups
= 0;
780 pdata
->irq_controller
= of_property_read_bool(
782 "interrupt-controller");
783 pdata
->mirror
= of_property_read_bool(client
->dev
.of_node
,
784 "microchip,irq-mirror");
785 client
->irq
= irq_of_parse_and_map(client
->dev
.of_node
, 0);
787 pdata
= dev_get_platdata(&client
->dev
);
789 pdata
= devm_kzalloc(&client
->dev
,
790 sizeof(struct mcp23s08_platform_data
),
796 mcp
= kzalloc(sizeof(*mcp
), GFP_KERNEL
);
800 mcp
->irq
= client
->irq
;
801 status
= mcp23s08_probe_one(mcp
, &client
->dev
, client
, client
->addr
,
802 id
->driver_data
, pdata
, 0);
806 i2c_set_clientdata(client
, mcp
);
816 static int mcp230xx_remove(struct i2c_client
*client
)
818 struct mcp23s08
*mcp
= i2c_get_clientdata(client
);
820 if (client
->irq
&& mcp
->irq_controller
)
821 mcp23s08_irq_teardown(mcp
);
823 gpiochip_remove(&mcp
->chip
);
829 static const struct i2c_device_id mcp230xx_id
[] = {
830 { "mcp23008", MCP_TYPE_008
},
831 { "mcp23017", MCP_TYPE_017
},
834 MODULE_DEVICE_TABLE(i2c
, mcp230xx_id
);
836 static struct i2c_driver mcp230xx_driver
= {
839 .owner
= THIS_MODULE
,
840 .of_match_table
= of_match_ptr(mcp23s08_i2c_of_match
),
842 .probe
= mcp230xx_probe
,
843 .remove
= mcp230xx_remove
,
844 .id_table
= mcp230xx_id
,
847 static int __init
mcp23s08_i2c_init(void)
849 return i2c_add_driver(&mcp230xx_driver
);
852 static void mcp23s08_i2c_exit(void)
854 i2c_del_driver(&mcp230xx_driver
);
859 static int __init
mcp23s08_i2c_init(void) { return 0; }
860 static void mcp23s08_i2c_exit(void) { }
862 #endif /* CONFIG_I2C */
864 /*----------------------------------------------------------------------*/
866 #ifdef CONFIG_SPI_MASTER
868 static int mcp23s08_probe(struct spi_device
*spi
)
870 struct mcp23s08_platform_data
*pdata
, local_pdata
;
873 struct mcp23s08_driver_data
*data
;
876 const struct of_device_id
*match
;
877 u32 spi_present_mask
= 0;
879 match
= of_match_device(of_match_ptr(mcp23s08_spi_of_match
), &spi
->dev
);
881 type
= (int)(uintptr_t)match
->data
;
882 status
= of_property_read_u32(spi
->dev
.of_node
,
883 "microchip,spi-present-mask", &spi_present_mask
);
885 status
= of_property_read_u32(spi
->dev
.of_node
,
886 "mcp,spi-present-mask", &spi_present_mask
);
889 "DT has no spi-present-mask\n");
893 if ((spi_present_mask
<= 0) || (spi_present_mask
>= 256)) {
894 dev_err(&spi
->dev
, "invalid spi-present-mask\n");
898 pdata
= &local_pdata
;
900 for (addr
= 0; addr
< ARRAY_SIZE(pdata
->chip
); addr
++) {
901 pdata
->chip
[addr
].pullups
= 0;
902 if (spi_present_mask
& (1 << addr
))
905 pdata
->irq_controller
= of_property_read_bool(
907 "interrupt-controller");
908 pdata
->mirror
= of_property_read_bool(spi
->dev
.of_node
,
909 "microchip,irq-mirror");
911 type
= spi_get_device_id(spi
)->driver_data
;
912 pdata
= dev_get_platdata(&spi
->dev
);
914 pdata
= devm_kzalloc(&spi
->dev
,
915 sizeof(struct mcp23s08_platform_data
),
920 for (addr
= 0; addr
< ARRAY_SIZE(pdata
->chip
); addr
++) {
921 if (!pdata
->chip
[addr
].is_present
)
924 if ((type
== MCP_TYPE_S08
) && (addr
> 3)) {
926 "mcp23s08 only supports address 0..3\n");
929 spi_present_mask
|= 1 << addr
;
936 data
= kzalloc(sizeof(*data
) + chips
* sizeof(struct mcp23s08
),
940 spi_set_drvdata(spi
, data
);
942 for (addr
= 0; addr
< ARRAY_SIZE(pdata
->chip
); addr
++) {
943 if (!(spi_present_mask
& (1 << addr
)))
946 data
->mcp
[addr
] = &data
->chip
[chips
];
947 status
= mcp23s08_probe_one(data
->mcp
[addr
], &spi
->dev
, spi
,
948 0x40 | (addr
<< 1), type
, pdata
,
953 if (pdata
->base
!= -1)
954 pdata
->base
+= (type
== MCP_TYPE_S17
) ? 16 : 8;
955 ngpio
+= (type
== MCP_TYPE_S17
) ? 16 : 8;
959 /* NOTE: these chips have a relatively sane IRQ framework, with
960 * per-signal masking and level/edge triggering. It's not yet
967 for (addr
= 0; addr
< ARRAY_SIZE(data
->mcp
); addr
++) {
969 if (!data
->mcp
[addr
])
971 gpiochip_remove(&data
->mcp
[addr
]->chip
);
977 static int mcp23s08_remove(struct spi_device
*spi
)
979 struct mcp23s08_driver_data
*data
= spi_get_drvdata(spi
);
982 for (addr
= 0; addr
< ARRAY_SIZE(data
->mcp
); addr
++) {
984 if (!data
->mcp
[addr
])
987 gpiochip_remove(&data
->mcp
[addr
]->chip
);
993 static const struct spi_device_id mcp23s08_ids
[] = {
994 { "mcp23s08", MCP_TYPE_S08
},
995 { "mcp23s17", MCP_TYPE_S17
},
998 MODULE_DEVICE_TABLE(spi
, mcp23s08_ids
);
1000 static struct spi_driver mcp23s08_driver
= {
1001 .probe
= mcp23s08_probe
,
1002 .remove
= mcp23s08_remove
,
1003 .id_table
= mcp23s08_ids
,
1006 .owner
= THIS_MODULE
,
1007 .of_match_table
= of_match_ptr(mcp23s08_spi_of_match
),
1011 static int __init
mcp23s08_spi_init(void)
1013 return spi_register_driver(&mcp23s08_driver
);
1016 static void mcp23s08_spi_exit(void)
1018 spi_unregister_driver(&mcp23s08_driver
);
1023 static int __init
mcp23s08_spi_init(void) { return 0; }
1024 static void mcp23s08_spi_exit(void) { }
1026 #endif /* CONFIG_SPI_MASTER */
1028 /*----------------------------------------------------------------------*/
1030 static int __init
mcp23s08_init(void)
1034 ret
= mcp23s08_spi_init();
1038 ret
= mcp23s08_i2c_init();
1045 mcp23s08_spi_exit();
1049 /* register after spi/i2c postcore initcall and before
1050 * subsys initcalls that may rely on these GPIOs
1052 subsys_initcall(mcp23s08_init
);
1054 static void __exit
mcp23s08_exit(void)
1056 mcp23s08_spi_exit();
1057 mcp23s08_i2c_exit();
1059 module_exit(mcp23s08_exit
);
1061 MODULE_LICENSE("GPL");