| /* | |
| * pinmux driver shared headfile for CSR SiRFsoc | |
| * | |
| * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company. | |
| * | |
| * Licensed under GPLv2 or later. | |
| */ | |
| #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 |