]> git.sur5r.net Git - u-boot/blob - drivers/gpio/spear_gpio.c
spi: mxc_spi: Fix chipselect on DM_SPI driver uclass
[u-boot] / drivers / gpio / spear_gpio.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (C) 2012 Stefan Roese <sr@denx.de>
4  */
5
6 /*
7  * Driver for SPEAr600 GPIO controller
8  */
9
10 #include <common.h>
11 #include <asm/arch/hardware.h>
12 #include <asm/gpio.h>
13 #include <asm/io.h>
14 #include <errno.h>
15
16 static int gpio_direction(unsigned gpio,
17                           enum gpio_direction direction)
18 {
19         struct gpio_regs *regs = (struct gpio_regs *)CONFIG_GPIO_BASE;
20         u32 val;
21
22         val = readl(&regs->gpiodir);
23
24         if (direction == GPIO_DIRECTION_OUT)
25                 val |= 1 << gpio;
26         else
27                 val &= ~(1 << gpio);
28
29         writel(val, &regs->gpiodir);
30
31         return 0;
32 }
33
34 int gpio_set_value(unsigned gpio, int value)
35 {
36         struct gpio_regs *regs = (struct gpio_regs *)CONFIG_GPIO_BASE;
37
38         if (value)
39                 writel(1 << gpio, &regs->gpiodata[DATA_REG_ADDR(gpio)]);
40         else
41                 writel(0, &regs->gpiodata[DATA_REG_ADDR(gpio)]);
42
43         return 0;
44 }
45
46 int gpio_get_value(unsigned gpio)
47 {
48         struct gpio_regs *regs = (struct gpio_regs *)CONFIG_GPIO_BASE;
49         u32 val;
50
51         val = readl(&regs->gpiodata[DATA_REG_ADDR(gpio)]);
52
53         return !!val;
54 }
55
56 int gpio_request(unsigned gpio, const char *label)
57 {
58         if (gpio >= SPEAR_GPIO_COUNT)
59                 return -EINVAL;
60
61         return 0;
62 }
63
64 int gpio_free(unsigned gpio)
65 {
66         return 0;
67 }
68
69 void gpio_toggle_value(unsigned gpio)
70 {
71         gpio_set_value(gpio, !gpio_get_value(gpio));
72 }
73
74 int gpio_direction_input(unsigned gpio)
75 {
76         return gpio_direction(gpio, GPIO_DIRECTION_IN);
77 }
78
79 int gpio_direction_output(unsigned gpio, int value)
80 {
81         int ret = gpio_direction(gpio, GPIO_DIRECTION_OUT);
82
83         if (ret < 0)
84                 return ret;
85
86         gpio_set_value(gpio, value);
87         return 0;
88 }