xref: /linux/drivers/pinctrl/airoha/airoha-common.h (revision cf9610f9116d55c5a66ef9f1faecacabd93a9322)
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