Files
system76-coreboot/src/cpu/ti/am335x/gpio.c
Martin Roth d57ace259a AUTHORS: Move src/cpu copyrights into AUTHORS file
As discussed on the mailing list and voted upon, the coreboot project
is going to move the majority of copyrights out of the headers and into
an AUTHORS file.  This will happen a bit at a time, as we'll be unifying
license headers at the same time.

Signed-off-by: Martin Roth <martin@coreboot.org>
Change-Id: Id6070fb586896653a1e44951a6af8f42f93b5a7b
Reviewed-on: https://review.coreboot.org/c/coreboot/+/35184
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Patrick Georgi <pgeorgi@google.com>
2019-09-10 12:51:22 +00:00

90 lines
2.1 KiB
C

/*
* This file is part of the coreboot project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include <device/mmio.h>
#include <console/console.h>
#include <cpu/ti/am335x/gpio.h>
#include <stdint.h>
static struct am335x_gpio_regs *gpio_regs_and_bit(unsigned int gpio,
uint32_t *bit)
{
unsigned int bank = gpio / AM335X_GPIO_BITS_PER_BANK;
if (bank >= ARRAY_SIZE(am335x_gpio_banks)) {
printk(BIOS_ERR, "Bad gpio index %d.\n", gpio);
return NULL;
}
*bit = 1 << (gpio % 32);
return am335x_gpio_banks[bank];
}
void am335x_disable_gpio_irqs(void)
{
int i;
for (i = 0; i < ARRAY_SIZE(am335x_gpio_banks); i++)
write32(&am335x_gpio_banks[i]->irqstatus_clr_0, 0xffffffff);
}
int gpio_direction_input(unsigned int gpio)
{
uint32_t bit;
struct am335x_gpio_regs *regs = gpio_regs_and_bit(gpio, &bit);
if (!regs)
return -1;
setbits_le32(&regs->oe, bit);
return 0;
}
int gpio_direction_output(unsigned int gpio, int value)
{
uint32_t bit;
struct am335x_gpio_regs *regs = gpio_regs_and_bit(gpio, &bit);
if (!regs)
return -1;
if (value)
write32(&regs->setdataout, bit);
else
write32(&regs->cleardataout, bit);
clrbits_le32(&regs->oe, bit);
return 0;
}
int gpio_get_value(unsigned int gpio)
{
uint32_t bit;
struct am335x_gpio_regs *regs = gpio_regs_and_bit(gpio, &bit);
if (!regs)
return -1;
return (read32(&regs->datain) & bit) ? 1 : 0;
}
int gpio_set_value(unsigned int gpio, int value)
{
uint32_t bit;
struct am335x_gpio_regs *regs = gpio_regs_and_bit(gpio, &bit);
if (!regs)
return -1;
if (value)
write32(&regs->setdataout, bit);
else
write32(&regs->cleardataout, bit);
return 0;
}