2009-06-20 09:11:00 +08:00
|
|
|
/*
|
|
|
|
* Coldfire generic GPIO support
|
|
|
|
*
|
|
|
|
* (C) Copyright 2009, Steven King <sfking@fdwdc.com>
|
|
|
|
*
|
|
|
|
* 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; version 2 of the License.
|
|
|
|
*
|
|
|
|
* 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.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef coldfire_gpio_h
|
|
|
|
#define coldfire_gpio_h
|
|
|
|
|
|
|
|
#include <linux/io.h>
|
|
|
|
#include <asm/coldfire.h>
|
|
|
|
#include <asm/mcfsim.h>
|
m68knommu: refactor Coldfire GPIO not to require GPIOLIB, eliminate mcf_gpio_chips.
If we're not connecting external GPIO extenders via i2c or spi or whatever, we
probably don't need GPIOLIB. If we provide an alternate implementation of
the GPIOLIB functions to use when only on-chip GPIO is needed, we can change
ARCH_REQUIRE_GPIOLIB to ARCH_WANTS_OPTIONAL_GPIOLIB so that GPIOLIB becomes
optional.
The downside is that in the GPIOLIB=n case, we lose all error checking done by
gpiolib, ie multiply allocating the gpio, free'ing gpio etc., so that the
only checking that can be done is if we reference a gpio on an external part.
Targets that need the extra error checking can still select GPIOLIB=y.
For the case where GPIOLIB=y, we can simplify the table of gpio chips to use a
single chip, eliminating the tables of chips in the 5xxx.c files. The
original motivation for the definition of multiple chips was to match the way
many of the Coldfire variants defined their gpio as a spare array in memory.
However, all this really gains us is some error checking when we request a
gpio, gpiolib can check that it doesn't fall in one of the holes. If thats
important, I think we can still come up with a better way of accomplishing
that.
Also in this patch is some general cleanup and reorganizing of the gpio header
files (I'm sure I must have had a reason why I sometimes used a prefix of
mcf_gpio and other times mcfgpio but for the life of me I can't think of it
now).
Signed-off-by: Steven King <sfking@fdwdc.com>
Signed-off-by: Greg Ungerer <gerg@uclinux.org>
2012-05-22 04:10:19 +08:00
|
|
|
#include <asm/mcfgpio.h>
|
2009-06-20 09:11:00 +08:00
|
|
|
/*
|
|
|
|
* The Generic GPIO functions
|
|
|
|
*
|
|
|
|
* If the gpio is a compile time constant and is one of the Coldfire gpios,
|
|
|
|
* use the inline version, otherwise dispatch thru gpiolib.
|
|
|
|
*/
|
|
|
|
|
|
|
|
static inline int gpio_get_value(unsigned gpio)
|
|
|
|
{
|
|
|
|
if (__builtin_constant_p(gpio) && gpio < MCFGPIO_PIN_MAX)
|
m68knommu: refactor Coldfire GPIO not to require GPIOLIB, eliminate mcf_gpio_chips.
If we're not connecting external GPIO extenders via i2c or spi or whatever, we
probably don't need GPIOLIB. If we provide an alternate implementation of
the GPIOLIB functions to use when only on-chip GPIO is needed, we can change
ARCH_REQUIRE_GPIOLIB to ARCH_WANTS_OPTIONAL_GPIOLIB so that GPIOLIB becomes
optional.
The downside is that in the GPIOLIB=n case, we lose all error checking done by
gpiolib, ie multiply allocating the gpio, free'ing gpio etc., so that the
only checking that can be done is if we reference a gpio on an external part.
Targets that need the extra error checking can still select GPIOLIB=y.
For the case where GPIOLIB=y, we can simplify the table of gpio chips to use a
single chip, eliminating the tables of chips in the 5xxx.c files. The
original motivation for the definition of multiple chips was to match the way
many of the Coldfire variants defined their gpio as a spare array in memory.
However, all this really gains us is some error checking when we request a
gpio, gpiolib can check that it doesn't fall in one of the holes. If thats
important, I think we can still come up with a better way of accomplishing
that.
Also in this patch is some general cleanup and reorganizing of the gpio header
files (I'm sure I must have had a reason why I sometimes used a prefix of
mcf_gpio and other times mcfgpio but for the life of me I can't think of it
now).
Signed-off-by: Steven King <sfking@fdwdc.com>
Signed-off-by: Greg Ungerer <gerg@uclinux.org>
2012-05-22 04:10:19 +08:00
|
|
|
return mcfgpio_read(__mcfgpio_ppdr(gpio)) & mcfgpio_bit(gpio);
|
2009-06-20 09:11:00 +08:00
|
|
|
else
|
|
|
|
return __gpio_get_value(gpio);
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void gpio_set_value(unsigned gpio, int value)
|
|
|
|
{
|
|
|
|
if (__builtin_constant_p(gpio) && gpio < MCFGPIO_PIN_MAX) {
|
|
|
|
if (gpio < MCFGPIO_SCR_START) {
|
|
|
|
unsigned long flags;
|
|
|
|
MCFGPIO_PORTTYPE data;
|
|
|
|
|
|
|
|
local_irq_save(flags);
|
m68knommu: refactor Coldfire GPIO not to require GPIOLIB, eliminate mcf_gpio_chips.
If we're not connecting external GPIO extenders via i2c or spi or whatever, we
probably don't need GPIOLIB. If we provide an alternate implementation of
the GPIOLIB functions to use when only on-chip GPIO is needed, we can change
ARCH_REQUIRE_GPIOLIB to ARCH_WANTS_OPTIONAL_GPIOLIB so that GPIOLIB becomes
optional.
The downside is that in the GPIOLIB=n case, we lose all error checking done by
gpiolib, ie multiply allocating the gpio, free'ing gpio etc., so that the
only checking that can be done is if we reference a gpio on an external part.
Targets that need the extra error checking can still select GPIOLIB=y.
For the case where GPIOLIB=y, we can simplify the table of gpio chips to use a
single chip, eliminating the tables of chips in the 5xxx.c files. The
original motivation for the definition of multiple chips was to match the way
many of the Coldfire variants defined their gpio as a spare array in memory.
However, all this really gains us is some error checking when we request a
gpio, gpiolib can check that it doesn't fall in one of the holes. If thats
important, I think we can still come up with a better way of accomplishing
that.
Also in this patch is some general cleanup and reorganizing of the gpio header
files (I'm sure I must have had a reason why I sometimes used a prefix of
mcf_gpio and other times mcfgpio but for the life of me I can't think of it
now).
Signed-off-by: Steven King <sfking@fdwdc.com>
Signed-off-by: Greg Ungerer <gerg@uclinux.org>
2012-05-22 04:10:19 +08:00
|
|
|
data = mcfgpio_read(__mcfgpio_podr(gpio));
|
2009-06-20 09:11:00 +08:00
|
|
|
if (value)
|
|
|
|
data |= mcfgpio_bit(gpio);
|
|
|
|
else
|
|
|
|
data &= ~mcfgpio_bit(gpio);
|
m68knommu: refactor Coldfire GPIO not to require GPIOLIB, eliminate mcf_gpio_chips.
If we're not connecting external GPIO extenders via i2c or spi or whatever, we
probably don't need GPIOLIB. If we provide an alternate implementation of
the GPIOLIB functions to use when only on-chip GPIO is needed, we can change
ARCH_REQUIRE_GPIOLIB to ARCH_WANTS_OPTIONAL_GPIOLIB so that GPIOLIB becomes
optional.
The downside is that in the GPIOLIB=n case, we lose all error checking done by
gpiolib, ie multiply allocating the gpio, free'ing gpio etc., so that the
only checking that can be done is if we reference a gpio on an external part.
Targets that need the extra error checking can still select GPIOLIB=y.
For the case where GPIOLIB=y, we can simplify the table of gpio chips to use a
single chip, eliminating the tables of chips in the 5xxx.c files. The
original motivation for the definition of multiple chips was to match the way
many of the Coldfire variants defined their gpio as a spare array in memory.
However, all this really gains us is some error checking when we request a
gpio, gpiolib can check that it doesn't fall in one of the holes. If thats
important, I think we can still come up with a better way of accomplishing
that.
Also in this patch is some general cleanup and reorganizing of the gpio header
files (I'm sure I must have had a reason why I sometimes used a prefix of
mcf_gpio and other times mcfgpio but for the life of me I can't think of it
now).
Signed-off-by: Steven King <sfking@fdwdc.com>
Signed-off-by: Greg Ungerer <gerg@uclinux.org>
2012-05-22 04:10:19 +08:00
|
|
|
mcfgpio_write(data, __mcfgpio_podr(gpio));
|
2009-06-20 09:11:00 +08:00
|
|
|
local_irq_restore(flags);
|
|
|
|
} else {
|
|
|
|
if (value)
|
|
|
|
mcfgpio_write(mcfgpio_bit(gpio),
|
|
|
|
MCFGPIO_SETR_PORT(gpio));
|
|
|
|
else
|
|
|
|
mcfgpio_write(~mcfgpio_bit(gpio),
|
|
|
|
MCFGPIO_CLRR_PORT(gpio));
|
|
|
|
}
|
|
|
|
} else
|
|
|
|
__gpio_set_value(gpio, value);
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline int gpio_to_irq(unsigned gpio)
|
|
|
|
{
|
2012-06-07 05:28:31 +08:00
|
|
|
#if defined(MCFGPIO_IRQ_MIN)
|
|
|
|
if ((gpio >= MCFGPIO_IRQ_MIN) && (gpio < MCFGPIO_IRQ_MAX))
|
|
|
|
#else
|
|
|
|
if (gpio < MCFGPIO_IRQ_MAX)
|
|
|
|
#endif
|
|
|
|
return gpio + MCFGPIO_IRQ_VECBASE;
|
|
|
|
else
|
|
|
|
return __gpio_to_irq(gpio);
|
2009-06-20 09:11:00 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
static inline int irq_to_gpio(unsigned irq)
|
|
|
|
{
|
|
|
|
return (irq >= MCFGPIO_IRQ_VECBASE &&
|
|
|
|
irq < (MCFGPIO_IRQ_VECBASE + MCFGPIO_IRQ_MAX)) ?
|
|
|
|
irq - MCFGPIO_IRQ_VECBASE : -ENXIO;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline int gpio_cansleep(unsigned gpio)
|
|
|
|
{
|
|
|
|
return gpio < MCFGPIO_PIN_MAX ? 0 : __gpio_cansleep(gpio);
|
|
|
|
}
|
|
|
|
|
2013-04-29 08:04:46 +08:00
|
|
|
#ifndef CONFIG_GPIOLIB
|
2013-04-08 12:21:31 +08:00
|
|
|
static inline int gpio_request_one(unsigned gpio, unsigned long flags, const char *label)
|
|
|
|
{
|
|
|
|
int err;
|
|
|
|
|
|
|
|
err = gpio_request(gpio, label);
|
|
|
|
if (err)
|
|
|
|
return err;
|
|
|
|
|
|
|
|
if (flags & GPIOF_DIR_IN)
|
|
|
|
err = gpio_direction_input(gpio);
|
|
|
|
else
|
|
|
|
err = gpio_direction_output(gpio,
|
|
|
|
(flags & GPIOF_INIT_HIGH) ? 1 : 0);
|
|
|
|
|
|
|
|
if (err)
|
|
|
|
gpio_free(gpio);
|
|
|
|
|
|
|
|
return err;
|
|
|
|
}
|
2013-04-29 08:04:46 +08:00
|
|
|
#endif /* !CONFIG_GPIOLIB */
|
2009-06-20 09:11:00 +08:00
|
|
|
#endif
|