xref: /openbmc/u-boot/drivers/gpio/mvgpio.c (revision 0c442298)
1*0c442298SAjay Bhargav /*
2*0c442298SAjay Bhargav  * (C) Copyright 2011
3*0c442298SAjay Bhargav  * eInfochips Ltd. <www.einfochips.com>
4*0c442298SAjay Bhargav  * Written-by: Ajay Bhargav <ajay.bhargav@einfochips.com>
5*0c442298SAjay Bhargav  *
6*0c442298SAjay Bhargav  * (C) Copyright 2010
7*0c442298SAjay Bhargav  * Marvell Semiconductor <www.marvell.com>
8*0c442298SAjay Bhargav  *
9*0c442298SAjay Bhargav  * See file CREDITS for list of people who contributed to this
10*0c442298SAjay Bhargav  * project.
11*0c442298SAjay Bhargav  *
12*0c442298SAjay Bhargav  * This program is free software; you can redistribute it and/or
13*0c442298SAjay Bhargav  * modify it under the terms of the GNU General Public License as
14*0c442298SAjay Bhargav  * published by the Free Software Foundation; either version 2 of
15*0c442298SAjay Bhargav  * the License, or (at your option) any later version.
16*0c442298SAjay Bhargav  *
17*0c442298SAjay Bhargav  * This program is distributed in the hope that it will be useful,
18*0c442298SAjay Bhargav  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19*0c442298SAjay Bhargav  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20*0c442298SAjay Bhargav  * GNU General Public License for more details.
21*0c442298SAjay Bhargav  *
22*0c442298SAjay Bhargav  * You should have received a copy of the GNU General Public License
23*0c442298SAjay Bhargav  * along with this program; if not, write to the Free Software
24*0c442298SAjay Bhargav  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
25*0c442298SAjay Bhargav  * MA 02110-1301 USA
26*0c442298SAjay Bhargav  */
27*0c442298SAjay Bhargav 
28*0c442298SAjay Bhargav #include <common.h>
29*0c442298SAjay Bhargav #include <asm/io.h>
30*0c442298SAjay Bhargav #include <asm/errno.h>
31*0c442298SAjay Bhargav #include "mvgpio.h"
32*0c442298SAjay Bhargav #include <asm/gpio.h>
33*0c442298SAjay Bhargav 
34*0c442298SAjay Bhargav #ifndef MV_MAX_GPIO
35*0c442298SAjay Bhargav #define MV_MAX_GPIO	128
36*0c442298SAjay Bhargav #endif
37*0c442298SAjay Bhargav 
38*0c442298SAjay Bhargav int gpio_request(int gp, const char *label)
39*0c442298SAjay Bhargav {
40*0c442298SAjay Bhargav 	if (gp >= MV_MAX_GPIO) {
41*0c442298SAjay Bhargav 		printf("%s: Invalid GPIO requested %d\n", __func__, gp);
42*0c442298SAjay Bhargav 		return -EINVAL;
43*0c442298SAjay Bhargav 	}
44*0c442298SAjay Bhargav 	return 0;
45*0c442298SAjay Bhargav }
46*0c442298SAjay Bhargav 
47*0c442298SAjay Bhargav void gpio_free(int gp)
48*0c442298SAjay Bhargav {
49*0c442298SAjay Bhargav }
50*0c442298SAjay Bhargav 
51*0c442298SAjay Bhargav void gpio_toggle_value(int gp)
52*0c442298SAjay Bhargav {
53*0c442298SAjay Bhargav 	gpio_set_value(gp, !gpio_get_value(gp));
54*0c442298SAjay Bhargav }
55*0c442298SAjay Bhargav 
56*0c442298SAjay Bhargav int gpio_direction_input(int gp)
57*0c442298SAjay Bhargav {
58*0c442298SAjay Bhargav 	struct gpio_reg *gpio_reg_bank;
59*0c442298SAjay Bhargav 
60*0c442298SAjay Bhargav 	if (gp >= MV_MAX_GPIO) {
61*0c442298SAjay Bhargav 		printf("%s: Invalid GPIO %d\n", __func__, gp);
62*0c442298SAjay Bhargav 		return -EINVAL;
63*0c442298SAjay Bhargav 	}
64*0c442298SAjay Bhargav 
65*0c442298SAjay Bhargav 	gpio_reg_bank = get_gpio_base(GPIO_TO_REG(gp));
66*0c442298SAjay Bhargav 	writel(GPIO_TO_BIT(gp), &gpio_reg_bank->gcdr);
67*0c442298SAjay Bhargav 	return 0;
68*0c442298SAjay Bhargav }
69*0c442298SAjay Bhargav 
70*0c442298SAjay Bhargav int gpio_direction_output(int gp, int value)
71*0c442298SAjay Bhargav {
72*0c442298SAjay Bhargav 	struct gpio_reg *gpio_reg_bank;
73*0c442298SAjay Bhargav 
74*0c442298SAjay Bhargav 	if (gp >= MV_MAX_GPIO) {
75*0c442298SAjay Bhargav 		printf("%s: Invalid GPIO %d\n", __func__, gp);
76*0c442298SAjay Bhargav 		return -EINVAL;
77*0c442298SAjay Bhargav 	}
78*0c442298SAjay Bhargav 
79*0c442298SAjay Bhargav 	gpio_reg_bank = get_gpio_base(GPIO_TO_REG(gp));
80*0c442298SAjay Bhargav 	writel(GPIO_TO_BIT(gp), &gpio_reg_bank->gsdr);
81*0c442298SAjay Bhargav 	gpio_set_value(gp, value);
82*0c442298SAjay Bhargav 	return 0;
83*0c442298SAjay Bhargav }
84*0c442298SAjay Bhargav 
85*0c442298SAjay Bhargav int gpio_get_value(int gp)
86*0c442298SAjay Bhargav {
87*0c442298SAjay Bhargav 	struct gpio_reg *gpio_reg_bank;
88*0c442298SAjay Bhargav 	u32 gp_val;
89*0c442298SAjay Bhargav 
90*0c442298SAjay Bhargav 	if (gp >= MV_MAX_GPIO) {
91*0c442298SAjay Bhargav 		printf("%s: Invalid GPIO %d\n", __func__, gp);
92*0c442298SAjay Bhargav 		return -EINVAL;
93*0c442298SAjay Bhargav 	}
94*0c442298SAjay Bhargav 
95*0c442298SAjay Bhargav 	gpio_reg_bank = get_gpio_base(GPIO_TO_REG(gp));
96*0c442298SAjay Bhargav 	gp_val = readl(&gpio_reg_bank->gplr);
97*0c442298SAjay Bhargav 
98*0c442298SAjay Bhargav 	return GPIO_VAL(gp, gp_val);
99*0c442298SAjay Bhargav }
100*0c442298SAjay Bhargav 
101*0c442298SAjay Bhargav void gpio_set_value(int gp, int value)
102*0c442298SAjay Bhargav {
103*0c442298SAjay Bhargav 	struct gpio_reg *gpio_reg_bank;
104*0c442298SAjay Bhargav 
105*0c442298SAjay Bhargav 	if (gp >= MV_MAX_GPIO) {
106*0c442298SAjay Bhargav 		printf("%s: Invalid GPIO %d\n", __func__, gp);
107*0c442298SAjay Bhargav 		return;
108*0c442298SAjay Bhargav 	}
109*0c442298SAjay Bhargav 
110*0c442298SAjay Bhargav 	gpio_reg_bank = get_gpio_base(GPIO_TO_REG(gp));
111*0c442298SAjay Bhargav 	if (value)
112*0c442298SAjay Bhargav 		writel(GPIO_TO_BIT(gp),	&gpio_reg_bank->gpsr);
113*0c442298SAjay Bhargav 	else
114*0c442298SAjay Bhargav 		writel(GPIO_TO_BIT(gp),	&gpio_reg_bank->gpcr);
115*0c442298SAjay Bhargav }
116