diff options
Diffstat (limited to 'drivers/gpio')
-rw-r--r-- | drivers/gpio/Kconfig | 18 | ||||
-rw-r--r-- | drivers/gpio/Makefile | 1 | ||||
-rw-r--r-- | drivers/gpio/pca953x.c | 8 | ||||
-rw-r--r-- | drivers/gpio/stm32_gpio.c | 94 | ||||
-rw-r--r-- | drivers/gpio/sx151x.c | 242 |
5 files changed, 18 insertions, 345 deletions
diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig index 63951e0dbe..ffeda9425a 100644 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig @@ -109,6 +109,15 @@ config OMAP_GPIO Support GPIO controllers on the TI OMAP3/4/5 and related (such as AM335x/AM43xx/AM57xx/DRA7xx/etc) families of SoCs. +config CMD_PCA953X + bool "Enable the pca953x command" + help + Deprecated: This should be converted to driver model. + + This command provides access to a pca953x GPIO device using the + legacy GPIO interface. Several subcommands are provided which mirror + the standard 'gpio' command. It should use that instead. + config PM8916_GPIO bool "Qualcomm PM8916 PMIC GPIO/keypad driver" depends on DM_GPIO && PMIC_PM8916 @@ -156,6 +165,15 @@ config SANDBOX_GPIO_COUNT of 'anonymous' GPIOs that do not belong to any device or bank. Select a suitable value depending on your needs. +config CMD_TCA642X + bool "tca642x - Command to access tca642x state" + help + DEPRECATED - This needs conversion to driver model + + This provides a way to looking at the pin state of this device. + This mirrors the 'gpio' command and that should be used in preference + to custom code. + config TEGRA_GPIO bool "Tegra20..210 GPIO driver" depends on DM_GPIO diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile index 8937e99b47..1396467ab6 100644 --- a/drivers/gpio/Makefile +++ b/drivers/gpio/Makefile @@ -45,7 +45,6 @@ obj-$(CONFIG_BCM2835_GPIO) += bcm2835_gpio.o obj-$(CONFIG_XILINX_GPIO) += xilinx_gpio.o obj-$(CONFIG_ADI_GPIO2) += adi_gpio2.o obj-$(CONFIG_TCA642X) += tca642x.o -oby-$(CONFIG_SX151X) += sx151x.o obj-$(CONFIG_SUNXI_GPIO) += sunxi_gpio.o obj-$(CONFIG_LPC32XX_GPIO) += lpc32xx_gpio.o obj-$(CONFIG_STM32_GPIO) += stm32_gpio.o diff --git a/drivers/gpio/pca953x.c b/drivers/gpio/pca953x.c index 238e02805c..d1c1ae1411 100644 --- a/drivers/gpio/pca953x.c +++ b/drivers/gpio/pca953x.c @@ -143,7 +143,6 @@ int pca953x_get_val(uint8_t chip) } #ifdef CONFIG_CMD_PCA953X -#ifdef CONFIG_CMD_PCA953X_INFO /* * Display pca953x information */ @@ -193,16 +192,13 @@ static int pca953x_info(uint8_t chip) return 0; } -#endif /* CONFIG_CMD_PCA953X_INFO */ cmd_tbl_t cmd_pca953x[] = { U_BOOT_CMD_MKENT(device, 3, 0, (void *)PCA953X_CMD_DEVICE, "", ""), U_BOOT_CMD_MKENT(output, 4, 0, (void *)PCA953X_CMD_OUTPUT, "", ""), U_BOOT_CMD_MKENT(input, 3, 0, (void *)PCA953X_CMD_INPUT, "", ""), U_BOOT_CMD_MKENT(invert, 4, 0, (void *)PCA953X_CMD_INVERT, "", ""), -#ifdef CONFIG_CMD_PCA953X_INFO U_BOOT_CMD_MKENT(info, 2, 0, (void *)PCA953X_CMD_INFO, "", ""), -#endif }; int do_pca953x(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) @@ -231,13 +227,11 @@ int do_pca953x(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) ul_arg3 = simple_strtoul(argv[3], NULL, 16) & 0x1; switch ((long)c->cmd) { -#ifdef CONFIG_CMD_PCA953X_INFO case PCA953X_CMD_INFO: ret = pca953x_info(chip); if (ret) ret = CMD_RET_FAILURE; break; -#endif case PCA953X_CMD_DEVICE: if (argc == 3) @@ -287,10 +281,8 @@ U_BOOT_CMD( "pca953x gpio access", "device [dev]\n" " - show or set current device address\n" -#ifdef CONFIG_CMD_PCA953X_INFO "pca953x info\n" " - display info for current chip\n" -#endif "pca953x output pin 0|1\n" " - set pin as output and drive low or high\n" "pca953x invert pin 0|1\n" diff --git a/drivers/gpio/stm32_gpio.c b/drivers/gpio/stm32_gpio.c index ff245db91d..c04cef4cb9 100644 --- a/drivers/gpio/stm32_gpio.c +++ b/drivers/gpio/stm32_gpio.c @@ -19,7 +19,6 @@ DECLARE_GLOBAL_DATA_PTR; -#if defined(CONFIG_STM32F4) || defined(CONFIG_STM32F7) static const unsigned long io_base[] = { STM32_GPIOA_BASE, STM32_GPIOB_BASE, STM32_GPIOC_BASE, STM32_GPIOD_BASE, STM32_GPIOE_BASE, STM32_GPIOF_BASE, @@ -74,81 +73,6 @@ int stm32_gpio_config(const struct stm32_gpio_dsc *dsc, out: return rv; } -#elif defined(CONFIG_STM32F1) -static const unsigned long io_base[] = { - STM32_GPIOA_BASE, STM32_GPIOB_BASE, STM32_GPIOC_BASE, - STM32_GPIOD_BASE, STM32_GPIOE_BASE, STM32_GPIOF_BASE, - STM32_GPIOG_BASE -}; - -#define STM32_GPIO_CR_MODE_MASK 0x3 -#define STM32_GPIO_CR_MODE_SHIFT(p) (p * 4) -#define STM32_GPIO_CR_CNF_MASK 0x3 -#define STM32_GPIO_CR_CNF_SHIFT(p) (p * 4 + 2) - -struct stm32_gpio_regs { - u32 crl; /* GPIO port configuration low */ - u32 crh; /* GPIO port configuration high */ - u32 idr; /* GPIO port input data */ - u32 odr; /* GPIO port output data */ - u32 bsrr; /* GPIO port bit set/reset */ - u32 brr; /* GPIO port bit reset */ - u32 lckr; /* GPIO port configuration lock */ -}; - -#define CHECK_DSC(x) (!x || x->port > 6 || x->pin > 15) -#define CHECK_CTL(x) (!x || x->mode > 3 || x->icnf > 3 || x->ocnf > 3 || \ - x->pupd > 1) - -int stm32_gpio_config(const struct stm32_gpio_dsc *dsc, - const struct stm32_gpio_ctl *ctl) -{ - struct stm32_gpio_regs *gpio_regs; - u32 *cr; - int p, crp; - int rv; - - if (CHECK_DSC(dsc)) { - rv = -EINVAL; - goto out; - } - if (CHECK_CTL(ctl)) { - rv = -EINVAL; - goto out; - } - - p = dsc->pin; - - gpio_regs = (struct stm32_gpio_regs *)io_base[dsc->port]; - - if (p < 8) { - cr = &gpio_regs->crl; - crp = p; - } else { - cr = &gpio_regs->crh; - crp = p - 8; - } - - clrbits_le32(cr, 0x3 << STM32_GPIO_CR_MODE_SHIFT(crp)); - setbits_le32(cr, ctl->mode << STM32_GPIO_CR_MODE_SHIFT(crp)); - - clrbits_le32(cr, 0x3 << STM32_GPIO_CR_CNF_SHIFT(crp)); - /* Inputs set the optional pull up / pull down */ - if (ctl->mode == STM32_GPIO_MODE_IN) { - setbits_le32(cr, ctl->icnf << STM32_GPIO_CR_CNF_SHIFT(crp)); - clrbits_le32(&gpio_regs->odr, 0x1 << p); - setbits_le32(&gpio_regs->odr, ctl->pupd << p); - } else { - setbits_le32(cr, ctl->ocnf << STM32_GPIO_CR_CNF_SHIFT(crp)); - } - - rv = 0; -out: - return rv; -} -#else -#error STM32 family not supported -#endif int stm32_gpout_set(const struct stm32_gpio_dsc *dsc, int state) { @@ -207,20 +131,11 @@ int gpio_direction_input(unsigned gpio) dsc.port = stm32_gpio_to_port(gpio); dsc.pin = stm32_gpio_to_pin(gpio); -#if defined(CONFIG_STM32F4) || defined(CONFIG_STM32F7) ctl.af = STM32_GPIO_AF0; ctl.mode = STM32_GPIO_MODE_IN; ctl.otype = STM32_GPIO_OTYPE_PP; ctl.pupd = STM32_GPIO_PUPD_NO; ctl.speed = STM32_GPIO_SPEED_50M; -#elif defined(CONFIG_STM32F1) - ctl.mode = STM32_GPIO_MODE_IN; - ctl.icnf = STM32_GPIO_ICNF_IN_FLT; - ctl.ocnf = STM32_GPIO_OCNF_GP_PP; /* ignored for input */ - ctl.pupd = STM32_GPIO_PUPD_UP; /* ignored for floating */ -#else -#error STM32 family not supported -#endif return stm32_gpio_config(&dsc, &ctl); } @@ -233,19 +148,10 @@ int gpio_direction_output(unsigned gpio, int value) dsc.port = stm32_gpio_to_port(gpio); dsc.pin = stm32_gpio_to_pin(gpio); -#if defined(CONFIG_STM32F4) || defined(CONFIG_STM32F7) ctl.af = STM32_GPIO_AF0; ctl.mode = STM32_GPIO_MODE_OUT; ctl.pupd = STM32_GPIO_PUPD_NO; ctl.speed = STM32_GPIO_SPEED_50M; -#elif defined(CONFIG_STM32F1) - ctl.mode = STM32_GPIO_MODE_OUT_50M; - ctl.ocnf = STM32_GPIO_OCNF_GP_PP; - ctl.icnf = STM32_GPIO_ICNF_IN_FLT; /* ignored for output */ - ctl.pupd = STM32_GPIO_PUPD_UP; /* ignored for output */ -#else -#error STM32 family not supported -#endif res = stm32_gpio_config(&dsc, &ctl); if (res < 0) diff --git a/drivers/gpio/sx151x.c b/drivers/gpio/sx151x.c deleted file mode 100644 index 167cf40c71..0000000000 --- a/drivers/gpio/sx151x.c +++ /dev/null @@ -1,242 +0,0 @@ -/* - * (C) Copyright 2013 - * Viktar Palstsiuk, Promwad, viktar.palstsiuk@promwad.com - * - * SPDX-License-Identifier: GPL-2.0+ - */ - -/* - * Driver for Semtech SX151x SPI GPIO Expanders - */ - -#include <common.h> -#include <spi.h> -#include <sx151x.h> - -#ifndef CONFIG_SX151X_SPI_BUS -#define CONFIG_SX151X_SPI_BUS 0 -#endif - -/* - * The SX151x registers - */ - -#ifdef CONFIG_SX151X_GPIO_COUNT_8 -/* 8bit: SX1511 */ -#define SX151X_REG_DIR 0x07 -#define SX151X_REG_DATA 0x08 -#else -/* 16bit: SX1512 */ -#define SX151X_REG_DIR 0x0F -#define SX151X_REG_DATA 0x11 -#endif -#define SX151X_REG_RESET 0x7D - -static int sx151x_spi_write(int chip, unsigned char reg, unsigned char val) -{ - struct spi_slave *slave; - unsigned char buf[2]; - int ret; - - slave = spi_setup_slave(CONFIG_SX151X_SPI_BUS, chip, 1000000, - SPI_MODE_0); - if (!slave) - return 0; - - spi_claim_bus(slave); - - buf[0] = reg; - buf[1] = val; - - ret = spi_xfer(slave, 16, buf, NULL, SPI_XFER_BEGIN | SPI_XFER_END); - if (ret < 0) - printf("spi%d.%d write fail: can't write %02x to %02x: %d\n", - CONFIG_SX151X_SPI_BUS, chip, val, reg, ret); - else - printf("spi%d.%d write 0x%02x to register 0x%02x\n", - CONFIG_SX151X_SPI_BUS, chip, val, reg); - spi_release_bus(slave); - spi_free_slave(slave); - - return ret; -} - -static int sx151x_spi_read(int chip, unsigned char reg) -{ - struct spi_slave *slave; - int ret; - - slave = spi_setup_slave(CONFIG_SX151X_SPI_BUS, chip, 1000000, - SPI_MODE_0); - if (!slave) - return 0; - - spi_claim_bus(slave); - - ret = spi_w8r8(slave, reg | 0x80); - if (ret < 0) - printf("spi%d.%d read fail: can't read %02x: %d\n", - CONFIG_SX151X_SPI_BUS, chip, reg, ret); - else - printf("spi%d.%d read register 0x%02x: 0x%02x\n", - CONFIG_SX151X_SPI_BUS, chip, reg, ret); - - spi_release_bus(slave); - spi_free_slave(slave); - - return ret; -} - -static inline void sx151x_find_cfg(int gpio, unsigned char *reg, unsigned char *mask) -{ - *reg -= gpio / 8; - *mask = 1 << (gpio % 8); -} - -static int sx151x_write_cfg(int chip, unsigned char gpio, unsigned char reg, int val) -{ - unsigned char mask; - unsigned char data; - int ret; - - sx151x_find_cfg(gpio, ®, &mask); - ret = sx151x_spi_read(chip, reg); - if (ret < 0) - return ret; - else - data = ret; - data &= ~mask; - data |= (val << (gpio % 8)) & mask; - return sx151x_spi_write(chip, reg, data); -} - -int sx151x_get_value(int chip, int gpio) -{ - unsigned char reg = SX151X_REG_DATA; - unsigned char mask; - int ret; - - sx151x_find_cfg(gpio, ®, &mask); - ret = sx151x_spi_read(chip, reg); - if (ret >= 0) - ret = (ret & mask) != 0 ? 1 : 0; - - return ret; -} - -int sx151x_set_value(int chip, int gpio, int val) -{ - return sx151x_write_cfg(chip, gpio, SX151X_REG_DATA, (val ? 1 : 0)); -} - -int sx151x_direction_input(int chip, int gpio) -{ - return sx151x_write_cfg(chip, gpio, SX151X_REG_DIR, 1); -} - -int sx151x_direction_output(int chip, int gpio) -{ - return sx151x_write_cfg(chip, gpio, SX151X_REG_DIR, 0); -} - -int sx151x_reset(int chip) -{ - int err; - - err = sx151x_spi_write(chip, SX151X_REG_RESET, 0x12); - if (err < 0) - return err; - - err = sx151x_spi_write(chip, SX151X_REG_RESET, 0x34); - return err; -} - -#ifdef CONFIG_CMD_SX151X - -int do_sx151x(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) -{ - int ret = CMD_RET_USAGE, chip = 0, gpio = 0, val = 0; - - if (argc < 3) - return CMD_RET_USAGE; - - /* arg2 used as chip number */ - chip = simple_strtoul(argv[2], NULL, 10); - - if (strcmp(argv[1], "reset") == 0) { - ret = sx151x_reset(chip); - if (!ret) { - printf("Device at spi%d.%d was reset\n", - CONFIG_SX151X_SPI_BUS, chip); - } - return ret; - } - - if (argc < 4) - return CMD_RET_USAGE; - - /* arg3 used as gpio number */ - gpio = simple_strtoul(argv[3], NULL, 10); - - if (strcmp(argv[1], "get") == 0) { - ret = sx151x_get_value(chip, gpio); - if (ret < 0) - printf("Failed to get value at spi%d.%d gpio %d\n", - CONFIG_SX151X_SPI_BUS, chip, gpio); - else { - printf("Value at spi%d.%d gpio %d is %d\n", - CONFIG_SX151X_SPI_BUS, chip, gpio, ret); - ret = 0; - } - return ret; - } - - if (argc < 5) - return CMD_RET_USAGE; - - /* arg4 used as value or direction */ - val = simple_strtoul(argv[4], NULL, 10); - - if (strcmp(argv[1], "set") == 0) { - ret = sx151x_set_value(chip, gpio, val); - if (ret < 0) - printf("Failed to set value at spi%d.%d gpio %d\n", - CONFIG_SX151X_SPI_BUS, chip, gpio); - else - printf("New value at spi%d.%d gpio %d is %d\n", - CONFIG_SX151X_SPI_BUS, chip, gpio, val); - return ret; - } else if (strcmp(argv[1], "dir") == 0) { - if (val == 0) - ret = sx151x_direction_output(chip, gpio); - else - ret = sx151x_direction_input(chip, gpio); - - if (ret < 0) - printf("Failed to set direction of spi%d.%d gpio %d\n", - CONFIG_SX151X_SPI_BUS, chip, gpio); - else - printf("New direction of spi%d.%d gpio %d is %d\n", - CONFIG_SX151X_SPI_BUS, chip, gpio, val); - return ret; - } - - printf("Please see usage\n"); - - return ret; -} - -U_BOOT_CMD( - sx151x, 5, 1, do_sx151x, - "sx151x gpio access", - "dir chip gpio 0|1\n" - " - set gpio direction (0 for output, 1 for input)\n" - "sx151x get chip gpio\n" - " - get gpio value\n" - "sx151x set chip gpio 0|1\n" - " - set gpio value\n" - "sx151x reset chip\n" - " - reset chip" -); - -#endif /* CONFIG_CMD_SX151X */ |