0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef __PINCTRL_SUNXI_H
0014 #define __PINCTRL_SUNXI_H
0015
0016 #include <linux/kernel.h>
0017 #include <linux/spinlock.h>
0018
0019 #define PA_BASE 0
0020 #define PB_BASE 32
0021 #define PC_BASE 64
0022 #define PD_BASE 96
0023 #define PE_BASE 128
0024 #define PF_BASE 160
0025 #define PG_BASE 192
0026 #define PH_BASE 224
0027 #define PI_BASE 256
0028 #define PL_BASE 352
0029 #define PM_BASE 384
0030 #define PN_BASE 416
0031
0032 #define SUNXI_PINCTRL_PIN(bank, pin) \
0033 PINCTRL_PIN(P ## bank ## _BASE + (pin), "P" #bank #pin)
0034
0035 #define SUNXI_PIN_NAME_MAX_LEN 5
0036
0037 #define BANK_MEM_SIZE 0x24
0038 #define MUX_REGS_OFFSET 0x0
0039 #define MUX_FIELD_WIDTH 4
0040 #define DATA_REGS_OFFSET 0x10
0041 #define DATA_FIELD_WIDTH 1
0042 #define DLEVEL_REGS_OFFSET 0x14
0043 #define DLEVEL_FIELD_WIDTH 2
0044 #define PULL_REGS_OFFSET 0x1c
0045 #define PULL_FIELD_WIDTH 2
0046
0047 #define D1_BANK_MEM_SIZE 0x30
0048 #define D1_DLEVEL_FIELD_WIDTH 4
0049 #define D1_PULL_REGS_OFFSET 0x24
0050
0051 #define PINS_PER_BANK 32
0052
0053 #define IRQ_PER_BANK 32
0054
0055 #define IRQ_CFG_REG 0x200
0056 #define IRQ_CFG_IRQ_PER_REG 8
0057 #define IRQ_CFG_IRQ_BITS 4
0058 #define IRQ_CFG_IRQ_MASK ((1 << IRQ_CFG_IRQ_BITS) - 1)
0059 #define IRQ_CTRL_REG 0x210
0060 #define IRQ_CTRL_IRQ_PER_REG 32
0061 #define IRQ_CTRL_IRQ_BITS 1
0062 #define IRQ_CTRL_IRQ_MASK ((1 << IRQ_CTRL_IRQ_BITS) - 1)
0063 #define IRQ_STATUS_REG 0x214
0064 #define IRQ_STATUS_IRQ_PER_REG 32
0065 #define IRQ_STATUS_IRQ_BITS 1
0066 #define IRQ_STATUS_IRQ_MASK ((1 << IRQ_STATUS_IRQ_BITS) - 1)
0067
0068 #define IRQ_DEBOUNCE_REG 0x218
0069
0070 #define IRQ_MEM_SIZE 0x20
0071
0072 #define IRQ_EDGE_RISING 0x00
0073 #define IRQ_EDGE_FALLING 0x01
0074 #define IRQ_LEVEL_HIGH 0x02
0075 #define IRQ_LEVEL_LOW 0x03
0076 #define IRQ_EDGE_BOTH 0x04
0077
0078 #define GRP_CFG_REG 0x300
0079
0080 #define IO_BIAS_MASK GENMASK(3, 0)
0081
0082 #define SUN4I_FUNC_INPUT 0
0083 #define SUN4I_FUNC_IRQ 6
0084
0085 #define PINCTRL_SUN5I_A10S BIT(1)
0086 #define PINCTRL_SUN5I_A13 BIT(2)
0087 #define PINCTRL_SUN5I_GR8 BIT(3)
0088 #define PINCTRL_SUN6I_A31 BIT(4)
0089 #define PINCTRL_SUN6I_A31S BIT(5)
0090 #define PINCTRL_SUN4I_A10 BIT(6)
0091 #define PINCTRL_SUN7I_A20 BIT(7)
0092 #define PINCTRL_SUN8I_R40 BIT(8)
0093 #define PINCTRL_SUN8I_V3 BIT(9)
0094 #define PINCTRL_SUN8I_V3S BIT(10)
0095
0096 #define PINCTRL_SUN20I_D1 BIT(11)
0097
0098 #define PIO_POW_MOD_SEL_REG 0x340
0099 #define PIO_POW_MOD_CTL_REG 0x344
0100
0101 enum sunxi_desc_bias_voltage {
0102 BIAS_VOLTAGE_NONE,
0103
0104
0105
0106
0107 BIAS_VOLTAGE_GRP_CONFIG,
0108
0109
0110
0111
0112 BIAS_VOLTAGE_PIO_POW_MODE_SEL,
0113
0114
0115
0116
0117
0118 BIAS_VOLTAGE_PIO_POW_MODE_CTL,
0119 };
0120
0121 struct sunxi_desc_function {
0122 unsigned long variant;
0123 const char *name;
0124 u8 muxval;
0125 u8 irqbank;
0126 u8 irqnum;
0127 };
0128
0129 struct sunxi_desc_pin {
0130 struct pinctrl_pin_desc pin;
0131 unsigned long variant;
0132 struct sunxi_desc_function *functions;
0133 };
0134
0135 struct sunxi_pinctrl_desc {
0136 const struct sunxi_desc_pin *pins;
0137 int npins;
0138 unsigned pin_base;
0139 unsigned irq_banks;
0140 const unsigned int *irq_bank_map;
0141 bool irq_read_needs_mux;
0142 bool disable_strict_mode;
0143 enum sunxi_desc_bias_voltage io_bias_cfg_variant;
0144 };
0145
0146 struct sunxi_pinctrl_function {
0147 const char *name;
0148 const char **groups;
0149 unsigned ngroups;
0150 };
0151
0152 struct sunxi_pinctrl_group {
0153 const char *name;
0154 unsigned pin;
0155 };
0156
0157 struct sunxi_pinctrl_regulator {
0158 struct regulator *regulator;
0159 refcount_t refcount;
0160 };
0161
0162 struct sunxi_pinctrl {
0163 void __iomem *membase;
0164 struct gpio_chip *chip;
0165 const struct sunxi_pinctrl_desc *desc;
0166 struct device *dev;
0167 struct sunxi_pinctrl_regulator regulators[9];
0168 struct irq_domain *domain;
0169 struct sunxi_pinctrl_function *functions;
0170 unsigned nfunctions;
0171 struct sunxi_pinctrl_group *groups;
0172 unsigned ngroups;
0173 int *irq;
0174 unsigned *irq_array;
0175 raw_spinlock_t lock;
0176 struct pinctrl_dev *pctl_dev;
0177 unsigned long variant;
0178 u32 bank_mem_size;
0179 u32 pull_regs_offset;
0180 u32 dlevel_field_width;
0181 };
0182
0183 #define SUNXI_PIN(_pin, ...) \
0184 { \
0185 .pin = _pin, \
0186 .functions = (struct sunxi_desc_function[]){ \
0187 __VA_ARGS__, { } }, \
0188 }
0189
0190 #define SUNXI_PIN_VARIANT(_pin, _variant, ...) \
0191 { \
0192 .pin = _pin, \
0193 .variant = _variant, \
0194 .functions = (struct sunxi_desc_function[]){ \
0195 __VA_ARGS__, { } }, \
0196 }
0197
0198 #define SUNXI_FUNCTION(_val, _name) \
0199 { \
0200 .name = _name, \
0201 .muxval = _val, \
0202 }
0203
0204 #define SUNXI_FUNCTION_VARIANT(_val, _name, _variant) \
0205 { \
0206 .name = _name, \
0207 .muxval = _val, \
0208 .variant = _variant, \
0209 }
0210
0211 #define SUNXI_FUNCTION_IRQ(_val, _irq) \
0212 { \
0213 .name = "irq", \
0214 .muxval = _val, \
0215 .irqnum = _irq, \
0216 }
0217
0218 #define SUNXI_FUNCTION_IRQ_BANK(_val, _bank, _irq) \
0219 { \
0220 .name = "irq", \
0221 .muxval = _val, \
0222 .irqbank = _bank, \
0223 .irqnum = _irq, \
0224 }
0225
0226 static inline u32 sunxi_irq_hw_bank_num(const struct sunxi_pinctrl_desc *desc, u8 bank)
0227 {
0228 if (!desc->irq_bank_map)
0229 return bank;
0230 else
0231 return desc->irq_bank_map[bank];
0232 }
0233
0234 static inline u32 sunxi_irq_cfg_reg(const struct sunxi_pinctrl_desc *desc,
0235 u16 irq)
0236 {
0237 u8 bank = irq / IRQ_PER_BANK;
0238 u8 reg = (irq % IRQ_PER_BANK) / IRQ_CFG_IRQ_PER_REG * 0x04;
0239
0240 return IRQ_CFG_REG +
0241 sunxi_irq_hw_bank_num(desc, bank) * IRQ_MEM_SIZE + reg;
0242 }
0243
0244 static inline u32 sunxi_irq_cfg_offset(u16 irq)
0245 {
0246 u32 irq_num = irq % IRQ_CFG_IRQ_PER_REG;
0247 return irq_num * IRQ_CFG_IRQ_BITS;
0248 }
0249
0250 static inline u32 sunxi_irq_ctrl_reg_from_bank(const struct sunxi_pinctrl_desc *desc, u8 bank)
0251 {
0252 return IRQ_CTRL_REG + sunxi_irq_hw_bank_num(desc, bank) * IRQ_MEM_SIZE;
0253 }
0254
0255 static inline u32 sunxi_irq_ctrl_reg(const struct sunxi_pinctrl_desc *desc,
0256 u16 irq)
0257 {
0258 u8 bank = irq / IRQ_PER_BANK;
0259
0260 return sunxi_irq_ctrl_reg_from_bank(desc, bank);
0261 }
0262
0263 static inline u32 sunxi_irq_ctrl_offset(u16 irq)
0264 {
0265 u32 irq_num = irq % IRQ_CTRL_IRQ_PER_REG;
0266 return irq_num * IRQ_CTRL_IRQ_BITS;
0267 }
0268
0269 static inline u32 sunxi_irq_debounce_reg_from_bank(const struct sunxi_pinctrl_desc *desc, u8 bank)
0270 {
0271 return IRQ_DEBOUNCE_REG +
0272 sunxi_irq_hw_bank_num(desc, bank) * IRQ_MEM_SIZE;
0273 }
0274
0275 static inline u32 sunxi_irq_status_reg_from_bank(const struct sunxi_pinctrl_desc *desc, u8 bank)
0276 {
0277 return IRQ_STATUS_REG +
0278 sunxi_irq_hw_bank_num(desc, bank) * IRQ_MEM_SIZE;
0279 }
0280
0281 static inline u32 sunxi_irq_status_reg(const struct sunxi_pinctrl_desc *desc,
0282 u16 irq)
0283 {
0284 u8 bank = irq / IRQ_PER_BANK;
0285
0286 return sunxi_irq_status_reg_from_bank(desc, bank);
0287 }
0288
0289 static inline u32 sunxi_irq_status_offset(u16 irq)
0290 {
0291 u32 irq_num = irq % IRQ_STATUS_IRQ_PER_REG;
0292 return irq_num * IRQ_STATUS_IRQ_BITS;
0293 }
0294
0295 static inline u32 sunxi_grp_config_reg(u16 pin)
0296 {
0297 u8 bank = pin / PINS_PER_BANK;
0298
0299 return GRP_CFG_REG + bank * 0x4;
0300 }
0301
0302 int sunxi_pinctrl_init_with_variant(struct platform_device *pdev,
0303 const struct sunxi_pinctrl_desc *desc,
0304 unsigned long variant);
0305
0306 #define sunxi_pinctrl_init(_dev, _desc) \
0307 sunxi_pinctrl_init_with_variant(_dev, _desc, 0)
0308
0309 #endif