/* SPDX-License-Identifier: GPL-2.0-or-later */ /* * pinmux driver shared headfile for CSR SiRFsoc * * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company. */ #ifndef __PINMUX_SIRF_H__ #define __PINMUX_SIRF_H__ #define SIRFSOC_NUM_PADS 622 #define SIRFSOC_RSC_USB_UART_SHARE 0 #define SIRFSOC_RSC_PIN_MUX 0x4 #define SIRFSOC_GPIO_PAD_EN(g) ((g)*0x100 + 0x84) #define SIRFSOC_GPIO_PAD_EN_CLR(g) ((g)*0x100 + 0x90) #define SIRFSOC_GPIO_CTRL(g, i) ((g)*0x100 + (i)*4) #define SIRFSOC_GPIO_DSP_EN0 (0x80) #define SIRFSOC_GPIO_INT_STATUS(g) ((g)*0x100 + 0x8C) #define SIRFSOC_GPIO_CTL_INTR_LOW_MASK 0x1 #define SIRFSOC_GPIO_CTL_INTR_HIGH_MASK 0x2 #define SIRFSOC_GPIO_CTL_INTR_TYPE_MASK 0x4 #define SIRFSOC_GPIO_CTL_INTR_EN_MASK 0x8 #define SIRFSOC_GPIO_CTL_INTR_STS_MASK 0x10 #define SIRFSOC_GPIO_CTL_OUT_EN_MASK 0x20 #define SIRFSOC_GPIO_CTL_DATAOUT_MASK 0x40 #define SIRFSOC_GPIO_CTL_DATAIN_MASK 0x80 #define SIRFSOC_GPIO_CTL_PULL_MASK 0x100 #define SIRFSOC_GPIO_CTL_PULL_HIGH 0x200 #define SIRFSOC_GPIO_CTL_DSP_INT 0x400 #define SIRFSOC_GPIO_NO_OF_BANKS 5 #define SIRFSOC_GPIO_BANK_SIZE 32 #define SIRFSOC_GPIO_NUM(bank, index) (((bank)*(32)) + (index)) /** * @dev: a pointer back to containing device * @virtbase: the offset to the controller in virtual memory */ struct sirfsoc_pmx { struct device *dev; struct pinctrl_dev *pmx; void __iomem *gpio_virtbase; void __iomem *rsc_virtbase; u32 gpio_regs[SIRFSOC_GPIO_NO_OF_BANKS][SIRFSOC_GPIO_BANK_SIZE]; u32 ints_regs[SIRFSOC_GPIO_NO_OF_BANKS]; u32 paden_regs[SIRFSOC_GPIO_NO_OF_BANKS]; u32 dspen_regs; u32 rsc_regs[3]; }; /* SIRFSOC_GPIO_PAD_EN set */ struct sirfsoc_muxmask { unsigned long group; unsigned long mask; }; struct sirfsoc_padmux { unsigned long muxmask_counts; const struct sirfsoc_muxmask *muxmask; /* RSC_PIN_MUX set */ unsigned long ctrlreg; unsigned long funcmask; unsigned long funcval; }; /** * struct sirfsoc_pin_group - describes a SiRFprimaII pin group * @name: the name of this specific pin group * @pins: an array of discrete physical pins used in this group, taken * from the driver-local pin enumeration space * @num_pins: the number of pins in this group array, i.e. the number of * elements in .pins so we can iterate over that array */ struct sirfsoc_pin_group { const char *name; const unsigned int *pins; const unsigned num_pins; }; #define SIRFSOC_PIN_GROUP(n, p) \ { \ .name = n, \ .pins = p, \ .num_pins = ARRAY_SIZE(p), \ } struct sirfsoc_pmx_func { const char *name; const char * const *groups; const unsigned num_groups; const struct sirfsoc_padmux *padmux; }; #define SIRFSOC_PMX_FUNCTION(n, g, m) \ { \ .name = n, \ .groups = g, \ .num_groups = ARRAY_SIZE(g), \ .padmux = &m, \ } struct sirfsoc_pinctrl_data { struct pinctrl_pin_desc *pads; int pads_cnt; struct sirfsoc_pin_group *grps; int grps_cnt; struct sirfsoc_pmx_func *funcs; int funcs_cnt; }; extern struct sirfsoc_pinctrl_data prima2_pinctrl_data; extern struct sirfsoc_pinctrl_data atlas6_pinctrl_data; #endif