xref: /openbmc/u-boot/drivers/gpio/mvgpio.c (revision e8f80a5a)
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