Lines Matching +full:- +full:gpio +full:- +full:bank
1 // SPDX-License-Identifier: GPL-2.0
8 * git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
13 * linux/arch/arm/plat-omap/gpio.c
15 * Support functions for OMAP GPIO
17 * Copyright (C) 2003-2005 Nokia Corporation
23 #include <asm/gpio.h>
44 static inline int get_gpio_index(int gpio) in get_gpio_index() argument
46 return gpio & 0x1f; in get_gpio_index()
49 int gpio_is_valid(int gpio) in gpio_is_valid() argument
51 return (gpio >= 0) && (gpio < OMAP_MAX_GPIO); in gpio_is_valid()
54 static void _set_gpio_direction(const struct gpio_bank *bank, int gpio, in _set_gpio_direction() argument
57 void *reg = bank->base; in _set_gpio_direction()
64 l |= 1 << gpio; in _set_gpio_direction()
66 l &= ~(1 << gpio); in _set_gpio_direction()
71 * Get the direction of the GPIO by reading the GPIO_OE register
72 * corresponding to the specified bank.
74 static int _get_gpio_direction(const struct gpio_bank *bank, int gpio) in _get_gpio_direction() argument
76 void *reg = bank->base; in _get_gpio_direction()
83 if (v & (1 << gpio)) in _get_gpio_direction()
89 static void _set_gpio_dataout(const struct gpio_bank *bank, int gpio, in _set_gpio_dataout() argument
92 void *reg = bank->base; in _set_gpio_dataout()
100 l = 1 << gpio; in _set_gpio_dataout()
104 static int _get_gpio_value(const struct gpio_bank *bank, int gpio) in _get_gpio_value() argument
106 void *reg = bank->base; in _get_gpio_value()
109 input = _get_gpio_direction(bank, gpio); in _get_gpio_value()
118 return -1; in _get_gpio_value()
121 return (__raw_readl(reg) & (1 << gpio)) != 0; in _get_gpio_value()
126 static inline const struct gpio_bank *get_gpio_bank(int gpio) in get_gpio_bank() argument
128 return &omap_gpio_bank[gpio >> 5]; in get_gpio_bank()
131 static int check_gpio(int gpio) in check_gpio() argument
133 if (!gpio_is_valid(gpio)) { in check_gpio()
134 printf("ERROR : check_gpio: invalid GPIO %d\n", gpio); in check_gpio()
135 return -1; in check_gpio()
141 * Set value of the specified gpio
143 int gpio_set_value(unsigned gpio, int value) in gpio_set_value() argument
145 const struct gpio_bank *bank; in gpio_set_value() local
147 if (check_gpio(gpio) < 0) in gpio_set_value()
148 return -1; in gpio_set_value()
149 bank = get_gpio_bank(gpio); in gpio_set_value()
150 _set_gpio_dataout(bank, get_gpio_index(gpio), value); in gpio_set_value()
156 * Get value of the specified gpio
158 int gpio_get_value(unsigned gpio) in gpio_get_value() argument
160 const struct gpio_bank *bank; in gpio_get_value() local
162 if (check_gpio(gpio) < 0) in gpio_get_value()
163 return -1; in gpio_get_value()
164 bank = get_gpio_bank(gpio); in gpio_get_value()
166 return _get_gpio_value(bank, get_gpio_index(gpio)); in gpio_get_value()
170 * Set gpio direction as input
172 int gpio_direction_input(unsigned gpio) in gpio_direction_input() argument
174 const struct gpio_bank *bank; in gpio_direction_input() local
176 if (check_gpio(gpio) < 0) in gpio_direction_input()
177 return -1; in gpio_direction_input()
179 bank = get_gpio_bank(gpio); in gpio_direction_input()
180 _set_gpio_direction(bank, get_gpio_index(gpio), 1); in gpio_direction_input()
186 * Set gpio direction as output
188 int gpio_direction_output(unsigned gpio, int value) in gpio_direction_output() argument
190 const struct gpio_bank *bank; in gpio_direction_output() local
192 if (check_gpio(gpio) < 0) in gpio_direction_output()
193 return -1; in gpio_direction_output()
195 bank = get_gpio_bank(gpio); in gpio_direction_output()
196 _set_gpio_dataout(bank, get_gpio_index(gpio), value); in gpio_direction_output()
197 _set_gpio_direction(bank, get_gpio_index(gpio), 0); in gpio_direction_output()
203 * Request a gpio before using it.
207 int gpio_request(unsigned gpio, const char *label) in gpio_request() argument
209 if (check_gpio(gpio) < 0) in gpio_request()
210 return -1; in gpio_request()
216 * Reset and free the gpio after using it.
218 int gpio_free(unsigned gpio) in gpio_free() argument
225 /* set GPIO pin 'gpio' as an input */
228 struct gpio_bank *bank = dev_get_priv(dev); in omap_gpio_direction_input() local
230 /* Configure GPIO direction as input. */ in omap_gpio_direction_input()
231 _set_gpio_direction(bank, offset, 1); in omap_gpio_direction_input()
236 /* set GPIO pin 'gpio' as an output, with polarity 'value' */
240 struct gpio_bank *bank = dev_get_priv(dev); in omap_gpio_direction_output() local
242 _set_gpio_dataout(bank, offset, value); in omap_gpio_direction_output()
243 _set_gpio_direction(bank, offset, 0); in omap_gpio_direction_output()
248 /* read GPIO IN value of pin 'gpio' */
251 struct gpio_bank *bank = dev_get_priv(dev); in omap_gpio_get_value() local
253 return _get_gpio_value(bank, offset); in omap_gpio_get_value()
256 /* write GPIO OUT value to pin 'gpio' */
260 struct gpio_bank *bank = dev_get_priv(dev); in omap_gpio_set_value() local
262 _set_gpio_dataout(bank, offset, value); in omap_gpio_set_value()
269 struct gpio_bank *bank = dev_get_priv(dev); in omap_gpio_get_function() local
272 if (_get_gpio_direction(bank, offset) == OMAP_GPIO_DIR_OUT) in omap_gpio_get_function()
288 struct gpio_bank *bank = dev_get_priv(dev); in omap_gpio_probe() local
293 sprintf(name, "gpio@%4x_", (unsigned int)plat->base); in omap_gpio_probe()
296 return -ENOMEM; in omap_gpio_probe()
297 uc_priv->bank_name = str; in omap_gpio_probe()
298 uc_priv->gpio_count = GPIO_PER_BANK; in omap_gpio_probe()
299 bank->base = (void *)plat->base; in omap_gpio_probe()
314 return -EINVAL; in omap_gpio_bind()
319 * supported, this can be done by auto-alloc feature, but in omap_gpio_bind()
328 return -ENOMEM; in omap_gpio_bind()
330 plat->base = base_addr; in omap_gpio_bind()
331 plat->port_name = fdt_get_name(gd->fdt_blob, dev_of_offset(dev), NULL); in omap_gpio_bind()
332 dev->platdata = plat; in omap_gpio_bind()
340 { .compatible = "ti,omap3-gpio" },
341 { .compatible = "ti,omap4-gpio" },
342 { .compatible = "ti,am4372-gpio" },
353 return -EINVAL; in omap_gpio_ofdata_to_platdata()
355 plat->base = addr; in omap_gpio_ofdata_to_platdata()