root/drivers/pinctrl/pinctrl-mcp23s08.h
/* SPDX-License-Identifier: GPL-2.0-only */
/* MCP23S08 SPI/I2C GPIO driver */

#include <linux/gpio/driver.h>
#include <linux/irq.h>
#include <linux/mutex.h>
#include <linux/pinctrl/pinctrl.h>
#include <linux/types.h>

/*
 * MCP types supported by driver
 */
#define MCP_TYPE_S08    1
#define MCP_TYPE_S17    2
#define MCP_TYPE_008    3
#define MCP_TYPE_017    4
#define MCP_TYPE_S18    5
#define MCP_TYPE_018    6

struct device;
struct regmap;

struct pinctrl_dev;

struct mcp23s08_info {
        const struct regmap_config *regmap;
        const char *label;
        unsigned int type;
        u16 ngpio;
        bool reg_shift;
};

struct mcp23s08 {
        u8                      addr;
        bool                    irq_active_high;
        bool                    reg_shift;

        u16                     irq_rise;
        u16                     irq_fall;
        int                     irq;
        bool                    irq_controller;
        int                     cached_gpio;
        /* lock protects regmap access with bypass/cache flags */
        struct mutex            lock;

        struct gpio_chip        chip;

        struct regmap           *regmap;
        struct device           *dev;

        struct pinctrl_dev      *pctldev;
        struct pinctrl_desc     pinctrl_desc;
        struct gpio_desc        *reset_gpio;
};

extern const struct regmap_config mcp23x08_regmap;
extern const struct regmap_config mcp23x17_regmap;

int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev,
                       unsigned int addr, unsigned int type, unsigned int base);