1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * OMAP GPIO handling defines and functions 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2003-2005 Nokia Corporation 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * Written by Juha Yrjölä <juha.yrjola@nokia.com> 8*4882a593Smuzhiyun */ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #ifndef __ASM_ARCH_OMAP_GPIO_H 11*4882a593Smuzhiyun #define __ASM_ARCH_OMAP_GPIO_H 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #ifndef __ASSEMBLER__ 14*4882a593Smuzhiyun #include <linux/io.h> 15*4882a593Smuzhiyun #include <linux/platform_device.h> 16*4882a593Smuzhiyun #endif 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #define OMAP1_MPUIO_BASE 0xfffb5000 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun /* 21*4882a593Smuzhiyun * These are the omap15xx/16xx offsets. The omap7xx offset are 22*4882a593Smuzhiyun * OMAP_MPUIO_ / 2 offsets below. 23*4882a593Smuzhiyun */ 24*4882a593Smuzhiyun #define OMAP_MPUIO_INPUT_LATCH 0x00 25*4882a593Smuzhiyun #define OMAP_MPUIO_OUTPUT 0x04 26*4882a593Smuzhiyun #define OMAP_MPUIO_IO_CNTL 0x08 27*4882a593Smuzhiyun #define OMAP_MPUIO_KBR_LATCH 0x10 28*4882a593Smuzhiyun #define OMAP_MPUIO_KBC 0x14 29*4882a593Smuzhiyun #define OMAP_MPUIO_GPIO_EVENT_MODE 0x18 30*4882a593Smuzhiyun #define OMAP_MPUIO_GPIO_INT_EDGE 0x1c 31*4882a593Smuzhiyun #define OMAP_MPUIO_KBD_INT 0x20 32*4882a593Smuzhiyun #define OMAP_MPUIO_GPIO_INT 0x24 33*4882a593Smuzhiyun #define OMAP_MPUIO_KBD_MASKIT 0x28 34*4882a593Smuzhiyun #define OMAP_MPUIO_GPIO_MASKIT 0x2c 35*4882a593Smuzhiyun #define OMAP_MPUIO_GPIO_DEBOUNCING 0x30 36*4882a593Smuzhiyun #define OMAP_MPUIO_LATCH 0x34 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun #define OMAP34XX_NR_GPIOS 6 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun /* 41*4882a593Smuzhiyun * OMAP1510 GPIO registers 42*4882a593Smuzhiyun */ 43*4882a593Smuzhiyun #define OMAP1510_GPIO_DATA_INPUT 0x00 44*4882a593Smuzhiyun #define OMAP1510_GPIO_DATA_OUTPUT 0x04 45*4882a593Smuzhiyun #define OMAP1510_GPIO_DIR_CONTROL 0x08 46*4882a593Smuzhiyun #define OMAP1510_GPIO_INT_CONTROL 0x0c 47*4882a593Smuzhiyun #define OMAP1510_GPIO_INT_MASK 0x10 48*4882a593Smuzhiyun #define OMAP1510_GPIO_INT_STATUS 0x14 49*4882a593Smuzhiyun #define OMAP1510_GPIO_PIN_CONTROL 0x18 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun #define OMAP1510_IH_GPIO_BASE 64 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun /* 54*4882a593Smuzhiyun * OMAP1610 specific GPIO registers 55*4882a593Smuzhiyun */ 56*4882a593Smuzhiyun #define OMAP1610_GPIO_REVISION 0x0000 57*4882a593Smuzhiyun #define OMAP1610_GPIO_SYSCONFIG 0x0010 58*4882a593Smuzhiyun #define OMAP1610_GPIO_SYSSTATUS 0x0014 59*4882a593Smuzhiyun #define OMAP1610_GPIO_IRQSTATUS1 0x0018 60*4882a593Smuzhiyun #define OMAP1610_GPIO_IRQENABLE1 0x001c 61*4882a593Smuzhiyun #define OMAP1610_GPIO_WAKEUPENABLE 0x0028 62*4882a593Smuzhiyun #define OMAP1610_GPIO_DATAIN 0x002c 63*4882a593Smuzhiyun #define OMAP1610_GPIO_DATAOUT 0x0030 64*4882a593Smuzhiyun #define OMAP1610_GPIO_DIRECTION 0x0034 65*4882a593Smuzhiyun #define OMAP1610_GPIO_EDGE_CTRL1 0x0038 66*4882a593Smuzhiyun #define OMAP1610_GPIO_EDGE_CTRL2 0x003c 67*4882a593Smuzhiyun #define OMAP1610_GPIO_CLEAR_IRQENABLE1 0x009c 68*4882a593Smuzhiyun #define OMAP1610_GPIO_CLEAR_WAKEUPENA 0x00a8 69*4882a593Smuzhiyun #define OMAP1610_GPIO_CLEAR_DATAOUT 0x00b0 70*4882a593Smuzhiyun #define OMAP1610_GPIO_SET_IRQENABLE1 0x00dc 71*4882a593Smuzhiyun #define OMAP1610_GPIO_SET_WAKEUPENA 0x00e8 72*4882a593Smuzhiyun #define OMAP1610_GPIO_SET_DATAOUT 0x00f0 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun /* 75*4882a593Smuzhiyun * OMAP7XX specific GPIO registers 76*4882a593Smuzhiyun */ 77*4882a593Smuzhiyun #define OMAP7XX_GPIO_DATA_INPUT 0x00 78*4882a593Smuzhiyun #define OMAP7XX_GPIO_DATA_OUTPUT 0x04 79*4882a593Smuzhiyun #define OMAP7XX_GPIO_DIR_CONTROL 0x08 80*4882a593Smuzhiyun #define OMAP7XX_GPIO_INT_CONTROL 0x0c 81*4882a593Smuzhiyun #define OMAP7XX_GPIO_INT_MASK 0x10 82*4882a593Smuzhiyun #define OMAP7XX_GPIO_INT_STATUS 0x14 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun /* 85*4882a593Smuzhiyun * omap2+ specific GPIO registers 86*4882a593Smuzhiyun */ 87*4882a593Smuzhiyun #define OMAP24XX_GPIO_REVISION 0x0000 88*4882a593Smuzhiyun #define OMAP24XX_GPIO_SYSCONFIG 0x0010 89*4882a593Smuzhiyun #define OMAP24XX_GPIO_IRQSTATUS1 0x0018 90*4882a593Smuzhiyun #define OMAP24XX_GPIO_IRQSTATUS2 0x0028 91*4882a593Smuzhiyun #define OMAP24XX_GPIO_IRQENABLE2 0x002c 92*4882a593Smuzhiyun #define OMAP24XX_GPIO_IRQENABLE1 0x001c 93*4882a593Smuzhiyun #define OMAP24XX_GPIO_WAKE_EN 0x0020 94*4882a593Smuzhiyun #define OMAP24XX_GPIO_CTRL 0x0030 95*4882a593Smuzhiyun #define OMAP24XX_GPIO_OE 0x0034 96*4882a593Smuzhiyun #define OMAP24XX_GPIO_DATAIN 0x0038 97*4882a593Smuzhiyun #define OMAP24XX_GPIO_DATAOUT 0x003c 98*4882a593Smuzhiyun #define OMAP24XX_GPIO_LEVELDETECT0 0x0040 99*4882a593Smuzhiyun #define OMAP24XX_GPIO_LEVELDETECT1 0x0044 100*4882a593Smuzhiyun #define OMAP24XX_GPIO_RISINGDETECT 0x0048 101*4882a593Smuzhiyun #define OMAP24XX_GPIO_FALLINGDETECT 0x004c 102*4882a593Smuzhiyun #define OMAP24XX_GPIO_DEBOUNCE_EN 0x0050 103*4882a593Smuzhiyun #define OMAP24XX_GPIO_DEBOUNCE_VAL 0x0054 104*4882a593Smuzhiyun #define OMAP24XX_GPIO_CLEARIRQENABLE1 0x0060 105*4882a593Smuzhiyun #define OMAP24XX_GPIO_SETIRQENABLE1 0x0064 106*4882a593Smuzhiyun #define OMAP24XX_GPIO_CLEARWKUENA 0x0080 107*4882a593Smuzhiyun #define OMAP24XX_GPIO_SETWKUENA 0x0084 108*4882a593Smuzhiyun #define OMAP24XX_GPIO_CLEARDATAOUT 0x0090 109*4882a593Smuzhiyun #define OMAP24XX_GPIO_SETDATAOUT 0x0094 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun #define OMAP4_GPIO_REVISION 0x0000 112*4882a593Smuzhiyun #define OMAP4_GPIO_SYSCONFIG 0x0010 113*4882a593Smuzhiyun #define OMAP4_GPIO_EOI 0x0020 114*4882a593Smuzhiyun #define OMAP4_GPIO_IRQSTATUSRAW0 0x0024 115*4882a593Smuzhiyun #define OMAP4_GPIO_IRQSTATUSRAW1 0x0028 116*4882a593Smuzhiyun #define OMAP4_GPIO_IRQSTATUS0 0x002c 117*4882a593Smuzhiyun #define OMAP4_GPIO_IRQSTATUS1 0x0030 118*4882a593Smuzhiyun #define OMAP4_GPIO_IRQSTATUSSET0 0x0034 119*4882a593Smuzhiyun #define OMAP4_GPIO_IRQSTATUSSET1 0x0038 120*4882a593Smuzhiyun #define OMAP4_GPIO_IRQSTATUSCLR0 0x003c 121*4882a593Smuzhiyun #define OMAP4_GPIO_IRQSTATUSCLR1 0x0040 122*4882a593Smuzhiyun #define OMAP4_GPIO_IRQWAKEN0 0x0044 123*4882a593Smuzhiyun #define OMAP4_GPIO_IRQWAKEN1 0x0048 124*4882a593Smuzhiyun #define OMAP4_GPIO_IRQENABLE1 0x011c 125*4882a593Smuzhiyun #define OMAP4_GPIO_WAKE_EN 0x0120 126*4882a593Smuzhiyun #define OMAP4_GPIO_IRQSTATUS2 0x0128 127*4882a593Smuzhiyun #define OMAP4_GPIO_IRQENABLE2 0x012c 128*4882a593Smuzhiyun #define OMAP4_GPIO_CTRL 0x0130 129*4882a593Smuzhiyun #define OMAP4_GPIO_OE 0x0134 130*4882a593Smuzhiyun #define OMAP4_GPIO_DATAIN 0x0138 131*4882a593Smuzhiyun #define OMAP4_GPIO_DATAOUT 0x013c 132*4882a593Smuzhiyun #define OMAP4_GPIO_LEVELDETECT0 0x0140 133*4882a593Smuzhiyun #define OMAP4_GPIO_LEVELDETECT1 0x0144 134*4882a593Smuzhiyun #define OMAP4_GPIO_RISINGDETECT 0x0148 135*4882a593Smuzhiyun #define OMAP4_GPIO_FALLINGDETECT 0x014c 136*4882a593Smuzhiyun #define OMAP4_GPIO_DEBOUNCENABLE 0x0150 137*4882a593Smuzhiyun #define OMAP4_GPIO_DEBOUNCINGTIME 0x0154 138*4882a593Smuzhiyun #define OMAP4_GPIO_CLEARIRQENABLE1 0x0160 139*4882a593Smuzhiyun #define OMAP4_GPIO_SETIRQENABLE1 0x0164 140*4882a593Smuzhiyun #define OMAP4_GPIO_CLEARWKUENA 0x0180 141*4882a593Smuzhiyun #define OMAP4_GPIO_SETWKUENA 0x0184 142*4882a593Smuzhiyun #define OMAP4_GPIO_CLEARDATAOUT 0x0190 143*4882a593Smuzhiyun #define OMAP4_GPIO_SETDATAOUT 0x0194 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun #define OMAP_MAX_GPIO_LINES 192 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun #define OMAP_MPUIO(nr) (OMAP_MAX_GPIO_LINES + (nr)) 148*4882a593Smuzhiyun #define OMAP_GPIO_IS_MPUIO(nr) ((nr) >= OMAP_MAX_GPIO_LINES) 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun #ifndef __ASSEMBLER__ 151*4882a593Smuzhiyun struct omap_gpio_reg_offs { 152*4882a593Smuzhiyun u16 revision; 153*4882a593Smuzhiyun u16 sysconfig; 154*4882a593Smuzhiyun u16 direction; 155*4882a593Smuzhiyun u16 datain; 156*4882a593Smuzhiyun u16 dataout; 157*4882a593Smuzhiyun u16 set_dataout; 158*4882a593Smuzhiyun u16 clr_dataout; 159*4882a593Smuzhiyun u16 irqstatus; 160*4882a593Smuzhiyun u16 irqstatus2; 161*4882a593Smuzhiyun u16 irqstatus_raw0; 162*4882a593Smuzhiyun u16 irqstatus_raw1; 163*4882a593Smuzhiyun u16 irqenable; 164*4882a593Smuzhiyun u16 irqenable2; 165*4882a593Smuzhiyun u16 set_irqenable; 166*4882a593Smuzhiyun u16 clr_irqenable; 167*4882a593Smuzhiyun u16 debounce; 168*4882a593Smuzhiyun u16 debounce_en; 169*4882a593Smuzhiyun u16 ctrl; 170*4882a593Smuzhiyun u16 wkup_en; 171*4882a593Smuzhiyun u16 leveldetect0; 172*4882a593Smuzhiyun u16 leveldetect1; 173*4882a593Smuzhiyun u16 risingdetect; 174*4882a593Smuzhiyun u16 fallingdetect; 175*4882a593Smuzhiyun u16 irqctrl; 176*4882a593Smuzhiyun u16 edgectrl1; 177*4882a593Smuzhiyun u16 edgectrl2; 178*4882a593Smuzhiyun u16 pinctrl; 179*4882a593Smuzhiyun 180*4882a593Smuzhiyun bool irqenable_inv; 181*4882a593Smuzhiyun }; 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun struct omap_gpio_platform_data { 184*4882a593Smuzhiyun int bank_type; 185*4882a593Smuzhiyun int bank_width; /* GPIO bank width */ 186*4882a593Smuzhiyun int bank_stride; /* Only needed for omap1 MPUIO */ 187*4882a593Smuzhiyun bool dbck_flag; /* dbck required or not - True for OMAP3&4 */ 188*4882a593Smuzhiyun bool loses_context; /* whether the bank would ever lose context */ 189*4882a593Smuzhiyun bool is_mpuio; /* whether the bank is of type MPUIO */ 190*4882a593Smuzhiyun u32 non_wakeup_gpios; 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun const struct omap_gpio_reg_offs *regs; 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun /* Return context loss count due to PM states changing */ 195*4882a593Smuzhiyun int (*get_context_loss_count)(struct device *dev); 196*4882a593Smuzhiyun }; 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun #endif /* __ASSEMBLER__ */ 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun #endif 201