Commit fe421052 authored by Linus Walleij's avatar Linus Walleij

Merge branch 'mcp23s08' into devel

parents bdb18d93 7f38c5b9
...@@ -112,7 +112,7 @@ CONFIG_GPIO_SX150X=y ...@@ -112,7 +112,7 @@ CONFIG_GPIO_SX150X=y
CONFIG_GPIO_74X164=y CONFIG_GPIO_74X164=y
CONFIG_GPIO_MAX7301=y CONFIG_GPIO_MAX7301=y
CONFIG_GPIO_MC33880=y CONFIG_GPIO_MC33880=y
CONFIG_GPIO_MCP23S08=y CONFIG_PINCTRL_MCP23S08=y
CONFIG_SENSORS_DS620=y CONFIG_SENSORS_DS620=y
CONFIG_SENSORS_MAX6639=y CONFIG_SENSORS_MAX6639=y
CONFIG_WATCHDOG=y CONFIG_WATCHDOG=y
......
...@@ -105,7 +105,7 @@ CONFIG_SPI=y ...@@ -105,7 +105,7 @@ CONFIG_SPI=y
CONFIG_SPI_ADI_V3=y CONFIG_SPI_ADI_V3=y
CONFIG_GPIOLIB=y CONFIG_GPIOLIB=y
CONFIG_GPIO_SYSFS=y CONFIG_GPIO_SYSFS=y
CONFIG_GPIO_MCP23S08=y CONFIG_PINCTRL_MCP23S08=y
# CONFIG_HWMON is not set # CONFIG_HWMON is not set
CONFIG_WATCHDOG=y CONFIG_WATCHDOG=y
CONFIG_BFIN_WDT=y CONFIG_BFIN_WDT=y
......
...@@ -348,14 +348,14 @@ static struct platform_device bfin_i2s = { ...@@ -348,14 +348,14 @@ static struct platform_device bfin_i2s = {
}; };
#endif #endif
#if IS_ENABLED(CONFIG_GPIO_MCP23S08) #if IS_ENABLED(CONFIG_PINCTRL_MCP23S08)
#include <linux/spi/mcp23s08.h> #include <linux/spi/mcp23s08.h>
static const struct mcp23s08_platform_data bfin_mcp23s08_sys_gpio_info = { static const struct mcp23s08_platform_data bfin_mcp23s08_sys_gpio_info = {
.chip[0].is_present = true, .spi_present_mask = BIT(0),
.base = 0x30, .base = 0x30,
}; };
static const struct mcp23s08_platform_data bfin_mcp23s08_usr_gpio_info = { static const struct mcp23s08_platform_data bfin_mcp23s08_usr_gpio_info = {
.chip[2].is_present = true, .spi_present_mask = BIT(2),
.base = 0x38, .base = 0x38,
}; };
#endif #endif
...@@ -423,7 +423,7 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = { ...@@ -423,7 +423,7 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {
.mode = SPI_CPHA | SPI_CPOL, .mode = SPI_CPHA | SPI_CPOL,
}, },
#endif #endif
#if IS_ENABLED(CONFIG_GPIO_MCP23S08) #if IS_ENABLED(CONFIG_PINCTRL_MCP23S08)
{ {
.modalias = "mcp23s08", .modalias = "mcp23s08",
.platform_data = &bfin_mcp23s08_sys_gpio_info, .platform_data = &bfin_mcp23s08_sys_gpio_info,
......
...@@ -1887,7 +1887,7 @@ static struct platform_device i2c_bfin_twi1_device = { ...@@ -1887,7 +1887,7 @@ static struct platform_device i2c_bfin_twi1_device = {
}; };
#endif #endif
#if IS_ENABLED(CONFIG_GPIO_MCP23S08) #if IS_ENABLED(CONFIG_PINCTRL_MCP23S08)
#include <linux/spi/mcp23s08.h> #include <linux/spi/mcp23s08.h>
static const struct mcp23s08_platform_data bfin_mcp23s08_soft_switch0 = { static const struct mcp23s08_platform_data bfin_mcp23s08_soft_switch0 = {
.base = 120, .base = 120,
...@@ -1929,7 +1929,7 @@ static struct i2c_board_info __initdata bfin_i2c_board_info0[] = { ...@@ -1929,7 +1929,7 @@ static struct i2c_board_info __initdata bfin_i2c_board_info0[] = {
I2C_BOARD_INFO("ssm2602", 0x1b), I2C_BOARD_INFO("ssm2602", 0x1b),
}, },
#endif #endif
#if IS_ENABLED(CONFIG_GPIO_MCP23S08) #if IS_ENABLED(CONFIG_PINCTRL_MCP23S08)
{ {
I2C_BOARD_INFO("mcp23017", 0x21), I2C_BOARD_INFO("mcp23017", 0x21),
.platform_data = (void *)&bfin_mcp23s08_soft_switch0 .platform_data = (void *)&bfin_mcp23s08_soft_switch0
......
...@@ -1237,23 +1237,6 @@ config GPIO_PISOSR ...@@ -1237,23 +1237,6 @@ config GPIO_PISOSR
endmenu endmenu
menu "SPI or I2C GPIO expanders"
depends on (SPI_MASTER && !I2C) || I2C
config GPIO_MCP23S08
tristate "Microchip MCP23xxx I/O expander"
depends on OF_GPIO
select GPIOLIB_IRQCHIP
select REGMAP_I2C if I2C
select REGMAP if SPI_MASTER
help
SPI/I2C driver for Microchip MCP23S08/MCP23S17/MCP23008/MCP23017
I/O expanders.
This provides a GPIO interface supporting inputs and outputs.
The I2C versions of the chips can be used as interrupt-controller.
endmenu
menu "USB GPIO expanders" menu "USB GPIO expanders"
depends on USB depends on USB
......
...@@ -78,7 +78,6 @@ obj-$(CONFIG_GPIO_MENZ127) += gpio-menz127.o ...@@ -78,7 +78,6 @@ obj-$(CONFIG_GPIO_MENZ127) += gpio-menz127.o
obj-$(CONFIG_GPIO_MERRIFIELD) += gpio-merrifield.o obj-$(CONFIG_GPIO_MERRIFIELD) += gpio-merrifield.o
obj-$(CONFIG_GPIO_MC33880) += gpio-mc33880.o obj-$(CONFIG_GPIO_MC33880) += gpio-mc33880.o
obj-$(CONFIG_GPIO_MC9S08DZ60) += gpio-mc9s08dz60.o obj-$(CONFIG_GPIO_MC9S08DZ60) += gpio-mc9s08dz60.o
obj-$(CONFIG_GPIO_MCP23S08) += gpio-mcp23s08.o
obj-$(CONFIG_GPIO_ML_IOH) += gpio-ml-ioh.o obj-$(CONFIG_GPIO_ML_IOH) += gpio-ml-ioh.o
obj-$(CONFIG_GPIO_MM_LANTIQ) += gpio-mm-lantiq.o obj-$(CONFIG_GPIO_MM_LANTIQ) += gpio-mm-lantiq.o
obj-$(CONFIG_GPIO_MOCKUP) += gpio-mockup.o obj-$(CONFIG_GPIO_MOCKUP) += gpio-mockup.o
......
...@@ -146,6 +146,19 @@ config PINCTRL_FALCON ...@@ -146,6 +146,19 @@ config PINCTRL_FALCON
depends on SOC_FALCON depends on SOC_FALCON
depends on PINCTRL_LANTIQ depends on PINCTRL_LANTIQ
config PINCTRL_MCP23S08
tristate "Microchip MCP23xxx I/O expander"
depends on SPI_MASTER || I2C
select GPIOLIB_IRQCHIP
select REGMAP_I2C if I2C
select REGMAP_SPI if SPI_MASTER
select GENERIC_PINCONF
help
SPI/I2C driver for Microchip MCP23S08/MCP23S17/MCP23008/MCP23017
I/O expanders.
This provides a GPIO interface supporting inputs and outputs.
The I2C versions of the chips can be used as interrupt-controller.
config PINCTRL_MESON config PINCTRL_MESON
bool bool
depends on OF depends on OF
......
...@@ -19,6 +19,7 @@ obj-$(CONFIG_PINCTRL_DA850_PUPD) += pinctrl-da850-pupd.o ...@@ -19,6 +19,7 @@ obj-$(CONFIG_PINCTRL_DA850_PUPD) += pinctrl-da850-pupd.o
obj-$(CONFIG_PINCTRL_DIGICOLOR) += pinctrl-digicolor.o obj-$(CONFIG_PINCTRL_DIGICOLOR) += pinctrl-digicolor.o
obj-$(CONFIG_PINCTRL_FALCON) += pinctrl-falcon.o obj-$(CONFIG_PINCTRL_FALCON) += pinctrl-falcon.o
obj-$(CONFIG_PINCTRL_MAX77620) += pinctrl-max77620.o obj-$(CONFIG_PINCTRL_MAX77620) += pinctrl-max77620.o
obj-$(CONFIG_PINCTRL_MCP23S08) += pinctrl-mcp23s08.o
obj-$(CONFIG_PINCTRL_MESON) += meson/ obj-$(CONFIG_PINCTRL_MESON) += meson/
obj-$(CONFIG_PINCTRL_OXNAS) += pinctrl-oxnas.o obj-$(CONFIG_PINCTRL_OXNAS) += pinctrl-oxnas.o
obj-$(CONFIG_PINCTRL_PALMAS) += pinctrl-palmas.o obj-$(CONFIG_PINCTRL_PALMAS) += pinctrl-palmas.o
......
/* FIXME driver should be able to handle IRQs... */
struct mcp23s08_chip_info {
bool is_present; /* true if populated */
unsigned pullups; /* BIT(x) means enable pullup x */
};
struct mcp23s08_platform_data { struct mcp23s08_platform_data {
/* For mcp23s08, up to 4 slaves (numbered 0..3) can share one SPI /* For mcp23s08, up to 4 slaves (numbered 0..3) can share one SPI
* chipselect, each providing 1 gpio_chip instance with 8 gpios. * chipselect, each providing 1 gpio_chip instance with 8 gpios.
...@@ -13,31 +5,13 @@ struct mcp23s08_platform_data { ...@@ -13,31 +5,13 @@ struct mcp23s08_platform_data {
* chipselect, each providing 1 gpio_chip (port A + port B) with * chipselect, each providing 1 gpio_chip (port A + port B) with
* 16 gpios. * 16 gpios.
*/ */
struct mcp23s08_chip_info chip[8]; u32 spi_present_mask;
/* "base" is the number of the first GPIO. Dynamic assignment is /* "base" is the number of the first GPIO or -1 for dynamic
* not currently supported, and even if there are gaps in chip * assignment. If there are gaps in chip addressing the GPIO
* addressing the GPIO numbers are sequential .. so for example * numbers are sequential .. so for example if only slaves 0
* if only slaves 0 and 3 are present, their GPIOs range from * and 3 are present, their GPIOs range from base to base+15
* base to base+15 (or base+31 for s17 variant). * (or base+31 for s17 variant).
*/ */
unsigned base; unsigned base;
/* Marks the device 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.
*/
bool irq_controller;
/* 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
* occurred 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.
*/
bool mirror;
}; };
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment