123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- /*
- * (C) Copyright 2012 Henrik Nordstrom <henrik@henriknordstrom.net>
- *
- * Based on earlier arch/arm/cpu/armv7/sunxi/gpio.c:
- *
- * (C) Copyright 2007-2011
- * Allwinner Technology Co., Ltd. <www.allwinnertech.com>
- * Tom Cubie <tangliang@allwinnertech.com>
- *
- * SPDX-License-Identifier: GPL-2.0+
- */
- #include <common.h>
- #include <asm/io.h>
- #include <asm/gpio.h>
- static int sunxi_gpio_output(u32 pin, u32 val)
- {
- u32 dat;
- u32 bank = GPIO_BANK(pin);
- u32 num = GPIO_NUM(pin);
- struct sunxi_gpio *pio = BANK_TO_GPIO(bank);
- dat = readl(&pio->dat);
- if (val)
- dat |= 0x1 << num;
- else
- dat &= ~(0x1 << num);
- writel(dat, &pio->dat);
- return 0;
- }
- static int sunxi_gpio_input(u32 pin)
- {
- u32 dat;
- u32 bank = GPIO_BANK(pin);
- u32 num = GPIO_NUM(pin);
- struct sunxi_gpio *pio = BANK_TO_GPIO(bank);
- dat = readl(&pio->dat);
- dat >>= num;
- return dat & 0x1;
- }
- int gpio_request(unsigned gpio, const char *label)
- {
- return 0;
- }
- int gpio_free(unsigned gpio)
- {
- return 0;
- }
- int gpio_direction_input(unsigned gpio)
- {
- sunxi_gpio_set_cfgpin(gpio, SUNXI_GPIO_INPUT);
- return sunxi_gpio_input(gpio);
- }
- int gpio_direction_output(unsigned gpio, int value)
- {
- sunxi_gpio_set_cfgpin(gpio, SUNXI_GPIO_OUTPUT);
- return sunxi_gpio_output(gpio, value);
- }
- int gpio_get_value(unsigned gpio)
- {
- return sunxi_gpio_input(gpio);
- }
- int gpio_set_value(unsigned gpio, int value)
- {
- return sunxi_gpio_output(gpio, value);
- }
- int sunxi_name_to_gpio(const char *name)
- {
- int group = 0;
- int groupsize = 9 * 32;
- long pin;
- char *eptr;
- if (*name == 'P' || *name == 'p')
- name++;
- if (*name >= 'A') {
- group = *name - (*name > 'a' ? 'a' : 'A');
- groupsize = 32;
- name++;
- }
- pin = simple_strtol(name, &eptr, 10);
- if (!*name || *eptr)
- return -1;
- if (pin < 0 || pin > groupsize || group >= 9)
- return -1;
- return group * 32 + pin;
- }
|