• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
3 #include <device/mmio.h>
4 #include <console/console.h>
5 #include <soc/ti/am335x/gpio.h>
6 #include <stdint.h>
7 
gpio_regs_and_bit(unsigned int gpio,uint32_t * bit)8 static struct am335x_gpio_regs *gpio_regs_and_bit(unsigned int gpio,
9 						  uint32_t *bit)
10 {
11 	unsigned int bank = gpio / AM335X_GPIO_BITS_PER_BANK;
12 
13 	if (bank >= ARRAY_SIZE(am335x_gpio_banks)) {
14 		printk(BIOS_ERR, "Bad gpio index %d.\n", gpio);
15 		return NULL;
16 	}
17 	*bit = 1 << (gpio % 32);
18 	return am335x_gpio_banks[bank];
19 }
20 
am335x_disable_gpio_irqs(void)21 void am335x_disable_gpio_irqs(void)
22 {
23 	int i;
24 
25 	for (i = 0; i < ARRAY_SIZE(am335x_gpio_banks); i++)
26 		write32(&am335x_gpio_banks[i]->irqstatus_clr_0, 0xffffffff);
27 }
28 
gpio_direction_input(unsigned int gpio)29 int gpio_direction_input(unsigned int gpio)
30 {
31 	uint32_t bit;
32 	struct am335x_gpio_regs *regs = gpio_regs_and_bit(gpio, &bit);
33 
34 	if (!regs)
35 		return -1;
36 	setbits32(&regs->oe, bit);
37 	return 0;
38 }
39 
gpio_direction_output(unsigned int gpio,int value)40 int gpio_direction_output(unsigned int gpio, int value)
41 {
42 	uint32_t bit;
43 	struct am335x_gpio_regs *regs = gpio_regs_and_bit(gpio, &bit);
44 
45 	if (!regs)
46 		return -1;
47 	if (value)
48 		write32(&regs->setdataout, bit);
49 	else
50 		write32(&regs->cleardataout, bit);
51 	clrbits32(&regs->oe, bit);
52 	return 0;
53 }
54 
gpio_get_value(unsigned int gpio)55 int gpio_get_value(unsigned int gpio)
56 {
57 	uint32_t bit;
58 	struct am335x_gpio_regs *regs = gpio_regs_and_bit(gpio, &bit);
59 
60 	if (!regs)
61 		return -1;
62 	return (read32(&regs->datain) & bit) ? 1 : 0;
63 }
64 
gpio_set_value(unsigned int gpio,int value)65 int gpio_set_value(unsigned int gpio, int value)
66 {
67 	uint32_t bit;
68 	struct am335x_gpio_regs *regs = gpio_regs_and_bit(gpio, &bit);
69 
70 	if (!regs)
71 		return -1;
72 	if (value)
73 		write32(&regs->setdataout, bit);
74 	else
75 		write32(&regs->cleardataout, bit);
76 	return 0;
77 }
78