|
@@ -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;
|
|
|
}
|