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