xref: /rk3399_rockchip-uboot/drivers/pinctrl/uniphier/pinctrl-uniphier.h (revision d38de7cb03adf88e18c05d840c2528b7a5af2f9b)
15dc626f8SMasahiro Yamada /*
24e3d8406SMasahiro Yamada  * Copyright (C) 2015-2016 Socionext Inc.
34e3d8406SMasahiro Yamada  *   Author: Masahiro Yamada <yamada.masahiro@socionext.com>
45dc626f8SMasahiro Yamada  *
55dc626f8SMasahiro Yamada  * SPDX-License-Identifier:	GPL-2.0+
65dc626f8SMasahiro Yamada  */
75dc626f8SMasahiro Yamada 
85dc626f8SMasahiro Yamada #ifndef __PINCTRL_UNIPHIER_H__
95dc626f8SMasahiro Yamada #define __PINCTRL_UNIPHIER_H__
105dc626f8SMasahiro Yamada 
118cc92b99SMasahiro Yamada #include <linux/bitops.h>
1284b8bf6dSMasahiro Yamada #include <linux/bug.h>
135dc626f8SMasahiro Yamada #include <linux/kernel.h>
145dc626f8SMasahiro Yamada #include <linux/types.h>
155dc626f8SMasahiro Yamada 
165dc626f8SMasahiro Yamada #define UNIPHIER_PIN_ATTR_PACKED(iectrl)	(iectrl)
175dc626f8SMasahiro Yamada 
uniphier_pin_get_iectrl(unsigned long data)185dc626f8SMasahiro Yamada static inline unsigned int uniphier_pin_get_iectrl(unsigned long data)
195dc626f8SMasahiro Yamada {
205dc626f8SMasahiro Yamada 	return data;
215dc626f8SMasahiro Yamada }
225dc626f8SMasahiro Yamada 
235dc626f8SMasahiro Yamada /**
245dc626f8SMasahiro Yamada  * struct uniphier_pinctrl_pin - pin data for UniPhier SoC
255dc626f8SMasahiro Yamada  *
265dc626f8SMasahiro Yamada  * @number: pin number
275dc626f8SMasahiro Yamada  * @data: additional per-pin data
285dc626f8SMasahiro Yamada  */
295dc626f8SMasahiro Yamada struct uniphier_pinctrl_pin {
305dc626f8SMasahiro Yamada 	unsigned number;
315dc626f8SMasahiro Yamada 	unsigned long data;
325dc626f8SMasahiro Yamada };
335dc626f8SMasahiro Yamada 
345dc626f8SMasahiro Yamada /**
355dc626f8SMasahiro Yamada  * struct uniphier_pinctrl_group - pin group data for UniPhier SoC
365dc626f8SMasahiro Yamada  *
375dc626f8SMasahiro Yamada  * @name: pin group name
385dc626f8SMasahiro Yamada  * @pins: array of pins that belong to the group
395dc626f8SMasahiro Yamada  * @num_pins: number of pins in the group
405dc626f8SMasahiro Yamada  * @muxvals: array of values to be set to pinmux registers
415dc626f8SMasahiro Yamada  */
425dc626f8SMasahiro Yamada struct uniphier_pinctrl_group {
435dc626f8SMasahiro Yamada 	const char *name;
445dc626f8SMasahiro Yamada 	const unsigned *pins;
455dc626f8SMasahiro Yamada 	unsigned num_pins;
465e25b9d5SMasahiro Yamada 	const int *muxvals;
475dc626f8SMasahiro Yamada };
485dc626f8SMasahiro Yamada 
495dc626f8SMasahiro Yamada /**
505dc626f8SMasahiro Yamada  * struct uniphier_pinctrl_socdata - SoC data for UniPhier pin controller
515dc626f8SMasahiro Yamada  *
525dc626f8SMasahiro Yamada  * @pins: array of pin data
535dc626f8SMasahiro Yamada  * @pins_count: number of pin data
545dc626f8SMasahiro Yamada  * @groups: array of pin group data
555dc626f8SMasahiro Yamada  * @groups_count: number of pin group data
565dc626f8SMasahiro Yamada  * @functions: array of pinmux function names
575dc626f8SMasahiro Yamada  * @functions_count: number of pinmux functions
585dc626f8SMasahiro Yamada  * @mux_bits: bit width of each pinmux register
595dc626f8SMasahiro Yamada  * @reg_stride: stride of pinmux register address
608cc92b99SMasahiro Yamada  * @caps: SoC-specific capability flag
615dc626f8SMasahiro Yamada  */
625dc626f8SMasahiro Yamada struct uniphier_pinctrl_socdata {
635dc626f8SMasahiro Yamada 	const struct uniphier_pinctrl_pin *pins;
645dc626f8SMasahiro Yamada 	int pins_count;
655dc626f8SMasahiro Yamada 	const struct uniphier_pinctrl_group *groups;
665dc626f8SMasahiro Yamada 	int groups_count;
675dc626f8SMasahiro Yamada 	const char * const *functions;
685dc626f8SMasahiro Yamada 	int functions_count;
698cc92b99SMasahiro Yamada 	unsigned caps;
70*6a6b9d5dSMasahiro Yamada #define UNIPHIER_PINCTRL_CAPS_PUPD_SIMPLE	BIT(3)
71bbb11980SMasahiro Yamada #define UNIPHIER_PINCTRL_CAPS_PERPIN_IECTRL	BIT(2)
72bbb11980SMasahiro Yamada #define UNIPHIER_PINCTRL_CAPS_DBGMUX_SEPARATE	BIT(1)
73bbb11980SMasahiro Yamada #define UNIPHIER_PINCTRL_CAPS_MUX_4BIT		BIT(0)
745dc626f8SMasahiro Yamada };
755dc626f8SMasahiro Yamada 
765dc626f8SMasahiro Yamada #define UNIPHIER_PINCTRL_PIN(a, b)					\
775dc626f8SMasahiro Yamada {									\
785dc626f8SMasahiro Yamada 	.number = a,							\
795dc626f8SMasahiro Yamada 	.data = UNIPHIER_PIN_ATTR_PACKED(b),				\
805dc626f8SMasahiro Yamada }
815dc626f8SMasahiro Yamada 
8264c1cc4cSMasahiro Yamada #define __UNIPHIER_PINCTRL_GROUP(grp)					\
835dc626f8SMasahiro Yamada 	{								\
845dc626f8SMasahiro Yamada 		.name = #grp,						\
855dc626f8SMasahiro Yamada 		.pins = grp##_pins,					\
865dc626f8SMasahiro Yamada 		.num_pins = ARRAY_SIZE(grp##_pins),			\
875dc626f8SMasahiro Yamada 		.muxvals = grp##_muxvals +				\
885dc626f8SMasahiro Yamada 			BUILD_BUG_ON_ZERO(ARRAY_SIZE(grp##_pins) !=	\
895dc626f8SMasahiro Yamada 					  ARRAY_SIZE(grp##_muxvals)),	\
905dc626f8SMasahiro Yamada 	}
915dc626f8SMasahiro Yamada 
9264c1cc4cSMasahiro Yamada #define __UNIPHIER_PINMUX_FUNCTION(func)	#func
9364c1cc4cSMasahiro Yamada 
9464c1cc4cSMasahiro Yamada #ifdef CONFIG_SPL_BUILD
95935e09cdSMasahiro Yamada 	/*
96935e09cdSMasahiro Yamada 	 * a tricky way to drop unneeded *_pins and *_muxvals arrays from SPL,
97935e09cdSMasahiro Yamada 	 * suppressing "defined but not used" warnings.
98935e09cdSMasahiro Yamada 	 */
99935e09cdSMasahiro Yamada #define UNIPHIER_PINCTRL_GROUP(grp)					\
100935e09cdSMasahiro Yamada 	{ .num_pins = ARRAY_SIZE(grp##_pins) + ARRAY_SIZE(grp##_muxvals) }
10164c1cc4cSMasahiro Yamada #define UNIPHIER_PINMUX_FUNCTION(func)		NULL
10264c1cc4cSMasahiro Yamada #else
10364c1cc4cSMasahiro Yamada #define UNIPHIER_PINCTRL_GROUP(grp)		__UNIPHIER_PINCTRL_GROUP(grp)
10464c1cc4cSMasahiro Yamada #define UNIPHIER_PINMUX_FUNCTION(func)		__UNIPHIER_PINMUX_FUNCTION(func)
10564c1cc4cSMasahiro Yamada #endif
10664c1cc4cSMasahiro Yamada 
10764c1cc4cSMasahiro Yamada #define UNIPHIER_PINCTRL_GROUP_SPL(grp)		__UNIPHIER_PINCTRL_GROUP(grp)
10864c1cc4cSMasahiro Yamada #define UNIPHIER_PINMUX_FUNCTION_SPL(func)	__UNIPHIER_PINMUX_FUNCTION(func)
10964c1cc4cSMasahiro Yamada 
1105dc626f8SMasahiro Yamada /**
1115dc626f8SMasahiro Yamada  * struct uniphier_pinctrl_priv - private data for UniPhier pinctrl driver
1125dc626f8SMasahiro Yamada  *
1135dc626f8SMasahiro Yamada  * @base: base address of the pinctrl device
1145dc626f8SMasahiro Yamada  * @socdata: SoC specific data
1155dc626f8SMasahiro Yamada  */
1165dc626f8SMasahiro Yamada struct uniphier_pinctrl_priv {
1175dc626f8SMasahiro Yamada 	void __iomem *base;
1185dc626f8SMasahiro Yamada 	struct uniphier_pinctrl_socdata *socdata;
1195dc626f8SMasahiro Yamada };
1205dc626f8SMasahiro Yamada 
1215dc626f8SMasahiro Yamada extern const struct pinctrl_ops uniphier_pinctrl_ops;
1225dc626f8SMasahiro Yamada 
1235dc626f8SMasahiro Yamada int uniphier_pinctrl_probe(struct udevice *dev,
1245dc626f8SMasahiro Yamada 			   struct uniphier_pinctrl_socdata *socdata);
1255dc626f8SMasahiro Yamada 
1265dc626f8SMasahiro Yamada #endif /* __PINCTRL_UNIPHIER_H__ */
127