Back to home page

OSCL-LXR

 
 

    


0001 /*
0002  * Allwinner A1X SoCs pinctrl driver.
0003  *
0004  * Copyright (C) 2012 Maxime Ripard
0005  *
0006  * Maxime Ripard <maxime.ripard@free-electrons.com>
0007  *
0008  * This file is licensed under the terms of the GNU General Public
0009  * License version 2.  This program is licensed "as is" without any
0010  * warranty of any kind, whether express or implied.
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 /* Variants below here have an updated register layout. */
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      * Bias voltage configuration is done through
0105      * Pn_GRP_CONFIG registers, as seen on A80 SoC.
0106      */
0107     BIAS_VOLTAGE_GRP_CONFIG,
0108     /*
0109      * Bias voltage is set through PIO_POW_MOD_SEL_REG
0110      * register, as seen on H6 SoC, for example.
0111      */
0112     BIAS_VOLTAGE_PIO_POW_MODE_SEL,
0113     /*
0114      * Bias voltage is set through PIO_POW_MOD_SEL_REG
0115      * and PIO_POW_MOD_CTL_REG register, as seen on
0116      * A100 and D1 SoC, for example.
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 /* __PINCTRL_SUNXI_H */