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
gpio_request(unsigned gpio,const char * label)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
gpio_free(unsigned gpio)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
gpio_direction_input(unsigned gpio)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
gpio_direction_output(unsigned gpio,int value)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
gpio_get_value(unsigned gpio)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
gpio_set_value(unsigned gpio,int value)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