10f04a817SAndy Shevchenko /* SPDX-License-Identifier: GPL-2.0-only */ 20f04a817SAndy Shevchenko /* MCP23S08 SPI/I2C GPIO driver */ 30f04a817SAndy Shevchenko 40f04a817SAndy Shevchenko #include <linux/gpio/driver.h> 50f04a817SAndy Shevchenko #include <linux/irq.h> 60f04a817SAndy Shevchenko #include <linux/mutex.h> 70f04a817SAndy Shevchenko #include <linux/pinctrl/pinctrl.h> 80f04a817SAndy Shevchenko #include <linux/types.h> 90f04a817SAndy Shevchenko 100f04a817SAndy Shevchenko /* 110f04a817SAndy Shevchenko * MCP types supported by driver 120f04a817SAndy Shevchenko */ 130f04a817SAndy Shevchenko #define MCP_TYPE_S08 1 140f04a817SAndy Shevchenko #define MCP_TYPE_S17 2 150f04a817SAndy Shevchenko #define MCP_TYPE_008 3 160f04a817SAndy Shevchenko #define MCP_TYPE_017 4 170f04a817SAndy Shevchenko #define MCP_TYPE_S18 5 180f04a817SAndy Shevchenko #define MCP_TYPE_018 6 190f04a817SAndy Shevchenko 200f04a817SAndy Shevchenko struct device; 210f04a817SAndy Shevchenko struct regmap; 220f04a817SAndy Shevchenko 230f04a817SAndy Shevchenko struct pinctrl_dev; 240f04a817SAndy Shevchenko 25*2e44555bSBiju Das struct mcp23s08_info { 26*2e44555bSBiju Das const struct regmap_config *regmap; 27*2e44555bSBiju Das const char *label; 28*2e44555bSBiju Das unsigned int type; 29*2e44555bSBiju Das u16 ngpio; 30*2e44555bSBiju Das bool reg_shift; 31*2e44555bSBiju Das }; 32*2e44555bSBiju Das 330f04a817SAndy Shevchenko struct mcp23s08 { 340f04a817SAndy Shevchenko u8 addr; 350f04a817SAndy Shevchenko bool irq_active_high; 360f04a817SAndy Shevchenko bool reg_shift; 370f04a817SAndy Shevchenko 380f04a817SAndy Shevchenko u16 irq_rise; 390f04a817SAndy Shevchenko u16 irq_fall; 400f04a817SAndy Shevchenko int irq; 410f04a817SAndy Shevchenko bool irq_controller; 420f04a817SAndy Shevchenko int cached_gpio; 430f04a817SAndy Shevchenko /* lock protects regmap access with bypass/cache flags */ 440f04a817SAndy Shevchenko struct mutex lock; 450f04a817SAndy Shevchenko 460f04a817SAndy Shevchenko struct gpio_chip chip; 470f04a817SAndy Shevchenko 480f04a817SAndy Shevchenko struct regmap *regmap; 490f04a817SAndy Shevchenko struct device *dev; 500f04a817SAndy Shevchenko 510f04a817SAndy Shevchenko struct pinctrl_dev *pctldev; 520f04a817SAndy Shevchenko struct pinctrl_desc pinctrl_desc; 534e73bfa3SAndreas Kaessens struct gpio_desc *reset_gpio; 540f04a817SAndy Shevchenko }; 550f04a817SAndy Shevchenko 560f04a817SAndy Shevchenko extern const struct regmap_config mcp23x08_regmap; 570f04a817SAndy Shevchenko extern const struct regmap_config mcp23x17_regmap; 580f04a817SAndy Shevchenko 590f04a817SAndy Shevchenko int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev, 600f04a817SAndy Shevchenko unsigned int addr, unsigned int type, unsigned int base); 61