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