uboot/drivers/gpio/spear_gpio.c
<<
>>
Prefs
   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
  16static 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
  34int 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
  46int 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
  56int gpio_request(unsigned gpio, const char *label)
  57{
  58        if (gpio >= SPEAR_GPIO_COUNT)
  59                return -EINVAL;
  60
  61        return 0;
  62}
  63
  64int gpio_free(unsigned gpio)
  65{
  66        return 0;
  67}
  68
  69void gpio_toggle_value(unsigned gpio)
  70{
  71        gpio_set_value(gpio, !gpio_get_value(gpio));
  72}
  73
  74int gpio_direction_input(unsigned gpio)
  75{
  76        return gpio_direction(gpio, GPIO_DIRECTION_IN);
  77}
  78
  79int 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}
  89