David Brownell | e58b9e2 | 2008-02-04 22:28:25 -0800 | [diff] [blame] | 1 | |
David Brownell | 8f1cc3b | 2008-07-25 01:46:09 -0700 | [diff] [blame] | 2 | /* FIXME driver should be able to handle IRQs... */ |
| 3 | |
| 4 | struct mcp23s08_chip_info { |
Peter Korsgaard | 0b7bb77 | 2011-03-09 17:56:30 +0100 | [diff] [blame] | 5 | bool is_present; /* true if populated */ |
| 6 | unsigned pullups; /* BIT(x) means enable pullup x */ |
David Brownell | 8f1cc3b | 2008-07-25 01:46:09 -0700 | [diff] [blame] | 7 | }; |
David Brownell | e58b9e2 | 2008-02-04 22:28:25 -0800 | [diff] [blame] | 8 | |
| 9 | struct mcp23s08_platform_data { |
Peter Korsgaard | 0b7bb77 | 2011-03-09 17:56:30 +0100 | [diff] [blame] | 10 | /* For mcp23s08, up to 4 slaves (numbered 0..3) can share one SPI |
| 11 | * chipselect, each providing 1 gpio_chip instance with 8 gpios. |
| 12 | * For mpc23s17, up to 8 slaves (numbered 0..7) can share one SPI |
| 13 | * chipselect, each providing 1 gpio_chip (port A + port B) with |
| 14 | * 16 gpios. |
David Brownell | 8f1cc3b | 2008-07-25 01:46:09 -0700 | [diff] [blame] | 15 | */ |
Peter Korsgaard | 0b7bb77 | 2011-03-09 17:56:30 +0100 | [diff] [blame] | 16 | struct mcp23s08_chip_info chip[8]; |
David Brownell | e58b9e2 | 2008-02-04 22:28:25 -0800 | [diff] [blame] | 17 | |
David Brownell | 8f1cc3b | 2008-07-25 01:46:09 -0700 | [diff] [blame] | 18 | /* "base" is the number of the first GPIO. Dynamic assignment is |
| 19 | * not currently supported, and even if there are gaps in chip |
| 20 | * addressing the GPIO numbers are sequential .. so for example |
| 21 | * if only slaves 0 and 3 are present, their GPIOs range from |
Peter Korsgaard | 0b7bb77 | 2011-03-09 17:56:30 +0100 | [diff] [blame] | 22 | * base to base+15 (or base+31 for s17 variant). |
David Brownell | 8f1cc3b | 2008-07-25 01:46:09 -0700 | [diff] [blame] | 23 | */ |
David Brownell | e58b9e2 | 2008-02-04 22:28:25 -0800 | [diff] [blame] | 24 | unsigned base; |
Sonic Zhang | 3af0dbd | 2014-09-01 11:19:52 +0800 | [diff] [blame^] | 25 | /* Marks the device as a interrupt controller. |
| 26 | * NOTE: The interrupt functionality is only supported for i2c |
| 27 | * versions of the chips. The spi chips can also do the interrupts, |
| 28 | * but this is not supported by the linux driver yet. |
| 29 | */ |
| 30 | bool irq_controller; |
| 31 | |
| 32 | /* Sets the mirror flag in the IOCON register. Devices |
| 33 | * with two interrupt outputs (these are the devices ending with 17 and |
| 34 | * those that have 16 IOs) have two IO banks: IO 0-7 form bank 1 and |
| 35 | * IO 8-15 are bank 2. These chips have two different interrupt outputs: |
| 36 | * One for bank 1 and another for bank 2. If irq-mirror is set, both |
| 37 | * interrupts are generated regardless of the bank that an input change |
| 38 | * occurred on. If it is not set, the interrupt are only generated for |
| 39 | * the bank they belong to. |
| 40 | * On devices with only one interrupt output this property is useless. |
| 41 | */ |
| 42 | bool mirror; |
David Brownell | e58b9e2 | 2008-02-04 22:28:25 -0800 | [diff] [blame] | 43 | }; |