1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3 * (C) Copyright 2011
4 * eInfochips Ltd. <www.einfochips.com>
5 * Written-by: Ajay Bhargav <contact@8051projects.net>
6 *
7 * (C) Copyright 2010
8 * Marvell Semiconductor <www.marvell.com>
9 */
10
11 #include <common.h>
12 #include <asm/io.h>
13 #include <linux/errno.h>
14 #include "mvgpio.h"
15 #include <asm/gpio.h>
16
17 #ifndef MV_MAX_GPIO
18 #define MV_MAX_GPIO 128
19 #endif
20
gpio_request(unsigned gpio,const char * label)21 int gpio_request(unsigned gpio, const char *label)
22 {
23 if (gpio >= MV_MAX_GPIO) {
24 printf("%s: Invalid GPIO requested %d\n", __func__, gpio);
25 return -1;
26 }
27 return 0;
28 }
29
gpio_free(unsigned gpio)30 int gpio_free(unsigned gpio)
31 {
32 return 0;
33 }
34
gpio_direction_input(unsigned gpio)35 int gpio_direction_input(unsigned gpio)
36 {
37 struct gpio_reg *gpio_reg_bank;
38
39 if (gpio >= MV_MAX_GPIO) {
40 printf("%s: Invalid GPIO %d\n", __func__, gpio);
41 return -1;
42 }
43
44 gpio_reg_bank = get_gpio_base(GPIO_TO_REG(gpio));
45 writel(GPIO_TO_BIT(gpio), &gpio_reg_bank->gcdr);
46 return 0;
47 }
48
gpio_direction_output(unsigned gpio,int value)49 int gpio_direction_output(unsigned gpio, int value)
50 {
51 struct gpio_reg *gpio_reg_bank;
52
53 if (gpio >= MV_MAX_GPIO) {
54 printf("%s: Invalid GPIO %d\n", __func__, gpio);
55 return -1;
56 }
57
58 gpio_reg_bank = get_gpio_base(GPIO_TO_REG(gpio));
59 writel(GPIO_TO_BIT(gpio), &gpio_reg_bank->gsdr);
60 gpio_set_value(gpio, value);
61 return 0;
62 }
63
gpio_get_value(unsigned gpio)64 int gpio_get_value(unsigned gpio)
65 {
66 struct gpio_reg *gpio_reg_bank;
67 u32 gpio_val;
68
69 if (gpio >= MV_MAX_GPIO) {
70 printf("%s: Invalid GPIO %d\n", __func__, gpio);
71 return -1;
72 }
73
74 gpio_reg_bank = get_gpio_base(GPIO_TO_REG(gpio));
75 gpio_val = readl(&gpio_reg_bank->gplr);
76
77 return GPIO_VAL(gpio, gpio_val);
78 }
79
gpio_set_value(unsigned gpio,int value)80 int gpio_set_value(unsigned gpio, int value)
81 {
82 struct gpio_reg *gpio_reg_bank;
83
84 if (gpio >= MV_MAX_GPIO) {
85 printf("%s: Invalid GPIO %d\n", __func__, gpio);
86 return -1;
87 }
88
89 gpio_reg_bank = get_gpio_base(GPIO_TO_REG(gpio));
90 if (value)
91 writel(GPIO_TO_BIT(gpio), &gpio_reg_bank->gpsr);
92 else
93 writel(GPIO_TO_BIT(gpio), &gpio_reg_bank->gpcr);
94
95 return 0;
96 }
97