xref: /rk3399_rockchip-uboot/drivers/pinctrl/uniphier/pinctrl-uniphier.h (revision 4e3d84066e09c9ab6cee2102db7a2c51090962a4)
15dc626f8SMasahiro Yamada /*
2*4e3d8406SMasahiro Yamada  * Copyright (C) 2015-2016 Socionext Inc.
3*4e3d8406SMasahiro 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 
16186c1334SMasahiro Yamada #define UNIPHIER_PINCTRL_PINMUX_BASE	0x1000
17186c1334SMasahiro Yamada #define UNIPHIER_PINCTRL_LOAD_PINMUX	0x1700
18186c1334SMasahiro Yamada #define UNIPHIER_PINCTRL_IECTRL		0x1d00
195dc626f8SMasahiro Yamada 
205dc626f8SMasahiro Yamada #define UNIPHIER_PIN_ATTR_PACKED(iectrl)	(iectrl)
215dc626f8SMasahiro Yamada 
225dc626f8SMasahiro Yamada static inline unsigned int uniphier_pin_get_iectrl(unsigned long data)
235dc626f8SMasahiro Yamada {
245dc626f8SMasahiro Yamada 	return data;
255dc626f8SMasahiro Yamada }
265dc626f8SMasahiro Yamada 
275dc626f8SMasahiro Yamada /**
285dc626f8SMasahiro Yamada  * struct uniphier_pinctrl_pin - pin data for UniPhier SoC
295dc626f8SMasahiro Yamada  *
305dc626f8SMasahiro Yamada  * @number: pin number
315dc626f8SMasahiro Yamada  * @data: additional per-pin data
325dc626f8SMasahiro Yamada  */
335dc626f8SMasahiro Yamada struct uniphier_pinctrl_pin {
345dc626f8SMasahiro Yamada 	unsigned number;
355dc626f8SMasahiro Yamada 	unsigned long data;
365dc626f8SMasahiro Yamada };
375dc626f8SMasahiro Yamada 
385dc626f8SMasahiro Yamada /**
395dc626f8SMasahiro Yamada  * struct uniphier_pinctrl_group - pin group data for UniPhier SoC
405dc626f8SMasahiro Yamada  *
415dc626f8SMasahiro Yamada  * @name: pin group name
425dc626f8SMasahiro Yamada  * @pins: array of pins that belong to the group
435dc626f8SMasahiro Yamada  * @num_pins: number of pins in the group
445dc626f8SMasahiro Yamada  * @muxvals: array of values to be set to pinmux registers
455dc626f8SMasahiro Yamada  */
465dc626f8SMasahiro Yamada struct uniphier_pinctrl_group {
475dc626f8SMasahiro Yamada 	const char *name;
485dc626f8SMasahiro Yamada 	const unsigned *pins;
495dc626f8SMasahiro Yamada 	unsigned num_pins;
505e25b9d5SMasahiro Yamada 	const int *muxvals;
515dc626f8SMasahiro Yamada };
525dc626f8SMasahiro Yamada 
535dc626f8SMasahiro Yamada /**
545dc626f8SMasahiro Yamada  * struct uniphier_pinctrl_socdata - SoC data for UniPhier pin controller
555dc626f8SMasahiro Yamada  *
565dc626f8SMasahiro Yamada  * @pins: array of pin data
575dc626f8SMasahiro Yamada  * @pins_count: number of pin data
585dc626f8SMasahiro Yamada  * @groups: array of pin group data
595dc626f8SMasahiro Yamada  * @groups_count: number of pin group data
605dc626f8SMasahiro Yamada  * @functions: array of pinmux function names
615dc626f8SMasahiro Yamada  * @functions_count: number of pinmux functions
625dc626f8SMasahiro Yamada  * @mux_bits: bit width of each pinmux register
635dc626f8SMasahiro Yamada  * @reg_stride: stride of pinmux register address
648cc92b99SMasahiro Yamada  * @caps: SoC-specific capability flag
655dc626f8SMasahiro Yamada  */
665dc626f8SMasahiro Yamada struct uniphier_pinctrl_socdata {
675dc626f8SMasahiro Yamada 	const struct uniphier_pinctrl_pin *pins;
685dc626f8SMasahiro Yamada 	int pins_count;
695dc626f8SMasahiro Yamada 	const struct uniphier_pinctrl_group *groups;
705dc626f8SMasahiro Yamada 	int groups_count;
715dc626f8SMasahiro Yamada 	const char * const *functions;
725dc626f8SMasahiro Yamada 	int functions_count;
738cc92b99SMasahiro Yamada 	unsigned caps;
743b05b5f0SMasahiro Yamada #define UNIPHIER_PINCTRL_CAPS_PERPIN_IECTRL	BIT(1)
758cc92b99SMasahiro Yamada #define UNIPHIER_PINCTRL_CAPS_DBGMUX_SEPARATE	BIT(0)
765dc626f8SMasahiro Yamada };
775dc626f8SMasahiro Yamada 
785dc626f8SMasahiro Yamada #define UNIPHIER_PINCTRL_PIN(a, b)					\
795dc626f8SMasahiro Yamada {									\
805dc626f8SMasahiro Yamada 	.number = a,							\
815dc626f8SMasahiro Yamada 	.data = UNIPHIER_PIN_ATTR_PACKED(b),				\
825dc626f8SMasahiro Yamada }
835dc626f8SMasahiro Yamada 
8464c1cc4cSMasahiro Yamada #define __UNIPHIER_PINCTRL_GROUP(grp)					\
855dc626f8SMasahiro Yamada 	{								\
865dc626f8SMasahiro Yamada 		.name = #grp,						\
875dc626f8SMasahiro Yamada 		.pins = grp##_pins,					\
885dc626f8SMasahiro Yamada 		.num_pins = ARRAY_SIZE(grp##_pins),			\
895dc626f8SMasahiro Yamada 		.muxvals = grp##_muxvals +				\
905dc626f8SMasahiro Yamada 			BUILD_BUG_ON_ZERO(ARRAY_SIZE(grp##_pins) !=	\
915dc626f8SMasahiro Yamada 					  ARRAY_SIZE(grp##_muxvals)),	\
925dc626f8SMasahiro Yamada 	}
935dc626f8SMasahiro Yamada 
9464c1cc4cSMasahiro Yamada #define __UNIPHIER_PINMUX_FUNCTION(func)	#func
9564c1cc4cSMasahiro Yamada 
9664c1cc4cSMasahiro Yamada #ifdef CONFIG_SPL_BUILD
9764c1cc4cSMasahiro Yamada #define UNIPHIER_PINCTRL_GROUP(grp)		{ .name = NULL }
9864c1cc4cSMasahiro Yamada #define UNIPHIER_PINMUX_FUNCTION(func)		NULL
9964c1cc4cSMasahiro Yamada #else
10064c1cc4cSMasahiro Yamada #define UNIPHIER_PINCTRL_GROUP(grp)		__UNIPHIER_PINCTRL_GROUP(grp)
10164c1cc4cSMasahiro Yamada #define UNIPHIER_PINMUX_FUNCTION(func)		__UNIPHIER_PINMUX_FUNCTION(func)
10264c1cc4cSMasahiro Yamada #endif
10364c1cc4cSMasahiro Yamada 
10464c1cc4cSMasahiro Yamada #define UNIPHIER_PINCTRL_GROUP_SPL(grp)		__UNIPHIER_PINCTRL_GROUP(grp)
10564c1cc4cSMasahiro Yamada #define UNIPHIER_PINMUX_FUNCTION_SPL(func)	__UNIPHIER_PINMUX_FUNCTION(func)
10664c1cc4cSMasahiro Yamada 
1075dc626f8SMasahiro Yamada /**
1085dc626f8SMasahiro Yamada  * struct uniphier_pinctrl_priv - private data for UniPhier pinctrl driver
1095dc626f8SMasahiro Yamada  *
1105dc626f8SMasahiro Yamada  * @base: base address of the pinctrl device
1115dc626f8SMasahiro Yamada  * @socdata: SoC specific data
1125dc626f8SMasahiro Yamada  */
1135dc626f8SMasahiro Yamada struct uniphier_pinctrl_priv {
1145dc626f8SMasahiro Yamada 	void __iomem *base;
1155dc626f8SMasahiro Yamada 	struct uniphier_pinctrl_socdata *socdata;
1165dc626f8SMasahiro Yamada };
1175dc626f8SMasahiro Yamada 
1185dc626f8SMasahiro Yamada extern const struct pinctrl_ops uniphier_pinctrl_ops;
1195dc626f8SMasahiro Yamada 
1205dc626f8SMasahiro Yamada int uniphier_pinctrl_probe(struct udevice *dev,
1215dc626f8SMasahiro Yamada 			   struct uniphier_pinctrl_socdata *socdata);
1225dc626f8SMasahiro Yamada 
1235dc626f8SMasahiro Yamada #endif /* __PINCTRL_UNIPHIER_H__ */
124