blob: c80891cd505220a6fb7d14c1b5465550ebd331e7 [file] [log] [blame]
Ajay Bhargavf56ba5d2011-08-22 17:57:38 +05301/*
2 * (C) Copyright 2011
3 * eInfochips Ltd. <www.einfochips.com>
4 * Written-by: Ajay Bhargav <ajay.bhargav@einfochips.com>
5 *
6 * (C) Copyright 2010
7 * Marvell Semiconductor <www.marvell.com>
8 *
9 * See file CREDITS for list of people who contributed to this
10 * project.
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License as
14 * published by the Free Software Foundation; either version 2 of
15 * the License, or (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
25 * MA 02110-1301 USA
26 */
27
28#include <common.h>
29#include <asm/io.h>
30#include <asm/errno.h>
31#include "mvgpio.h"
32#include <asm/gpio.h>
33
34#ifndef MV_MAX_GPIO
35#define MV_MAX_GPIO 128
36#endif
37
Joe Hershbergerf8928f12011-11-11 15:55:36 -060038int gpio_request(unsigned gpio, const char *label)
Ajay Bhargavf56ba5d2011-08-22 17:57:38 +053039{
Joe Hershbergerf8928f12011-11-11 15:55:36 -060040 if (gpio >= MV_MAX_GPIO) {
41 printf("%s: Invalid GPIO requested %d\n", __func__, gpio);
42 return -1;
Ajay Bhargavf56ba5d2011-08-22 17:57:38 +053043 }
44 return 0;
45}
46
Joe Hershbergerf8928f12011-11-11 15:55:36 -060047int gpio_free(unsigned gpio)
Ajay Bhargavf56ba5d2011-08-22 17:57:38 +053048{
Joe Hershbergerf8928f12011-11-11 15:55:36 -060049 return 0;
Ajay Bhargavf56ba5d2011-08-22 17:57:38 +053050}
51
Joe Hershbergerf8928f12011-11-11 15:55:36 -060052int gpio_direction_input(unsigned gpio)
Ajay Bhargavf56ba5d2011-08-22 17:57:38 +053053{
54 struct gpio_reg *gpio_reg_bank;
55
Joe Hershbergerf8928f12011-11-11 15:55:36 -060056 if (gpio >= MV_MAX_GPIO) {
57 printf("%s: Invalid GPIO %d\n", __func__, gpio);
58 return -1;
Ajay Bhargavf56ba5d2011-08-22 17:57:38 +053059 }
60
Joe Hershbergerf8928f12011-11-11 15:55:36 -060061 gpio_reg_bank = get_gpio_base(GPIO_TO_REG(gpio));
62 writel(GPIO_TO_BIT(gpio), &gpio_reg_bank->gcdr);
Ajay Bhargavf56ba5d2011-08-22 17:57:38 +053063 return 0;
64}
65
Joe Hershbergerf8928f12011-11-11 15:55:36 -060066int gpio_direction_output(unsigned gpio, int value)
Ajay Bhargavf56ba5d2011-08-22 17:57:38 +053067{
68 struct gpio_reg *gpio_reg_bank;
69
Joe Hershbergerf8928f12011-11-11 15:55:36 -060070 if (gpio >= MV_MAX_GPIO) {
71 printf("%s: Invalid GPIO %d\n", __func__, gpio);
72 return -1;
Ajay Bhargavf56ba5d2011-08-22 17:57:38 +053073 }
74
Joe Hershbergerf8928f12011-11-11 15:55:36 -060075 gpio_reg_bank = get_gpio_base(GPIO_TO_REG(gpio));
76 writel(GPIO_TO_BIT(gpio), &gpio_reg_bank->gsdr);
77 gpio_set_value(gpio, value);
Ajay Bhargavf56ba5d2011-08-22 17:57:38 +053078 return 0;
79}
80
Joe Hershbergerf8928f12011-11-11 15:55:36 -060081int gpio_get_value(unsigned gpio)
Ajay Bhargavf56ba5d2011-08-22 17:57:38 +053082{
83 struct gpio_reg *gpio_reg_bank;
Joe Hershbergerf8928f12011-11-11 15:55:36 -060084 u32 gpio_val;
Ajay Bhargavf56ba5d2011-08-22 17:57:38 +053085
Joe Hershbergerf8928f12011-11-11 15:55:36 -060086 if (gpio >= MV_MAX_GPIO) {
87 printf("%s: Invalid GPIO %d\n", __func__, gpio);
88 return -1;
Ajay Bhargavf56ba5d2011-08-22 17:57:38 +053089 }
90
Joe Hershbergerf8928f12011-11-11 15:55:36 -060091 gpio_reg_bank = get_gpio_base(GPIO_TO_REG(gpio));
92 gpio_val = readl(&gpio_reg_bank->gplr);
Ajay Bhargavf56ba5d2011-08-22 17:57:38 +053093
Joe Hershbergerf8928f12011-11-11 15:55:36 -060094 return GPIO_VAL(gpio, gpio_val);
Ajay Bhargavf56ba5d2011-08-22 17:57:38 +053095}
96
Joe Hershbergerf8928f12011-11-11 15:55:36 -060097int gpio_set_value(unsigned gpio, int value)
Ajay Bhargavf56ba5d2011-08-22 17:57:38 +053098{
99 struct gpio_reg *gpio_reg_bank;
100
Joe Hershbergerf8928f12011-11-11 15:55:36 -0600101 if (gpio >= MV_MAX_GPIO) {
102 printf("%s: Invalid GPIO %d\n", __func__, gpio);
103 return -1;
Ajay Bhargavf56ba5d2011-08-22 17:57:38 +0530104 }
105
Joe Hershbergerf8928f12011-11-11 15:55:36 -0600106 gpio_reg_bank = get_gpio_base(GPIO_TO_REG(gpio));
Ajay Bhargavf56ba5d2011-08-22 17:57:38 +0530107 if (value)
Joe Hershbergerf8928f12011-11-11 15:55:36 -0600108 writel(GPIO_TO_BIT(gpio), &gpio_reg_bank->gpsr);
Ajay Bhargavf56ba5d2011-08-22 17:57:38 +0530109 else
Joe Hershbergerf8928f12011-11-11 15:55:36 -0600110 writel(GPIO_TO_BIT(gpio), &gpio_reg_bank->gpcr);
111
112 return 0;
Ajay Bhargavf56ba5d2011-08-22 17:57:38 +0530113}