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
34 #define MCP_TYPE_S18 4
36 /* Registers are all 8 bits wide.
38 * The mcp23s17 has twice as many bits, and can be configured to work
39 * with either 16 bit registers or with two adjacent 8 bit banks.
41 #define MCP_IODIR 0x00 /* init/reset: all ones */
43 #define MCP_GPINTEN 0x02
44 #define MCP_DEFVAL 0x03
45 #define MCP_INTCON 0x04
46 #define MCP_IOCON 0x05
47 # define IOCON_MIRROR (1 << 6)
48 # define IOCON_SEQOP (1 << 5)
49 # define IOCON_HAEN (1 << 3)
50 # define IOCON_ODR (1 << 2)
51 # define IOCON_INTPOL (1 << 1)
52 # define IOCON_INTCC (1)
55 #define MCP_INTCAP 0x08
62 int (*read
)(struct mcp23s08
*mcp
, unsigned reg
);
63 int (*write
)(struct mcp23s08
*mcp
, unsigned reg
, unsigned val
);
64 int (*read_regs
)(struct mcp23s08
*mcp
, unsigned reg
,
65 u16
*vals
, unsigned n
);
77 /* lock protects the cached values */
79 struct mutex irq_lock
;
81 struct gpio_chip chip
;
83 const struct mcp23s08_ops
*ops
;
84 void *data
; /* ops specific data */
87 /* A given spi_device can represent up to eight mcp23sxx chips
88 * sharing the same chipselect but using different addresses
89 * (e.g. chips #0 and #3 might be populated, but not #1 or $2).
90 * Driver data holds all the per-chip data.
92 struct mcp23s08_driver_data
{
94 struct mcp23s08
*mcp
[8];
95 struct mcp23s08 chip
[];
98 /*----------------------------------------------------------------------*/
100 #if IS_ENABLED(CONFIG_I2C)
102 static int mcp23008_read(struct mcp23s08
*mcp
, unsigned reg
)
104 return i2c_smbus_read_byte_data(mcp
->data
, reg
);
107 static int mcp23008_write(struct mcp23s08
*mcp
, unsigned reg
, unsigned val
)
109 return i2c_smbus_write_byte_data(mcp
->data
, reg
, val
);
113 mcp23008_read_regs(struct mcp23s08
*mcp
, unsigned reg
, u16
*vals
, unsigned n
)
116 int ret
= mcp23008_read(mcp
, reg
++);
125 static int mcp23017_read(struct mcp23s08
*mcp
, unsigned reg
)
127 return i2c_smbus_read_word_data(mcp
->data
, reg
<< 1);
130 static int mcp23017_write(struct mcp23s08
*mcp
, unsigned reg
, unsigned val
)
132 return i2c_smbus_write_word_data(mcp
->data
, reg
<< 1, val
);
136 mcp23017_read_regs(struct mcp23s08
*mcp
, unsigned reg
, u16
*vals
, unsigned n
)
139 int ret
= mcp23017_read(mcp
, reg
++);
148 static const struct mcp23s08_ops mcp23008_ops
= {
149 .read
= mcp23008_read
,
150 .write
= mcp23008_write
,
151 .read_regs
= mcp23008_read_regs
,
154 static const struct mcp23s08_ops mcp23017_ops
= {
155 .read
= mcp23017_read
,
156 .write
= mcp23017_write
,
157 .read_regs
= mcp23017_read_regs
,
160 #endif /* CONFIG_I2C */
162 /*----------------------------------------------------------------------*/
164 #ifdef CONFIG_SPI_MASTER
166 static int mcp23s08_read(struct mcp23s08
*mcp
, unsigned reg
)
171 tx
[0] = mcp
->addr
| 0x01;
173 status
= spi_write_then_read(mcp
->data
, tx
, sizeof(tx
), rx
, sizeof(rx
));
174 return (status
< 0) ? status
: rx
[0];
177 static int mcp23s08_write(struct mcp23s08
*mcp
, unsigned reg
, unsigned val
)
184 return spi_write_then_read(mcp
->data
, tx
, sizeof(tx
), NULL
, 0);
188 mcp23s08_read_regs(struct mcp23s08
*mcp
, unsigned reg
, u16
*vals
, unsigned n
)
193 if ((n
+ reg
) > sizeof(mcp
->cache
))
195 tx
[0] = mcp
->addr
| 0x01;
199 status
= spi_write_then_read(mcp
->data
, tx
, sizeof(tx
), tmp
, n
);
202 vals
[n
] = tmp
[n
]; /* expand to 16bit */
207 static int mcp23s17_read(struct mcp23s08
*mcp
, unsigned reg
)
212 tx
[0] = mcp
->addr
| 0x01;
214 status
= spi_write_then_read(mcp
->data
, tx
, sizeof(tx
), rx
, sizeof(rx
));
215 return (status
< 0) ? status
: (rx
[0] | (rx
[1] << 8));
218 static int mcp23s17_write(struct mcp23s08
*mcp
, unsigned reg
, unsigned val
)
226 return spi_write_then_read(mcp
->data
, tx
, sizeof(tx
), NULL
, 0);
230 mcp23s17_read_regs(struct mcp23s08
*mcp
, unsigned reg
, u16
*vals
, unsigned n
)
235 if ((n
+ reg
) > sizeof(mcp
->cache
))
237 tx
[0] = mcp
->addr
| 0x01;
240 status
= spi_write_then_read(mcp
->data
, tx
, sizeof(tx
),
244 vals
[n
] = __le16_to_cpu((__le16
)vals
[n
]);
250 static const struct mcp23s08_ops mcp23s08_ops
= {
251 .read
= mcp23s08_read
,
252 .write
= mcp23s08_write
,
253 .read_regs
= mcp23s08_read_regs
,
256 static const struct mcp23s08_ops mcp23s17_ops
= {
257 .read
= mcp23s17_read
,
258 .write
= mcp23s17_write
,
259 .read_regs
= mcp23s17_read_regs
,
262 #endif /* CONFIG_SPI_MASTER */
264 /*----------------------------------------------------------------------*/
266 static int mcp23s08_direction_input(struct gpio_chip
*chip
, unsigned offset
)
268 struct mcp23s08
*mcp
= gpiochip_get_data(chip
);
271 mutex_lock(&mcp
->lock
);
272 mcp
->cache
[MCP_IODIR
] |= (1 << offset
);
273 status
= mcp
->ops
->write(mcp
, MCP_IODIR
, mcp
->cache
[MCP_IODIR
]);
274 mutex_unlock(&mcp
->lock
);
278 static int mcp23s08_get(struct gpio_chip
*chip
, unsigned offset
)
280 struct mcp23s08
*mcp
= gpiochip_get_data(chip
);
283 mutex_lock(&mcp
->lock
);
285 /* REVISIT reading this clears any IRQ ... */
286 status
= mcp
->ops
->read(mcp
, MCP_GPIO
);
290 mcp
->cache
[MCP_GPIO
] = status
;
291 status
= !!(status
& (1 << offset
));
293 mutex_unlock(&mcp
->lock
);
297 static int __mcp23s08_set(struct mcp23s08
*mcp
, unsigned mask
, int value
)
299 unsigned olat
= mcp
->cache
[MCP_OLAT
];
305 mcp
->cache
[MCP_OLAT
] = olat
;
306 return mcp
->ops
->write(mcp
, MCP_OLAT
, olat
);
309 static void mcp23s08_set(struct gpio_chip
*chip
, unsigned offset
, int value
)
311 struct mcp23s08
*mcp
= gpiochip_get_data(chip
);
312 unsigned mask
= 1 << offset
;
314 mutex_lock(&mcp
->lock
);
315 __mcp23s08_set(mcp
, mask
, value
);
316 mutex_unlock(&mcp
->lock
);
320 mcp23s08_direction_output(struct gpio_chip
*chip
, unsigned offset
, int value
)
322 struct mcp23s08
*mcp
= gpiochip_get_data(chip
);
323 unsigned mask
= 1 << offset
;
326 mutex_lock(&mcp
->lock
);
327 status
= __mcp23s08_set(mcp
, mask
, value
);
329 mcp
->cache
[MCP_IODIR
] &= ~mask
;
330 status
= mcp
->ops
->write(mcp
, MCP_IODIR
, mcp
->cache
[MCP_IODIR
]);
332 mutex_unlock(&mcp
->lock
);
336 /*----------------------------------------------------------------------*/
337 static irqreturn_t
mcp23s08_irq(int irq
, void *data
)
339 struct mcp23s08
*mcp
= data
;
341 unsigned int child_irq
;
343 mutex_lock(&mcp
->lock
);
344 intf
= mcp
->ops
->read(mcp
, MCP_INTF
);
346 mutex_unlock(&mcp
->lock
);
350 mcp
->cache
[MCP_INTF
] = intf
;
352 intcap
= mcp
->ops
->read(mcp
, MCP_INTCAP
);
354 mutex_unlock(&mcp
->lock
);
358 mcp
->cache
[MCP_INTCAP
] = intcap
;
359 mutex_unlock(&mcp
->lock
);
362 for (i
= 0; i
< mcp
->chip
.ngpio
; i
++) {
363 if ((BIT(i
) & mcp
->cache
[MCP_INTF
]) &&
364 ((BIT(i
) & intcap
& mcp
->irq_rise
) ||
365 (mcp
->irq_fall
& ~intcap
& BIT(i
)) ||
366 (BIT(i
) & mcp
->cache
[MCP_INTCON
]))) {
367 child_irq
= irq_find_mapping(mcp
->chip
.irqdomain
, i
);
368 handle_nested_irq(child_irq
);
375 static void mcp23s08_irq_mask(struct irq_data
*data
)
377 struct gpio_chip
*gc
= irq_data_get_irq_chip_data(data
);
378 struct mcp23s08
*mcp
= gpiochip_get_data(gc
);
379 unsigned int pos
= data
->hwirq
;
381 mcp
->cache
[MCP_GPINTEN
] &= ~BIT(pos
);
384 static void mcp23s08_irq_unmask(struct irq_data
*data
)
386 struct gpio_chip
*gc
= irq_data_get_irq_chip_data(data
);
387 struct mcp23s08
*mcp
= gpiochip_get_data(gc
);
388 unsigned int pos
= data
->hwirq
;
390 mcp
->cache
[MCP_GPINTEN
] |= BIT(pos
);
393 static int mcp23s08_irq_set_type(struct irq_data
*data
, unsigned int type
)
395 struct gpio_chip
*gc
= irq_data_get_irq_chip_data(data
);
396 struct mcp23s08
*mcp
= gpiochip_get_data(gc
);
397 unsigned int pos
= data
->hwirq
;
400 if ((type
& IRQ_TYPE_EDGE_BOTH
) == IRQ_TYPE_EDGE_BOTH
) {
401 mcp
->cache
[MCP_INTCON
] &= ~BIT(pos
);
402 mcp
->irq_rise
|= BIT(pos
);
403 mcp
->irq_fall
|= BIT(pos
);
404 } else if (type
& IRQ_TYPE_EDGE_RISING
) {
405 mcp
->cache
[MCP_INTCON
] &= ~BIT(pos
);
406 mcp
->irq_rise
|= BIT(pos
);
407 mcp
->irq_fall
&= ~BIT(pos
);
408 } else if (type
& IRQ_TYPE_EDGE_FALLING
) {
409 mcp
->cache
[MCP_INTCON
] &= ~BIT(pos
);
410 mcp
->irq_rise
&= ~BIT(pos
);
411 mcp
->irq_fall
|= BIT(pos
);
412 } else if (type
& IRQ_TYPE_LEVEL_HIGH
) {
413 mcp
->cache
[MCP_INTCON
] |= BIT(pos
);
414 mcp
->cache
[MCP_DEFVAL
] &= ~BIT(pos
);
415 } else if (type
& IRQ_TYPE_LEVEL_LOW
) {
416 mcp
->cache
[MCP_INTCON
] |= BIT(pos
);
417 mcp
->cache
[MCP_DEFVAL
] |= BIT(pos
);
424 static void mcp23s08_irq_bus_lock(struct irq_data
*data
)
426 struct gpio_chip
*gc
= irq_data_get_irq_chip_data(data
);
427 struct mcp23s08
*mcp
= gpiochip_get_data(gc
);
429 mutex_lock(&mcp
->irq_lock
);
432 static void mcp23s08_irq_bus_unlock(struct irq_data
*data
)
434 struct gpio_chip
*gc
= irq_data_get_irq_chip_data(data
);
435 struct mcp23s08
*mcp
= gpiochip_get_data(gc
);
437 mutex_lock(&mcp
->lock
);
438 mcp
->ops
->write(mcp
, MCP_GPINTEN
, mcp
->cache
[MCP_GPINTEN
]);
439 mcp
->ops
->write(mcp
, MCP_DEFVAL
, mcp
->cache
[MCP_DEFVAL
]);
440 mcp
->ops
->write(mcp
, MCP_INTCON
, mcp
->cache
[MCP_INTCON
]);
441 mutex_unlock(&mcp
->lock
);
442 mutex_unlock(&mcp
->irq_lock
);
445 static struct irq_chip mcp23s08_irq_chip
= {
446 .name
= "gpio-mcp23xxx",
447 .irq_mask
= mcp23s08_irq_mask
,
448 .irq_unmask
= mcp23s08_irq_unmask
,
449 .irq_set_type
= mcp23s08_irq_set_type
,
450 .irq_bus_lock
= mcp23s08_irq_bus_lock
,
451 .irq_bus_sync_unlock
= mcp23s08_irq_bus_unlock
,
454 static int mcp23s08_irq_setup(struct mcp23s08
*mcp
)
456 struct gpio_chip
*chip
= &mcp
->chip
;
458 unsigned long irqflags
= IRQF_ONESHOT
| IRQF_SHARED
;
460 mutex_init(&mcp
->irq_lock
);
462 if (mcp
->irq_active_high
)
463 irqflags
|= IRQF_TRIGGER_HIGH
;
465 irqflags
|= IRQF_TRIGGER_LOW
;
467 err
= devm_request_threaded_irq(chip
->parent
, mcp
->irq
, NULL
,
469 irqflags
, dev_name(chip
->parent
), mcp
);
471 dev_err(chip
->parent
, "unable to request IRQ#%d: %d\n",
476 err
= gpiochip_irqchip_add(chip
,
482 dev_err(chip
->parent
,
483 "could not connect irqchip to gpiochip: %d\n", err
);
487 gpiochip_set_chained_irqchip(chip
,
495 /*----------------------------------------------------------------------*/
497 #ifdef CONFIG_DEBUG_FS
499 #include <linux/seq_file.h>
502 * This shows more info than the generic gpio dump code:
503 * pullups, deglitching, open drain drive.
505 static void mcp23s08_dbg_show(struct seq_file
*s
, struct gpio_chip
*chip
)
507 struct mcp23s08
*mcp
;
512 mcp
= gpiochip_get_data(chip
);
514 /* NOTE: we only handle one bank for now ... */
515 bank
= '0' + ((mcp
->addr
>> 1) & 0x7);
517 mutex_lock(&mcp
->lock
);
518 t
= mcp
->ops
->read_regs(mcp
, 0, mcp
->cache
, ARRAY_SIZE(mcp
->cache
));
520 seq_printf(s
, " I/O ERROR %d\n", t
);
524 for (t
= 0, mask
= 1; t
< chip
->ngpio
; t
++, mask
<<= 1) {
527 label
= gpiochip_is_requested(chip
, t
);
531 seq_printf(s
, " gpio-%-3d P%c.%d (%-12s) %s %s %s",
532 chip
->base
+ t
, bank
, t
, label
,
533 (mcp
->cache
[MCP_IODIR
] & mask
) ? "in " : "out",
534 (mcp
->cache
[MCP_GPIO
] & mask
) ? "hi" : "lo",
535 (mcp
->cache
[MCP_GPPU
] & mask
) ? "up" : " ");
536 /* NOTE: ignoring the irq-related registers */
540 mutex_unlock(&mcp
->lock
);
544 #define mcp23s08_dbg_show NULL
547 /*----------------------------------------------------------------------*/
549 static int mcp23s08_probe_one(struct mcp23s08
*mcp
, struct device
*dev
,
550 void *data
, unsigned addr
, unsigned type
,
551 struct mcp23s08_platform_data
*pdata
, int cs
)
556 mutex_init(&mcp
->lock
);
560 mcp
->irq_active_high
= false;
562 mcp
->chip
.direction_input
= mcp23s08_direction_input
;
563 mcp
->chip
.get
= mcp23s08_get
;
564 mcp
->chip
.direction_output
= mcp23s08_direction_output
;
565 mcp
->chip
.set
= mcp23s08_set
;
566 mcp
->chip
.dbg_show
= mcp23s08_dbg_show
;
568 mcp
->chip
.of_gpio_n_cells
= 2;
569 mcp
->chip
.of_node
= dev
->of_node
;
573 #ifdef CONFIG_SPI_MASTER
575 mcp
->ops
= &mcp23s08_ops
;
577 mcp
->chip
.label
= "mcp23s08";
581 mcp
->ops
= &mcp23s17_ops
;
582 mcp
->chip
.ngpio
= 16;
583 mcp
->chip
.label
= "mcp23s17";
587 mcp
->ops
= &mcp23s17_ops
;
588 mcp
->chip
.ngpio
= 16;
589 mcp
->chip
.label
= "mcp23s18";
591 #endif /* CONFIG_SPI_MASTER */
593 #if IS_ENABLED(CONFIG_I2C)
595 mcp
->ops
= &mcp23008_ops
;
597 mcp
->chip
.label
= "mcp23008";
601 mcp
->ops
= &mcp23017_ops
;
602 mcp
->chip
.ngpio
= 16;
603 mcp
->chip
.label
= "mcp23017";
605 #endif /* CONFIG_I2C */
608 dev_err(dev
, "invalid device type (%d)\n", type
);
612 mcp
->chip
.base
= pdata
->base
;
613 mcp
->chip
.can_sleep
= true;
614 mcp
->chip
.parent
= dev
;
615 mcp
->chip
.owner
= THIS_MODULE
;
617 /* verify MCP_IOCON.SEQOP = 0, so sequential reads work,
618 * and MCP_IOCON.HAEN = 1, so we work with all chips.
621 status
= mcp
->ops
->read(mcp
, MCP_IOCON
);
625 mcp
->irq_controller
= pdata
->irq_controller
;
626 if (mcp
->irq
&& mcp
->irq_controller
) {
627 mcp
->irq_active_high
=
628 of_property_read_bool(mcp
->chip
.parent
->of_node
,
629 "microchip,irq-active-high");
631 mirror
= pdata
->mirror
;
634 if ((status
& IOCON_SEQOP
) || !(status
& IOCON_HAEN
) || mirror
||
635 mcp
->irq_active_high
) {
636 /* mcp23s17 has IOCON twice, make sure they are in sync */
637 status
&= ~(IOCON_SEQOP
| (IOCON_SEQOP
<< 8));
638 status
|= IOCON_HAEN
| (IOCON_HAEN
<< 8);
639 if (mcp
->irq_active_high
)
640 status
|= IOCON_INTPOL
| (IOCON_INTPOL
<< 8);
642 status
&= ~(IOCON_INTPOL
| (IOCON_INTPOL
<< 8));
645 status
|= IOCON_MIRROR
| (IOCON_MIRROR
<< 8);
647 if (type
== MCP_TYPE_S18
)
648 status
|= IOCON_INTCC
| (IOCON_INTCC
<< 8);
650 status
= mcp
->ops
->write(mcp
, MCP_IOCON
, status
);
655 /* configure ~100K pullups */
656 status
= mcp
->ops
->write(mcp
, MCP_GPPU
, pdata
->chip
[cs
].pullups
);
660 status
= mcp
->ops
->read_regs(mcp
, 0, mcp
->cache
, ARRAY_SIZE(mcp
->cache
));
664 /* disable inverter on input */
665 if (mcp
->cache
[MCP_IPOL
] != 0) {
666 mcp
->cache
[MCP_IPOL
] = 0;
667 status
= mcp
->ops
->write(mcp
, MCP_IPOL
, 0);
673 if (mcp
->cache
[MCP_GPINTEN
] != 0) {
674 mcp
->cache
[MCP_GPINTEN
] = 0;
675 status
= mcp
->ops
->write(mcp
, MCP_GPINTEN
, 0);
680 status
= gpiochip_add_data(&mcp
->chip
, mcp
);
684 if (mcp
->irq
&& mcp
->irq_controller
) {
685 status
= mcp23s08_irq_setup(mcp
);
692 dev_dbg(dev
, "can't setup chip %d, --> %d\n",
697 /*----------------------------------------------------------------------*/
700 #ifdef CONFIG_SPI_MASTER
701 static const struct of_device_id mcp23s08_spi_of_match
[] = {
703 .compatible
= "microchip,mcp23s08",
704 .data
= (void *) MCP_TYPE_S08
,
707 .compatible
= "microchip,mcp23s17",
708 .data
= (void *) MCP_TYPE_S17
,
711 .compatible
= "microchip,mcp23s18",
712 .data
= (void *) MCP_TYPE_S18
,
714 /* NOTE: The use of the mcp prefix is deprecated and will be removed. */
716 .compatible
= "mcp,mcp23s08",
717 .data
= (void *) MCP_TYPE_S08
,
720 .compatible
= "mcp,mcp23s17",
721 .data
= (void *) MCP_TYPE_S17
,
725 MODULE_DEVICE_TABLE(of
, mcp23s08_spi_of_match
);
728 #if IS_ENABLED(CONFIG_I2C)
729 static const struct of_device_id mcp23s08_i2c_of_match
[] = {
731 .compatible
= "microchip,mcp23008",
732 .data
= (void *) MCP_TYPE_008
,
735 .compatible
= "microchip,mcp23017",
736 .data
= (void *) MCP_TYPE_017
,
738 /* NOTE: The use of the mcp prefix is deprecated and will be removed. */
740 .compatible
= "mcp,mcp23008",
741 .data
= (void *) MCP_TYPE_008
,
744 .compatible
= "mcp,mcp23017",
745 .data
= (void *) MCP_TYPE_017
,
749 MODULE_DEVICE_TABLE(of
, mcp23s08_i2c_of_match
);
751 #endif /* CONFIG_OF */
754 #if IS_ENABLED(CONFIG_I2C)
756 static int mcp230xx_probe(struct i2c_client
*client
,
757 const struct i2c_device_id
*id
)
759 struct mcp23s08_platform_data
*pdata
, local_pdata
;
760 struct mcp23s08
*mcp
;
762 const struct of_device_id
*match
;
764 match
= of_match_device(of_match_ptr(mcp23s08_i2c_of_match
),
767 pdata
= &local_pdata
;
769 pdata
->chip
[0].pullups
= 0;
770 pdata
->irq_controller
= of_property_read_bool(
772 "interrupt-controller");
773 pdata
->mirror
= of_property_read_bool(client
->dev
.of_node
,
774 "microchip,irq-mirror");
775 client
->irq
= irq_of_parse_and_map(client
->dev
.of_node
, 0);
777 pdata
= dev_get_platdata(&client
->dev
);
779 pdata
= devm_kzalloc(&client
->dev
,
780 sizeof(struct mcp23s08_platform_data
),
788 mcp
= kzalloc(sizeof(*mcp
), GFP_KERNEL
);
792 mcp
->irq
= client
->irq
;
793 status
= mcp23s08_probe_one(mcp
, &client
->dev
, client
, client
->addr
,
794 id
->driver_data
, pdata
, 0);
798 i2c_set_clientdata(client
, mcp
);
808 static int mcp230xx_remove(struct i2c_client
*client
)
810 struct mcp23s08
*mcp
= i2c_get_clientdata(client
);
812 gpiochip_remove(&mcp
->chip
);
818 static const struct i2c_device_id mcp230xx_id
[] = {
819 { "mcp23008", MCP_TYPE_008
},
820 { "mcp23017", MCP_TYPE_017
},
823 MODULE_DEVICE_TABLE(i2c
, mcp230xx_id
);
825 static struct i2c_driver mcp230xx_driver
= {
828 .of_match_table
= of_match_ptr(mcp23s08_i2c_of_match
),
830 .probe
= mcp230xx_probe
,
831 .remove
= mcp230xx_remove
,
832 .id_table
= mcp230xx_id
,
835 static int __init
mcp23s08_i2c_init(void)
837 return i2c_add_driver(&mcp230xx_driver
);
840 static void mcp23s08_i2c_exit(void)
842 i2c_del_driver(&mcp230xx_driver
);
847 static int __init
mcp23s08_i2c_init(void) { return 0; }
848 static void mcp23s08_i2c_exit(void) { }
850 #endif /* CONFIG_I2C */
852 /*----------------------------------------------------------------------*/
854 #ifdef CONFIG_SPI_MASTER
856 static int mcp23s08_probe(struct spi_device
*spi
)
858 struct mcp23s08_platform_data
*pdata
, local_pdata
;
861 struct mcp23s08_driver_data
*data
;
864 const struct of_device_id
*match
;
865 u32 spi_present_mask
= 0;
867 match
= of_match_device(of_match_ptr(mcp23s08_spi_of_match
), &spi
->dev
);
869 type
= (int)(uintptr_t)match
->data
;
870 status
= of_property_read_u32(spi
->dev
.of_node
,
871 "microchip,spi-present-mask", &spi_present_mask
);
873 status
= of_property_read_u32(spi
->dev
.of_node
,
874 "mcp,spi-present-mask", &spi_present_mask
);
877 "DT has no spi-present-mask\n");
881 if ((spi_present_mask
<= 0) || (spi_present_mask
>= 256)) {
882 dev_err(&spi
->dev
, "invalid spi-present-mask\n");
886 pdata
= &local_pdata
;
888 for (addr
= 0; addr
< ARRAY_SIZE(pdata
->chip
); addr
++) {
889 pdata
->chip
[addr
].pullups
= 0;
890 if (spi_present_mask
& (1 << addr
))
893 pdata
->irq_controller
= of_property_read_bool(
895 "interrupt-controller");
896 pdata
->mirror
= of_property_read_bool(spi
->dev
.of_node
,
897 "microchip,irq-mirror");
899 type
= spi_get_device_id(spi
)->driver_data
;
900 pdata
= dev_get_platdata(&spi
->dev
);
902 pdata
= devm_kzalloc(&spi
->dev
,
903 sizeof(struct mcp23s08_platform_data
),
908 for (addr
= 0; addr
< ARRAY_SIZE(pdata
->chip
); addr
++) {
909 if (!pdata
->chip
[addr
].is_present
)
912 if ((type
== MCP_TYPE_S08
) && (addr
> 3)) {
914 "mcp23s08 only supports address 0..3\n");
917 spi_present_mask
|= 1 << addr
;
924 data
= devm_kzalloc(&spi
->dev
,
925 sizeof(*data
) + chips
* sizeof(struct mcp23s08
),
930 spi_set_drvdata(spi
, data
);
932 spi
->irq
= irq_of_parse_and_map(spi
->dev
.of_node
, 0);
934 for (addr
= 0; addr
< ARRAY_SIZE(pdata
->chip
); addr
++) {
935 if (!(spi_present_mask
& (1 << addr
)))
938 data
->mcp
[addr
] = &data
->chip
[chips
];
939 data
->mcp
[addr
]->irq
= spi
->irq
;
940 status
= mcp23s08_probe_one(data
->mcp
[addr
], &spi
->dev
, spi
,
941 0x40 | (addr
<< 1), type
, pdata
,
946 if (pdata
->base
!= -1)
947 pdata
->base
+= data
->mcp
[addr
]->chip
.ngpio
;
948 ngpio
+= data
->mcp
[addr
]->chip
.ngpio
;
952 /* NOTE: these chips have a relatively sane IRQ framework, with
953 * per-signal masking and level/edge triggering. It's not yet
960 for (addr
= 0; addr
< ARRAY_SIZE(data
->mcp
); addr
++) {
962 if (!data
->mcp
[addr
])
964 gpiochip_remove(&data
->mcp
[addr
]->chip
);
969 static int mcp23s08_remove(struct spi_device
*spi
)
971 struct mcp23s08_driver_data
*data
= spi_get_drvdata(spi
);
974 for (addr
= 0; addr
< ARRAY_SIZE(data
->mcp
); addr
++) {
976 if (!data
->mcp
[addr
])
979 gpiochip_remove(&data
->mcp
[addr
]->chip
);
985 static const struct spi_device_id mcp23s08_ids
[] = {
986 { "mcp23s08", MCP_TYPE_S08
},
987 { "mcp23s17", MCP_TYPE_S17
},
988 { "mcp23s18", MCP_TYPE_S18
},
991 MODULE_DEVICE_TABLE(spi
, mcp23s08_ids
);
993 static struct spi_driver mcp23s08_driver
= {
994 .probe
= mcp23s08_probe
,
995 .remove
= mcp23s08_remove
,
996 .id_table
= mcp23s08_ids
,
999 .of_match_table
= of_match_ptr(mcp23s08_spi_of_match
),
1003 static int __init
mcp23s08_spi_init(void)
1005 return spi_register_driver(&mcp23s08_driver
);
1008 static void mcp23s08_spi_exit(void)
1010 spi_unregister_driver(&mcp23s08_driver
);
1015 static int __init
mcp23s08_spi_init(void) { return 0; }
1016 static void mcp23s08_spi_exit(void) { }
1018 #endif /* CONFIG_SPI_MASTER */
1020 /*----------------------------------------------------------------------*/
1022 static int __init
mcp23s08_init(void)
1026 ret
= mcp23s08_spi_init();
1030 ret
= mcp23s08_i2c_init();
1037 mcp23s08_spi_exit();
1041 /* register after spi/i2c postcore initcall and before
1042 * subsys initcalls that may rely on these GPIOs
1044 subsys_initcall(mcp23s08_init
);
1046 static void __exit
mcp23s08_exit(void)
1048 mcp23s08_spi_exit();
1049 mcp23s08_i2c_exit();
1051 module_exit(mcp23s08_exit
);
1053 MODULE_LICENSE("GPL");