X-Git-Url: https://git.kernelconcepts.de/?p=karo-tx-uboot.git;a=blobdiff_plain;f=drivers%2Fgpio%2Fmxs_gpio.c;h=e0e627d36c7af6e6ec44c017886d56a1f2801b20;hp=b7e959128e8e8b40f4da2bc8c87f259f28136aff;hb=24ec4dbd5a59630f8d0ede2aad560d1336e31fdd;hpb=9dfa8da709a1589d177d99c597d9b18d8c9a145d diff --git a/drivers/gpio/mxs_gpio.c b/drivers/gpio/mxs_gpio.c index b7e959128e..e0e627d36c 100644 --- a/drivers/gpio/mxs_gpio.c +++ b/drivers/gpio/mxs_gpio.c @@ -4,33 +4,18 @@ * Copyright (C) 2011 Marek Vasut * on behalf of DENX Software Engineering GmbH * - * See file CREDITS for list of people who contributed to this - * 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. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA + * SPDX-License-Identifier: GPL-2.0+ */ #include #include #include #include +#include #include #include -#if defined(CONFIG_MX23) +#if defined(CONFIG_SOC_MX23) #define PINCTRL_BANKS 3 #define PINCTRL_DOUT(n) (0x0500 + ((n) * 0x10)) #define PINCTRL_DIN(n) (0x0600 + ((n) * 0x10)) @@ -38,7 +23,7 @@ #define PINCTRL_PIN2IRQ(n) (0x0800 + ((n) * 0x10)) #define PINCTRL_IRQEN(n) (0x0900 + ((n) * 0x10)) #define PINCTRL_IRQSTAT(n) (0x0c00 + ((n) * 0x10)) -#elif defined(CONFIG_MX28) +#elif defined(CONFIG_SOC_MX28) #define PINCTRL_BANKS 5 #define PINCTRL_DOUT(n) (0x0700 + ((n) * 0x10)) #define PINCTRL_DIN(n) (0x0900 + ((n) * 0x10)) @@ -47,16 +32,9 @@ #define PINCTRL_IRQEN(n) (0x1100 + ((n) * 0x10)) #define PINCTRL_IRQSTAT(n) (0x1400 + ((n) * 0x10)) #else -#error "Please select CONFIG_MX23 or CONFIG_MX28" +#error "Please select CONFIG_SOC_MX23 or CONFIG_SOC_MX28" #endif -#define GPIO_INT_FALL_EDGE 0x0 -#define GPIO_INT_LOW_LEV 0x1 -#define GPIO_INT_RISE_EDGE 0x2 -#define GPIO_INT_HIGH_LEV 0x3 -#define GPIO_INT_LEV_MASK (1 << 0) -#define GPIO_INT_POL_MASK (1 << 1) - void mxs_gpio_init(void) { int i; @@ -69,68 +47,80 @@ void mxs_gpio_init(void) } } -int gpio_get_value(int gp) +int gpio_get_value(unsigned gpio) { - uint32_t bank = PAD_BANK(gp); + uint32_t bank = MXS_GPIO_TO_BANK(gpio); uint32_t offset = PINCTRL_DIN(bank); - struct mx28_register *reg = - (struct mx28_register *)(MXS_PINCTRL_BASE + offset); + struct mxs_register_32 *reg = (void *)(MXS_PINCTRL_BASE + offset); + + if (bank >= PINCTRL_BANKS) + return -EINVAL; - return (readl(®->reg) >> PAD_PIN(gp)) & 1; + return (readl(®->reg) >> MXS_GPIO_TO_PIN(gpio)) & 1; } -void gpio_set_value(int gp, int value) +int gpio_set_value(unsigned gpio, int value) { - uint32_t bank = PAD_BANK(gp); + uint32_t bank = MXS_GPIO_TO_BANK(gpio); uint32_t offset = PINCTRL_DOUT(bank); - struct mx28_register *reg = - (struct mx28_register *)(MXS_PINCTRL_BASE + offset); + struct mxs_register_32 *reg = (void *)(MXS_PINCTRL_BASE + offset); + + if (bank >= PINCTRL_BANKS) + return -EINVAL; if (value) - writel(1 << PAD_PIN(gp), ®->reg_set); + writel(1 << MXS_GPIO_TO_PIN(gpio), ®->reg_set); else - writel(1 << PAD_PIN(gp), ®->reg_clr); + writel(1 << MXS_GPIO_TO_PIN(gpio), ®->reg_clr); + + return 0; } -int gpio_direction_input(int gp) +int gpio_direction_input(unsigned gpio) { - uint32_t bank = PAD_BANK(gp); + uint32_t bank = MXS_GPIO_TO_BANK(gpio); uint32_t offset = PINCTRL_DOE(bank); - struct mx28_register *reg = - (struct mx28_register *)(MXS_PINCTRL_BASE + offset); + struct mxs_register_32 *reg = (void *)(MXS_PINCTRL_BASE + offset); - writel(1 << PAD_PIN(gp), ®->reg_clr); + if (bank >= PINCTRL_BANKS) + return -EINVAL; + + writel(1 << MXS_GPIO_TO_PIN(gpio), ®->reg_clr); return 0; } -int gpio_direction_output(int gp, int value) +int gpio_direction_output(unsigned gpio, int value) { - uint32_t bank = PAD_BANK(gp); + uint32_t bank = MXS_GPIO_TO_BANK(gpio); uint32_t offset = PINCTRL_DOE(bank); - struct mx28_register *reg = - (struct mx28_register *)(MXS_PINCTRL_BASE + offset); + struct mxs_register_32 *reg = (void *)(MXS_PINCTRL_BASE + offset); - writel(1 << PAD_PIN(gp), ®->reg_set); + if (bank >= PINCTRL_BANKS) + return -EINVAL; - gpio_set_value(gp, value); + gpio_set_value(gpio, value); + + writel(1 << MXS_GPIO_TO_PIN(gpio), ®->reg_set); return 0; } -int gpio_request(int gp, const char *label) +int gpio_request(unsigned gpio, const char *label) { - if (PAD_BANK(gp) > PINCTRL_BANKS) + if (MXS_GPIO_TO_BANK(gpio) >= PINCTRL_BANKS) { + printf("%s(): Invalid GPIO%d (GPIO_%u_%u) requested; possibly intended: GPIO_%u_%u\n", + __func__, gpio, gpio / 32, gpio % 32, + PAD_BANK(gpio), PAD_PIN(gpio)); + printf("Linear GPIO number required rather than iomux_cfg_t cookie!\n"); + printf("Possibly missing MXS_PAD_TO_GPIO() in the GPIO specification.\n"); return -EINVAL; + } return 0; } -void gpio_free(int gp) +int gpio_free(unsigned gpio) { -} - -void gpio_toggle_value(int gp) -{ - gpio_set_value(gp, !gpio_get_value(gp)); + return 0; }