|
|
|
@ -24,6 +24,16 @@ |
|
|
|
|
* MA 02111-1307 USA |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* WARNING: |
|
|
|
|
* |
|
|
|
|
* As the code is right now, it expects all PIO ports A,B,C,... |
|
|
|
|
* to be evenly spaced in the memory map: |
|
|
|
|
* ATMEL_BASE_PIOA + port * sizeof at91pio_t |
|
|
|
|
* This might not necessaryly be true in future Atmel SoCs. |
|
|
|
|
* This code should be fixed to use a pointer array to the ports. |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
#include <config.h> |
|
|
|
|
#include <common.h> |
|
|
|
|
#include <asm/sizes.h> |
|
|
|
@ -33,10 +43,10 @@ |
|
|
|
|
|
|
|
|
|
int at91_set_pio_pullup(unsigned port, unsigned pin, int use_pullup) |
|
|
|
|
{ |
|
|
|
|
at91_pio_t *pio = (at91_pio_t *) AT91_PIO_BASE; |
|
|
|
|
at91_pio_t *pio = (at91_pio_t *) ATMEL_BASE_PIOA; |
|
|
|
|
u32 mask; |
|
|
|
|
|
|
|
|
|
if ((port < AT91_PIO_PORTS) && (pin < 32)) { |
|
|
|
|
if ((port < ATMEL_PIO_PORTS) && (pin < 32)) { |
|
|
|
|
mask = 1 << pin; |
|
|
|
|
if (use_pullup) |
|
|
|
|
writel(1 << pin, &pio->port[port].puer); |
|
|
|
@ -52,10 +62,10 @@ int at91_set_pio_pullup(unsigned port, unsigned pin, int use_pullup) |
|
|
|
|
*/ |
|
|
|
|
int at91_set_pio_periph(unsigned port, unsigned pin, int use_pullup) |
|
|
|
|
{ |
|
|
|
|
at91_pio_t *pio = (at91_pio_t *) AT91_PIO_BASE; |
|
|
|
|
at91_pio_t *pio = (at91_pio_t *) ATMEL_BASE_PIOA; |
|
|
|
|
u32 mask; |
|
|
|
|
|
|
|
|
|
if ((port < AT91_PIO_PORTS) && (pin < 32)) { |
|
|
|
|
if ((port < ATMEL_PIO_PORTS) && (pin < 32)) { |
|
|
|
|
mask = 1 << pin; |
|
|
|
|
writel(mask, &pio->port[port].idr); |
|
|
|
|
at91_set_pio_pullup(port, pin, use_pullup); |
|
|
|
@ -69,10 +79,10 @@ int at91_set_pio_periph(unsigned port, unsigned pin, int use_pullup) |
|
|
|
|
*/ |
|
|
|
|
int at91_set_a_periph(unsigned port, unsigned pin, int use_pullup) |
|
|
|
|
{ |
|
|
|
|
at91_pio_t *pio = (at91_pio_t *) AT91_PIO_BASE; |
|
|
|
|
at91_pio_t *pio = (at91_pio_t *) ATMEL_BASE_PIOA; |
|
|
|
|
u32 mask; |
|
|
|
|
|
|
|
|
|
if ((port < AT91_PIO_PORTS) && (pin < 32)) { |
|
|
|
|
if ((port < ATMEL_PIO_PORTS) && (pin < 32)) { |
|
|
|
|
mask = 1 << pin; |
|
|
|
|
writel(mask, &pio->port[port].idr); |
|
|
|
|
at91_set_pio_pullup(port, pin, use_pullup); |
|
|
|
@ -87,10 +97,10 @@ int at91_set_a_periph(unsigned port, unsigned pin, int use_pullup) |
|
|
|
|
*/ |
|
|
|
|
int at91_set_b_periph(unsigned port, unsigned pin, int use_pullup) |
|
|
|
|
{ |
|
|
|
|
at91_pio_t *pio = (at91_pio_t *) AT91_PIO_BASE; |
|
|
|
|
at91_pio_t *pio = (at91_pio_t *) ATMEL_BASE_PIOA; |
|
|
|
|
u32 mask; |
|
|
|
|
|
|
|
|
|
if ((port < AT91_PIO_PORTS) && (pin < 32)) { |
|
|
|
|
if ((port < ATMEL_PIO_PORTS) && (pin < 32)) { |
|
|
|
|
mask = 1 << pin; |
|
|
|
|
writel(mask, &pio->port[port].idr); |
|
|
|
|
at91_set_pio_pullup(port, pin, use_pullup); |
|
|
|
@ -106,10 +116,10 @@ int at91_set_b_periph(unsigned port, unsigned pin, int use_pullup) |
|
|
|
|
*/ |
|
|
|
|
int at91_set_pio_input(unsigned port, u32 pin, int use_pullup) |
|
|
|
|
{ |
|
|
|
|
at91_pio_t *pio = (at91_pio_t *) AT91_PIO_BASE; |
|
|
|
|
at91_pio_t *pio = (at91_pio_t *) ATMEL_BASE_PIOA; |
|
|
|
|
u32 mask; |
|
|
|
|
|
|
|
|
|
if ((port < AT91_PIO_PORTS) && (pin < 32)) { |
|
|
|
|
if ((port < ATMEL_PIO_PORTS) && (pin < 32)) { |
|
|
|
|
mask = 1 << pin; |
|
|
|
|
writel(mask, &pio->port[port].idr); |
|
|
|
|
at91_set_pio_pullup(port, pin, use_pullup); |
|
|
|
@ -125,10 +135,10 @@ int at91_set_pio_input(unsigned port, u32 pin, int use_pullup) |
|
|
|
|
*/ |
|
|
|
|
int at91_set_pio_output(unsigned port, u32 pin, int value) |
|
|
|
|
{ |
|
|
|
|
at91_pio_t *pio = (at91_pio_t *) AT91_PIO_BASE; |
|
|
|
|
at91_pio_t *pio = (at91_pio_t *) ATMEL_BASE_PIOA; |
|
|
|
|
u32 mask; |
|
|
|
|
|
|
|
|
|
if ((port < AT91_PIO_PORTS) && (pin < 32)) { |
|
|
|
|
if ((port < ATMEL_PIO_PORTS) && (pin < 32)) { |
|
|
|
|
mask = 1 << pin; |
|
|
|
|
writel(mask, &pio->port[port].idr); |
|
|
|
|
writel(mask, &pio->port[port].pudr); |
|
|
|
@ -147,10 +157,10 @@ int at91_set_pio_output(unsigned port, u32 pin, int value) |
|
|
|
|
*/ |
|
|
|
|
int at91_set_pio_deglitch(unsigned port, unsigned pin, int is_on) |
|
|
|
|
{ |
|
|
|
|
at91_pio_t *pio = (at91_pio_t *) AT91_PIO_BASE; |
|
|
|
|
at91_pio_t *pio = (at91_pio_t *) ATMEL_BASE_PIOA; |
|
|
|
|
u32 mask; |
|
|
|
|
|
|
|
|
|
if ((port < AT91_PIO_PORTS) && (pin < 32)) { |
|
|
|
|
if ((port < ATMEL_PIO_PORTS) && (pin < 32)) { |
|
|
|
|
mask = 1 << pin; |
|
|
|
|
if (is_on) |
|
|
|
|
writel(mask, &pio->port[port].ifer); |
|
|
|
@ -166,10 +176,10 @@ int at91_set_pio_deglitch(unsigned port, unsigned pin, int is_on) |
|
|
|
|
*/ |
|
|
|
|
int at91_set_pio_multi_drive(unsigned port, unsigned pin, int is_on) |
|
|
|
|
{ |
|
|
|
|
at91_pio_t *pio = (at91_pio_t *) AT91_PIO_BASE; |
|
|
|
|
at91_pio_t *pio = (at91_pio_t *) ATMEL_BASE_PIOA; |
|
|
|
|
u32 mask; |
|
|
|
|
|
|
|
|
|
if ((port < AT91_PIO_PORTS) && (pin < 32)) { |
|
|
|
|
if ((port < ATMEL_PIO_PORTS) && (pin < 32)) { |
|
|
|
|
mask = 1 << pin; |
|
|
|
|
if (is_on) |
|
|
|
|
writel(mask, &pio->port[port].mder); |
|
|
|
@ -184,10 +194,10 @@ int at91_set_pio_multi_drive(unsigned port, unsigned pin, int is_on) |
|
|
|
|
*/ |
|
|
|
|
int at91_set_pio_value(unsigned port, unsigned pin, int value) |
|
|
|
|
{ |
|
|
|
|
at91_pio_t *pio = (at91_pio_t *) AT91_PIO_BASE; |
|
|
|
|
at91_pio_t *pio = (at91_pio_t *) ATMEL_BASE_PIOA; |
|
|
|
|
u32 mask; |
|
|
|
|
|
|
|
|
|
if ((port < AT91_PIO_PORTS) && (pin < 32)) { |
|
|
|
|
if ((port < ATMEL_PIO_PORTS) && (pin < 32)) { |
|
|
|
|
mask = 1 << pin; |
|
|
|
|
if (value) |
|
|
|
|
writel(mask, &pio->port[port].sodr); |
|
|
|
@ -202,11 +212,11 @@ int at91_set_pio_value(unsigned port, unsigned pin, int value) |
|
|
|
|
*/ |
|
|
|
|
int at91_get_pio_value(unsigned port, unsigned pin) |
|
|
|
|
{ |
|
|
|
|
u32 pdsr = 0; |
|
|
|
|
at91_pio_t *pio = (at91_pio_t *) AT91_PIO_BASE; |
|
|
|
|
u32 pdsr = 0; |
|
|
|
|
at91_pio_t *pio = (at91_pio_t *) ATMEL_BASE_PIOA; |
|
|
|
|
u32 mask; |
|
|
|
|
|
|
|
|
|
if ((port < AT91_PIO_PORTS) && (pin < 32)) { |
|
|
|
|
if ((port < ATMEL_PIO_PORTS) && (pin < 32)) { |
|
|
|
|
mask = 1 << pin; |
|
|
|
|
pdsr = readl(&pio->port[port].pdsr) & mask; |
|
|
|
|
} |
|
|
|
|