mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-27 04:35:27 +07:00
4e47f91bf7
This adds interrupt functionality for i2c chips to the driver. They can act as a interrupt-controller and generate interrupts, if the inputs change. This is tested with a mcp23017 chip on an arm based platform. v3: - be a bit more clear that the irq functionality is also available on spi versions of the chips, but the linux driver does not support this yet v2: - some more word about irq-mirror property in binding doc - use of_read_bool instead of of_find_property for "interrupt-contrller" and "irq-mirror" - cache the "interrupt-controller" for remove function - do set the irq-mirror bit only if device is marked as interrupt-controller - do create the irq mapping and setup of irq_desc of all possible interrupts in probe path instead of in gpio_to_irq - mark gpios as in use as interrupts in irq in irq_startup and unlock it in irq_shutdown - rename virq to child_irq - remove dev argument from mcp23s08_irq_setup function - move gpiochip_add before mcp23s08_irq_setup in probe path Signed-off-by: Lars Poeschel <poeschel@lemonage.de> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
84 lines
3.6 KiB
Plaintext
84 lines
3.6 KiB
Plaintext
Microchip MCP2308/MCP23S08/MCP23017/MCP23S17 driver for
|
|
8-/16-bit I/O expander with serial interface (I2C/SPI)
|
|
|
|
Required properties:
|
|
- compatible : Should be
|
|
- "mcp,mcp23s08" (DEPRECATED) for 8 GPIO SPI version
|
|
- "mcp,mcp23s17" (DEPRECATED) for 16 GPIO SPI version
|
|
- "mcp,mcp23008" (DEPRECATED) for 8 GPIO I2C version or
|
|
- "mcp,mcp23017" (DEPRECATED) for 16 GPIO I2C version of the chip
|
|
|
|
- "microchip,mcp23s08" for 8 GPIO SPI version
|
|
- "microchip,mcp23s17" for 16 GPIO SPI version
|
|
- "microchip,mcp23008" for 8 GPIO I2C version or
|
|
- "microchip,mcp23017" for 16 GPIO I2C version of the chip
|
|
NOTE: Do not use the old mcp prefix any more. It is deprecated and will be
|
|
removed.
|
|
- #gpio-cells : Should be two.
|
|
- first cell is the pin number
|
|
- second cell is used to specify flags. Flags are currently unused.
|
|
- gpio-controller : Marks the device node as a GPIO controller.
|
|
- reg : For an address on its bus. I2C uses this a the I2C address of the chip.
|
|
SPI uses this to specify the chipselect line which the chip is
|
|
connected to. The driver and the SPI variant of the chip support
|
|
multiple chips on the same chipselect. Have a look at
|
|
microchip,spi-present-mask below.
|
|
|
|
Required device specific properties (only for SPI chips):
|
|
- mcp,spi-present-mask (DEPRECATED)
|
|
- microchip,spi-present-mask : This is a present flag, that makes only sense for SPI
|
|
chips - as the name suggests. Multiple SPI chips can share the same
|
|
SPI chipselect. Set a bit in bit0-7 in this mask to 1 if there is a
|
|
chip connected with the corresponding spi address set. For example if
|
|
you have a chip with address 3 connected, you have to set bit3 to 1,
|
|
which is 0x08. mcp23s08 chip variant only supports bits 0-3. It is not
|
|
possible to mix mcp23s08 and mcp23s17 on the same chipselect. Set at
|
|
least one bit to 1 for SPI chips.
|
|
NOTE: Do not use the old mcp prefix any more. It is deprecated and will be
|
|
removed.
|
|
- spi-max-frequency = The maximum frequency this chip is able to handle
|
|
|
|
Optional properties:
|
|
- #interrupt-cells : Should be two.
|
|
- first cell is the pin number
|
|
- second cell is used to specify flags.
|
|
- interrupt-controller: Marks the device node as a interrupt controller.
|
|
NOTE: The interrupt functionality is only supported for i2c versions of the
|
|
chips. The spi chips can also do the interrupts, but this is not supported by
|
|
the linux driver yet.
|
|
|
|
Optional device specific properties:
|
|
- microchip,irq-mirror: Sets the mirror flag in the IOCON register. Devices
|
|
with two interrupt outputs (these are the devices ending with 17 and
|
|
those that have 16 IOs) have two IO banks: IO 0-7 form bank 1 and
|
|
IO 8-15 are bank 2. These chips have two different interrupt outputs:
|
|
One for bank 1 and another for bank 2. If irq-mirror is set, both
|
|
interrupts are generated regardless of the bank that an input change
|
|
occured on. If it is not set, the interrupt are only generated for the
|
|
bank they belong to.
|
|
On devices with only one interrupt output this property is useless.
|
|
|
|
Example I2C (with interrupt):
|
|
gpiom1: gpio@20 {
|
|
compatible = "microchip,mcp23017";
|
|
gpio-controller;
|
|
#gpio-cells = <2>;
|
|
reg = <0x20>;
|
|
|
|
interrupt-parent = <&gpio1>;
|
|
interrupts = <17 IRQ_TYPE_LEVEL_LOW>;
|
|
interrupt-controller;
|
|
#interrupt-cells=<2>;
|
|
microchip,irq-mirror;
|
|
};
|
|
|
|
Example SPI:
|
|
gpiom1: gpio@0 {
|
|
compatible = "microchip,mcp23s17";
|
|
gpio-controller;
|
|
#gpio-cells = <2>;
|
|
spi-present-mask = <0x01>;
|
|
reg = <0>;
|
|
spi-max-frequency = <1000000>;
|
|
};
|