10c442298SAjay Bhargav /*
20c442298SAjay Bhargav * (C) Copyright 2011
30c442298SAjay Bhargav * eInfochips Ltd. <www.einfochips.com>
4*c7c47ca2SAjay Bhargav * Written-by: Ajay Bhargav <contact@8051projects.net>
50c442298SAjay Bhargav *
60c442298SAjay Bhargav * (C) Copyright 2010
70c442298SAjay Bhargav * Marvell Semiconductor <www.marvell.com>
80c442298SAjay Bhargav *
91a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+
100c442298SAjay Bhargav */
110c442298SAjay Bhargav
120c442298SAjay Bhargav #include <common.h>
130c442298SAjay Bhargav #include <asm/io.h>
141221ce45SMasahiro Yamada #include <linux/errno.h>
150c442298SAjay Bhargav #include "mvgpio.h"
160c442298SAjay Bhargav #include <asm/gpio.h>
170c442298SAjay Bhargav
180c442298SAjay Bhargav #ifndef MV_MAX_GPIO
190c442298SAjay Bhargav #define MV_MAX_GPIO 128
200c442298SAjay Bhargav #endif
210c442298SAjay Bhargav
gpio_request(unsigned gpio,const char * label)22365d6070SJoe Hershberger int gpio_request(unsigned gpio, const char *label)
230c442298SAjay Bhargav {
24365d6070SJoe Hershberger if (gpio >= MV_MAX_GPIO) {
25365d6070SJoe Hershberger printf("%s: Invalid GPIO requested %d\n", __func__, gpio);
26365d6070SJoe Hershberger return -1;
270c442298SAjay Bhargav }
280c442298SAjay Bhargav return 0;
290c442298SAjay Bhargav }
300c442298SAjay Bhargav
gpio_free(unsigned gpio)31365d6070SJoe Hershberger int gpio_free(unsigned gpio)
320c442298SAjay Bhargav {
330c442298SAjay Bhargav return 0;
340c442298SAjay Bhargav }
350c442298SAjay Bhargav
gpio_direction_input(unsigned gpio)36365d6070SJoe Hershberger int gpio_direction_input(unsigned gpio)
370c442298SAjay Bhargav {
380c442298SAjay Bhargav struct gpio_reg *gpio_reg_bank;
390c442298SAjay Bhargav
40365d6070SJoe Hershberger if (gpio >= MV_MAX_GPIO) {
41365d6070SJoe Hershberger printf("%s: Invalid GPIO %d\n", __func__, gpio);
42365d6070SJoe Hershberger return -1;
430c442298SAjay Bhargav }
440c442298SAjay Bhargav
45365d6070SJoe Hershberger gpio_reg_bank = get_gpio_base(GPIO_TO_REG(gpio));
46365d6070SJoe Hershberger writel(GPIO_TO_BIT(gpio), &gpio_reg_bank->gcdr);
470c442298SAjay Bhargav return 0;
480c442298SAjay Bhargav }
490c442298SAjay Bhargav
gpio_direction_output(unsigned gpio,int value)50365d6070SJoe Hershberger int gpio_direction_output(unsigned gpio, int value)
510c442298SAjay Bhargav {
520c442298SAjay Bhargav struct gpio_reg *gpio_reg_bank;
530c442298SAjay Bhargav
54365d6070SJoe Hershberger if (gpio >= MV_MAX_GPIO) {
55365d6070SJoe Hershberger printf("%s: Invalid GPIO %d\n", __func__, gpio);
56365d6070SJoe Hershberger return -1;
570c442298SAjay Bhargav }
580c442298SAjay Bhargav
59365d6070SJoe Hershberger gpio_reg_bank = get_gpio_base(GPIO_TO_REG(gpio));
60365d6070SJoe Hershberger writel(GPIO_TO_BIT(gpio), &gpio_reg_bank->gsdr);
61365d6070SJoe Hershberger gpio_set_value(gpio, value);
62365d6070SJoe Hershberger return 0;
63365d6070SJoe Hershberger }
64365d6070SJoe Hershberger
gpio_get_value(unsigned gpio)65365d6070SJoe Hershberger int gpio_get_value(unsigned gpio)
66365d6070SJoe Hershberger {
67365d6070SJoe Hershberger struct gpio_reg *gpio_reg_bank;
68365d6070SJoe Hershberger u32 gpio_val;
69365d6070SJoe Hershberger
70365d6070SJoe Hershberger if (gpio >= MV_MAX_GPIO) {
71365d6070SJoe Hershberger printf("%s: Invalid GPIO %d\n", __func__, gpio);
72365d6070SJoe Hershberger return -1;
73365d6070SJoe Hershberger }
74365d6070SJoe Hershberger
75365d6070SJoe Hershberger gpio_reg_bank = get_gpio_base(GPIO_TO_REG(gpio));
76365d6070SJoe Hershberger gpio_val = readl(&gpio_reg_bank->gplr);
77365d6070SJoe Hershberger
78365d6070SJoe Hershberger return GPIO_VAL(gpio, gpio_val);
79365d6070SJoe Hershberger }
80365d6070SJoe Hershberger
gpio_set_value(unsigned gpio,int value)81365d6070SJoe Hershberger int gpio_set_value(unsigned gpio, int value)
82365d6070SJoe Hershberger {
83365d6070SJoe Hershberger struct gpio_reg *gpio_reg_bank;
84365d6070SJoe Hershberger
85365d6070SJoe Hershberger if (gpio >= MV_MAX_GPIO) {
86365d6070SJoe Hershberger printf("%s: Invalid GPIO %d\n", __func__, gpio);
87365d6070SJoe Hershberger return -1;
88365d6070SJoe Hershberger }
89365d6070SJoe Hershberger
90365d6070SJoe Hershberger gpio_reg_bank = get_gpio_base(GPIO_TO_REG(gpio));
910c442298SAjay Bhargav if (value)
92365d6070SJoe Hershberger writel(GPIO_TO_BIT(gpio), &gpio_reg_bank->gpsr);
930c442298SAjay Bhargav else
94365d6070SJoe Hershberger writel(GPIO_TO_BIT(gpio), &gpio_reg_bank->gpcr);
95365d6070SJoe Hershberger
96365d6070SJoe Hershberger return 0;
970c442298SAjay Bhargav }
98