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_GPIO_A_NR         32
  97#define SUNXI_GPIO_B_NR         32
  98#define SUNXI_GPIO_C_NR         32
  99#define SUNXI_GPIO_D_NR         32
 100#define SUNXI_GPIO_E_NR         32
 101#define SUNXI_GPIO_F_NR         32
 102#define SUNXI_GPIO_G_NR         32
 103#define SUNXI_GPIO_H_NR         32
 104#define SUNXI_GPIO_I_NR         32
 105#define SUNXI_GPIO_L_NR         32
 106#define SUNXI_GPIO_M_NR         32
 107
 108#define SUNXI_GPIO_NEXT(__gpio) \
 109        ((__gpio##_START) + (__gpio##_NR) + 0)
 110
 111enum sunxi_gpio_number {
 112        SUNXI_GPIO_A_START = 0,
 113        SUNXI_GPIO_B_START = SUNXI_GPIO_NEXT(SUNXI_GPIO_A),
 114        SUNXI_GPIO_C_START = SUNXI_GPIO_NEXT(SUNXI_GPIO_B),
 115        SUNXI_GPIO_D_START = SUNXI_GPIO_NEXT(SUNXI_GPIO_C),
 116        SUNXI_GPIO_E_START = SUNXI_GPIO_NEXT(SUNXI_GPIO_D),
 117        SUNXI_GPIO_F_START = SUNXI_GPIO_NEXT(SUNXI_GPIO_E),
 118        SUNXI_GPIO_G_START = SUNXI_GPIO_NEXT(SUNXI_GPIO_F),
 119        SUNXI_GPIO_H_START = SUNXI_GPIO_NEXT(SUNXI_GPIO_G),
 120        SUNXI_GPIO_I_START = SUNXI_GPIO_NEXT(SUNXI_GPIO_H),
 121        SUNXI_GPIO_L_START = 352,
 122        SUNXI_GPIO_M_START = SUNXI_GPIO_NEXT(SUNXI_GPIO_L),
 123        SUNXI_GPIO_N_START = SUNXI_GPIO_NEXT(SUNXI_GPIO_M),
 124        SUNXI_GPIO_AXP0_START = 1024,
 125};
 126
 127/* SUNXI GPIO number definitions */
 128#define SUNXI_GPA(_nr)  (SUNXI_GPIO_A_START + (_nr))
 129#define SUNXI_GPB(_nr)  (SUNXI_GPIO_B_START + (_nr))
 130#define SUNXI_GPC(_nr)  (SUNXI_GPIO_C_START + (_nr))
 131#define SUNXI_GPD(_nr)  (SUNXI_GPIO_D_START + (_nr))
 132#define SUNXI_GPE(_nr)  (SUNXI_GPIO_E_START + (_nr))
 133#define SUNXI_GPF(_nr)  (SUNXI_GPIO_F_START + (_nr))
 134#define SUNXI_GPG(_nr)  (SUNXI_GPIO_G_START + (_nr))
 135#define SUNXI_GPH(_nr)  (SUNXI_GPIO_H_START + (_nr))
 136#define SUNXI_GPI(_nr)  (SUNXI_GPIO_I_START + (_nr))
 137#define SUNXI_GPL(_nr)  (SUNXI_GPIO_L_START + (_nr))
 138#define SUNXI_GPM(_nr)  (SUNXI_GPIO_M_START + (_nr))
 139#define SUNXI_GPN(_nr)  (SUNXI_GPIO_N_START + (_nr))
 140
 141#define SUNXI_GPAXP0(_nr)       (SUNXI_GPIO_AXP0_START + (_nr))
 142
 143/* GPIO pin function config */
 144#define SUNXI_GPIO_INPUT        0
 145#define SUNXI_GPIO_OUTPUT       1
 146#define SUNXI_GPIO_DISABLE      7
 147
 148#define SUNXI_GPA_EMAC          2
 149#define SUN6I_GPA_GMAC          2
 150#define SUN7I_GPA_GMAC          5
 151#define SUN6I_GPA_SDC2          5
 152#define SUN6I_GPA_SDC3          4
 153#define SUN8I_H3_GPA_UART0      2
 154
 155#define SUN4I_GPB_PWM           2
 156#define SUN4I_GPB_TWI0          2
 157#define SUN4I_GPB_TWI1          2
 158#define SUN5I_GPB_TWI1          2
 159#define SUN4I_GPB_TWI2          2
 160#define SUN5I_GPB_TWI2          2
 161#define SUN4I_GPB_UART0         2
 162#define SUN5I_GPB_UART0         2
 163#define SUN8I_GPB_UART2         2
 164#define SUN8I_A33_GPB_UART0     3
 165#define SUN8I_A83T_GPB_UART0    2
 166#define SUN8I_V3S_GPB_UART0     3
 167#define SUN50I_GPB_UART0        4
 168
 169#define SUNXI_GPC_NAND          2
 170#define SUNXI_GPC_SPI0          3
 171#define SUNXI_GPC_SDC2          3
 172#define SUN6I_GPC_SDC3          4
 173#define SUN50I_GPC_SPI0         4
 174
 175#define SUN8I_GPD_SDC1          3
 176#define SUNXI_GPD_LCD0          2
 177#define SUNXI_GPD_LVDS0         3
 178#define SUNXI_GPD_PWM           2
 179
 180#define SUN5I_GPE_SDC2          3
 181#define SUN8I_GPE_TWI2          3
 182#define SUN50I_GPE_TWI2         3
 183
 184#define SUNXI_GPF_SDC0          2
 185#define SUNXI_GPF_UART0         4
 186#define SUN8I_GPF_UART0         3
 187
 188#define SUN4I_GPG_SDC1          4
 189#define SUN5I_GPG_SDC1          2
 190#define SUN6I_GPG_SDC1          2
 191#define SUN8I_GPG_SDC1          2
 192#define SUN6I_GPG_TWI3          2
 193#define SUN5I_GPG_UART1         4
 194
 195#define SUN6I_GPH_PWM           2
 196#define SUN8I_GPH_PWM           2
 197#define SUN4I_GPH_SDC1          5
 198#define SUN6I_GPH_TWI0          2
 199#define SUN8I_GPH_TWI0          2
 200#define SUN50I_GPH_TWI0         2
 201#define SUN6I_GPH_TWI1          2
 202#define SUN8I_GPH_TWI1          2
 203#define SUN50I_GPH_TWI1         2
 204#define SUN6I_GPH_TWI2          2
 205#define SUN6I_GPH_UART0         2
 206#define SUN9I_GPH_UART0         2
 207#define SUN50I_H6_GPH_UART0     2
 208
 209#define SUNXI_GPI_SDC3          2
 210#define SUN7I_GPI_TWI3          3
 211#define SUN7I_GPI_TWI4          3
 212
 213#define SUN6I_GPL0_R_P2WI_SCK   3
 214#define SUN6I_GPL1_R_P2WI_SDA   3
 215
 216#define SUN8I_GPL_R_RSB         2
 217#define SUN8I_H3_GPL_R_TWI      2
 218#define SUN8I_A23_GPL_R_TWI     3
 219#define SUN8I_GPL_R_UART        2
 220#define SUN50I_GPL_R_TWI        2
 221
 222#define SUN9I_GPN_R_RSB         3
 223
 224/* GPIO pin pull-up/down config */
 225#define SUNXI_GPIO_PULL_DISABLE 0
 226#define SUNXI_GPIO_PULL_UP      1
 227#define SUNXI_GPIO_PULL_DOWN    2
 228
 229/* Virtual AXP0 GPIOs */
 230#define SUNXI_GPIO_AXP0_PREFIX "AXP0-"
 231#define SUNXI_GPIO_AXP0_VBUS_DETECT     4
 232#define SUNXI_GPIO_AXP0_VBUS_ENABLE     5
 233#define SUNXI_GPIO_AXP0_GPIO_COUNT      6
 234
 235void sunxi_gpio_set_cfgbank(struct sunxi_gpio *pio, int bank_offset, u32 val);
 236void sunxi_gpio_set_cfgpin(u32 pin, u32 val);
 237int sunxi_gpio_get_cfgbank(struct sunxi_gpio *pio, int bank_offset);
 238int sunxi_gpio_get_cfgpin(u32 pin);
 239int sunxi_gpio_set_drv(u32 pin, u32 val);
 240int sunxi_gpio_set_pull(u32 pin, u32 val);
 241int sunxi_name_to_gpio_bank(const char *name);
 242int sunxi_name_to_gpio(const char *name);
 243#define name_to_gpio(name) sunxi_name_to_gpio(name)
 244
 245#if !defined CONFIG_SPL_BUILD && defined CONFIG_AXP_GPIO
 246int axp_gpio_init(void);
 247#else
 248static inline int axp_gpio_init(void) { return 0; }
 249#endif
 250
 251#endif /* _SUNXI_GPIO_H */
 252