avr32: Add GPIO manipulation functions
Adds GPIO manipulation functions for AVR32 AP7 platform. Signed-off-by: Peter Ma <pma@mediamatech.com> [haavard.skinnemoen@atmel.com: coding style fixup, slight simplification] Signed-off-by: Haavard Skinnemoen <haavard.skinnemoen@atmel.com>
This commit is contained in:
parent
914f58c576
commit
4688f9e34a
2 changed files with 64 additions and 0 deletions
|
@ -58,3 +58,59 @@ void gpio_select_periph_B(unsigned int pin, int use_pullup)
|
||||||
else
|
else
|
||||||
pio2_writel(base, PUDR, mask);
|
pio2_writel(base, PUDR, mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void gpio_select_pio(unsigned int pin, unsigned long gpiof_flags)
|
||||||
|
{
|
||||||
|
void *base = gpio_pin_to_addr(pin);
|
||||||
|
uint32_t mask = 1 << (pin & 0x1f);
|
||||||
|
|
||||||
|
if (!base)
|
||||||
|
panic("Invalid GPIO pin %u\n", pin);
|
||||||
|
|
||||||
|
if (gpiof_flags & GPIOF_OUTPUT) {
|
||||||
|
if (gpiof_flags & GPIOF_MULTIDRV)
|
||||||
|
pio2_writel(base, MDER, mask);
|
||||||
|
else
|
||||||
|
pio2_writel(base, MDDR, mask);
|
||||||
|
pio2_writel(base, PUDR, mask);
|
||||||
|
pio2_writel(base, OER, mask);
|
||||||
|
} else {
|
||||||
|
if (gpiof_flags & GPIOF_PULLUP)
|
||||||
|
pio2_writel(base, PUER, mask);
|
||||||
|
else
|
||||||
|
pio2_writel(base, PUDR, mask);
|
||||||
|
if (gpiof_flags & GPIOF_DEGLITCH)
|
||||||
|
pio2_writel(base, IFER, mask);
|
||||||
|
else
|
||||||
|
pio2_writel(base, IFDR, mask);
|
||||||
|
pio2_writel(base, ODR, mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
pio2_writel(base, PER, mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
void gpio_set_value(unsigned int pin, int value)
|
||||||
|
{
|
||||||
|
void *base = gpio_pin_to_addr(pin);
|
||||||
|
uint32_t mask = 1 << (pin & 0x1f);
|
||||||
|
|
||||||
|
if (!base)
|
||||||
|
panic("Invalid GPIO pin %u\n", pin);
|
||||||
|
|
||||||
|
if (value)
|
||||||
|
pio2_writel(base, SODR, mask);
|
||||||
|
else
|
||||||
|
pio2_writel(base, CODR, mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
int gpio_get_value(unsigned int pin)
|
||||||
|
{
|
||||||
|
void *base = gpio_pin_to_addr(pin);
|
||||||
|
int value;
|
||||||
|
|
||||||
|
if (!base)
|
||||||
|
panic("Invalid GPIO pin %u\n", pin);
|
||||||
|
|
||||||
|
value = pio2_readl(base, PDSR);
|
||||||
|
return (value >> (pin & 0x1f)) & 1;
|
||||||
|
}
|
||||||
|
|
|
@ -180,6 +180,11 @@
|
||||||
#define GPIO_PIN_PE25 (GPIO_PIOE_BASE + 25)
|
#define GPIO_PIN_PE25 (GPIO_PIOE_BASE + 25)
|
||||||
#define GPIO_PIN_PE26 (GPIO_PIOE_BASE + 26)
|
#define GPIO_PIN_PE26 (GPIO_PIOE_BASE + 26)
|
||||||
|
|
||||||
|
#define GPIOF_PULLUP 0x00000001 /* (not-OUT) Enable pull-up */
|
||||||
|
#define GPIOF_OUTPUT 0x00000002 /* (OUT) Enable output driver */
|
||||||
|
#define GPIOF_DEGLITCH 0x00000004 /* (IN) Filter glitches */
|
||||||
|
#define GPIOF_MULTIDRV 0x00000008 /* Enable multidriver option */
|
||||||
|
|
||||||
static inline void *gpio_pin_to_addr(unsigned int pin)
|
static inline void *gpio_pin_to_addr(unsigned int pin)
|
||||||
{
|
{
|
||||||
switch (pin >> 5) {
|
switch (pin >> 5) {
|
||||||
|
@ -200,6 +205,9 @@ static inline void *gpio_pin_to_addr(unsigned int pin)
|
||||||
|
|
||||||
void gpio_select_periph_A(unsigned int pin, int use_pullup);
|
void gpio_select_periph_A(unsigned int pin, int use_pullup);
|
||||||
void gpio_select_periph_B(unsigned int pin, int use_pullup);
|
void gpio_select_periph_B(unsigned int pin, int use_pullup);
|
||||||
|
void gpio_select_pio(unsigned int pin, unsigned long gpiof_flags);
|
||||||
|
void gpio_set_value(unsigned int pin, int value);
|
||||||
|
int gpio_get_value(unsigned int pin);
|
||||||
|
|
||||||
void gpio_enable_ebi(void);
|
void gpio_enable_ebi(void);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue