/* SPDX-License-Identifier: GPL-2.0-only */ /* * Author: Lorenzo Bianconi * Author: Benjamin Larsson * Author: Markus Gothe */ #ifndef __AIROHA_COMMON_HEADER__ #define __AIROHA_COMMON_HEADER__ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "../core.h" #include "../pinconf.h" #include "../pinmux.h" #define AIROHA_NUM_PINS 64 #define AIROHA_PIN_BANK_SIZE (AIROHA_NUM_PINS / 2) #define AIROHA_REG_GPIOCTRL_NUM_PIN (AIROHA_NUM_PINS / 4) #define PINCTRL_PIN_GROUP(id, table) \ PINCTRL_PINGROUP(id, table##_pins, ARRAY_SIZE(table##_pins)) #define PINCTRL_FUNC_DESC(id, table) \ { \ .desc = PINCTRL_PINFUNCTION(id, table##_groups, \ ARRAY_SIZE(table##_groups)),\ .groups = table##_func_group, \ .group_size = ARRAY_SIZE(table##_func_group), \ } #define PINCTRL_CONF_DESC(p, offset, mask) \ { \ .pin = p, \ .reg = { offset, mask }, \ } struct airoha_pinctrl_reg { u32 offset; u32 mask; }; enum airoha_pinctrl_mux_func { AIROHA_FUNC_MUX, AIROHA_FUNC_PWM_MUX, AIROHA_FUNC_PWM_EXT_MUX, }; struct airoha_pinctrl_func_group { const char *name; struct { enum airoha_pinctrl_mux_func mux; u32 offset; u32 mask; u32 val; } regmap[2]; int regmap_size; }; struct airoha_pinctrl_func { const struct pinfunction desc; const struct airoha_pinctrl_func_group *groups; u8 group_size; }; struct airoha_pinctrl_conf { u32 pin; struct airoha_pinctrl_reg reg; }; struct airoha_gpiochip_regs { /* gpio */ const u32 *data; const u32 *dir; const u32 *out; /* irq */ const u32 *status; const u32 *level; const u32 *edge; }; struct airoha_pinctrl_confs_info { const struct airoha_pinctrl_conf *confs; unsigned int num_confs; }; enum airoha_pinctrl_confs_type { AIROHA_PINCTRL_CONFS_PULLUP, AIROHA_PINCTRL_CONFS_PULLDOWN, AIROHA_PINCTRL_CONFS_DRIVE_E2, AIROHA_PINCTRL_CONFS_DRIVE_E4, AIROHA_PINCTRL_CONFS_PCIE_RST_OD, AIROHA_PINCTRL_CONFS_MAX, }; struct airoha_pinctrl { struct pinctrl_dev *ctrl; struct pinctrl_desc desc; const struct pingroup *grps; const struct airoha_pinctrl_func *funcs; const struct airoha_pinctrl_confs_info *confs_info; struct regmap *chip_scu; struct regmap *regmap; struct gpio_chip gpiochip; struct airoha_gpiochip_regs *gpio_regs; }; struct airoha_pinctrl_match_data { const char *chip_scu_compatible; const char *pinctrl_name; struct module *pinctrl_owner; const struct pinctrl_pin_desc *pins; const unsigned int num_pins; const struct pingroup *grps; const unsigned int num_grps; const struct airoha_pinctrl_func *funcs; const unsigned int num_funcs; const struct airoha_pinctrl_confs_info confs_info[AIROHA_PINCTRL_CONFS_MAX]; }; int airoha_pinctrl_probe(struct platform_device *pdev); #endif