13f263f76SMikhail Kshevetskiy /* SPDX-License-Identifier: GPL-2.0-only */ 23f263f76SMikhail Kshevetskiy /* 33f263f76SMikhail Kshevetskiy * Author: Lorenzo Bianconi <lorenzo@kernel.org> 43f263f76SMikhail Kshevetskiy * Author: Benjamin Larsson <benjamin.larsson@genexis.eu> 53f263f76SMikhail Kshevetskiy * Author: Markus Gothe <markus.gothe@genexis.eu> 63f263f76SMikhail Kshevetskiy */ 73f263f76SMikhail Kshevetskiy 83f263f76SMikhail Kshevetskiy #ifndef __AIROHA_COMMON_HEADER__ 93f263f76SMikhail Kshevetskiy #define __AIROHA_COMMON_HEADER__ 103f263f76SMikhail Kshevetskiy 113f263f76SMikhail Kshevetskiy #include <dt-bindings/pinctrl/mt65xx.h> 123f263f76SMikhail Kshevetskiy #include <linux/bitfield.h> 133f263f76SMikhail Kshevetskiy #include <linux/bits.h> 143f263f76SMikhail Kshevetskiy #include <linux/cleanup.h> 153f263f76SMikhail Kshevetskiy #include <linux/gpio/driver.h> 163f263f76SMikhail Kshevetskiy #include <linux/interrupt.h> 173f263f76SMikhail Kshevetskiy #include <linux/io.h> 183f263f76SMikhail Kshevetskiy #include <linux/irq.h> 193f263f76SMikhail Kshevetskiy #include <linux/irqdomain.h> 203f263f76SMikhail Kshevetskiy #include <linux/mfd/syscon.h> 213f263f76SMikhail Kshevetskiy #include <linux/of.h> 223f263f76SMikhail Kshevetskiy #include <linux/of_irq.h> 233f263f76SMikhail Kshevetskiy #include <linux/of_platform.h> 243f263f76SMikhail Kshevetskiy #include <linux/pinctrl/consumer.h> 253f263f76SMikhail Kshevetskiy #include <linux/pinctrl/pinctrl.h> 263f263f76SMikhail Kshevetskiy #include <linux/pinctrl/pinconf.h> 273f263f76SMikhail Kshevetskiy #include <linux/pinctrl/pinconf-generic.h> 283f263f76SMikhail Kshevetskiy #include <linux/pinctrl/pinmux.h> 293f263f76SMikhail Kshevetskiy #include <linux/platform_device.h> 303f263f76SMikhail Kshevetskiy #include <linux/regmap.h> 313f263f76SMikhail Kshevetskiy #include <linux/types.h> 323f263f76SMikhail Kshevetskiy 333f263f76SMikhail Kshevetskiy #include "../core.h" 343f263f76SMikhail Kshevetskiy #include "../pinconf.h" 353f263f76SMikhail Kshevetskiy #include "../pinmux.h" 363f263f76SMikhail Kshevetskiy 373f263f76SMikhail Kshevetskiy #define AIROHA_NUM_PINS 64 383f263f76SMikhail Kshevetskiy #define AIROHA_PIN_BANK_SIZE (AIROHA_NUM_PINS / 2) 393f263f76SMikhail Kshevetskiy #define AIROHA_REG_GPIOCTRL_NUM_PIN (AIROHA_NUM_PINS / 4) 403f263f76SMikhail Kshevetskiy 413f263f76SMikhail Kshevetskiy #define PINCTRL_PIN_GROUP(id, table) \ 423f263f76SMikhail Kshevetskiy PINCTRL_PINGROUP(id, table##_pins, ARRAY_SIZE(table##_pins)) 433f263f76SMikhail Kshevetskiy 443f263f76SMikhail Kshevetskiy #define PINCTRL_FUNC_DESC(id, table) \ 453f263f76SMikhail Kshevetskiy { \ 463f263f76SMikhail Kshevetskiy .desc = PINCTRL_PINFUNCTION(id, table##_groups, \ 473f263f76SMikhail Kshevetskiy ARRAY_SIZE(table##_groups)),\ 483f263f76SMikhail Kshevetskiy .groups = table##_func_group, \ 493f263f76SMikhail Kshevetskiy .group_size = ARRAY_SIZE(table##_func_group), \ 503f263f76SMikhail Kshevetskiy } 513f263f76SMikhail Kshevetskiy 523f263f76SMikhail Kshevetskiy #define PINCTRL_CONF_DESC(p, offset, mask) \ 533f263f76SMikhail Kshevetskiy { \ 543f263f76SMikhail Kshevetskiy .pin = p, \ 553f263f76SMikhail Kshevetskiy .reg = { offset, mask }, \ 563f263f76SMikhail Kshevetskiy } 573f263f76SMikhail Kshevetskiy 583f263f76SMikhail Kshevetskiy struct airoha_pinctrl_reg { 593f263f76SMikhail Kshevetskiy u32 offset; 603f263f76SMikhail Kshevetskiy u32 mask; 613f263f76SMikhail Kshevetskiy }; 623f263f76SMikhail Kshevetskiy 633f263f76SMikhail Kshevetskiy enum airoha_pinctrl_mux_func { 643f263f76SMikhail Kshevetskiy AIROHA_FUNC_MUX, 653f263f76SMikhail Kshevetskiy AIROHA_FUNC_PWM_MUX, 663f263f76SMikhail Kshevetskiy AIROHA_FUNC_PWM_EXT_MUX, 673f263f76SMikhail Kshevetskiy }; 683f263f76SMikhail Kshevetskiy 693f263f76SMikhail Kshevetskiy struct airoha_pinctrl_func_group { 703f263f76SMikhail Kshevetskiy const char *name; 713f263f76SMikhail Kshevetskiy struct { 723f263f76SMikhail Kshevetskiy enum airoha_pinctrl_mux_func mux; 733f263f76SMikhail Kshevetskiy u32 offset; 743f263f76SMikhail Kshevetskiy u32 mask; 753f263f76SMikhail Kshevetskiy u32 val; 763f263f76SMikhail Kshevetskiy } regmap[2]; 773f263f76SMikhail Kshevetskiy int regmap_size; 783f263f76SMikhail Kshevetskiy }; 793f263f76SMikhail Kshevetskiy 803f263f76SMikhail Kshevetskiy struct airoha_pinctrl_func { 813f263f76SMikhail Kshevetskiy const struct pinfunction desc; 823f263f76SMikhail Kshevetskiy const struct airoha_pinctrl_func_group *groups; 833f263f76SMikhail Kshevetskiy u8 group_size; 843f263f76SMikhail Kshevetskiy }; 853f263f76SMikhail Kshevetskiy 863f263f76SMikhail Kshevetskiy struct airoha_pinctrl_conf { 873f263f76SMikhail Kshevetskiy u32 pin; 883f263f76SMikhail Kshevetskiy struct airoha_pinctrl_reg reg; 893f263f76SMikhail Kshevetskiy }; 903f263f76SMikhail Kshevetskiy 913f263f76SMikhail Kshevetskiy struct airoha_gpiochip_regs { 923f263f76SMikhail Kshevetskiy /* gpio */ 933f263f76SMikhail Kshevetskiy const u32 *data; 943f263f76SMikhail Kshevetskiy const u32 *dir; 953f263f76SMikhail Kshevetskiy const u32 *out; 963f263f76SMikhail Kshevetskiy /* irq */ 973f263f76SMikhail Kshevetskiy const u32 *status; 983f263f76SMikhail Kshevetskiy const u32 *level; 993f263f76SMikhail Kshevetskiy const u32 *edge; 1003f263f76SMikhail Kshevetskiy }; 1013f263f76SMikhail Kshevetskiy 1023f263f76SMikhail Kshevetskiy struct airoha_pinctrl_confs_info { 1033f263f76SMikhail Kshevetskiy const struct airoha_pinctrl_conf *confs; 1043f263f76SMikhail Kshevetskiy unsigned int num_confs; 1053f263f76SMikhail Kshevetskiy }; 1063f263f76SMikhail Kshevetskiy 1073f263f76SMikhail Kshevetskiy enum airoha_pinctrl_confs_type { 1083f263f76SMikhail Kshevetskiy AIROHA_PINCTRL_CONFS_PULLUP, 1093f263f76SMikhail Kshevetskiy AIROHA_PINCTRL_CONFS_PULLDOWN, 1103f263f76SMikhail Kshevetskiy AIROHA_PINCTRL_CONFS_DRIVE_E2, 1113f263f76SMikhail Kshevetskiy AIROHA_PINCTRL_CONFS_DRIVE_E4, 1123f263f76SMikhail Kshevetskiy AIROHA_PINCTRL_CONFS_PCIE_RST_OD, 1133f263f76SMikhail Kshevetskiy 1143f263f76SMikhail Kshevetskiy AIROHA_PINCTRL_CONFS_MAX, 1153f263f76SMikhail Kshevetskiy }; 1163f263f76SMikhail Kshevetskiy 1173f263f76SMikhail Kshevetskiy struct airoha_pinctrl { 1183f263f76SMikhail Kshevetskiy struct pinctrl_dev *ctrl; 1193f263f76SMikhail Kshevetskiy 1203f263f76SMikhail Kshevetskiy struct pinctrl_desc desc; 1213f263f76SMikhail Kshevetskiy const struct pingroup *grps; 1223f263f76SMikhail Kshevetskiy const struct airoha_pinctrl_func *funcs; 1233f263f76SMikhail Kshevetskiy const struct airoha_pinctrl_confs_info *confs_info; 1243f263f76SMikhail Kshevetskiy 1253f263f76SMikhail Kshevetskiy struct regmap *chip_scu; 1263f263f76SMikhail Kshevetskiy struct regmap *regmap; 1273f263f76SMikhail Kshevetskiy 1283f263f76SMikhail Kshevetskiy struct gpio_chip gpiochip; 1293f263f76SMikhail Kshevetskiy struct airoha_gpiochip_regs *gpio_regs; 1303f263f76SMikhail Kshevetskiy }; 1313f263f76SMikhail Kshevetskiy 1323f263f76SMikhail Kshevetskiy struct airoha_pinctrl_match_data { 133*18c510baSMikhail Kshevetskiy const char *chip_scu_compatible; 134900b49e6SMikhail Kshevetskiy const char *pinctrl_name; 135900b49e6SMikhail Kshevetskiy struct module *pinctrl_owner; 1363f263f76SMikhail Kshevetskiy const struct pinctrl_pin_desc *pins; 1373f263f76SMikhail Kshevetskiy const unsigned int num_pins; 1383f263f76SMikhail Kshevetskiy const struct pingroup *grps; 1393f263f76SMikhail Kshevetskiy const unsigned int num_grps; 1403f263f76SMikhail Kshevetskiy const struct airoha_pinctrl_func *funcs; 1413f263f76SMikhail Kshevetskiy const unsigned int num_funcs; 1423f263f76SMikhail Kshevetskiy const struct airoha_pinctrl_confs_info confs_info[AIROHA_PINCTRL_CONFS_MAX]; 1433f263f76SMikhail Kshevetskiy }; 1443f263f76SMikhail Kshevetskiy 145900b49e6SMikhail Kshevetskiy int airoha_pinctrl_probe(struct platform_device *pdev); 146900b49e6SMikhail Kshevetskiy 1473f263f76SMikhail Kshevetskiy #endif 148