From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alexander Graf Date: Thu, 11 Aug 2016 13:38:31 +0200 Subject: [U-Boot] [PATCH 1/2] bcm2835_gpio: Implement GPIOF_FUNC Message-ID: <1470915512-40855-1-git-send-email-agraf@suse.de> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de So far we could only tell the gpio framework that a GPIO was mapped as input or output, not as alternative function. This patch adds support for determining whether a function is mapped as alternative. Signed-off-by: Alexander Graf --- arch/arm/mach-bcm283x/include/mach/gpio.h | 2 ++ drivers/gpio/bcm2835_gpio.c | 30 +++++++++++++++++------------- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/arch/arm/mach-bcm283x/include/mach/gpio.h b/arch/arm/mach-bcm283x/include/mach/gpio.h index e6e5d16..b2df75a 100644 --- a/arch/arm/mach-bcm283x/include/mach/gpio.h +++ b/arch/arm/mach-bcm283x/include/mach/gpio.h @@ -66,4 +66,6 @@ struct bcm2835_gpio_platdata { unsigned long base; }; +int bcm2835_gpio_get_func_id(struct udevice *dev, unsigned gpio); + #endif /* _BCM2835_GPIO_H_ */ diff --git a/drivers/gpio/bcm2835_gpio.c b/drivers/gpio/bcm2835_gpio.c index fbc641d..8b88d79 100644 --- a/drivers/gpio/bcm2835_gpio.c +++ b/drivers/gpio/bcm2835_gpio.c @@ -44,15 +44,6 @@ static int bcm2835_gpio_direction_output(struct udevice *dev, unsigned gpio, return 0; } -static bool bcm2835_gpio_is_output(const struct bcm2835_gpios *gpios, int gpio) -{ - u32 val; - - val = readl(&gpios->reg->gpfsel[BCM2835_GPIO_FSEL_BANK(gpio)]); - val &= BCM2835_GPIO_FSEL_MASK << BCM2835_GPIO_FSEL_SHIFT(gpio); - return val ? true : false; -} - static int bcm2835_get_value(const struct bcm2835_gpios *gpios, unsigned gpio) { unsigned val; @@ -81,15 +72,28 @@ static int bcm2835_gpio_set_value(struct udevice *dev, unsigned gpio, return 0; } -static int bcm2835_gpio_get_function(struct udevice *dev, unsigned offset) +int bcm2835_gpio_get_func_id(struct udevice *dev, unsigned gpio) { struct bcm2835_gpios *gpios = dev_get_priv(dev); + u32 val; + + val = readl(&gpios->reg->gpfsel[BCM2835_GPIO_FSEL_BANK(gpio)]); + + return (val >> BCM2835_GPIO_FSEL_SHIFT(gpio) & BCM2835_GPIO_FSEL_MASK); +} + +static int bcm2835_gpio_get_function(struct udevice *dev, unsigned offset) +{ + int funcid = bcm2835_gpio_get_func_id(dev, offset); - /* GPIOF_FUNC is not implemented yet */ - if (bcm2835_gpio_is_output(gpios, offset)) + switch (funcid) { + case BCM2835_GPIO_OUTPUT: return GPIOF_OUTPUT; - else + case BCM2835_GPIO_INPUT: return GPIOF_INPUT; + default: + return GPIOF_FUNC; + } } -- 1.8.5.6