| /* SPDX-License-Identifier: GPL-2.0-only */ | |
| /* | |
| * Author: Lorenzo Bianconi <lorenzo@kernel.org> | |
| * Author: Benjamin Larsson <benjamin.larsson@genexis.eu> | |
| * Author: Markus Gothe <markus.gothe@genexis.eu> | |
| */ | |
| #ifndef __AIROHA_COMMON_HEADER__ | |
| #define __AIROHA_COMMON_HEADER__ | |
| #include <dt-bindings/pinctrl/mt65xx.h> | |
| #include <linux/bitfield.h> | |
| #include <linux/bits.h> | |
| #include <linux/cleanup.h> | |
| #include <linux/gpio/driver.h> | |
| #include <linux/interrupt.h> | |
| #include <linux/io.h> | |
| #include <linux/irq.h> | |
| #include <linux/irqdomain.h> | |
| #include <linux/mfd/syscon.h> | |
| #include <linux/of.h> | |
| #include <linux/of_irq.h> | |
| #include <linux/of_platform.h> | |
| #include <linux/pinctrl/consumer.h> | |
| #include <linux/pinctrl/pinctrl.h> | |
| #include <linux/pinctrl/pinconf.h> | |
| #include <linux/pinctrl/pinconf-generic.h> | |
| #include <linux/pinctrl/pinmux.h> | |
| #include <linux/platform_device.h> | |
| #include <linux/regmap.h> | |
| #include <linux/types.h> | |
| #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 |