101aa9d1dSRyder Lee /* SPDX-License-Identifier: GPL-2.0 */
201aa9d1dSRyder Lee /*
301aa9d1dSRyder Lee  * Copyright (C) 2018 MediaTek Inc.
401aa9d1dSRyder Lee  * Author: Ryder Lee <ryder.lee@mediatek.com>
501aa9d1dSRyder Lee  */
601aa9d1dSRyder Lee 
701aa9d1dSRyder Lee #ifndef __PINCTRL_MEDIATEK_H__
801aa9d1dSRyder Lee #define __PINCTRL_MEDIATEK_H__
901aa9d1dSRyder Lee 
1001aa9d1dSRyder Lee #define MTK_RANGE(_a)		{ .range = (_a), .nranges = ARRAY_SIZE(_a), }
1101aa9d1dSRyder Lee #define MTK_PIN(_number, _name, _drv_n) {				\
1201aa9d1dSRyder Lee 		.number = _number,					\
1301aa9d1dSRyder Lee 		.name = _name,						\
1401aa9d1dSRyder Lee 		.drv_n = _drv_n,					\
1501aa9d1dSRyder Lee 	}
1601aa9d1dSRyder Lee 
1701aa9d1dSRyder Lee #define PINCTRL_PIN_GROUP(name, id)					\
1801aa9d1dSRyder Lee 	{								\
1901aa9d1dSRyder Lee 		name,							\
2001aa9d1dSRyder Lee 		id##_pins,						\
2101aa9d1dSRyder Lee 		ARRAY_SIZE(id##_pins),					\
2201aa9d1dSRyder Lee 		id##_funcs,						\
2301aa9d1dSRyder Lee 	}
2401aa9d1dSRyder Lee 
2501aa9d1dSRyder Lee #define PIN_FIELD_CALC(_s_pin, _e_pin, _s_addr, _x_addrs, _s_bit,	\
2601aa9d1dSRyder Lee 			_x_bits, _sz_reg, _fixed) {			\
2701aa9d1dSRyder Lee 		.s_pin = _s_pin,					\
2801aa9d1dSRyder Lee 		.e_pin = _e_pin,					\
2901aa9d1dSRyder Lee 		.s_addr = _s_addr,					\
3001aa9d1dSRyder Lee 		.x_addrs = _x_addrs,					\
3101aa9d1dSRyder Lee 		.s_bit = _s_bit,					\
3201aa9d1dSRyder Lee 		.x_bits = _x_bits,					\
3301aa9d1dSRyder Lee 		.sz_reg = _sz_reg,					\
3401aa9d1dSRyder Lee 		.fixed = _fixed,					\
3501aa9d1dSRyder Lee 	}
3601aa9d1dSRyder Lee 
3701aa9d1dSRyder Lee /* List these attributes which could be modified for the pin */
3801aa9d1dSRyder Lee enum {
3901aa9d1dSRyder Lee 	PINCTRL_PIN_REG_MODE,
4001aa9d1dSRyder Lee 	PINCTRL_PIN_REG_DIR,
4101aa9d1dSRyder Lee 	PINCTRL_PIN_REG_DI,
4201aa9d1dSRyder Lee 	PINCTRL_PIN_REG_DO,
4301aa9d1dSRyder Lee 	PINCTRL_PIN_REG_IES,
4401aa9d1dSRyder Lee 	PINCTRL_PIN_REG_SMT,
4501aa9d1dSRyder Lee 	PINCTRL_PIN_REG_PULLEN,
4601aa9d1dSRyder Lee 	PINCTRL_PIN_REG_PULLSEL,
4701aa9d1dSRyder Lee 	PINCTRL_PIN_REG_DRV,
4801aa9d1dSRyder Lee 	PINCTRL_PIN_REG_MAX,
4901aa9d1dSRyder Lee };
5001aa9d1dSRyder Lee 
5101aa9d1dSRyder Lee /* Group the pins by the driving current */
5201aa9d1dSRyder Lee enum {
5301aa9d1dSRyder Lee 	DRV_FIXED,
5401aa9d1dSRyder Lee 	DRV_GRP0,
5501aa9d1dSRyder Lee 	DRV_GRP1,
5601aa9d1dSRyder Lee 	DRV_GRP2,
5701aa9d1dSRyder Lee 	DRV_GRP3,
5801aa9d1dSRyder Lee 	DRV_GRP4,
5901aa9d1dSRyder Lee };
6001aa9d1dSRyder Lee 
6101aa9d1dSRyder Lee /**
6201aa9d1dSRyder Lee  * struct mtk_pin_field - the structure that holds the information of the field
6301aa9d1dSRyder Lee  *			  used to describe the attribute for the pin
6401aa9d1dSRyder Lee  * @offset:		the register offset relative to the base address
6501aa9d1dSRyder Lee  * @mask:		the mask used to filter out the field from the register
6601aa9d1dSRyder Lee  * @bitpos:		the start bit relative to the register
6701aa9d1dSRyder Lee  * @next:		the indication that the field would be extended to the
6801aa9d1dSRyder Lee 			next register
6901aa9d1dSRyder Lee  */
7001aa9d1dSRyder Lee struct mtk_pin_field {
7101aa9d1dSRyder Lee 	u32 offset;
7201aa9d1dSRyder Lee 	u32 mask;
7301aa9d1dSRyder Lee 	u8 bitpos;
7401aa9d1dSRyder Lee 	u8 next;
7501aa9d1dSRyder Lee };
7601aa9d1dSRyder Lee 
7701aa9d1dSRyder Lee /**
7801aa9d1dSRyder Lee  * struct mtk_pin_field_calc - the structure that holds the range providing
7901aa9d1dSRyder Lee  *			       the guide used to look up the relevant field
8001aa9d1dSRyder Lee  * @s_pin:		the start pin within the range
8101aa9d1dSRyder Lee  * @e_pin:		the end pin within the range
8201aa9d1dSRyder Lee  * @s_addr:		the start address for the range
8301aa9d1dSRyder Lee  * @x_addrs:		the address distance between two consecutive registers
8401aa9d1dSRyder Lee  *			within the range
8501aa9d1dSRyder Lee  * @s_bit:		the start bit for the first register within the range
8601aa9d1dSRyder Lee  * @x_bits:		the bit distance between two consecutive pins within
8701aa9d1dSRyder Lee  *			the range
8801aa9d1dSRyder Lee  * @sz_reg:		the size of bits in a register
8901aa9d1dSRyder Lee  * @fixed:		the consecutive pins share the same bits with the 1st
9001aa9d1dSRyder Lee  *			pin
9101aa9d1dSRyder Lee  */
9201aa9d1dSRyder Lee struct mtk_pin_field_calc {
9301aa9d1dSRyder Lee 	u16 s_pin;
9401aa9d1dSRyder Lee 	u16 e_pin;
9501aa9d1dSRyder Lee 	u32 s_addr;
9601aa9d1dSRyder Lee 	u8 x_addrs;
9701aa9d1dSRyder Lee 	u8 s_bit;
9801aa9d1dSRyder Lee 	u8 x_bits;
9901aa9d1dSRyder Lee 	u8 sz_reg;
10001aa9d1dSRyder Lee 	u8 fixed;
10101aa9d1dSRyder Lee };
10201aa9d1dSRyder Lee 
10301aa9d1dSRyder Lee /**
10401aa9d1dSRyder Lee  * struct mtk_pin_reg_calc - the structure that holds all ranges used to
10501aa9d1dSRyder Lee  *			     determine which register the pin would make use of
10601aa9d1dSRyder Lee  *			     for certain pin attribute.
10701aa9d1dSRyder Lee  * @range:		     the start address for the range
10801aa9d1dSRyder Lee  * @nranges:		     the number of items in the range
10901aa9d1dSRyder Lee  */
11001aa9d1dSRyder Lee struct mtk_pin_reg_calc {
11101aa9d1dSRyder Lee 	const struct mtk_pin_field_calc *range;
11201aa9d1dSRyder Lee 	unsigned int nranges;
11301aa9d1dSRyder Lee };
11401aa9d1dSRyder Lee 
11501aa9d1dSRyder Lee /**
11601aa9d1dSRyder Lee  * struct mtk_pin_desc - the structure that providing information
11701aa9d1dSRyder Lee  *			 for each pin of chips
11801aa9d1dSRyder Lee  * @number:		unique pin number from the global pin number space
11901aa9d1dSRyder Lee  * @name:		name for this pin
12001aa9d1dSRyder Lee  * @drv_n:		the index with the driving group
12101aa9d1dSRyder Lee  */
12201aa9d1dSRyder Lee struct mtk_pin_desc {
12301aa9d1dSRyder Lee 	unsigned int number;
12401aa9d1dSRyder Lee 	const char *name;
12501aa9d1dSRyder Lee 	u8 drv_n;
12601aa9d1dSRyder Lee };
12701aa9d1dSRyder Lee 
12801aa9d1dSRyder Lee /**
12901aa9d1dSRyder Lee  * struct mtk_group_desc - generic pin group descriptor
13001aa9d1dSRyder Lee  * @name: name of the pin group
13101aa9d1dSRyder Lee  * @pins: array of pins that belong to the group
13201aa9d1dSRyder Lee  * @num_pins: number of pins in the group
13301aa9d1dSRyder Lee  * @data: pin controller driver specific data
13401aa9d1dSRyder Lee  */
13501aa9d1dSRyder Lee struct mtk_group_desc {
13601aa9d1dSRyder Lee 	const char *name;
13701aa9d1dSRyder Lee 	int *pins;
13801aa9d1dSRyder Lee 	int num_pins;
13901aa9d1dSRyder Lee 	void *data;
14001aa9d1dSRyder Lee };
14101aa9d1dSRyder Lee 
14201aa9d1dSRyder Lee /**
14301aa9d1dSRyder Lee  * struct mtk_function_desc - generic function descriptor
14401aa9d1dSRyder Lee  * @name: name of the function
14501aa9d1dSRyder Lee  * @group_names: array of pin group names
14601aa9d1dSRyder Lee  * @num_group_names: number of pin group names
14701aa9d1dSRyder Lee  */
14801aa9d1dSRyder Lee struct mtk_function_desc {
14901aa9d1dSRyder Lee 	const char *name;
15001aa9d1dSRyder Lee 	const char * const *group_names;
15101aa9d1dSRyder Lee 	int num_group_names;
15201aa9d1dSRyder Lee };
15301aa9d1dSRyder Lee 
15401aa9d1dSRyder Lee /* struct mtk_pin_soc - the structure that holds SoC-specific data */
15501aa9d1dSRyder Lee struct mtk_pinctrl_soc {
15601aa9d1dSRyder Lee 	const char *name;
15701aa9d1dSRyder Lee 	const struct mtk_pin_reg_calc *reg_cal;
15801aa9d1dSRyder Lee 	const struct mtk_pin_desc *pins;
15901aa9d1dSRyder Lee 	int npins;
16001aa9d1dSRyder Lee 	const struct mtk_group_desc *grps;
16101aa9d1dSRyder Lee 	int ngrps;
16201aa9d1dSRyder Lee 	const struct mtk_function_desc *funcs;
16301aa9d1dSRyder Lee 	int nfuncs;
16401aa9d1dSRyder Lee };
16501aa9d1dSRyder Lee 
16601aa9d1dSRyder Lee /**
16701aa9d1dSRyder Lee  * struct mtk_pinctrl_priv - private data for MTK pinctrl driver
16801aa9d1dSRyder Lee  *
16901aa9d1dSRyder Lee  * @base: base address of the pinctrl device
17001aa9d1dSRyder Lee  * @soc: SoC specific data
17101aa9d1dSRyder Lee  */
17201aa9d1dSRyder Lee struct mtk_pinctrl_priv {
17301aa9d1dSRyder Lee 	void __iomem *base;
17401aa9d1dSRyder Lee 	struct mtk_pinctrl_soc *soc;
17501aa9d1dSRyder Lee };
17601aa9d1dSRyder Lee 
17701aa9d1dSRyder Lee extern const struct pinctrl_ops mtk_pinctrl_ops;
17801aa9d1dSRyder Lee 
179*59a8fef3SRyder Lee /* A common read-modify-write helper for MediaTek chips */
180*59a8fef3SRyder Lee void mtk_rmw(struct udevice *dev, u32 reg, u32 mask, u32 set);
18101aa9d1dSRyder Lee int mtk_pinctrl_common_probe(struct udevice *dev,
18201aa9d1dSRyder Lee 			     struct mtk_pinctrl_soc *soc);
18301aa9d1dSRyder Lee 
18401aa9d1dSRyder Lee #endif /* __PINCTRL_MEDIATEK_H__ */
185