1*24e52197SDarwin Rambo /* 2*24e52197SDarwin Rambo * Copyright 2013 Broadcom Corporation. 3*24e52197SDarwin Rambo * 4*24e52197SDarwin Rambo * SPDX-License-Identifier: GPL-2.0+ 5*24e52197SDarwin Rambo */ 6*24e52197SDarwin Rambo 7*24e52197SDarwin Rambo #include <common.h> 8*24e52197SDarwin Rambo #include <asm/io.h> 9*24e52197SDarwin Rambo #include <asm/arch/sysmap.h> 10*24e52197SDarwin Rambo 11*24e52197SDarwin Rambo #define GPIO_BASE (void *)GPIO2_BASE_ADDR 12*24e52197SDarwin Rambo 13*24e52197SDarwin Rambo #define GPIO_PASSWD 0x00a5a501 14*24e52197SDarwin Rambo #define GPIO_PER_BANK 32 15*24e52197SDarwin Rambo #define GPIO_MAX_BANK_NUM 8 16*24e52197SDarwin Rambo 17*24e52197SDarwin Rambo #define GPIO_BANK(gpio) ((gpio) >> 5) 18*24e52197SDarwin Rambo #define GPIO_BITMASK(gpio) \ 19*24e52197SDarwin Rambo (1UL << ((gpio) & (GPIO_PER_BANK - 1))) 20*24e52197SDarwin Rambo 21*24e52197SDarwin Rambo #define GPIO_OUT_STATUS(bank) (0x00000000 + ((bank) << 2)) 22*24e52197SDarwin Rambo #define GPIO_IN_STATUS(bank) (0x00000020 + ((bank) << 2)) 23*24e52197SDarwin Rambo #define GPIO_OUT_SET(bank) (0x00000040 + ((bank) << 2)) 24*24e52197SDarwin Rambo #define GPIO_OUT_CLEAR(bank) (0x00000060 + ((bank) << 2)) 25*24e52197SDarwin Rambo #define GPIO_INT_STATUS(bank) (0x00000080 + ((bank) << 2)) 26*24e52197SDarwin Rambo #define GPIO_INT_MASK(bank) (0x000000a0 + ((bank) << 2)) 27*24e52197SDarwin Rambo #define GPIO_INT_MSKCLR(bank) (0x000000c0 + ((bank) << 2)) 28*24e52197SDarwin Rambo #define GPIO_CONTROL(bank) (0x00000100 + ((bank) << 2)) 29*24e52197SDarwin Rambo #define GPIO_PWD_STATUS(bank) (0x00000500 + ((bank) << 2)) 30*24e52197SDarwin Rambo 31*24e52197SDarwin Rambo #define GPIO_GPPWR_OFFSET 0x00000520 32*24e52197SDarwin Rambo 33*24e52197SDarwin Rambo #define GPIO_GPCTR0_DBR_SHIFT 5 34*24e52197SDarwin Rambo #define GPIO_GPCTR0_DBR_MASK 0x000001e0 35*24e52197SDarwin Rambo 36*24e52197SDarwin Rambo #define GPIO_GPCTR0_ITR_SHIFT 3 37*24e52197SDarwin Rambo #define GPIO_GPCTR0_ITR_MASK 0x00000018 38*24e52197SDarwin Rambo #define GPIO_GPCTR0_ITR_CMD_RISING_EDGE 0x00000001 39*24e52197SDarwin Rambo #define GPIO_GPCTR0_ITR_CMD_FALLING_EDGE 0x00000002 40*24e52197SDarwin Rambo #define GPIO_GPCTR0_ITR_CMD_BOTH_EDGE 0x00000003 41*24e52197SDarwin Rambo 42*24e52197SDarwin Rambo #define GPIO_GPCTR0_IOTR_MASK 0x00000001 43*24e52197SDarwin Rambo #define GPIO_GPCTR0_IOTR_CMD_0UTPUT 0x00000000 44*24e52197SDarwin Rambo #define GPIO_GPCTR0_IOTR_CMD_INPUT 0x00000001 45*24e52197SDarwin Rambo 46*24e52197SDarwin Rambo int gpio_request(unsigned gpio, const char *label) 47*24e52197SDarwin Rambo { 48*24e52197SDarwin Rambo unsigned int value, off; 49*24e52197SDarwin Rambo 50*24e52197SDarwin Rambo writel(GPIO_PASSWD, GPIO_BASE + GPIO_GPPWR_OFFSET); 51*24e52197SDarwin Rambo off = GPIO_PWD_STATUS(GPIO_BANK(gpio)); 52*24e52197SDarwin Rambo value = readl(GPIO_BASE + off) & ~GPIO_BITMASK(gpio); 53*24e52197SDarwin Rambo writel(value, GPIO_BASE + off); 54*24e52197SDarwin Rambo 55*24e52197SDarwin Rambo return 0; 56*24e52197SDarwin Rambo } 57*24e52197SDarwin Rambo 58*24e52197SDarwin Rambo int gpio_free(unsigned gpio) 59*24e52197SDarwin Rambo { 60*24e52197SDarwin Rambo unsigned int value, off; 61*24e52197SDarwin Rambo 62*24e52197SDarwin Rambo writel(GPIO_PASSWD, GPIO_BASE + GPIO_GPPWR_OFFSET); 63*24e52197SDarwin Rambo off = GPIO_PWD_STATUS(GPIO_BANK(gpio)); 64*24e52197SDarwin Rambo value = readl(GPIO_BASE + off) | GPIO_BITMASK(gpio); 65*24e52197SDarwin Rambo writel(value, GPIO_BASE + off); 66*24e52197SDarwin Rambo 67*24e52197SDarwin Rambo return 0; 68*24e52197SDarwin Rambo } 69*24e52197SDarwin Rambo 70*24e52197SDarwin Rambo int gpio_direction_input(unsigned gpio) 71*24e52197SDarwin Rambo { 72*24e52197SDarwin Rambo u32 val; 73*24e52197SDarwin Rambo 74*24e52197SDarwin Rambo val = readl(GPIO_BASE + GPIO_CONTROL(gpio)); 75*24e52197SDarwin Rambo val &= ~GPIO_GPCTR0_IOTR_MASK; 76*24e52197SDarwin Rambo val |= GPIO_GPCTR0_IOTR_CMD_INPUT; 77*24e52197SDarwin Rambo writel(val, GPIO_BASE + GPIO_CONTROL(gpio)); 78*24e52197SDarwin Rambo 79*24e52197SDarwin Rambo return 0; 80*24e52197SDarwin Rambo } 81*24e52197SDarwin Rambo 82*24e52197SDarwin Rambo int gpio_direction_output(unsigned gpio, int value) 83*24e52197SDarwin Rambo { 84*24e52197SDarwin Rambo int bank_id = GPIO_BANK(gpio); 85*24e52197SDarwin Rambo int bitmask = GPIO_BITMASK(gpio); 86*24e52197SDarwin Rambo u32 val, off; 87*24e52197SDarwin Rambo 88*24e52197SDarwin Rambo val = readl(GPIO_BASE + GPIO_CONTROL(gpio)); 89*24e52197SDarwin Rambo val &= ~GPIO_GPCTR0_IOTR_MASK; 90*24e52197SDarwin Rambo val |= GPIO_GPCTR0_IOTR_CMD_0UTPUT; 91*24e52197SDarwin Rambo writel(val, GPIO_BASE + GPIO_CONTROL(gpio)); 92*24e52197SDarwin Rambo off = value ? GPIO_OUT_SET(bank_id) : GPIO_OUT_CLEAR(bank_id); 93*24e52197SDarwin Rambo 94*24e52197SDarwin Rambo val = readl(GPIO_BASE + off); 95*24e52197SDarwin Rambo val |= bitmask; 96*24e52197SDarwin Rambo writel(val, GPIO_BASE + off); 97*24e52197SDarwin Rambo 98*24e52197SDarwin Rambo return 0; 99*24e52197SDarwin Rambo } 100*24e52197SDarwin Rambo 101*24e52197SDarwin Rambo int gpio_get_value(unsigned gpio) 102*24e52197SDarwin Rambo { 103*24e52197SDarwin Rambo int bank_id = GPIO_BANK(gpio); 104*24e52197SDarwin Rambo int bitmask = GPIO_BITMASK(gpio); 105*24e52197SDarwin Rambo u32 val, off; 106*24e52197SDarwin Rambo 107*24e52197SDarwin Rambo /* determine the GPIO pin direction */ 108*24e52197SDarwin Rambo val = readl(GPIO_BASE + GPIO_CONTROL(gpio)); 109*24e52197SDarwin Rambo val &= GPIO_GPCTR0_IOTR_MASK; 110*24e52197SDarwin Rambo 111*24e52197SDarwin Rambo /* read the GPIO bank status */ 112*24e52197SDarwin Rambo off = (GPIO_GPCTR0_IOTR_CMD_INPUT == val) ? 113*24e52197SDarwin Rambo GPIO_IN_STATUS(bank_id) : GPIO_OUT_STATUS(bank_id); 114*24e52197SDarwin Rambo val = readl(GPIO_BASE + off); 115*24e52197SDarwin Rambo 116*24e52197SDarwin Rambo /* return the specified bit status */ 117*24e52197SDarwin Rambo return !!(val & bitmask); 118*24e52197SDarwin Rambo } 119*24e52197SDarwin Rambo 120*24e52197SDarwin Rambo void gpio_set_value(unsigned gpio, int value) 121*24e52197SDarwin Rambo { 122*24e52197SDarwin Rambo int bank_id = GPIO_BANK(gpio); 123*24e52197SDarwin Rambo int bitmask = GPIO_BITMASK(gpio); 124*24e52197SDarwin Rambo u32 val, off; 125*24e52197SDarwin Rambo 126*24e52197SDarwin Rambo /* determine the GPIO pin direction */ 127*24e52197SDarwin Rambo val = readl(GPIO_BASE + GPIO_CONTROL(gpio)); 128*24e52197SDarwin Rambo val &= GPIO_GPCTR0_IOTR_MASK; 129*24e52197SDarwin Rambo 130*24e52197SDarwin Rambo /* this function only applies to output pin */ 131*24e52197SDarwin Rambo if (GPIO_GPCTR0_IOTR_CMD_INPUT == val) { 132*24e52197SDarwin Rambo printf("%s: Cannot set an input pin %d\n", __func__, gpio); 133*24e52197SDarwin Rambo return; 134*24e52197SDarwin Rambo } 135*24e52197SDarwin Rambo 136*24e52197SDarwin Rambo off = value ? GPIO_OUT_SET(bank_id) : GPIO_OUT_CLEAR(bank_id); 137*24e52197SDarwin Rambo 138*24e52197SDarwin Rambo val = readl(GPIO_BASE + off); 139*24e52197SDarwin Rambo val |= bitmask; 140*24e52197SDarwin Rambo writel(val, GPIO_BASE + off); 141*24e52197SDarwin Rambo } 142