162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef PINCTRL_PINCTRL_NOMADIK_H
362306a36Sopenharmony_ci#define PINCTRL_PINCTRL_NOMADIK_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include <linux/kernel.h>
662306a36Sopenharmony_ci#include <linux/types.h>
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <linux/pinctrl/pinctrl.h>
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci/* Package definitions */
1162306a36Sopenharmony_ci#define PINCTRL_NMK_STN8815	0
1262306a36Sopenharmony_ci#define PINCTRL_NMK_DB8500	1
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci/* Alternate functions: function C is set in hw by setting both A and B */
1562306a36Sopenharmony_ci#define NMK_GPIO_ALT_GPIO	0
1662306a36Sopenharmony_ci#define NMK_GPIO_ALT_A	1
1762306a36Sopenharmony_ci#define NMK_GPIO_ALT_B	2
1862306a36Sopenharmony_ci#define NMK_GPIO_ALT_C	(NMK_GPIO_ALT_A | NMK_GPIO_ALT_B)
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#define NMK_GPIO_ALT_CX_SHIFT 2
2162306a36Sopenharmony_ci#define NMK_GPIO_ALT_C1	((1<<NMK_GPIO_ALT_CX_SHIFT) | NMK_GPIO_ALT_C)
2262306a36Sopenharmony_ci#define NMK_GPIO_ALT_C2	((2<<NMK_GPIO_ALT_CX_SHIFT) | NMK_GPIO_ALT_C)
2362306a36Sopenharmony_ci#define NMK_GPIO_ALT_C3	((3<<NMK_GPIO_ALT_CX_SHIFT) | NMK_GPIO_ALT_C)
2462306a36Sopenharmony_ci#define NMK_GPIO_ALT_C4	((4<<NMK_GPIO_ALT_CX_SHIFT) | NMK_GPIO_ALT_C)
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci#define PRCM_GPIOCR_ALTCX(pin_num,\
2762306a36Sopenharmony_ci	altc1_used, altc1_ri, altc1_cb,\
2862306a36Sopenharmony_ci	altc2_used, altc2_ri, altc2_cb,\
2962306a36Sopenharmony_ci	altc3_used, altc3_ri, altc3_cb,\
3062306a36Sopenharmony_ci	altc4_used, altc4_ri, altc4_cb)\
3162306a36Sopenharmony_ci{\
3262306a36Sopenharmony_ci	.pin = pin_num,\
3362306a36Sopenharmony_ci	.altcx[PRCM_IDX_GPIOCR_ALTC1] = {\
3462306a36Sopenharmony_ci		.used = altc1_used,\
3562306a36Sopenharmony_ci		.reg_index = altc1_ri,\
3662306a36Sopenharmony_ci		.control_bit = altc1_cb\
3762306a36Sopenharmony_ci	},\
3862306a36Sopenharmony_ci	.altcx[PRCM_IDX_GPIOCR_ALTC2] = {\
3962306a36Sopenharmony_ci		.used = altc2_used,\
4062306a36Sopenharmony_ci		.reg_index = altc2_ri,\
4162306a36Sopenharmony_ci		.control_bit = altc2_cb\
4262306a36Sopenharmony_ci	},\
4362306a36Sopenharmony_ci	.altcx[PRCM_IDX_GPIOCR_ALTC3] = {\
4462306a36Sopenharmony_ci		.used = altc3_used,\
4562306a36Sopenharmony_ci		.reg_index = altc3_ri,\
4662306a36Sopenharmony_ci		.control_bit = altc3_cb\
4762306a36Sopenharmony_ci	},\
4862306a36Sopenharmony_ci	.altcx[PRCM_IDX_GPIOCR_ALTC4] = {\
4962306a36Sopenharmony_ci		.used = altc4_used,\
5062306a36Sopenharmony_ci		.reg_index = altc4_ri,\
5162306a36Sopenharmony_ci		.control_bit = altc4_cb\
5262306a36Sopenharmony_ci	},\
5362306a36Sopenharmony_ci}
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci/**
5662306a36Sopenharmony_ci * enum prcm_gpiocr_reg_index
5762306a36Sopenharmony_ci * Used to reference an PRCM GPIOCR register address.
5862306a36Sopenharmony_ci */
5962306a36Sopenharmony_cienum prcm_gpiocr_reg_index {
6062306a36Sopenharmony_ci	PRCM_IDX_GPIOCR1,
6162306a36Sopenharmony_ci	PRCM_IDX_GPIOCR2,
6262306a36Sopenharmony_ci	PRCM_IDX_GPIOCR3
6362306a36Sopenharmony_ci};
6462306a36Sopenharmony_ci/**
6562306a36Sopenharmony_ci * enum prcm_gpiocr_altcx_index
6662306a36Sopenharmony_ci * Used to reference an Other alternate-C function.
6762306a36Sopenharmony_ci */
6862306a36Sopenharmony_cienum prcm_gpiocr_altcx_index {
6962306a36Sopenharmony_ci	PRCM_IDX_GPIOCR_ALTC1,
7062306a36Sopenharmony_ci	PRCM_IDX_GPIOCR_ALTC2,
7162306a36Sopenharmony_ci	PRCM_IDX_GPIOCR_ALTC3,
7262306a36Sopenharmony_ci	PRCM_IDX_GPIOCR_ALTC4,
7362306a36Sopenharmony_ci	PRCM_IDX_GPIOCR_ALTC_MAX,
7462306a36Sopenharmony_ci};
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci/**
7762306a36Sopenharmony_ci * struct prcm_gpio_altcx - Other alternate-C function
7862306a36Sopenharmony_ci * @used: other alternate-C function availability
7962306a36Sopenharmony_ci * @reg_index: PRCM GPIOCR register index used to control the function
8062306a36Sopenharmony_ci * @control_bit: PRCM GPIOCR bit used to control the function
8162306a36Sopenharmony_ci */
8262306a36Sopenharmony_cistruct prcm_gpiocr_altcx {
8362306a36Sopenharmony_ci	bool used:1;
8462306a36Sopenharmony_ci	u8 reg_index:2;
8562306a36Sopenharmony_ci	u8 control_bit:5;
8662306a36Sopenharmony_ci} __packed;
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci/**
8962306a36Sopenharmony_ci * struct prcm_gpio_altcx_pin_desc - Other alternate-C pin
9062306a36Sopenharmony_ci * @pin: The pin number
9162306a36Sopenharmony_ci * @altcx: array of other alternate-C[1-4] functions
9262306a36Sopenharmony_ci */
9362306a36Sopenharmony_cistruct prcm_gpiocr_altcx_pin_desc {
9462306a36Sopenharmony_ci	unsigned short pin;
9562306a36Sopenharmony_ci	struct prcm_gpiocr_altcx altcx[PRCM_IDX_GPIOCR_ALTC_MAX];
9662306a36Sopenharmony_ci};
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci/**
9962306a36Sopenharmony_ci * struct nmk_function - Nomadik pinctrl mux function
10062306a36Sopenharmony_ci * @name: The name of the function, exported to pinctrl core.
10162306a36Sopenharmony_ci * @groups: An array of pin groups that may select this function.
10262306a36Sopenharmony_ci * @ngroups: The number of entries in @groups.
10362306a36Sopenharmony_ci */
10462306a36Sopenharmony_cistruct nmk_function {
10562306a36Sopenharmony_ci	const char *name;
10662306a36Sopenharmony_ci	const char * const *groups;
10762306a36Sopenharmony_ci	unsigned ngroups;
10862306a36Sopenharmony_ci};
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ci/**
11162306a36Sopenharmony_ci * struct nmk_pingroup - describes a Nomadik pin group
11262306a36Sopenharmony_ci * @grp: Generic data of the pin group (name and pins)
11362306a36Sopenharmony_ci * @altsetting: the altsetting to apply to all pins in this group to
11462306a36Sopenharmony_ci *	configure them to be used by a function
11562306a36Sopenharmony_ci */
11662306a36Sopenharmony_cistruct nmk_pingroup {
11762306a36Sopenharmony_ci	struct pingroup grp;
11862306a36Sopenharmony_ci	int altsetting;
11962306a36Sopenharmony_ci};
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_ci#define NMK_PIN_GROUP(a, b)							\
12262306a36Sopenharmony_ci	{									\
12362306a36Sopenharmony_ci		.grp = PINCTRL_PINGROUP(#a, a##_pins, ARRAY_SIZE(a##_pins)),	\
12462306a36Sopenharmony_ci		.altsetting = b,						\
12562306a36Sopenharmony_ci	}
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_ci/**
12862306a36Sopenharmony_ci * struct nmk_pinctrl_soc_data - Nomadik pin controller per-SoC configuration
12962306a36Sopenharmony_ci * @pins:	An array describing all pins the pin controller affects.
13062306a36Sopenharmony_ci *		All pins which are also GPIOs must be listed first within the
13162306a36Sopenharmony_ci *		array, and be numbered identically to the GPIO controller's
13262306a36Sopenharmony_ci *		numbering.
13362306a36Sopenharmony_ci * @npins:	The number of entries in @pins.
13462306a36Sopenharmony_ci * @functions:	The functions supported on this SoC.
13562306a36Sopenharmony_ci * @nfunction:	The number of entries in @functions.
13662306a36Sopenharmony_ci * @groups:	An array describing all pin groups the pin SoC supports.
13762306a36Sopenharmony_ci * @ngroups:	The number of entries in @groups.
13862306a36Sopenharmony_ci * @altcx_pins:	The pins that support Other alternate-C function on this SoC
13962306a36Sopenharmony_ci * @npins_altcx: The number of Other alternate-C pins
14062306a36Sopenharmony_ci * @prcm_gpiocr_registers: The array of PRCM GPIOCR registers on this SoC
14162306a36Sopenharmony_ci */
14262306a36Sopenharmony_cistruct nmk_pinctrl_soc_data {
14362306a36Sopenharmony_ci	const struct pinctrl_pin_desc *pins;
14462306a36Sopenharmony_ci	unsigned npins;
14562306a36Sopenharmony_ci	const struct nmk_function *functions;
14662306a36Sopenharmony_ci	unsigned nfunctions;
14762306a36Sopenharmony_ci	const struct nmk_pingroup *groups;
14862306a36Sopenharmony_ci	unsigned ngroups;
14962306a36Sopenharmony_ci	const struct prcm_gpiocr_altcx_pin_desc *altcx_pins;
15062306a36Sopenharmony_ci	unsigned npins_altcx;
15162306a36Sopenharmony_ci	const u16 *prcm_gpiocr_registers;
15262306a36Sopenharmony_ci};
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_ci#ifdef CONFIG_PINCTRL_STN8815
15562306a36Sopenharmony_ci
15662306a36Sopenharmony_civoid nmk_pinctrl_stn8815_init(const struct nmk_pinctrl_soc_data **soc);
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ci#else
15962306a36Sopenharmony_ci
16062306a36Sopenharmony_cistatic inline void
16162306a36Sopenharmony_cinmk_pinctrl_stn8815_init(const struct nmk_pinctrl_soc_data **soc)
16262306a36Sopenharmony_ci{
16362306a36Sopenharmony_ci}
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_ci#endif
16662306a36Sopenharmony_ci
16762306a36Sopenharmony_ci#ifdef CONFIG_PINCTRL_DB8500
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_civoid nmk_pinctrl_db8500_init(const struct nmk_pinctrl_soc_data **soc);
17062306a36Sopenharmony_ci
17162306a36Sopenharmony_ci#else
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_cistatic inline void
17462306a36Sopenharmony_cinmk_pinctrl_db8500_init(const struct nmk_pinctrl_soc_data **soc)
17562306a36Sopenharmony_ci{
17662306a36Sopenharmony_ci}
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_ci#endif
17962306a36Sopenharmony_ci
18062306a36Sopenharmony_ci#endif /* PINCTRL_PINCTRL_NOMADIK_H */
181