uboot/arch/arm/include/asm/arch-sunxi/gpio.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0+ */
   2/*
   3 * (C) Copyright 2007-2012
   4 * Allwinner Technology Co., Ltd. <www.allwinnertech.com>
   5 * Tom Cubie <tangliang@allwinnertech.com>
   6 */
   7
   8#ifndef _SUNXI_GPIO_H
   9#define _SUNXI_GPIO_H
  10
  11#include <linux/types.h>
  12#include <asm/arch/cpu.h>
  13
  14/*
  15 * sunxi has 9 banks of gpio, they are:
  16 * PA0 - PA17 | PB0 - PB23 | PC0 - PC24
  17 * PD0 - PD27 | PE0 - PE31 | PF0 - PF5
  18 * PG0 - PG9  | PH0 - PH27 | PI0 - PI12
  19 */
  20
  21#define SUNXI_GPIO_A    0
  22#define SUNXI_GPIO_B    1
  23#define SUNXI_GPIO_C    2
  24#define SUNXI_GPIO_D    3
  25#define SUNXI_GPIO_E    4
  26#define SUNXI_GPIO_F    5
  27#define SUNXI_GPIO_G    6
  28#define SUNXI_GPIO_H    7
  29#define SUNXI_GPIO_I    8
  30
  31/*
  32 * This defines the number of GPIO banks for the _main_ GPIO controller.
  33 * You should fix up the padding in struct sunxi_gpio_reg below if you
  34 * change this.
  35 */
  36#define SUNXI_GPIO_BANKS 9
  37
  38/*
  39 * sun6i/sun8i and later SoCs have an additional GPIO controller (R_PIO)
  40 * at a different register offset.
  41 *
  42 * sun6i has 2 banks:
  43 * PL0 - PL8  | PM0 - PM7
  44 *
  45 * sun8i has 1 bank:
  46 * PL0 - PL11
  47 *
  48 * sun9i has 3 banks:
  49 * PL0 - PL9  | PM0 - PM15  | PN0 - PN1
  50 */
  51#define SUNXI_GPIO_L    11
  52#define SUNXI_GPIO_M    12
  53#define SUNXI_GPIO_N    13
  54
  55struct sunxi_gpio {
  56        u32 cfg[4];
  57        u32 dat;
  58        u32 drv[2];
  59        u32 pull[2];
  60};
  61
  62/* gpio interrupt control */
  63struct sunxi_gpio_int {
  64        u32 cfg[3];
  65        u32 ctl;
  66        u32 sta;
  67        u32 deb;                /* interrupt debounce */
  68};
  69
  70struct sunxi_gpio_reg {
  71        struct sunxi_gpio gpio_bank[SUNXI_GPIO_BANKS];
  72        u8 res[0xbc];
  73        struct sunxi_gpio_int gpio_int;
  74};
  75
  76#define SUN50I_H6_GPIO_POW_MOD_SEL      0x340
  77#define SUN50I_H6_GPIO_POW_MOD_VAL      0x348
  78
  79#define BANK_TO_GPIO(bank)      (((bank) < SUNXI_GPIO_L) ? \
  80        &((struct sunxi_gpio_reg *)SUNXI_PIO_BASE)->gpio_bank[bank] : \
  81        &((struct sunxi_gpio_reg *)SUNXI_R_PIO_BASE)->gpio_bank[(bank) - SUNXI_GPIO_L])
  82
  83#define GPIO_BANK(pin)          ((pin) >> 5)
  84#define GPIO_NUM(pin)           ((pin) & 0x1f)
  85
  86#define GPIO_CFG_INDEX(pin)     (((pin) & 0x1f) >> 3)
  87#define GPIO_CFG_OFFSET(pin)    ((((pin) & 0x1f) & 0x7) << 2)
  88
  89#define GPIO_DRV_INDEX(pin)     (((pin) & 0x1f) >> 4)
  90#define GPIO_DRV_OFFSET(pin)    ((((pin) & 0x1f) & 0xf) << 1)
  91
  92#define GPIO_PULL_INDEX(pin)    (((pin) & 0x1f) >> 4)
  93#define GPIO_PULL_OFFSET(pin)   ((((pin) & 0x1f) & 0xf) << 1)
  94
  95/* GPIO bank sizes */
  96#define SUNXI_GPIOS_PER_BANK    32
  97
  98#define SUNXI_GPIO_NEXT(__gpio) \
  99        ((__gpio##_START) + SUNXI_GPIOS_PER_BANK)
 100
 101enum sunxi_gpio_number {
 102        SUNXI_GPIO_A_START = 0,
 103        SUNXI_GPIO_B_START = SUNXI_GPIO_NEXT(SUNXI_GPIO_A),
 104        SUNXI_GPIO_C_START = SUNXI_GPIO_NEXT(SUNXI_GPIO_B),
 105        SUNXI_GPIO_D_START = SUNXI_GPIO_NEXT(SUNXI_GPIO_C),
 106        SUNXI_GPIO_E_START = SUNXI_GPIO_NEXT(SUNXI_GPIO_D),
 107        SUNXI_GPIO_F_START = SUNXI_GPIO_NEXT(SUNXI_GPIO_E),
 108        SUNXI_GPIO_G_START = SUNXI_GPIO_NEXT(SUNXI_GPIO_F),
 109        SUNXI_GPIO_H_START = SUNXI_GPIO_NEXT(SUNXI_GPIO_G),
 110        SUNXI_GPIO_I_START = SUNXI_GPIO_NEXT(SUNXI_GPIO_H),
 111        SUNXI_GPIO_L_START = 352,
 112        SUNXI_GPIO_M_START = SUNXI_GPIO_NEXT(SUNXI_GPIO_L),
 113        SUNXI_GPIO_N_START = SUNXI_GPIO_NEXT(SUNXI_GPIO_M),
 114        SUNXI_GPIO_AXP0_START = 1024,
 115};
 116
 117/* SUNXI GPIO number definitions */
 118#define SUNXI_GPA(_nr)  (SUNXI_GPIO_A_START + (_nr))
 119#define SUNXI_GPB(_nr)  (SUNXI_GPIO_B_START + (_nr))
 120#define SUNXI_GPC(_nr)  (SUNXI_GPIO_C_START + (_nr))
 121#define SUNXI_GPD(_nr)  (SUNXI_GPIO_D_START + (_nr))
 122#define SUNXI_GPE(_nr)  (SUNXI_GPIO_E_START + (_nr))
 123#define SUNXI_GPF(_nr)  (SUNXI_GPIO_F_START + (_nr))
 124#define SUNXI_GPG(_nr)  (SUNXI_GPIO_G_START + (_nr))
 125#define SUNXI_GPH(_nr)  (SUNXI_GPIO_H_START + (_nr))
 126#define SUNXI_GPI(_nr)  (SUNXI_GPIO_I_START + (_nr))
 127#define SUNXI_GPL(_nr)  (SUNXI_GPIO_L_START + (_nr))
 128#define SUNXI_GPM(_nr)  (SUNXI_GPIO_M_START + (_nr))
 129#define SUNXI_GPN(_nr)  (SUNXI_GPIO_N_START + (_nr))
 130
 131#define SUNXI_GPAXP0(_nr)       (SUNXI_GPIO_AXP0_START + (_nr))
 132
 133/* GPIO pin function config */
 134#define SUNXI_GPIO_INPUT        0
 135#define SUNXI_GPIO_OUTPUT       1
 136#define SUNXI_GPIO_DISABLE      7
 137
 138#define SUN8I_H3_GPA_UART0      2
 139#define SUN8I_H3_GPA_UART2      2
 140
 141#define SUN4I_GPB_PWM           2
 142#define SUN4I_GPB_TWI0          2
 143#define SUN4I_GPB_TWI1          2
 144#define SUN5I_GPB_TWI1          2
 145#define SUN8I_V3S_GPB_TWI0      2
 146#define SUN4I_GPB_UART0         2
 147#define SUN5I_GPB_UART0         2
 148#define SUN8I_GPB_UART2         2
 149#define SUN8I_A33_GPB_UART0     3
 150#define SUN8I_A83T_GPB_UART0    2
 151#define SUN8I_V3S_GPB_UART0     3
 152#define SUN50I_GPB_UART0        4
 153
 154#define SUNXI_GPC_NAND          2
 155#define SUNXI_GPC_SPI0          3
 156#define SUNXI_GPC_SDC2          3
 157#define SUN6I_GPC_SDC3          4
 158#define SUN50I_GPC_SPI0         4
 159#define SUNIV_GPC_SPI0          2
 160
 161#define SUNXI_GPD_LCD0          2
 162#define SUNXI_GPD_LVDS0         3
 163
 164#define SUNIV_GPE_UART0         5
 165
 166#define SUNXI_GPF_SDC0          2
 167#define SUNXI_GPF_UART0         4
 168#define SUN8I_GPF_UART0         3
 169
 170#define SUN4I_GPG_SDC1          4
 171#define SUN5I_GPG_SDC1          2
 172#define SUN6I_GPG_SDC1          2
 173#define SUN8I_GPG_SDC1          2
 174#define SUN8I_GPG_UART1         2
 175#define SUN5I_GPG_UART1         4
 176
 177#define SUN6I_GPH_PWM           2
 178#define SUN8I_GPH_PWM           2
 179#define SUN4I_GPH_SDC1          5
 180#define SUN6I_GPH_TWI0          2
 181#define SUN8I_GPH_TWI0          2
 182#define SUN50I_GPH_TWI0         2
 183#define SUN6I_GPH_TWI1          2
 184#define SUN8I_GPH_TWI1          2
 185#define SUN50I_GPH_TWI1         2
 186#define SUN6I_GPH_UART0         2
 187#define SUN9I_GPH_UART0         2
 188#define SUN50I_H6_GPH_UART0     2
 189#define SUN50I_H616_GPH_UART0   2
 190
 191#define SUNXI_GPI_SDC3          2
 192
 193#define SUN6I_GPL0_R_P2WI_SCK   3
 194#define SUN6I_GPL1_R_P2WI_SDA   3
 195
 196#define SUN8I_GPL_R_RSB         2
 197#define SUN8I_H3_GPL_R_TWI      2
 198#define SUN8I_A23_GPL_R_TWI     3
 199#define SUN8I_GPL_R_UART        2
 200#define SUN50I_GPL_R_TWI        2
 201#define SUN50I_H616_GPL_R_TWI   3
 202
 203#define SUN9I_GPN_R_RSB         3
 204
 205/* GPIO pin pull-up/down config */
 206#define SUNXI_GPIO_PULL_DISABLE 0
 207#define SUNXI_GPIO_PULL_UP      1
 208#define SUNXI_GPIO_PULL_DOWN    2
 209
 210/* Virtual AXP0 GPIOs */
 211#define SUNXI_GPIO_AXP0_PREFIX "AXP0-"
 212#define SUNXI_GPIO_AXP0_VBUS_ENABLE     5
 213#define SUNXI_GPIO_AXP0_GPIO_COUNT      6
 214
 215struct sunxi_gpio_plat {
 216        struct sunxi_gpio       *regs;
 217        char                    bank_name[3];
 218};
 219
 220void sunxi_gpio_set_cfgbank(struct sunxi_gpio *pio, int bank_offset, u32 val);
 221void sunxi_gpio_set_cfgpin(u32 pin, u32 val);
 222int sunxi_gpio_get_cfgbank(struct sunxi_gpio *pio, int bank_offset);
 223int sunxi_gpio_get_cfgpin(u32 pin);
 224void sunxi_gpio_set_drv(u32 pin, u32 val);
 225void sunxi_gpio_set_drv_bank(struct sunxi_gpio *pio, u32 bank_offset, u32 val);
 226void sunxi_gpio_set_pull(u32 pin, u32 val);
 227void sunxi_gpio_set_pull_bank(struct sunxi_gpio *pio, int bank_offset, u32 val);
 228int sunxi_name_to_gpio(const char *name);
 229
 230#if !defined CONFIG_SPL_BUILD && defined CONFIG_AXP_GPIO
 231int axp_gpio_init(void);
 232#else
 233static inline int axp_gpio_init(void) { return 0; }
 234#endif
 235
 236#endif /* _SUNXI_GPIO_H */
 237