Hi Andreas,

> -----Original Message-----
> From: Andreas Bießmann [mailto:andr...@biessmann.org]
> Sent: 2017年2月14日 6:01
> To: Tony Yang - A41535 <wenyou.y...@microchip.com>; U-Boot Mailing List
> <u-boot@lists.denx.de>
> Cc: Stephen Warren <swar...@nvidia.com>; Simon Glass <s...@chromium.org>;
> Heiko Schocher <h...@denx.de>; Tony Yang - A41535
> <wenyou.y...@microchip.com>
> Subject: Re: [PATCH v6 1/2] gpio: at91_gpio: Remove CPU_HAS_PIO3 macro
> 
> Dear Wenyou,
> 
> On 13.02.17 03:07, Wenyou Yang wrote:
> > The intention of this patch is the preparation to introduce
> > the pinctrl driver for AT91 PIO.
> >
> > Use "union" to make the PIO3 and PIO2's registers be together
> > and make their offset aligned.
> 
> unfortunately there is another breakage in this patch I was not able to
> discover yesterday. The at91_emac driver for at91rm9200 devices uses the
> pio struct internally and therefore this patch also breaks the build for
> at91rm9200.
> 

Sorry for the inconvenience caused by my carelessness.

> Could you please also fix this?

Fixed, will send a new version. 

> 
> Andreas
> 
> >

Best Regards,
Wenyou Yang

> > Signed-off-by: Wenyou Yang <wenyou.y...@atmel.com>
> > ---
> >
> > Changes in v6:
> >  - Move PIO_SCDR_DIV define from mach/<soc.h> to mach/at91_pio.h
> >    to fix the build error.
> >
> > Changes in v5: None
> > Changes in v4:
> >  - Fix the incomplete conversion of the peripheral configurations on
> >    the sama5d3, sam9x5, and sam9n12.
> >
> > Changes in v3: None
> > Changes in v2: None
> >
> >  arch/arm/mach-at91/arm926ejs/at91sam9n12_devices.c | 106 ++++++------
> >  arch/arm/mach-at91/arm926ejs/at91sam9x5_devices.c  | 112 ++++++-------
> >  arch/arm/mach-at91/armv7/sama5d3_devices.c         | 140 ++++++++--------
> >  arch/arm/mach-at91/include/mach/at91_pio.h         |  63 ++++----
> >  arch/arm/mach-at91/include/mach/at91sam9x5.h       |   2 -
> >  arch/arm/mach-at91/include/mach/sama5d3.h          |   2 -
> >  arch/arm/mach-at91/include/mach/sama5d4.h          |   2 -
> >  board/atmel/at91sam9n12ek/at91sam9n12ek.c          |  10 +-
> >  board/atmel/at91sam9x5ek/at91sam9x5ek.c            |  90 +++++------
> >  board/atmel/sama5d3xek/sama5d3xek.c                |  64 ++++----
> >  board/atmel/sama5d4_xplained/sama5d4_xplained.c    | 148 ++++++++---------
> >  board/atmel/sama5d4ek/sama5d4ek.c                  | 136 ++++++++--------
> >  board/denx/ma5d4evk/ma5d4evk.c                     | 178 
> > ++++++++++-----------
> >  board/l+g/vinco/vinco.c                            |  70 ++++----
> >  drivers/gpio/at91_gpio.c                           | 142 ++++++++++------
> >  15 files changed, 658 insertions(+), 607 deletions(-)
> >
> > diff --git a/arch/arm/mach-at91/arm926ejs/at91sam9n12_devices.c
> b/arch/arm/mach-at91/arm926ejs/at91sam9n12_devices.c
> > index a03abfc310..28c8cf260a 100644
> > --- a/arch/arm/mach-at91/arm926ejs/at91sam9n12_devices.c
> > +++ b/arch/arm/mach-at91/arm926ejs/at91sam9n12_devices.c
> > @@ -18,45 +18,45 @@ unsigned int has_lcdc()
> >
> >  void at91_serial0_hw_init(void)
> >  {
> > -   at91_set_a_periph(AT91_PIO_PORTA, 0, 1);                /* TXD0 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 1, 0);                /* RXD0 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 0, 1);           /* TXD0 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 1, 0);           /* RXD0
> */
> >     at91_periph_clk_enable(ATMEL_ID_USART0);
> >  }
> >
> >  void at91_serial1_hw_init(void)
> >  {
> > -   at91_set_a_periph(AT91_PIO_PORTA, 5, 1);                /* TXD1 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 6, 0);                /* RXD1 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 5, 1);           /* TXD1 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 6, 0);           /* RXD1
> */
> >     at91_periph_clk_enable(ATMEL_ID_USART1);
> >  }
> >
> >  void at91_serial2_hw_init(void)
> >  {
> > -   at91_set_a_periph(AT91_PIO_PORTA, 7, 1);                /* TXD2 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 8, 0);                /* RXD2 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 7, 1);           /* TXD2 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 8, 0);           /* RXD2
> */
> >     at91_periph_clk_enable(ATMEL_ID_USART2);
> >  }
> >
> >  void at91_serial3_hw_init(void)
> >  {
> > -   at91_set_b_periph(AT91_PIO_PORTC, 22, 1);               /* TXD3 */
> > -   at91_set_b_periph(AT91_PIO_PORTC, 23, 0);               /* RXD3 */
> > +   at91_pio3_set_b_periph(AT91_PIO_PORTC, 22, 1);          /* TXD3 */
> > +   at91_pio3_set_b_periph(AT91_PIO_PORTC, 23, 0);          /* RXD3
> */
> >     at91_periph_clk_enable(ATMEL_ID_USART3);
> >  }
> >
> >  void at91_seriald_hw_init(void)
> >  {
> > -   at91_set_a_periph(AT91_PIO_PORTA, 10, 1);               /* DTXD */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 9, 0);                /* DRXD */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 10, 1);          /* DTXD
> */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 9, 0);           /* DRXD
> */
> >     at91_periph_clk_enable(ATMEL_ID_SYS);
> >  }
> >
> >  #ifdef CONFIG_ATMEL_SPI
> >  void at91_spi0_hw_init(unsigned long cs_mask)
> >  {
> > -   at91_set_a_periph(AT91_PIO_PORTA, 11, 0);       /* SPI0_MISO */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 12, 0);       /* SPI0_MOSI */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 13, 0);       /* SPI0_SPCK */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 11, 0);  /* SPI0_MISO */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 12, 0);  /* SPI0_MOSI */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 13, 0);  /* SPI0_SPCK */
> >
> >     at91_periph_clk_enable(ATMEL_ID_SPI0);
> >
> > @@ -72,9 +72,9 @@ void at91_spi0_hw_init(unsigned long cs_mask)
> >
> >  void at91_spi1_hw_init(unsigned long cs_mask)
> >  {
> > -   at91_set_b_periph(AT91_PIO_PORTA, 21, 0);       /* SPI1_MISO */
> > -   at91_set_b_periph(AT91_PIO_PORTA, 22, 0);       /* SPI1_MOSI */
> > -   at91_set_b_periph(AT91_PIO_PORTA, 23, 0);       /* SPI1_SPCK */
> > +   at91_pio3_set_b_periph(AT91_PIO_PORTA, 21, 0);  /* SPI1_MISO */
> > +   at91_pio3_set_b_periph(AT91_PIO_PORTA, 22, 0);  /* SPI1_MOSI */
> > +   at91_pio3_set_b_periph(AT91_PIO_PORTA, 23, 0);  /* SPI1_SPCK */
> >
> >     at91_periph_clk_enable(ATMEL_ID_SPI1);
> >
> > @@ -91,12 +91,12 @@ void at91_spi1_hw_init(unsigned long cs_mask)
> >
> >  void at91_mci_hw_init(void)
> >  {
> > -   at91_set_a_periph(AT91_PIO_PORTA, 17, 0);       /* MCCK */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 16, 0);       /* MCCDA */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 15, 0);       /* MCDA0 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 18, 0);       /* MCDA1 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 19, 0);       /* MCDA2 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 20, 0);       /* MCDA3 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 17, 0);  /* MCCK */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 16, 0);  /* MCCDA */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 15, 0);  /* MCDA0 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 18, 0);  /* MCDA1 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 19, 0);  /* MCDA2 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 20, 0);  /* MCDA3 */
> >
> >     at91_periph_clk_enable(ATMEL_ID_HSMCI0);
> >  }
> > @@ -104,37 +104,37 @@ void at91_mci_hw_init(void)
> >  #ifdef CONFIG_LCD
> >  void at91_lcd_hw_init(void)
> >  {
> > -   at91_set_a_periph(AT91_PIO_PORTC, 24, 0);       /* LCDDPWR */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 26, 0);       /* LCDVSYNC */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 27, 0);       /* LCDHSYNC */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 28, 0);       /* LCDDOTCK */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 29, 0);       /* LCDDEN */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 30, 0);       /* LCDDOTCK */
> > -
> > -   at91_set_a_periph(AT91_PIO_PORTC, 0, 0);        /* LCDD0 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 1, 0);        /* LCDD1 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 2, 0);        /* LCDD2 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 3, 0);        /* LCDD3 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 4, 0);        /* LCDD4 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 5, 0);        /* LCDD5 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 6, 0);        /* LCDD6 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 7, 0);        /* LCDD7 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 8, 0);        /* LCDD8 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 9, 0);        /* LCDD9 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 10, 0);       /* LCDD10 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 11, 0);       /* LCDD11 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 12, 0);       /* LCDD12 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 13, 0);       /* LCDD13 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 14, 0);       /* LCDD14 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 15, 0);       /* LCDD15 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 16, 0);       /* LCDD16 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 17, 0);       /* LCDD17 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 18, 0);       /* LCDD18 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 19, 0);       /* LCDD19 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 20, 0);       /* LCDD20 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 21, 0);       /* LCDD21 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 22, 0);       /* LCDD22 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 23, 0);       /* LCDD23 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 24, 0);  /* LCDDPWR */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 26, 0);  /* LCDVSYNC */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 27, 0);  /* LCDHSYNC */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 28, 0);  /* LCDDOTCK */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 29, 0);  /* LCDDEN */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 30, 0);  /* LCDDOTCK */
> > +
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 0, 0);   /* LCDD0 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 1, 0);   /* LCDD1 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 2, 0);   /* LCDD2 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 3, 0);   /* LCDD3 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 4, 0);   /* LCDD4 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 5, 0);   /* LCDD5 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 6, 0);   /* LCDD6 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 7, 0);   /* LCDD7 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 8, 0);   /* LCDD8 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 9, 0);   /* LCDD9 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 10, 0);  /* LCDD10 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 11, 0);  /* LCDD11 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 12, 0);  /* LCDD12 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 13, 0);  /* LCDD13 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 14, 0);  /* LCDD14 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 15, 0);  /* LCDD15 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 16, 0);  /* LCDD16 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 17, 0);  /* LCDD17 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 18, 0);  /* LCDD18 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 19, 0);  /* LCDD19 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 20, 0);  /* LCDD20 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 21, 0);  /* LCDD21 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 22, 0);  /* LCDD22 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 23, 0);  /* LCDD23 */
> >
> >     at91_periph_clk_enable(ATMEL_ID_LCDC);
> >  }
> > diff --git a/arch/arm/mach-at91/arm926ejs/at91sam9x5_devices.c
> b/arch/arm/mach-at91/arm926ejs/at91sam9x5_devices.c
> > index 3e4555a1a1..8de086efd6 100644
> > --- a/arch/arm/mach-at91/arm926ejs/at91sam9x5_devices.c
> > +++ b/arch/arm/mach-at91/arm926ejs/at91sam9x5_devices.c
> > @@ -64,32 +64,32 @@ char *get_cpu_name()
> >
> >  void at91_seriald_hw_init(void)
> >  {
> > -   at91_set_a_periph(AT91_PIO_PORTA, 9, 0);        /* DRXD */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 10, 1);       /* DTXD */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 9, 0);   /* DRXD */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 10, 1);  /* DTXD */
> >
> >     at91_periph_clk_enable(ATMEL_ID_SYS);
> >  }
> >
> >  void at91_serial0_hw_init(void)
> >  {
> > -   at91_set_a_periph(AT91_PIO_PORTA, 0, 1);        /* TXD */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 1, 0);        /* RXD */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 0, 1);   /* TXD */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 1, 0);   /* RXD */
> >
> >     at91_periph_clk_enable(ATMEL_ID_USART0);
> >  }
> >
> >  void at91_serial1_hw_init(void)
> >  {
> > -   at91_set_a_periph(AT91_PIO_PORTA, 5, 1);        /* TXD */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 6, 0);        /* RXD */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 5, 1);   /* TXD */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 6, 0);   /* RXD */
> >
> >     at91_periph_clk_enable(ATMEL_ID_USART1);
> >  }
> >
> >  void at91_serial2_hw_init(void)
> >  {
> > -   at91_set_a_periph(AT91_PIO_PORTA, 7, 1);        /* TXD */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 8, 0);        /* RXD */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 7, 1);   /* TXD */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 8, 0);   /* RXD */
> >
> >     at91_periph_clk_enable(ATMEL_ID_USART2);
> >  }
> > @@ -97,12 +97,12 @@ void at91_serial2_hw_init(void)
> >  void at91_mci_hw_init(void)
> >  {
> >     /* Initialize the MCI0 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 17, 1);       /* MCCK */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 16, 1);       /* MCCDA */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 15, 1);       /* MCDA0 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 18, 1);       /* MCDA1 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 19, 1);       /* MCDA2 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 20, 1);       /* MCDA3 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 17, 1);  /* MCCK */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 16, 1);  /* MCCDA */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 15, 1);  /* MCDA0 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 18, 1);  /* MCDA1 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 19, 1);  /* MCDA2 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 20, 1);  /* MCDA3 */
> >
> >     at91_periph_clk_enable(ATMEL_ID_HSMCI0);
> >  }
> > @@ -110,20 +110,20 @@ void at91_mci_hw_init(void)
> >  #ifdef CONFIG_ATMEL_SPI
> >  void at91_spi0_hw_init(unsigned long cs_mask)
> >  {
> > -   at91_set_a_periph(AT91_PIO_PORTA, 11, 0);       /* SPI0_MISO */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 12, 0);       /* SPI0_MOSI */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 13, 0);       /* SPI0_SPCK */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 11, 0);  /* SPI0_MISO */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 12, 0);  /* SPI0_MOSI */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 13, 0);  /* SPI0_SPCK */
> >
> >     at91_periph_clk_enable(ATMEL_ID_SPI0);
> >
> >     if (cs_mask & (1 << 0))
> > -           at91_set_a_periph(AT91_PIO_PORTA, 14, 0);
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTA, 14, 0);
> >     if (cs_mask & (1 << 1))
> > -           at91_set_b_periph(AT91_PIO_PORTA, 7, 0);
> > +           at91_pio3_set_b_periph(AT91_PIO_PORTA, 7, 0);
> >     if (cs_mask & (1 << 2))
> > -           at91_set_b_periph(AT91_PIO_PORTA, 1, 0);
> > +           at91_pio3_set_b_periph(AT91_PIO_PORTA, 1, 0);
> >     if (cs_mask & (1 << 3))
> > -           at91_set_b_periph(AT91_PIO_PORTB, 3, 0);
> > +           at91_pio3_set_b_periph(AT91_PIO_PORTB, 3, 0);
> >     if (cs_mask & (1 << 4))
> >             at91_set_pio_output(AT91_PIO_PORTA, 14, 0);
> >     if (cs_mask & (1 << 5))
> > @@ -136,20 +136,20 @@ void at91_spi0_hw_init(unsigned long cs_mask)
> >
> >  void at91_spi1_hw_init(unsigned long cs_mask)
> >  {
> > -   at91_set_b_periph(AT91_PIO_PORTA, 21, 0);       /* SPI1_MISO */
> > -   at91_set_b_periph(AT91_PIO_PORTA, 22, 0);       /* SPI1_MOSI */
> > -   at91_set_b_periph(AT91_PIO_PORTA, 23, 0);       /* SPI1_SPCK */
> > +   at91_pio3_set_b_periph(AT91_PIO_PORTA, 21, 0);  /* SPI1_MISO */
> > +   at91_pio3_set_b_periph(AT91_PIO_PORTA, 22, 0);  /* SPI1_MOSI */
> > +   at91_pio3_set_b_periph(AT91_PIO_PORTA, 23, 0);  /* SPI1_SPCK */
> >
> >     at91_periph_clk_enable(ATMEL_ID_SPI1);
> >
> >     if (cs_mask & (1 << 0))
> > -           at91_set_b_periph(AT91_PIO_PORTA, 8, 0);
> > +           at91_pio3_set_b_periph(AT91_PIO_PORTA, 8, 0);
> >     if (cs_mask & (1 << 1))
> > -           at91_set_b_periph(AT91_PIO_PORTA, 0, 0);
> > +           at91_pio3_set_b_periph(AT91_PIO_PORTA, 0, 0);
> >     if (cs_mask & (1 << 2))
> > -           at91_set_b_periph(AT91_PIO_PORTA, 31, 0);
> > +           at91_pio3_set_b_periph(AT91_PIO_PORTA, 31, 0);
> >     if (cs_mask & (1 << 3))
> > -           at91_set_b_periph(AT91_PIO_PORTA, 30, 0);
> > +           at91_pio3_set_b_periph(AT91_PIO_PORTA, 30, 0);
> >     if (cs_mask & (1 << 4))
> >             at91_set_pio_output(AT91_PIO_PORTA, 8, 0);
> >     if (cs_mask & (1 << 5))
> > @@ -181,45 +181,45 @@ void at91_macb_hw_init(void)
> >             /* Enable EMAC0 clock */
> >             at91_periph_clk_enable(ATMEL_ID_EMAC0);
> >             /* EMAC0 pins setup */
> > -           at91_set_a_periph(AT91_PIO_PORTB, 4, 0);        /* ETXCK */
> > -           at91_set_a_periph(AT91_PIO_PORTB, 3, 0);        /* ERXDV */
> > -           at91_set_a_periph(AT91_PIO_PORTB, 0, 0);        /* ERX0 */
> > -           at91_set_a_periph(AT91_PIO_PORTB, 1, 0);        /* ERX1 */
> > -           at91_set_a_periph(AT91_PIO_PORTB, 2, 0);        /* ERXER */
> > -           at91_set_a_periph(AT91_PIO_PORTB, 7, 0);        /* ETXEN */
> > -           at91_set_a_periph(AT91_PIO_PORTB, 9, 0);        /* ETX0 */
> > -           at91_set_a_periph(AT91_PIO_PORTB, 10, 0);       /* ETX1 */
> > -           at91_set_a_periph(AT91_PIO_PORTB, 5, 0);        /* EMDIO */
> > -           at91_set_a_periph(AT91_PIO_PORTB, 6, 0);        /* EMDC */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTB, 4, 0);   /* ETXCK
> */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTB, 3, 0);   /* ERXDV
> */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTB, 0, 0);   /* ERX0 */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTB, 1, 0);   /* ERX1 */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTB, 2, 0);   /* ERXER
> */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTB, 7, 0);   /* ETXEN
> */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTB, 9, 0);   /* ETX0 */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTB, 10, 0);  /* ETX1 */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTB, 5, 0);   /* EMDIO
> */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTB, 6, 0);   /* EMDC
> */
> >     }
> >
> >     if (has_emac1()) {
> >             /* Enable EMAC1 clock */
> >             at91_periph_clk_enable(ATMEL_ID_EMAC1);
> >             /* EMAC1 pins setup */
> > -           at91_set_b_periph(AT91_PIO_PORTC, 29, 0);       /* ETXCK */
> > -           at91_set_b_periph(AT91_PIO_PORTC, 28, 0);       /* ECRSDV */
> > -           at91_set_b_periph(AT91_PIO_PORTC, 20, 0);       /* ERXO */
> > -           at91_set_b_periph(AT91_PIO_PORTC, 21, 0);       /* ERX1 */
> > -           at91_set_b_periph(AT91_PIO_PORTC, 16, 0);       /* ERXER */
> > -           at91_set_b_periph(AT91_PIO_PORTC, 27, 0);       /* ETXEN */
> > -           at91_set_b_periph(AT91_PIO_PORTC, 18, 0);       /* ETX0 */
> > -           at91_set_b_periph(AT91_PIO_PORTC, 19, 0);       /* ETX1 */
> > -           at91_set_b_periph(AT91_PIO_PORTC, 31, 0);       /* EMDIO */
> > -           at91_set_b_periph(AT91_PIO_PORTC, 30, 0);       /* EMDC */
> > +           at91_pio3_set_b_periph(AT91_PIO_PORTC, 29, 0);  /* ETXCK
> */
> > +           at91_pio3_set_b_periph(AT91_PIO_PORTC, 28, 0);  /*
> ECRSDV */
> > +           at91_pio3_set_b_periph(AT91_PIO_PORTC, 20, 0);  /* ERXO
> */
> > +           at91_pio3_set_b_periph(AT91_PIO_PORTC, 21, 0);  /* ERX1 */
> > +           at91_pio3_set_b_periph(AT91_PIO_PORTC, 16, 0);  /* ERXER
> */
> > +           at91_pio3_set_b_periph(AT91_PIO_PORTC, 27, 0);  /* ETXEN
> */
> > +           at91_pio3_set_b_periph(AT91_PIO_PORTC, 18, 0);  /* ETX0 */
> > +           at91_pio3_set_b_periph(AT91_PIO_PORTC, 19, 0);  /* ETX1 */
> > +           at91_pio3_set_b_periph(AT91_PIO_PORTC, 31, 0);  /* EMDIO
> */
> > +           at91_pio3_set_b_periph(AT91_PIO_PORTC, 30, 0);  /* EMDC
> */
> >     }
> >
> >  #ifndef CONFIG_RMII
> >     /* Only emac0 support MII */
> >     if (has_emac0()) {
> > -           at91_set_a_periph(AT91_PIO_PORTB, 16, 0);       /* ECRS */
> > -           at91_set_a_periph(AT91_PIO_PORTB, 17, 0);       /* ECOL */
> > -           at91_set_a_periph(AT91_PIO_PORTB, 13, 0);       /* ERX2 */
> > -           at91_set_a_periph(AT91_PIO_PORTB, 14, 0);       /* ERX3 */
> > -           at91_set_a_periph(AT91_PIO_PORTB, 15, 0);       /* ERXCK */
> > -           at91_set_a_periph(AT91_PIO_PORTB, 11, 0);       /* ETX2 */
> > -           at91_set_a_periph(AT91_PIO_PORTB, 12, 0);       /* ETX3 */
> > -           at91_set_a_periph(AT91_PIO_PORTB, 8, 0);        /* ETXER */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTB, 16, 0);  /* ECRS
> */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTB, 17, 0);  /* ECOL
> */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTB, 13, 0);  /* ERX2 */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTB, 14, 0);  /* ERX3 */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTB, 15, 0);  /* ERXCK
> */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTB, 11, 0);  /* ETX2 */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTB, 12, 0);  /* ETX3 */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTB, 8, 0);   /* ETXER
> */
> >     }
> >  #endif
> >  }
> > diff --git a/arch/arm/mach-at91/armv7/sama5d3_devices.c b/arch/arm/mach-
> at91/armv7/sama5d3_devices.c
> > index 64ac262818..6becdd7fee 100644
> > --- a/arch/arm/mach-at91/armv7/sama5d3_devices.c
> > +++ b/arch/arm/mach-at91/armv7/sama5d3_devices.c
> > @@ -52,8 +52,8 @@ char *get_cpu_name()
> >
> >  void at91_serial0_hw_init(void)
> >  {
> > -   at91_set_a_periph(AT91_PIO_PORTD, 18, 1);       /* TXD0 */
> > -   at91_set_a_periph(AT91_PIO_PORTD, 17, 0);       /* RXD0 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTD, 18, 1);  /* TXD0 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTD, 17, 0);  /* RXD0 */
> >
> >     /* Enable clock */
> >     at91_periph_clk_enable(ATMEL_ID_USART0);
> > @@ -61,8 +61,8 @@ void at91_serial0_hw_init(void)
> >
> >  void at91_serial1_hw_init(void)
> >  {
> > -   at91_set_a_periph(AT91_PIO_PORTB, 29, 1);       /* TXD1 */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 28, 0);       /* RXD1 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 29, 1);  /* TXD1 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 28, 0);  /* RXD1 */
> >
> >     /* Enable clock */
> >     at91_periph_clk_enable(ATMEL_ID_USART1);
> > @@ -70,8 +70,8 @@ void at91_serial1_hw_init(void)
> >
> >  void at91_serial2_hw_init(void)
> >  {
> > -   at91_set_b_periph(AT91_PIO_PORTE, 26, 1);       /* TXD2 */
> > -   at91_set_b_periph(AT91_PIO_PORTE, 25, 0);       /* RXD2 */
> > +   at91_pio3_set_b_periph(AT91_PIO_PORTE, 26, 1);  /* TXD2 */
> > +   at91_pio3_set_b_periph(AT91_PIO_PORTE, 25, 0);  /* RXD2 */
> >
> >     /* Enable clock */
> >     at91_periph_clk_enable(ATMEL_ID_USART2);
> > @@ -79,8 +79,8 @@ void at91_serial2_hw_init(void)
> >
> >  void at91_seriald_hw_init(void)
> >  {
> > -   at91_set_a_periph(AT91_PIO_PORTB, 31, 1);       /* DTXD */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 30, 0);       /* DRXD */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 31, 1);  /* DTXD */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 30, 0);  /* DRXD */
> >
> >     /* Enable clock */
> >     at91_periph_clk_enable(ATMEL_ID_DBGU);
> > @@ -89,9 +89,9 @@ void at91_seriald_hw_init(void)
> >  #if defined(CONFIG_ATMEL_SPI)
> >  void at91_spi0_hw_init(unsigned long cs_mask)
> >  {
> > -   at91_set_a_periph(AT91_PIO_PORTD, 10, 0);       /* SPI0_MISO */
> > -   at91_set_a_periph(AT91_PIO_PORTD, 11, 0);       /* SPI0_MOSI */
> > -   at91_set_a_periph(AT91_PIO_PORTD, 12, 0);       /* SPI0_SPCK */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTD, 10, 0);       /* SPI0_MISO */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTD, 11, 0);       /* SPI0_MOSI */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTD, 12, 0);       /* SPI0_SPCK */
> >
> >     if (cs_mask & (1 << 0))
> >             at91_set_pio_output(AT91_PIO_PORTD, 13, 1);
> > @@ -110,18 +110,18 @@ void at91_spi0_hw_init(unsigned long cs_mask)
> >  #ifdef CONFIG_GENERIC_ATMEL_MCI
> >  void at91_mci_hw_init(void)
> >  {
> > -   at91_set_a_periph(AT91_PIO_PORTD, 0, 0);        /* MCI0 CMD */
> > -   at91_set_a_periph(AT91_PIO_PORTD, 1, 0);        /* MCI0 DA0 */
> > -   at91_set_a_periph(AT91_PIO_PORTD, 2, 0);        /* MCI0 DA1 */
> > -   at91_set_a_periph(AT91_PIO_PORTD, 3, 0);        /* MCI0 DA2 */
> > -   at91_set_a_periph(AT91_PIO_PORTD, 4, 0);        /* MCI0 DA3 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTD, 0, 0);   /* MCI0 CMD */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTD, 1, 0);   /* MCI0 DA0 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTD, 2, 0);   /* MCI0 DA1 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTD, 3, 0);        /* MCI0 DA2 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTD, 4, 0);        /* MCI0 DA3 */
> >  #ifdef CONFIG_ATMEL_MCI_8BIT
> > -   at91_set_a_periph(AT91_PIO_PORTD, 5, 0);        /* MCI0 DA4 */
> > -   at91_set_a_periph(AT91_PIO_PORTD, 6, 0);        /* MCI0 DA5 */
> > -   at91_set_a_periph(AT91_PIO_PORTD, 7, 0);        /* MCI0 DA6 */
> > -   at91_set_a_periph(AT91_PIO_PORTD, 8, 0);        /* MCI0 DA7 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTD, 5, 0);        /* MCI0 DA4 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTD, 6, 0);        /* MCI0 DA5 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTD, 7, 0);        /* MCI0 DA6 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTD, 8, 0);        /* MCI0 DA7 */
> >  #endif
> > -   at91_set_a_periph(AT91_PIO_PORTD, 9, 0);        /* MCI0 CLK */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTD, 9, 0);        /* MCI0 CLK */
> >
> >     /* Enable clock */
> >     at91_periph_clk_enable(ATMEL_ID_MCI0);
> > @@ -131,16 +131,16 @@ void at91_mci_hw_init(void)
> >  #ifdef CONFIG_MACB
> >  void at91_macb_hw_init(void)
> >  {
> > -   at91_set_a_periph(AT91_PIO_PORTC, 7, 0);        /* ETXCK_EREFCK */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 5, 0);        /* ERXDV */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 2, 0);        /* ERX0 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 3, 0);        /* ERX1 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 6, 0);        /* ERXER */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 4, 0);        /* ETXEN */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 0, 0);        /* ETX0 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 1, 0);        /* ETX1 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 9, 0);        /* EMDIO */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 8, 0);        /* EMDC */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 7, 0);   /*
> ETXCK_EREFCK */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 5, 0);   /* ERXDV */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 2, 0);   /* ERX0 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 3, 0);   /* ERX1 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 6, 0);   /* ERXER */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 4, 0);   /* ETXEN */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 0, 0);   /* ETX0 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 1, 0);   /* ETX1 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 9, 0);   /* EMDIO */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 8, 0);   /* EMDC */
> >
> >     /* Enable clock */
> >     at91_periph_clk_enable(ATMEL_ID_EMAC);
> > @@ -148,23 +148,23 @@ void at91_macb_hw_init(void)
> >
> >  void at91_gmac_hw_init(void)
> >  {
> > -   at91_set_a_periph(AT91_PIO_PORTB, 0, 0);        /* GTX0 */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 1, 0);        /* GTX1 */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 2, 0);        /* GTX2 */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 3, 0);        /* GTX3 */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 4, 0);        /* GRX0 */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 5, 0);        /* GRX1 */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 6, 0);        /* GRX2 */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 7, 0);        /* GRX3 */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 8, 0);        /* GTXCK */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 9, 0);        /* GTXEN */
> > -
> > -   at91_set_a_periph(AT91_PIO_PORTB, 11, 0);       /* GRXCK */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 13, 0);       /* GRXER */
> > -
> > -   at91_set_a_periph(AT91_PIO_PORTB, 16, 0);       /* GMDC */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 17, 0);       /* GMDIO */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 18, 0);       /* G125CK */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 0, 0);   /* GTX0 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 1, 0);   /* GTX1 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 2, 0);   /* GTX2 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 3, 0);   /* GTX3 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 4, 0);   /* GRX0 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 5, 0);   /* GRX1 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 6, 0);   /* GRX2 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 7, 0);   /* GRX3 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 8, 0);   /* GTXCK */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 9, 0);   /* GTXEN */
> > +
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 11, 0);  /* GRXCK */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 13, 0);  /* GRXER */
> > +
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 16, 0);  /* GMDC */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 17, 0);  /* GMDIO */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 18, 0);  /* G125CK */
> >
> >     /* Enable clock */
> >     at91_periph_clk_enable(ATMEL_ID_GMAC);
> > @@ -174,30 +174,30 @@ void at91_gmac_hw_init(void)
> >  #ifdef CONFIG_LCD
> >  void at91_lcd_hw_init(void)
> >  {
> > -   at91_set_a_periph(AT91_PIO_PORTA, 24, 0);       /* LCDPWM */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 25, 0);       /* LCDDISP */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 26, 0);       /* LCDVSYNC */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 27, 0);       /* LCDHSYNC */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 28, 0);       /* LCDDOTCK */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 29, 0);       /* LCDDEN */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 24, 0);  /* LCDPWM */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 25, 0);  /* LCDDISP */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 26, 0);  /* LCDVSYNC */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 27, 0);  /* LCDHSYNC */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 28, 0);  /* LCDDOTCK */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 29, 0);  /* LCDDEN */
> >
> >     /* The lower 16-bit of LCD only available on Port A */
> > -   at91_set_a_periph(AT91_PIO_PORTA,  0, 0);       /* LCDD0 */
> > -   at91_set_a_periph(AT91_PIO_PORTA,  1, 0);       /* LCDD1 */
> > -   at91_set_a_periph(AT91_PIO_PORTA,  2, 0);       /* LCDD2 */
> > -   at91_set_a_periph(AT91_PIO_PORTA,  3, 0);       /* LCDD3 */
> > -   at91_set_a_periph(AT91_PIO_PORTA,  4, 0);       /* LCDD4 */
> > -   at91_set_a_periph(AT91_PIO_PORTA,  5, 0);       /* LCDD5 */
> > -   at91_set_a_periph(AT91_PIO_PORTA,  6, 0);       /* LCDD6 */
> > -   at91_set_a_periph(AT91_PIO_PORTA,  7, 0);       /* LCDD7 */
> > -   at91_set_a_periph(AT91_PIO_PORTA,  8, 0);       /* LCDD8 */
> > -   at91_set_a_periph(AT91_PIO_PORTA,  9, 0);       /* LCDD9 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 10, 0);       /* LCDD10 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 11, 0);       /* LCDD11 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 12, 0);       /* LCDD12 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 13, 0);       /* LCDD13 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 14, 0);       /* LCDD14 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 15, 0);       /* LCDD15 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA,  0, 0);  /* LCDD0 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA,  1, 0);  /* LCDD1 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA,  2, 0);  /* LCDD2 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA,  3, 0);  /* LCDD3 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA,  4, 0);  /* LCDD4 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA,  5, 0);  /* LCDD5 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA,  6, 0);  /* LCDD6 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA,  7, 0);  /* LCDD7 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA,  8, 0);  /* LCDD8 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA,  9, 0);  /* LCDD9 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 10, 0);  /* LCDD10 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 11, 0);  /* LCDD11 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 12, 0);  /* LCDD12 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 13, 0);  /* LCDD13 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 14, 0);  /* LCDD14 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 15, 0);  /* LCDD15 */
> >
> >     /* Enable clock */
> >     at91_periph_clk_enable(ATMEL_ID_LCDC);
> > diff --git a/arch/arm/mach-at91/include/mach/at91_pio.h b/arch/arm/mach-
> at91/include/mach/at91_pio.h
> > index 301227880a..946f076714 100644
> > --- a/arch/arm/mach-at91/include/mach/at91_pio.h
> > +++ b/arch/arm/mach-at91/include/mach/at91_pio.h
> > @@ -32,6 +32,8 @@
> >  #define AT91_ASM_PIOD_ASR  \
> >     (ATMEL_BASE_PIO + AT91_PIO_PORTD * AT91_ASM_PIO_RANGE +
> 0x70)
> >
> > +#define PIO_SCDR_DIV               0x3fff  /* Slow Clock Divider Selection
> for Debouncing Mask */
> > +
> >  #ifndef __ASSEMBLY__
> >
> >  typedef struct at91_port {
> > @@ -63,28 +65,32 @@ typedef struct at91_port {
> >     u32     puer;           /* 0x64 Pull-up Enable Register */
> >     u32     pusr;           /* 0x68 Pad Pull-up Status Register */
> >     u32     reserved4;
> > -#if defined(CPU_HAS_PIO3)
> > -   u32     abcdsr1;        /* 0x70 Peripheral ABCD Select Register 1 */
> > -   u32     abcdsr2;        /* 0x74 Peripheral ABCD Select Register 2 */
> > -   u32     reserved5[2];
> > -   u32     ifscdr;         /* 0x80 Input Filter SCLK Disable Register */
> > -   u32     ifscer;         /* 0x84 Input Filter SCLK Enable Register */
> > -   u32     ifscsr;         /* 0x88 Input Filter SCLK Status Register */
> > -   u32     scdr;           /* 0x8C SCLK Divider Debouncing Register */
> > -   u32     ppddr;          /* 0x90 Pad Pull-down Disable Register */
> > -   u32     ppder;          /* 0x94 Pad Pull-down Enable Register */
> > -   u32     ppdsr;          /* 0x98 Pad Pull-down Status Register */
> > -   u32     reserved6;      /*  */
> > -#else
> > -   u32     asr;            /* 0x70 Select A Register */
> > -   u32     bsr;            /* 0x74 Select B Register */
> > -   u32     absr;           /* 0x78 AB Select Status Register */
> > -   u32     reserved5[9];   /*  */
> > -#endif
> > +   union {
> > +           struct {
> > +                   u32     abcdsr1;        /* 0x70 Peripheral ABCD Select
> Register 1 */
> > +                   u32     abcdsr2;        /* 0x74 Peripheral ABCD Select
> Register 2 */
> > +                   u32     reserved5[2];
> > +                   u32     ifscdr;         /* 0x80 Input Filter SCLK 
> > Disable
> Register */
> > +                   u32     ifscer;         /* 0x84 Input Filter SCLK Enable
> Register */
> > +                   u32     ifscsr;         /* 0x88 Input Filter SCLK Status
> Register */
> > +                   u32     scdr;           /* 0x8C SCLK Divider Debouncing
> Register */
> > +                   u32     ppddr;          /* 0x90 Pad Pull-down Disable
> Register */
> > +                   u32     ppder;          /* 0x94 Pad Pull-down Enable
> Register */
> > +                   u32     ppdsr;          /* 0x98 Pad Pull-down Status
> Register */
> > +                   u32     reserved6;      /*  */
> > +           } pio3;
> > +
> > +           struct {
> > +                   u32     asr;            /* 0x70 Select A Register */
> > +                   u32     bsr;            /* 0x74 Select B Register */
> > +                   u32     absr;           /* 0x78 AB Select Status 
> > Register
> */
> > +                   u32     reserved5[9];   /*  */
> > +           } pio2;
> > +   } mux;
> > +
> >     u32     ower;           /* 0xA0 Output Write Enable Register */
> >     u32     owdr;           /* 0xA4 Output Write Disable Register */
> >     u32     owsr;           /* OxA8 Output Write Status Register */
> > -#if defined(CPU_HAS_PIO3)
> >     u32     reserved7;      /*  */
> >     u32     aimer;          /* 0xB0 Additional INT Modes Enable Register */
> >     u32     aimdr;          /* 0xB4 Additional INT Modes Disable Register */
> > @@ -104,9 +110,6 @@ typedef struct at91_port {
> >     u32     reserved11[5];  /* */
> >     u32     schmitt;        /* 0x100 Schmitt Trigger Register */
> >     u32     reserved12[63];
> > -#else
> > -   u32     reserved6[85];
> > -#endif
> >  } at91_port_t;
> >
> >  typedef union at91_pio {
> > @@ -123,13 +126,6 @@ typedef union at91_pio {
> >  #ifdef CONFIG_AT91_GPIO
> >  int at91_set_a_periph(unsigned port, unsigned pin, int use_pullup);
> >  int at91_set_b_periph(unsigned port, unsigned pin, int use_pullup);
> > -#if defined(CPU_HAS_PIO3)
> > -int at91_set_c_periph(unsigned port, unsigned pin, int use_pullup);
> > -int at91_set_d_periph(unsigned port, unsigned pin, int use_pullup);
> > -int at91_set_pio_debounce(unsigned port, unsigned pin, int is_on, int div);
> > -int at91_set_pio_pulldown(unsigned port, unsigned pin, int is_on);
> > -int at91_set_pio_disable_schmitt_trig(unsigned port, unsigned pin);
> > -#endif
> >  int at91_set_pio_input(unsigned port, unsigned pin, int use_pullup);
> >  int at91_set_pio_multi_drive(unsigned port, unsigned pin, int is_on);
> >  int at91_set_pio_output(unsigned port, unsigned pin, int value);
> > @@ -138,6 +134,15 @@ int at91_set_pio_pullup(unsigned port, unsigned pin,
> int use_pullup);
> >  int at91_set_pio_deglitch(unsigned port, unsigned pin, int is_on);
> >  int at91_set_pio_value(unsigned port, unsigned pin, int value);
> >  int at91_get_pio_value(unsigned port, unsigned pin);
> > +
> > +int at91_pio3_set_a_periph(unsigned port, unsigned pin, int use_pullup);
> > +int at91_pio3_set_b_periph(unsigned port, unsigned pin, int use_pullup);
> > +int at91_pio3_set_c_periph(unsigned port, unsigned pin, int use_pullup);
> > +int at91_pio3_set_d_periph(unsigned port, unsigned pin, int use_pullup);
> > +int at91_pio3_set_pio_debounce(unsigned port, unsigned pin, int is_on, int 
> > div);
> > +int at91_pio3_set_pio_pullup(unsigned port, unsigned pin, int use_pullup);
> > +int at91_pio3_set_pio_pulldown(unsigned port, unsigned pin, int is_on);
> > +int at91_pio3_set_pio_disable_schmitt_trig(unsigned port, unsigned pin);
> >  #endif
> >  #endif
> >
> > diff --git a/arch/arm/mach-at91/include/mach/at91sam9x5.h b/arch/arm/mach-
> at91/include/mach/at91sam9x5.h
> > index 8100ebed4b..e7224e432d 100644
> > --- a/arch/arm/mach-at91/include/mach/at91sam9x5.h
> > +++ b/arch/arm/mach-at91/include/mach/at91sam9x5.h
> > @@ -171,8 +171,6 @@
> >   * Other misc defines
> >   */
> >  #define ATMEL_PIO_PORTS         4
> > -#define CPU_HAS_PIO3
> > -#define PIO_SCDR_DIV            (0x3fff <<  0)  /* Slow Clock Divider Mask 
> > */
> >  #define ATMEL_PMC_UHP              AT91SAM926x_PMC_UHP
> >  #define ATMEL_ID_UHP               ATMEL_ID_UHPHS
> >
> > diff --git a/arch/arm/mach-at91/include/mach/sama5d3.h b/arch/arm/mach-
> at91/include/mach/sama5d3.h
> > index 33f6c97c11..d558f95141 100644
> > --- a/arch/arm/mach-at91/include/mach/sama5d3.h
> > +++ b/arch/arm/mach-at91/include/mach/sama5d3.h
> > @@ -188,8 +188,6 @@
> >   * Other misc defines
> >   */
> >  #define ATMEL_PIO_PORTS            5
> > -#define CPU_HAS_PIO3
> > -#define PIO_SCDR_DIV               0x3fff
> >  #define CPU_HAS_PCR
> >
> >  /* Timer */
> > diff --git a/arch/arm/mach-at91/include/mach/sama5d4.h b/arch/arm/mach-
> at91/include/mach/sama5d4.h
> > index 90085da1c6..78cc2a7a0a 100644
> > --- a/arch/arm/mach-at91/include/mach/sama5d4.h
> > +++ b/arch/arm/mach-at91/include/mach/sama5d4.h
> > @@ -174,8 +174,6 @@
> >   * Other misc defines
> >   */
> >  #define ATMEL_PIO_PORTS            5
> > -#define CPU_HAS_PIO3
> > -#define PIO_SCDR_DIV               0x3fff
> >  #define CPU_HAS_PCR
> >  #define CPU_HAS_H32MXDIV
> >
> > diff --git a/board/atmel/at91sam9n12ek/at91sam9n12ek.c
> b/board/atmel/at91sam9n12ek/at91sam9n12ek.c
> > index fc4f50d219..58da2d27f8 100644
> > --- a/board/atmel/at91sam9n12ek/at91sam9n12ek.c
> > +++ b/board/atmel/at91sam9n12ek/at91sam9n12ek.c
> > @@ -71,10 +71,10 @@ static void at91sam9n12ek_nand_hw_init(void)
> >     /* Configure ENABLE pin for NandFlash */
> >     at91_set_pio_output(AT91_PIO_PORTD, 4, 1);
> >
> > -   at91_set_a_periph(AT91_PIO_PORTD, 0, 1);    /* NAND OE */
> > -   at91_set_a_periph(AT91_PIO_PORTD, 1, 1);    /* NAND WE */
> > -   at91_set_a_periph(AT91_PIO_PORTD, 2, 1);    /* ALE */
> > -   at91_set_a_periph(AT91_PIO_PORTD, 3, 1);    /* CLE */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTD, 0, 1);    /* NAND OE */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTD, 1, 1);    /* NAND WE */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTD, 2, 1);    /* ALE */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTD, 3, 1);    /* CLE */
> >  }
> >  #endif
> >
> > @@ -194,7 +194,7 @@ void at91sam9n12ek_ks8851_hw_init(void)
> >            &smc->cs[2].mode);
> >
> >     /* Configure NCS2 PIN */
> > -   at91_set_b_periph(AT91_PIO_PORTD, 19, 0);
> > +   at91_pio3_set_b_periph(AT91_PIO_PORTD, 19, 0);
> >  }
> >  #endif
> >
> > diff --git a/board/atmel/at91sam9x5ek/at91sam9x5ek.c
> b/board/atmel/at91sam9x5ek/at91sam9x5ek.c
> > index b0d440d728..cc81776f9b 100644
> > --- a/board/atmel/at91sam9x5ek/at91sam9x5ek.c
> > +++ b/board/atmel/at91sam9x5ek/at91sam9x5ek.c
> > @@ -77,18 +77,18 @@ static void at91sam9x5ek_nand_hw_init(void)
> >     /* Enable NandFlash */
> >     at91_set_gpio_output(CONFIG_SYS_NAND_ENABLE_PIN, 1);
> >
> > -   at91_set_a_periph(AT91_PIO_PORTD, 0, 1);        /* NAND OE */
> > -   at91_set_a_periph(AT91_PIO_PORTD, 1, 1);        /* NAND WE */
> > -   at91_set_a_periph(AT91_PIO_PORTD, 2, 1);        /* NAND ALE */
> > -   at91_set_a_periph(AT91_PIO_PORTD, 3, 1);        /* NAND CLE */
> > -   at91_set_a_periph(AT91_PIO_PORTD, 6, 1);
> > -   at91_set_a_periph(AT91_PIO_PORTD, 7, 1);
> > -   at91_set_a_periph(AT91_PIO_PORTD, 8, 1);
> > -   at91_set_a_periph(AT91_PIO_PORTD, 9, 1);
> > -   at91_set_a_periph(AT91_PIO_PORTD, 10, 1);
> > -   at91_set_a_periph(AT91_PIO_PORTD, 11, 1);
> > -   at91_set_a_periph(AT91_PIO_PORTD, 12, 1);
> > -   at91_set_a_periph(AT91_PIO_PORTD, 13, 1);
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTD, 0, 1);   /* NAND OE */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTD, 1, 1);   /* NAND WE */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTD, 2, 1);   /* NAND ALE */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTD, 3, 1);   /* NAND CLE */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTD, 6, 1);
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTD, 7, 1);
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTD, 8, 1);
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTD, 9, 1);
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTD, 10, 1);
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTD, 11, 1);
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTD, 12, 1);
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTD, 13, 1);
> >  }
> >  #endif
> >
> > @@ -128,49 +128,49 @@ vidinfo_t panel_info = {
> >  void lcd_enable(void)
> >  {
> >     if (has_lcdc())
> > -           at91_set_a_periph(AT91_PIO_PORTC, 29, 1);       /* power up */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTC, 29, 1);  /* power
> up */
> >  }
> >
> >  void lcd_disable(void)
> >  {
> >     if (has_lcdc())
> > -           at91_set_a_periph(AT91_PIO_PORTC, 29, 0);       /* power down */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTC, 29, 0);  /* power
> down */
> >  }
> >
> >  static void at91sam9x5ek_lcd_hw_init(void)
> >  {
> >     if (has_lcdc()) {
> > -           at91_set_a_periph(AT91_PIO_PORTC, 26, 0);       /* LCDPWM */
> > -           at91_set_a_periph(AT91_PIO_PORTC, 27, 0);       /* LCDVSYNC */
> > -           at91_set_a_periph(AT91_PIO_PORTC, 28, 0);       /* LCDHSYNC */
> > -           at91_set_a_periph(AT91_PIO_PORTC, 24, 0);       /* LCDDISP */
> > -           at91_set_a_periph(AT91_PIO_PORTC, 29, 0);       /* LCDDEN */
> > -           at91_set_a_periph(AT91_PIO_PORTC, 30, 0);       /* LCDPCK */
> > -
> > -           at91_set_a_periph(AT91_PIO_PORTC, 0, 0);        /* LCDD0 */
> > -           at91_set_a_periph(AT91_PIO_PORTC, 1, 0);        /* LCDD1 */
> > -           at91_set_a_periph(AT91_PIO_PORTC, 2, 0);        /* LCDD2 */
> > -           at91_set_a_periph(AT91_PIO_PORTC, 3, 0);        /* LCDD3 */
> > -           at91_set_a_periph(AT91_PIO_PORTC, 4, 0);        /* LCDD4 */
> > -           at91_set_a_periph(AT91_PIO_PORTC, 5, 0);        /* LCDD5 */
> > -           at91_set_a_periph(AT91_PIO_PORTC, 6, 0);        /* LCDD6 */
> > -           at91_set_a_periph(AT91_PIO_PORTC, 7, 0);        /* LCDD7 */
> > -           at91_set_a_periph(AT91_PIO_PORTC, 8, 0);        /* LCDD8 */
> > -           at91_set_a_periph(AT91_PIO_PORTC, 9, 0);        /* LCDD9 */
> > -           at91_set_a_periph(AT91_PIO_PORTC, 10, 0);       /* LCDD10 */
> > -           at91_set_a_periph(AT91_PIO_PORTC, 11, 0);       /* LCDD11 */
> > -           at91_set_a_periph(AT91_PIO_PORTC, 12, 0);       /* LCDD12 */
> > -           at91_set_a_periph(AT91_PIO_PORTC, 13, 0);       /* LCDD13 */
> > -           at91_set_a_periph(AT91_PIO_PORTC, 14, 0);       /* LCDD14 */
> > -           at91_set_a_periph(AT91_PIO_PORTC, 15, 0);       /* LCDD15 */
> > -           at91_set_a_periph(AT91_PIO_PORTC, 16, 0);       /* LCDD16 */
> > -           at91_set_a_periph(AT91_PIO_PORTC, 17, 0);       /* LCDD17 */
> > -           at91_set_a_periph(AT91_PIO_PORTC, 18, 0);       /* LCDD18 */
> > -           at91_set_a_periph(AT91_PIO_PORTC, 19, 0);       /* LCDD19 */
> > -           at91_set_a_periph(AT91_PIO_PORTC, 20, 0);       /* LCDD20 */
> > -           at91_set_a_periph(AT91_PIO_PORTC, 21, 0);       /* LCDD21 */
> > -           at91_set_a_periph(AT91_PIO_PORTC, 22, 0);       /* LCDD22 */
> > -           at91_set_a_periph(AT91_PIO_PORTC, 23, 0);       /* LCDD23 */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTC, 26, 0);  /*
> LCDPWM */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTC, 27, 0);  /*
> LCDVSYNC */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTC, 28, 0);  /*
> LCDHSYNC */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTC, 24, 0);  /*
> LCDDISP */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTC, 29, 0);  /*
> LCDDEN */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTC, 30, 0);  /*
> LCDPCK */
> > +
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTC, 0, 0);   /* LCDD0
> */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTC, 1, 0);   /* LCDD1
> */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTC, 2, 0);   /* LCDD2
> */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTC, 3, 0);   /* LCDD3
> */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTC, 4, 0);   /* LCDD4
> */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTC, 5, 0);   /* LCDD5
> */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTC, 6, 0);   /* LCDD6
> */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTC, 7, 0);   /* LCDD7
> */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTC, 8, 0);   /* LCDD8
> */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTC, 9, 0);   /* LCDD9
> */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTC, 10, 0);  /*
> LCDD10 */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTC, 11, 0);  /*
> LCDD11 */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTC, 12, 0);  /*
> LCDD12 */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTC, 13, 0);  /*
> LCDD13 */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTC, 14, 0);  /*
> LCDD14 */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTC, 15, 0);  /*
> LCDD15 */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTC, 16, 0);  /*
> LCDD16 */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTC, 17, 0);  /*
> LCDD17 */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTC, 18, 0);  /*
> LCDD18 */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTC, 19, 0);  /*
> LCDD19 */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTC, 20, 0);  /*
> LCDD20 */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTC, 21, 0);  /*
> LCDD21 */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTC, 22, 0);  /*
> LCDD22 */
> > +           at91_pio3_set_a_periph(AT91_PIO_PORTC, 23, 0);  /*
> LCDD23 */
> >
> >             at91_periph_clk_enable(ATMEL_ID_LCDC);
> >     }
> > diff --git a/board/atmel/sama5d3xek/sama5d3xek.c
> b/board/atmel/sama5d3xek/sama5d3xek.c
> > index ce67478f0b..134c2fe1eb 100644
> > --- a/board/atmel/sama5d3xek/sama5d3xek.c
> > +++ b/board/atmel/sama5d3xek/sama5d3xek.c
> > @@ -95,31 +95,31 @@ static void sama5d3xek_nor_hw_init(void)
> >            &smc->cs[0].mode);
> >
> >     /* Address pin (A1 ~ A23) configuration */
> > -   at91_set_a_periph(AT91_PIO_PORTE, 1, 0);
> > -   at91_set_a_periph(AT91_PIO_PORTE, 2, 0);
> > -   at91_set_a_periph(AT91_PIO_PORTE, 3, 0);
> > -   at91_set_a_periph(AT91_PIO_PORTE, 4, 0);
> > -   at91_set_a_periph(AT91_PIO_PORTE, 5, 0);
> > -   at91_set_a_periph(AT91_PIO_PORTE, 6, 0);
> > -   at91_set_a_periph(AT91_PIO_PORTE, 7, 0);
> > -   at91_set_a_periph(AT91_PIO_PORTE, 8, 0);
> > -   at91_set_a_periph(AT91_PIO_PORTE, 9, 0);
> > -   at91_set_a_periph(AT91_PIO_PORTE, 10, 0);
> > -   at91_set_a_periph(AT91_PIO_PORTE, 11, 0);
> > -   at91_set_a_periph(AT91_PIO_PORTE, 12, 0);
> > -   at91_set_a_periph(AT91_PIO_PORTE, 13, 0);
> > -   at91_set_a_periph(AT91_PIO_PORTE, 14, 0);
> > -   at91_set_a_periph(AT91_PIO_PORTE, 15, 0);
> > -   at91_set_a_periph(AT91_PIO_PORTE, 16, 0);
> > -   at91_set_a_periph(AT91_PIO_PORTE, 17, 0);
> > -   at91_set_a_periph(AT91_PIO_PORTE, 18, 0);
> > -   at91_set_a_periph(AT91_PIO_PORTE, 19, 0);
> > -   at91_set_a_periph(AT91_PIO_PORTE, 20, 0);
> > -   at91_set_a_periph(AT91_PIO_PORTE, 21, 0);
> > -   at91_set_a_periph(AT91_PIO_PORTE, 22, 0);
> > -   at91_set_a_periph(AT91_PIO_PORTE, 23, 0);
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTE, 1, 0);
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTE, 2, 0);
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTE, 3, 0);
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTE, 4, 0);
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTE, 5, 0);
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTE, 6, 0);
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTE, 7, 0);
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTE, 8, 0);
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTE, 9, 0);
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTE, 10, 0);
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTE, 11, 0);
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTE, 12, 0);
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTE, 13, 0);
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTE, 14, 0);
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTE, 15, 0);
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTE, 16, 0);
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTE, 17, 0);
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTE, 18, 0);
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTE, 19, 0);
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTE, 20, 0);
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTE, 21, 0);
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTE, 22, 0);
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTE, 23, 0);
> >     /* CS0 pin configuration */
> > -   at91_set_a_periph(AT91_PIO_PORTE, 26, 0);
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTE, 26, 0);
> >  }
> >  #endif
> >
> > @@ -170,14 +170,14 @@ static void sama5d3xek_lcd_hw_init(void)
> >     gd->fb_base = CONFIG_SAMA5D3_LCD_BASE;
> >
> >     /* The higher 8 bit of LCD is board related */
> > -   at91_set_c_periph(AT91_PIO_PORTC, 14, 0);       /* LCDD16 */
> > -   at91_set_c_periph(AT91_PIO_PORTC, 13, 0);       /* LCDD17 */
> > -   at91_set_c_periph(AT91_PIO_PORTC, 12, 0);       /* LCDD18 */
> > -   at91_set_c_periph(AT91_PIO_PORTC, 11, 0);       /* LCDD19 */
> > -   at91_set_c_periph(AT91_PIO_PORTC, 10, 0);       /* LCDD20 */
> > -   at91_set_c_periph(AT91_PIO_PORTC, 15, 0);       /* LCDD21 */
> > -   at91_set_c_periph(AT91_PIO_PORTE, 27, 0);       /* LCDD22 */
> > -   at91_set_c_periph(AT91_PIO_PORTE, 28, 0);       /* LCDD23 */
> > +   at91_pio3_set_c_periph(AT91_PIO_PORTC, 14, 0);  /* LCDD16 */
> > +   at91_pio3_set_c_periph(AT91_PIO_PORTC, 13, 0);  /* LCDD17 */
> > +   at91_pio3_set_c_periph(AT91_PIO_PORTC, 12, 0);  /* LCDD18 */
> > +   at91_pio3_set_c_periph(AT91_PIO_PORTC, 11, 0);  /* LCDD19 */
> > +   at91_pio3_set_c_periph(AT91_PIO_PORTC, 10, 0);  /* LCDD20 */
> > +   at91_pio3_set_c_periph(AT91_PIO_PORTC, 15, 0);  /* LCDD21 */
> > +   at91_pio3_set_c_periph(AT91_PIO_PORTE, 27, 0);  /* LCDD22 */
> > +   at91_pio3_set_c_periph(AT91_PIO_PORTE, 28, 0);  /* LCDD23 */
> >
> >     /* Configure lower 16 bit of LCD and enable clock */
> >     at91_lcd_hw_init();
> > diff --git a/board/atmel/sama5d4_xplained/sama5d4_xplained.c
> b/board/atmel/sama5d4_xplained/sama5d4_xplained.c
> > index 23ec274468..47f0bae8c1 100644
> > --- a/board/atmel/sama5d4_xplained/sama5d4_xplained.c
> > +++ b/board/atmel/sama5d4_xplained/sama5d4_xplained.c
> > @@ -45,9 +45,9 @@ void spi_cs_deactivate(struct spi_slave *slave)
> >
> >  static void sama5d4_xplained_spi0_hw_init(void)
> >  {
> > -   at91_set_a_periph(AT91_PIO_PORTC, 0, 0);        /* SPI0_MISO */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 1, 0);        /* SPI0_MOSI */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 2, 0);        /* SPI0_SPCK */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 0, 0);   /* SPI0_MISO */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 1, 0);   /* SPI0_MOSI */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 2, 0);   /* SPI0_SPCK */
> >
> >     at91_set_pio_output(AT91_PIO_PORTC, 3, 1);      /* SPI0_CS0 */
> >
> > @@ -82,20 +82,20 @@ static void sama5d4_xplained_nand_hw_init(void)
> >            AT91_SMC_MODE_TDF_CYCLE(3),
> >            &smc->cs[3].mode);
> >
> > -   at91_set_a_periph(AT91_PIO_PORTC, 5, 0);        /* D0 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 6, 0);        /* D1 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 7, 0);        /* D2 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 8, 0);        /* D3 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 9, 0);        /* D4 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 10, 0);       /* D5 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 11, 0);       /* D6 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 12, 0);       /* D7 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 13, 0);       /* RE */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 14, 0);       /* WE */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 15, 1);       /* NCS */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 16, 1);       /* RDY */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 17, 1);       /* ALE */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 18, 1);       /* CLE */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 5, 0);   /* D0 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 6, 0);   /* D1 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 7, 0);   /* D2 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 8, 0);   /* D3 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 9, 0);   /* D4 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 10, 0);  /* D5 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 11, 0);  /* D6 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 12, 0);  /* D7 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 13, 0);  /* RE */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 14, 0);  /* WE */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 15, 1);  /* NCS */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 16, 1);  /* RDY */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 17, 1);  /* ALE */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 18, 1);  /* CLE */
> >  }
> >  #endif
> >
> > @@ -134,39 +134,39 @@ unsigned int has_lcdc(void)
> >
> >  static void sama5d4_xplained_lcd_hw_init(void)
> >  {
> > -   at91_set_a_periph(AT91_PIO_PORTA, 24, 0);       /* LCDPWM */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 25, 0);       /* LCDDISP */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 26, 0);       /* LCDVSYNC */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 27, 0);       /* LCDHSYNC */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 28, 0);       /* LCDDOTCK */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 29, 0);       /* LCDDEN */
> > -
> > -   at91_set_a_periph(AT91_PIO_PORTA,  0, 0);       /* LCDD0 */
> > -   at91_set_a_periph(AT91_PIO_PORTA,  1, 0);       /* LCDD1 */
> > -   at91_set_a_periph(AT91_PIO_PORTA,  2, 0);       /* LCDD2 */
> > -   at91_set_a_periph(AT91_PIO_PORTA,  3, 0);       /* LCDD3 */
> > -   at91_set_a_periph(AT91_PIO_PORTA,  4, 0);       /* LCDD4 */
> > -   at91_set_a_periph(AT91_PIO_PORTA,  5, 0);       /* LCDD5 */
> > -   at91_set_a_periph(AT91_PIO_PORTA,  6, 0);       /* LCDD6 */
> > -   at91_set_a_periph(AT91_PIO_PORTA,  7, 0);       /* LCDD7 */
> > -
> > -   at91_set_a_periph(AT91_PIO_PORTA,  8, 0);       /* LCDD9 */
> > -   at91_set_a_periph(AT91_PIO_PORTA,  9, 0);       /* LCDD8 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 10, 0);       /* LCDD10 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 11, 0);       /* LCDD11 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 12, 0);       /* LCDD12 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 13, 0);       /* LCDD13 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 14, 0);       /* LCDD14 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 15, 0);       /* LCDD15 */
> > -
> > -   at91_set_a_periph(AT91_PIO_PORTA, 16, 0);       /* LCDD16 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 17, 0);       /* LCDD17 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 18, 0);       /* LCDD18 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 19, 0);       /* LCDD19 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 20, 0);       /* LCDD20 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 21, 0);       /* LCDD21 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 22, 0);       /* LCDD22 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 23, 0);       /* LCDD23 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 24, 0);  /* LCDPWM */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 25, 0);  /* LCDDISP */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 26, 0);  /* LCDVSYNC */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 27, 0);  /* LCDHSYNC */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 28, 0);  /* LCDDOTCK */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 29, 0);  /* LCDDEN */
> > +
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA,  0, 0);  /* LCDD0 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA,  1, 0);  /* LCDD1 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA,  2, 0);  /* LCDD2 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA,  3, 0);  /* LCDD3 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA,  4, 0);  /* LCDD4 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA,  5, 0);  /* LCDD5 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA,  6, 0);  /* LCDD6 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA,  7, 0);  /* LCDD7 */
> > +
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA,  8, 0);  /* LCDD9 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA,  9, 0);  /* LCDD8 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 10, 0);  /* LCDD10 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 11, 0);  /* LCDD11 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 12, 0);  /* LCDD12 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 13, 0);  /* LCDD13 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 14, 0);  /* LCDD14 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 15, 0);  /* LCDD15 */
> > +
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 16, 0);  /* LCDD16 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 17, 0);  /* LCDD17 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 18, 0);  /* LCDD18 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 19, 0);  /* LCDD19 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 20, 0);  /* LCDD20 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 21, 0);  /* LCDD21 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 22, 0);  /* LCDD22 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 23, 0);  /* LCDD23 */
> >
> >     /* Enable clock */
> >     at91_periph_clk_enable(ATMEL_ID_LCDC);
> > @@ -203,12 +203,12 @@ void lcd_show_board_info(void)
> >  #ifdef CONFIG_GENERIC_ATMEL_MCI
> >  void sama5d4_xplained_mci1_hw_init(void)
> >  {
> > -   at91_set_c_periph(AT91_PIO_PORTE, 19, 1);       /* MCI1 CDA */
> > -   at91_set_c_periph(AT91_PIO_PORTE, 20, 1);       /* MCI1 DA0 */
> > -   at91_set_c_periph(AT91_PIO_PORTE, 21, 1);       /* MCI1 DA1 */
> > -   at91_set_c_periph(AT91_PIO_PORTE, 22, 1);       /* MCI1 DA2 */
> > -   at91_set_c_periph(AT91_PIO_PORTE, 23, 1);       /* MCI1 DA3 */
> > -   at91_set_c_periph(AT91_PIO_PORTE, 18, 0);       /* MCI1 CLK */
> > +   at91_pio3_set_c_periph(AT91_PIO_PORTE, 19, 1);  /* MCI1 CDA */
> > +   at91_pio3_set_c_periph(AT91_PIO_PORTE, 20, 1);  /* MCI1 DA0 */
> > +   at91_pio3_set_c_periph(AT91_PIO_PORTE, 21, 1);  /* MCI1 DA1 */
> > +   at91_pio3_set_c_periph(AT91_PIO_PORTE, 22, 1);  /* MCI1 DA2 */
> > +   at91_pio3_set_c_periph(AT91_PIO_PORTE, 23, 1);  /* MCI1 DA3 */
> > +   at91_pio3_set_c_periph(AT91_PIO_PORTE, 18, 0);  /* MCI1 CLK */
> >
> >     /*
> >      * As the mci io internal pull down is too strong, so if the io needs
> > @@ -216,12 +216,12 @@ void sama5d4_xplained_mci1_hw_init(void)
> >      * the power consumption will increase, so disable the interanl pull
> >      * down to save the power.
> >      */
> > -   at91_set_pio_pulldown(AT91_PIO_PORTE, 18, 0);
> > -   at91_set_pio_pulldown(AT91_PIO_PORTE, 19, 0);
> > -   at91_set_pio_pulldown(AT91_PIO_PORTE, 20, 0);
> > -   at91_set_pio_pulldown(AT91_PIO_PORTE, 21, 0);
> > -   at91_set_pio_pulldown(AT91_PIO_PORTE, 22, 0);
> > -   at91_set_pio_pulldown(AT91_PIO_PORTE, 23, 0);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTE, 18, 0);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTE, 19, 0);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTE, 20, 0);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTE, 21, 0);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTE, 22, 0);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTE, 23, 0);
> >
> >     /* Enable clock */
> >     at91_periph_clk_enable(ATMEL_ID_MCI1);
> > @@ -239,16 +239,16 @@ int board_mmc_init(bd_t *bis)
> >  #ifdef CONFIG_MACB
> >  void sama5d4_xplained_macb0_hw_init(void)
> >  {
> > -   at91_set_a_periph(AT91_PIO_PORTB, 0, 0);        /* ETXCK_EREFCK */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 6, 0);        /* ERXDV */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 8, 0);        /* ERX0 */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 9, 0);        /* ERX1 */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 7, 0);        /* ERXER */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 2, 0);        /* ETXEN */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 12, 0);       /* ETX0 */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 13, 0);       /* ETX1 */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 17, 0);       /* EMDIO */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 16, 0);       /* EMDC */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 0, 0);   /*
> ETXCK_EREFCK */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 6, 0);   /* ERXDV */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 8, 0);   /* ERX0 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 9, 0);   /* ERX1 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 7, 0);   /* ERXER */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 2, 0);   /* ETXEN */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 12, 0);  /* ETX0 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 13, 0);  /* ETX1 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 17, 0);  /* EMDIO */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 16, 0);  /* EMDC */
> >
> >     /* Enable clock */
> >     at91_periph_clk_enable(ATMEL_ID_GMAC0);
> > @@ -257,8 +257,8 @@ void sama5d4_xplained_macb0_hw_init(void)
> >
> >  static void sama5d4_xplained_serial3_hw_init(void)
> >  {
> > -   at91_set_b_periph(AT91_PIO_PORTE, 17, 1);       /* TXD3 */
> > -   at91_set_b_periph(AT91_PIO_PORTE, 16, 0);       /* RXD3 */
> > +   at91_pio3_set_b_periph(AT91_PIO_PORTE, 17, 1);  /* TXD3 */
> > +   at91_pio3_set_b_periph(AT91_PIO_PORTE, 16, 0);  /* RXD3 */
> >
> >     /* Enable clock */
> >     at91_periph_clk_enable(ATMEL_ID_USART3);
> > diff --git a/board/atmel/sama5d4ek/sama5d4ek.c
> b/board/atmel/sama5d4ek/sama5d4ek.c
> > index 72bad23087..d1b5ff5797 100644
> > --- a/board/atmel/sama5d4ek/sama5d4ek.c
> > +++ b/board/atmel/sama5d4ek/sama5d4ek.c
> > @@ -45,9 +45,9 @@ void spi_cs_deactivate(struct spi_slave *slave)
> >
> >  static void sama5d4ek_spi0_hw_init(void)
> >  {
> > -   at91_set_a_periph(AT91_PIO_PORTC, 0, 0);        /* SPI0_MISO */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 1, 0);        /* SPI0_MOSI */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 2, 0);        /* SPI0_SPCK */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 0, 0);   /* SPI0_MISO */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 1, 0);   /* SPI0_MOSI */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 2, 0);   /* SPI0_SPCK */
> >
> >     at91_set_pio_output(AT91_PIO_PORTC, 3, 1);      /* SPI0_CS0 */
> >
> > @@ -82,20 +82,20 @@ static void sama5d4ek_nand_hw_init(void)
> >            AT91_SMC_MODE_TDF_CYCLE(3),
> >            &smc->cs[3].mode);
> >
> > -   at91_set_a_periph(AT91_PIO_PORTC, 5, 0);        /* D0 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 6, 0);        /* D1 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 7, 0);        /* D2 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 8, 0);        /* D3 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 9, 0);        /* D4 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 10, 0);       /* D5 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 11, 0);       /* D6 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 12, 0);       /* D7 */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 13, 0);       /* RE */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 14, 0);       /* WE */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 15, 1);       /* NCS */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 16, 1);       /* RDY */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 17, 1);       /* ALE */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 18, 1);       /* CLE */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 5, 0);   /* D0 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 6, 0);   /* D1 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 7, 0);   /* D2 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 8, 0);   /* D3 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 9, 0);   /* D4 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 10, 0);  /* D5 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 11, 0);  /* D6 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 12, 0);  /* D7 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 13, 0);  /* RE */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 14, 0);  /* WE */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 15, 1);  /* NCS */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 16, 1);  /* RDY */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 17, 1);  /* ALE */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 18, 1);  /* CLE */
> >  }
> >  #endif
> >
> > @@ -135,33 +135,33 @@ unsigned int has_lcdc(void)
> >
> >  static void sama5d4ek_lcd_hw_init(void)
> >  {
> > -   at91_set_a_periph(AT91_PIO_PORTA, 24, 0);       /* LCDPWM */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 25, 0);       /* LCDDISP */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 26, 0);       /* LCDVSYNC */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 27, 0);       /* LCDHSYNC */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 28, 0);       /* LCDDOTCK */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 29, 0);       /* LCDDEN */
> > -
> > -   at91_set_a_periph(AT91_PIO_PORTA,  2, 0);       /* LCDD2 */
> > -   at91_set_a_periph(AT91_PIO_PORTA,  3, 0);       /* LCDD3 */
> > -   at91_set_a_periph(AT91_PIO_PORTA,  4, 0);       /* LCDD4 */
> > -   at91_set_a_periph(AT91_PIO_PORTA,  5, 0);       /* LCDD5 */
> > -   at91_set_a_periph(AT91_PIO_PORTA,  6, 0);       /* LCDD6 */
> > -   at91_set_a_periph(AT91_PIO_PORTA,  7, 0);       /* LCDD7 */
> > -
> > -   at91_set_a_periph(AT91_PIO_PORTA, 10, 0);       /* LCDD10 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 11, 0);       /* LCDD11 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 12, 0);       /* LCDD12 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 13, 0);       /* LCDD13 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 14, 0);       /* LCDD14 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 15, 0);       /* LCDD15 */
> > -
> > -   at91_set_a_periph(AT91_PIO_PORTA, 18, 0);       /* LCDD18 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 19, 0);       /* LCDD19 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 20, 0);       /* LCDD20 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 21, 0);       /* LCDD21 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 22, 0);       /* LCDD22 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 23, 0);       /* LCDD23 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 24, 0);  /* LCDPWM */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 25, 0);  /* LCDDISP */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 26, 0);  /* LCDVSYNC */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 27, 0);  /* LCDHSYNC */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 28, 0);  /* LCDDOTCK */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 29, 0);  /* LCDDEN */
> > +
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA,  2, 0);  /* LCDD2 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA,  3, 0);  /* LCDD3 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA,  4, 0);  /* LCDD4 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA,  5, 0);  /* LCDD5 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA,  6, 0);  /* LCDD6 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA,  7, 0);  /* LCDD7 */
> > +
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 10, 0);  /* LCDD10 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 11, 0);  /* LCDD11 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 12, 0);  /* LCDD12 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 13, 0);  /* LCDD13 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 14, 0);  /* LCDD14 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 15, 0);  /* LCDD15 */
> > +
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 18, 0);  /* LCDD18 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 19, 0);  /* LCDD19 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 20, 0);  /* LCDD20 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 21, 0);  /* LCDD21 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 22, 0);  /* LCDD22 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 23, 0);  /* LCDD23 */
> >
> >     /* Enable clock */
> >     at91_periph_clk_enable(ATMEL_ID_LCDC);
> > @@ -199,12 +199,12 @@ void lcd_show_board_info(void)
> >  #ifdef CONFIG_GENERIC_ATMEL_MCI
> >  void sama5d4ek_mci1_hw_init(void)
> >  {
> > -   at91_set_c_periph(AT91_PIO_PORTE, 19, 1);       /* MCI1 CDA */
> > -   at91_set_c_periph(AT91_PIO_PORTE, 20, 1);       /* MCI1 DA0 */
> > -   at91_set_c_periph(AT91_PIO_PORTE, 21, 1);       /* MCI1 DA1 */
> > -   at91_set_c_periph(AT91_PIO_PORTE, 22, 1);       /* MCI1 DA2 */
> > -   at91_set_c_periph(AT91_PIO_PORTE, 23, 1);       /* MCI1 DA3 */
> > -   at91_set_c_periph(AT91_PIO_PORTE, 18, 0);       /* MCI1 CLK */
> > +   at91_pio3_set_c_periph(AT91_PIO_PORTE, 19, 1);  /* MCI1 CDA */
> > +   at91_pio3_set_c_periph(AT91_PIO_PORTE, 20, 1);  /* MCI1 DA0 */
> > +   at91_pio3_set_c_periph(AT91_PIO_PORTE, 21, 1);  /* MCI1 DA1 */
> > +   at91_pio3_set_c_periph(AT91_PIO_PORTE, 22, 1);  /* MCI1 DA2 */
> > +   at91_pio3_set_c_periph(AT91_PIO_PORTE, 23, 1);  /* MCI1 DA3 */
> > +   at91_pio3_set_c_periph(AT91_PIO_PORTE, 18, 0);  /* MCI1 CLK */
> >
> >     /*
> >      * As the mci io internal pull down is too strong, so if the io needs
> > @@ -212,12 +212,12 @@ void sama5d4ek_mci1_hw_init(void)
> >      * the power consumption will increase, so disable the interanl pull
> >      * down to save the power.
> >      */
> > -   at91_set_pio_pulldown(AT91_PIO_PORTE, 18, 0);
> > -   at91_set_pio_pulldown(AT91_PIO_PORTE, 19, 0);
> > -   at91_set_pio_pulldown(AT91_PIO_PORTE, 20, 0);
> > -   at91_set_pio_pulldown(AT91_PIO_PORTE, 21, 0);
> > -   at91_set_pio_pulldown(AT91_PIO_PORTE, 22, 0);
> > -   at91_set_pio_pulldown(AT91_PIO_PORTE, 23, 0);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTE, 18, 0);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTE, 19, 0);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTE, 20, 0);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTE, 21, 0);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTE, 22, 0);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTE, 23, 0);
> >
> >     /* Enable clock */
> >     at91_periph_clk_enable(ATMEL_ID_MCI1);
> > @@ -235,16 +235,16 @@ int board_mmc_init(bd_t *bis)
> >  #ifdef CONFIG_MACB
> >  void sama5d4ek_macb0_hw_init(void)
> >  {
> > -   at91_set_a_periph(AT91_PIO_PORTB, 0, 0);        /* ETXCK_EREFCK */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 6, 0);        /* ERXDV */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 8, 0);        /* ERX0 */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 9, 0);        /* ERX1 */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 7, 0);        /* ERXER */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 2, 0);        /* ETXEN */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 12, 0);       /* ETX0 */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 13, 0);       /* ETX1 */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 17, 0);       /* EMDIO */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 16, 0);       /* EMDC */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 0, 0);   /*
> ETXCK_EREFCK */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 6, 0);   /* ERXDV */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 8, 0);   /* ERX0 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 9, 0);   /* ERX1 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 7, 0);   /* ERXER */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 2, 0);   /* ETXEN */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 12, 0);  /* ETX0 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 13, 0);  /* ETX1 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 17, 0);  /* EMDIO */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 16, 0);  /* EMDC */
> >
> >     /* Enable clock */
> >     at91_periph_clk_enable(ATMEL_ID_GMAC0);
> > @@ -253,8 +253,8 @@ void sama5d4ek_macb0_hw_init(void)
> >
> >  static void sama5d4ek_serial3_hw_init(void)
> >  {
> > -   at91_set_b_periph(AT91_PIO_PORTE, 17, 1);       /* TXD3 */
> > -   at91_set_b_periph(AT91_PIO_PORTE, 16, 0);       /* RXD3 */
> > +   at91_pio3_set_b_periph(AT91_PIO_PORTE, 17, 1);  /* TXD3 */
> > +   at91_pio3_set_b_periph(AT91_PIO_PORTE, 16, 0);  /* RXD3 */
> >
> >     /* Enable clock */
> >     at91_periph_clk_enable(ATMEL_ID_USART3);
> > diff --git a/board/denx/ma5d4evk/ma5d4evk.c
> b/board/denx/ma5d4evk/ma5d4evk.c
> > index ec0fa28f3e..81463712fa 100644
> > --- a/board/denx/ma5d4evk/ma5d4evk.c
> > +++ b/board/denx/ma5d4evk/ma5d4evk.c
> > @@ -44,9 +44,9 @@ void spi_cs_deactivate(struct spi_slave *slave)
> >
> >  static void ma5d4evk_spi0_hw_init(void)
> >  {
> > -   at91_set_a_periph(AT91_PIO_PORTC, 0, 0);        /* SPI0_MISO */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 1, 0);        /* SPI0_MOSI */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 2, 0);        /* SPI0_SPCK */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 0, 0);   /* SPI0_MISO */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 1, 0);   /* SPI0_MOSI */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 2, 0);   /* SPI0_SPCK */
> >
> >     at91_set_pio_output(AT91_PIO_PORTC, 3, 1);      /* SPI0_CS0 */
> >
> > @@ -90,39 +90,39 @@ unsigned int has_lcdc(void)
> >
> >  static void ma5d4evk_lcd_hw_init(void)
> >  {
> > -   at91_set_a_periph(AT91_PIO_PORTA, 24, 1);       /* LCDPWM */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 25, 0);       /* LCDDISP */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 26, 0);       /* LCDVSYNC */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 27, 0);       /* LCDHSYNC */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 28, 0);       /* LCDDOTCK */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 29, 1);       /* LCDDEN */
> > -
> > -   at91_set_a_periph(AT91_PIO_PORTA,  0, 0);       /* LCDD0 */
> > -   at91_set_a_periph(AT91_PIO_PORTA,  1, 0);       /* LCDD1 */
> > -   at91_set_a_periph(AT91_PIO_PORTA,  2, 0);       /* LCDD2 */
> > -   at91_set_a_periph(AT91_PIO_PORTA,  3, 0);       /* LCDD3 */
> > -   at91_set_a_periph(AT91_PIO_PORTA,  4, 0);       /* LCDD4 */
> > -   at91_set_a_periph(AT91_PIO_PORTA,  5, 0);       /* LCDD5 */
> > -   at91_set_a_periph(AT91_PIO_PORTA,  6, 0);       /* LCDD6 */
> > -   at91_set_a_periph(AT91_PIO_PORTA,  7, 0);       /* LCDD7 */
> > -
> > -   at91_set_a_periph(AT91_PIO_PORTA,  8, 0);       /* LCDD9 */
> > -   at91_set_a_periph(AT91_PIO_PORTA,  9, 0);       /* LCDD8 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 10, 0);       /* LCDD10 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 11, 0);       /* LCDD11 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 12, 0);       /* LCDD12 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 13, 0);       /* LCDD13 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 14, 0);       /* LCDD14 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 15, 0);       /* LCDD15 */
> > -
> > -   at91_set_a_periph(AT91_PIO_PORTA, 16, 0);       /* LCDD16 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 17, 0);       /* LCDD17 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 18, 0);       /* LCDD18 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 19, 0);       /* LCDD19 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 20, 0);       /* LCDD20 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 21, 0);       /* LCDD21 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 22, 0);       /* LCDD22 */
> > -   at91_set_a_periph(AT91_PIO_PORTA, 23, 0);       /* LCDD23 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 24, 1);  /* LCDPWM */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 25, 0);  /* LCDDISP */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 26, 0);  /* LCDVSYNC */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 27, 0);  /* LCDHSYNC */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 28, 0);  /* LCDDOTCK */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 29, 1);  /* LCDDEN */
> > +
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA,  0, 0);  /* LCDD0 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA,  1, 0);  /* LCDD1 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA,  2, 0);  /* LCDD2 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA,  3, 0);  /* LCDD3 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA,  4, 0);  /* LCDD4 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA,  5, 0);  /* LCDD5 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA,  6, 0);  /* LCDD6 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA,  7, 0);  /* LCDD7 */
> > +
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA,  8, 0);  /* LCDD9 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA,  9, 0);  /* LCDD8 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 10, 0);  /* LCDD10 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 11, 0);  /* LCDD11 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 12, 0);  /* LCDD12 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 13, 0);  /* LCDD13 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 14, 0);  /* LCDD14 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 15, 0);  /* LCDD15 */
> > +
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 16, 0);  /* LCDD16 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 17, 0);  /* LCDD17 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 18, 0);  /* LCDD18 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 19, 0);  /* LCDD19 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 20, 0);  /* LCDD20 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 21, 0);  /* LCDD21 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 22, 0);  /* LCDD22 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTA, 23, 0);  /* LCDD23 */
> >
> >     /* Enable clock */
> >     at91_periph_clk_enable(ATMEL_ID_LCDC);
> > @@ -134,16 +134,16 @@ static void ma5d4evk_lcd_hw_init(void)
> >  /* On-SoM eMMC */
> >  void ma5d4evk_mci0_hw_init(void)
> >  {
> > -   at91_set_b_periph(AT91_PIO_PORTC, 5, 1);        /* MCI1 CDA */
> > -   at91_set_b_periph(AT91_PIO_PORTC, 6, 1);        /* MCI1 DA0 */
> > -   at91_set_b_periph(AT91_PIO_PORTC, 7, 1);        /* MCI1 DA1 */
> > -   at91_set_b_periph(AT91_PIO_PORTC, 8, 1);        /* MCI1 DA2 */
> > -   at91_set_b_periph(AT91_PIO_PORTC, 9, 1);        /* MCI1 DA3 */
> > -   at91_set_b_periph(AT91_PIO_PORTC, 10, 1);       /* MCI1 DA4 */
> > -   at91_set_b_periph(AT91_PIO_PORTC, 11, 1);       /* MCI1 DA5 */
> > -   at91_set_b_periph(AT91_PIO_PORTC, 12, 1);       /* MCI1 DA6 */
> > -   at91_set_b_periph(AT91_PIO_PORTC, 13, 1);       /* MCI1 DA7 */
> > -   at91_set_b_periph(AT91_PIO_PORTC, 4, 0);        /* MCI1 CLK */
> > +   at91_pio3_set_b_periph(AT91_PIO_PORTC, 5, 1);   /* MCI1 CDA */
> > +   at91_pio3_set_b_periph(AT91_PIO_PORTC, 6, 1);   /* MCI1 DA0 */
> > +   at91_pio3_set_b_periph(AT91_PIO_PORTC, 7, 1);   /* MCI1 DA1 */
> > +   at91_pio3_set_b_periph(AT91_PIO_PORTC, 8, 1);   /* MCI1 DA2 */
> > +   at91_pio3_set_b_periph(AT91_PIO_PORTC, 9, 1);   /* MCI1 DA3 */
> > +   at91_pio3_set_b_periph(AT91_PIO_PORTC, 10, 1);  /* MCI1 DA4 */
> > +   at91_pio3_set_b_periph(AT91_PIO_PORTC, 11, 1);  /* MCI1 DA5 */
> > +   at91_pio3_set_b_periph(AT91_PIO_PORTC, 12, 1);  /* MCI1 DA6 */
> > +   at91_pio3_set_b_periph(AT91_PIO_PORTC, 13, 1);  /* MCI1 DA7 */
> > +   at91_pio3_set_b_periph(AT91_PIO_PORTC, 4, 0);   /* MCI1 CLK */
> >
> >     /*
> >      * As the mci io internal pull down is too strong, so if the io needs
> > @@ -151,16 +151,16 @@ void ma5d4evk_mci0_hw_init(void)
> >      * the power consumption will increase, so disable the internal pull
> >      * down to save the power.
> >      */
> > -   at91_set_pio_pulldown(AT91_PIO_PORTC, 5, 0);
> > -   at91_set_pio_pulldown(AT91_PIO_PORTC, 6, 0);
> > -   at91_set_pio_pulldown(AT91_PIO_PORTC, 7, 0);
> > -   at91_set_pio_pulldown(AT91_PIO_PORTC, 8, 0);
> > -   at91_set_pio_pulldown(AT91_PIO_PORTC, 9, 0);
> > -   at91_set_pio_pulldown(AT91_PIO_PORTC, 10, 0);
> > -   at91_set_pio_pulldown(AT91_PIO_PORTC, 11, 0);
> > -   at91_set_pio_pulldown(AT91_PIO_PORTC, 12, 0);
> > -   at91_set_pio_pulldown(AT91_PIO_PORTC, 13, 0);
> > -   at91_set_pio_pulldown(AT91_PIO_PORTC, 4, 0);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTC, 5, 0);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTC, 6, 0);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTC, 7, 0);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTC, 8, 0);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTC, 9, 0);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTC, 10, 0);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTC, 11, 0);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTC, 12, 0);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTC, 13, 0);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTC, 4, 0);
> >
> >     /* Enable clock */
> >     at91_periph_clk_enable(ATMEL_ID_MCI0);
> > @@ -169,12 +169,12 @@ void ma5d4evk_mci0_hw_init(void)
> >  /* On-board MicroSD slot */
> >  void ma5d4evk_mci1_hw_init(void)
> >  {
> > -   at91_set_c_periph(AT91_PIO_PORTE, 19, 1);       /* MCI1 CDA */
> > -   at91_set_c_periph(AT91_PIO_PORTE, 20, 1);       /* MCI1 DA0 */
> > -   at91_set_c_periph(AT91_PIO_PORTE, 21, 1);       /* MCI1 DA1 */
> > -   at91_set_c_periph(AT91_PIO_PORTE, 22, 1);       /* MCI1 DA2 */
> > -   at91_set_c_periph(AT91_PIO_PORTE, 23, 1);       /* MCI1 DA3 */
> > -   at91_set_c_periph(AT91_PIO_PORTE, 18, 0);       /* MCI1 CLK */
> > +   at91_pio3_set_c_periph(AT91_PIO_PORTE, 19, 1);  /* MCI1 CDA */
> > +   at91_pio3_set_c_periph(AT91_PIO_PORTE, 20, 1);  /* MCI1 DA0 */
> > +   at91_pio3_set_c_periph(AT91_PIO_PORTE, 21, 1);  /* MCI1 DA1 */
> > +   at91_pio3_set_c_periph(AT91_PIO_PORTE, 22, 1);  /* MCI1 DA2 */
> > +   at91_pio3_set_c_periph(AT91_PIO_PORTE, 23, 1);  /* MCI1 DA3 */
> > +   at91_pio3_set_c_periph(AT91_PIO_PORTE, 18, 0);  /* MCI1 CLK */
> >
> >     /*
> >      * As the mci io internal pull down is too strong, so if the io needs
> > @@ -182,16 +182,16 @@ void ma5d4evk_mci1_hw_init(void)
> >      * the power consumption will increase, so disable the internal pull
> >      * down to save the power.
> >      */
> > -   at91_set_pio_pulldown(AT91_PIO_PORTE, 18, 0);
> > -   at91_set_pio_pulldown(AT91_PIO_PORTE, 19, 0);
> > -   at91_set_pio_pulldown(AT91_PIO_PORTE, 20, 0);
> > -   at91_set_pio_pulldown(AT91_PIO_PORTE, 21, 0);
> > -   at91_set_pio_pulldown(AT91_PIO_PORTE, 22, 0);
> > -   at91_set_pio_pulldown(AT91_PIO_PORTE, 23, 0);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTE, 18, 0);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTE, 19, 0);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTE, 20, 0);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTE, 21, 0);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTE, 22, 0);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTE, 23, 0);
> >
> >     /* Deal with WP pin on the microSD slot. */
> >     at91_set_pio_output(AT91_PIO_PORTE, 16, 0);
> > -   at91_set_pio_pulldown(AT91_PIO_PORTE, 16, 1);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTE, 16, 1);
> >
> >     /* Enable clock */
> >     at91_periph_clk_enable(ATMEL_ID_MCI1);
> > @@ -203,7 +203,7 @@ int board_mmc_init(bd_t *bis)
> >
> >     /* De-assert reset on On-SoM eMMC */
> >     at91_set_pio_output(AT91_PIO_PORTE, 15, 1);
> > -   at91_set_pio_pulldown(AT91_PIO_PORTE, 15, 0);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTE, 15, 0);
> >
> >     ret = atmel_mci_init((void *)ATMEL_BASE_MCI0);
> >     if (ret)        /* eMMC init failed, skip it. */
> > @@ -223,16 +223,16 @@ int board_mmc_init(bd_t *bis)
> >  #ifdef CONFIG_MACB
> >  void ma5d4evk_macb0_hw_init(void)
> >  {
> > -   at91_set_a_periph(AT91_PIO_PORTB, 0, 0);        /* ETXCK_EREFCK */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 6, 0);        /* ERXDV */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 8, 0);        /* ERX0 */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 9, 0);        /* ERX1 */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 7, 0);        /* ERXER */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 2, 0);        /* ETXEN */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 12, 0);       /* ETX0 */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 13, 0);       /* ETX1 */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 17, 0);       /* EMDIO */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 16, 0);       /* EMDC */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 0, 0);   /*
> ETXCK_EREFCK */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 6, 0);   /* ERXDV */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 8, 0);   /* ERX0 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 9, 0);   /* ERX1 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 7, 0);   /* ERXER */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 2, 0);   /* ETXEN */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 12, 0);  /* ETX0 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 13, 0);  /* ETX1 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 17, 0);  /* EMDIO */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 16, 0);  /* EMDC */
> >
> >     /* Enable clock */
> >     at91_periph_clk_enable(ATMEL_ID_GMAC0);
> > @@ -242,17 +242,17 @@ void ma5d4evk_macb0_hw_init(void)
> >  static void ma5d4evk_serial_hw_init(void)
> >  {
> >     /* USART0 */
> > -   at91_set_a_periph(AT91_PIO_PORTD, 13, 1);       /* TXD */
> > -   at91_set_a_periph(AT91_PIO_PORTD, 12, 0);       /* RXD */
> > -   at91_set_a_periph(AT91_PIO_PORTD, 11, 0);       /* RTS */
> > -   at91_set_a_periph(AT91_PIO_PORTD, 10, 0);       /* CTS */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTD, 13, 1);  /* TXD */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTD, 12, 0);  /* RXD */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTD, 11, 0);  /* RTS */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTD, 10, 0);  /* CTS */
> >     at91_periph_clk_enable(ATMEL_ID_USART0);
> >
> >     /* USART1 */
> > -   at91_set_a_periph(AT91_PIO_PORTD, 17, 1);       /* TXD */
> > -   at91_set_a_periph(AT91_PIO_PORTD, 16, 0);       /* RXD */
> > -   at91_set_a_periph(AT91_PIO_PORTD, 15, 0);       /* RTS */
> > -   at91_set_a_periph(AT91_PIO_PORTD, 14, 0);       /* CTS */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTD, 17, 1);  /* TXD */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTD, 16, 0);  /* RXD */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTD, 15, 0);  /* RTS */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTD, 14, 0);  /* CTS */
> >     at91_periph_clk_enable(ATMEL_ID_USART1);
> >  }
> >
> > @@ -273,7 +273,7 @@ int board_early_init_f(void)
> >     at91_set_pio_output(AT91_PIO_PORTB, 21, 0);
> >     udelay(100);
> >     at91_set_pio_output(AT91_PIO_PORTB, 21, 1);
> > -   at91_set_pio_pulldown(AT91_PIO_PORTB, 21, 0);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTB, 21, 0);
> >
> >     ma5d4evk_serial_hw_init();
> >
> > diff --git a/board/l+g/vinco/vinco.c b/board/l+g/vinco/vinco.c
> > index 3d7af092e8..a938a2c2e1 100644
> > --- a/board/l+g/vinco/vinco.c
> > +++ b/board/l+g/vinco/vinco.c
> > @@ -51,9 +51,9 @@ void spi_cs_deactivate(struct spi_slave *slave)
> >
> >  static void vinco_spi0_hw_init(void)
> >  {
> > -   at91_set_a_periph(AT91_PIO_PORTC, 0, 0);        /* SPI0_MISO */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 1, 0);        /* SPI0_MOSI */
> > -   at91_set_a_periph(AT91_PIO_PORTC, 2, 0);        /* SPI0_SPCK */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 0, 0);   /* SPI0_MISO */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 1, 0);   /* SPI0_MOSI */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTC, 2, 0);   /* SPI0_SPCK */
> >
> >     at91_set_pio_output(AT91_PIO_PORTC, 3, 1);      /* SPI0_CS0 */
> >
> > @@ -76,16 +76,16 @@ static void vinco_usb_hw_init(void)
> >  #ifdef CONFIG_GENERIC_ATMEL_MCI
> >  void vinco_mci0_hw_init(void)
> >  {
> > -   at91_set_b_periph(AT91_PIO_PORTC, 5, 1);        /* MCI0 CDA */
> > -   at91_set_b_periph(AT91_PIO_PORTC, 6, 1);        /* MCI0 DA0 */
> > -   at91_set_b_periph(AT91_PIO_PORTC, 7, 1);        /* MCI0 DA1 */
> > -   at91_set_b_periph(AT91_PIO_PORTC, 8, 1);        /* MCI0 DA2 */
> > -   at91_set_b_periph(AT91_PIO_PORTC, 9, 1);        /* MCI0 DA3 */
> > -   at91_set_b_periph(AT91_PIO_PORTC, 10, 1);       /* MCI0 DA4 */
> > -   at91_set_b_periph(AT91_PIO_PORTC, 11, 1);       /* MCI0 DA5 */
> > -   at91_set_b_periph(AT91_PIO_PORTC, 12, 1);       /* MCI0 DA6 */
> > -   at91_set_b_periph(AT91_PIO_PORTC, 13, 1);       /* MCI0 DA7 */
> > -   at91_set_b_periph(AT91_PIO_PORTC, 4, 0);        /* MCI0 CLK */
> > +   at91_pio3_set_b_periph(AT91_PIO_PORTC, 5, 1);   /* MCI0 CDA */
> > +   at91_pio3_set_b_periph(AT91_PIO_PORTC, 6, 1);   /* MCI0 DA0 */
> > +   at91_pio3_set_b_periph(AT91_PIO_PORTC, 7, 1);   /* MCI0 DA1 */
> > +   at91_pio3_set_b_periph(AT91_PIO_PORTC, 8, 1);   /* MCI0 DA2 */
> > +   at91_pio3_set_b_periph(AT91_PIO_PORTC, 9, 1);   /* MCI0 DA3 */
> > +   at91_pio3_set_b_periph(AT91_PIO_PORTC, 10, 1);  /* MCI0 DA4 */
> > +   at91_pio3_set_b_periph(AT91_PIO_PORTC, 11, 1);  /* MCI0 DA5 */
> > +   at91_pio3_set_b_periph(AT91_PIO_PORTC, 12, 1);  /* MCI0 DA6 */
> > +   at91_pio3_set_b_periph(AT91_PIO_PORTC, 13, 1);  /* MCI0 DA7 */
> > +   at91_pio3_set_b_periph(AT91_PIO_PORTC, 4, 0);   /* MCI0 CLK */
> >
> >     /*
> >      * As the mci io internal pull down is too strong, so if the io needs
> > @@ -93,16 +93,16 @@ void vinco_mci0_hw_init(void)
> >      * the power consumption will increase, so disable the interanl pull
> >      * down to save the power.
> >      */
> > -   at91_set_pio_pulldown(AT91_PIO_PORTC, 4, 0);
> > -   at91_set_pio_pulldown(AT91_PIO_PORTC, 5, 0);
> > -   at91_set_pio_pulldown(AT91_PIO_PORTC, 6, 0);
> > -   at91_set_pio_pulldown(AT91_PIO_PORTC, 7, 0);
> > -   at91_set_pio_pulldown(AT91_PIO_PORTC, 8, 0);
> > -   at91_set_pio_pulldown(AT91_PIO_PORTC, 9, 0);
> > -   at91_set_pio_pulldown(AT91_PIO_PORTC, 10, 0);
> > -   at91_set_pio_pulldown(AT91_PIO_PORTC, 11, 0);
> > -   at91_set_pio_pulldown(AT91_PIO_PORTC, 12, 0);
> > -   at91_set_pio_pulldown(AT91_PIO_PORTC, 13, 0);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTC, 4, 0);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTC, 5, 0);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTC, 6, 0);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTC, 7, 0);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTC, 8, 0);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTC, 9, 0);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTC, 10, 0);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTC, 11, 0);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTC, 12, 0);
> > +   at91_pio3_set_pio_pulldown(AT91_PIO_PORTC, 13, 0);
> >
> >     /* Enable clock */
> >     at91_periph_clk_enable(ATMEL_ID_MCI0);
> > @@ -120,16 +120,16 @@ int board_mmc_init(bd_t *bis)
> >  #ifdef CONFIG_MACB
> >  void vinco_macb0_hw_init(void)
> >  {
> > -   at91_set_a_periph(AT91_PIO_PORTB, 0, 0);        /* ETXCK_EREFCK */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 6, 0);        /* ERXDV */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 8, 0);        /* ERX0 */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 9, 0);        /* ERX1 */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 7, 0);        /* ERXER */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 2, 0);        /* ETXEN */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 12, 0);       /* ETX0 */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 13, 0);       /* ETX1 */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 17, 0);       /* EMDIO */
> > -   at91_set_a_periph(AT91_PIO_PORTB, 16, 0);       /* EMDC */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 0, 0);   /*
> ETXCK_EREFCK */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 6, 0);   /* ERXDV */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 8, 0);   /* ERX0 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 9, 0);   /* ERX1 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 7, 0);   /* ERXER */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 2, 0);   /* ETXEN */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 12, 0);  /* ETX0 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 13, 0);  /* ETX1 */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 17, 0);  /* EMDIO */
> > +   at91_pio3_set_a_periph(AT91_PIO_PORTB, 16, 0);  /* EMDC */
> >
> >     /* Enable clock */
> >     at91_periph_clk_enable(ATMEL_ID_GMAC0);
> > @@ -141,8 +141,8 @@ void vinco_macb0_hw_init(void)
> >
> >  static void vinco_serial3_hw_init(void)
> >  {
> > -   at91_set_b_periph(AT91_PIO_PORTE, 17, 1);       /* TXD3 */
> > -   at91_set_b_periph(AT91_PIO_PORTE, 16, 0);       /* RXD3 */
> > +   at91_pio3_set_b_periph(AT91_PIO_PORTE, 17, 1);  /* TXD3 */
> > +   at91_pio3_set_b_periph(AT91_PIO_PORTE, 16, 0);  /* RXD3 */
> >
> >     /* Enable clock */
> >     at91_periph_clk_enable(ATMEL_ID_USART3);
> > diff --git a/drivers/gpio/at91_gpio.c b/drivers/gpio/at91_gpio.c
> > index 8e52e3dad0..2f9e44b620 100644
> > --- a/drivers/gpio/at91_gpio.c
> > +++ b/drivers/gpio/at91_gpio.c
> > @@ -59,11 +59,6 @@ int at91_set_pio_pullup(unsigned port, unsigned pin, int
> use_pullup)
> >  {
> >     struct at91_port *at91_port = at91_pio_get_port(port);
> >
> > -#if defined(CPU_HAS_PIO3)
> > -   if (use_pullup)
> > -           at91_set_pio_pulldown(port, pin, 0);
> > -#endif
> > -
> >     if (at91_port && (pin < GPIO_PER_BANK))
> >             at91_set_port_pullup(at91_port, pin, use_pullup);
> >
> > @@ -100,14 +95,7 @@ int at91_set_a_periph(unsigned port, unsigned pin, int
> use_pullup)
> >             mask = 1 << pin;
> >             writel(mask, &at91_port->idr);
> >             at91_set_pio_pullup(port, pin, use_pullup);
> > -#if defined(CPU_HAS_PIO3)
> > -           writel(readl(&at91_port->abcdsr1) & ~mask,
> > -                  &at91_port->abcdsr1);
> > -           writel(readl(&at91_port->abcdsr2) & ~mask,
> > -                  &at91_port->abcdsr2);
> > -#else
> > -           writel(mask, &at91_port->asr);
> > -#endif
> > +           writel(mask, &at91_port->mux.pio2.asr);
> >             writel(mask, &at91_port->pdr);
> >     }
> >
> > @@ -126,25 +114,62 @@ int at91_set_b_periph(unsigned port, unsigned pin,
> int use_pullup)
> >             mask = 1 << pin;
> >             writel(mask, &at91_port->idr);
> >             at91_set_pio_pullup(port, pin, use_pullup);
> > -#if defined(CPU_HAS_PIO3)
> > -           writel(readl(&at91_port->abcdsr1) | mask,
> > -                  &at91_port->abcdsr1);
> > -           writel(readl(&at91_port->abcdsr2) & ~mask,
> > -                  &at91_port->abcdsr2);
> > -#else
> > -           writel(mask, &at91_port->bsr);
> > -#endif
> > +           writel(mask, &at91_port->mux.pio2.bsr);
> > +           writel(mask, &at91_port->pdr);
> > +   }
> > +
> > +   return 0;
> > +}
> > +
> > +/*
> > + * mux the pin to the "A" internal peripheral role.
> > + */
> > +int at91_pio3_set_a_periph(unsigned port, unsigned pin, int use_pullup)
> > +{
> > +   struct at91_port *at91_port = at91_pio_get_port(port);
> > +   u32 mask;
> > +
> > +   if (at91_port && (pin < GPIO_PER_BANK)) {
> > +           mask = 1 << pin;
> > +           writel(mask, &at91_port->idr);
> > +           at91_set_pio_pullup(port, pin, use_pullup);
> > +           writel(readl(&at91_port->mux.pio3.abcdsr1) & ~mask,
> > +                  &at91_port->mux.pio3.abcdsr1);
> > +           writel(readl(&at91_port->mux.pio3.abcdsr2) & ~mask,
> > +                  &at91_port->mux.pio3.abcdsr2);
> > +
> >             writel(mask, &at91_port->pdr);
> >     }
> >
> >     return 0;
> >  }
> >
> > -#if defined(CPU_HAS_PIO3)
> > +/*
> > + * mux the pin to the "B" internal peripheral role.
> > + */
> > +int at91_pio3_set_b_periph(unsigned port, unsigned pin, int use_pullup)
> > +{
> > +   struct at91_port *at91_port = at91_pio_get_port(port);
> > +   u32 mask;
> > +
> > +   if (at91_port && (pin < GPIO_PER_BANK)) {
> > +           mask = 1 << pin;
> > +           writel(mask, &at91_port->idr);
> > +           at91_set_pio_pullup(port, pin, use_pullup);
> > +           writel(readl(&at91_port->mux.pio3.abcdsr1) | mask,
> > +                  &at91_port->mux.pio3.abcdsr1);
> > +           writel(readl(&at91_port->mux.pio3.abcdsr2) & ~mask,
> > +                  &at91_port->mux.pio3.abcdsr2);
> > +
> > +           writel(mask, &at91_port->pdr);
> > +   }
> > +
> > +   return 0;
> > +}
> >  /*
> >   * mux the pin to the "C" internal peripheral role.
> >   */
> > -int at91_set_c_periph(unsigned port, unsigned pin, int use_pullup)
> > +int at91_pio3_set_c_periph(unsigned port, unsigned pin, int use_pullup)
> >  {
> >     struct at91_port *at91_port = at91_pio_get_port(port);
> >     u32 mask;
> > @@ -153,10 +178,10 @@ int at91_set_c_periph(unsigned port, unsigned pin,
> int use_pullup)
> >             mask = 1 << pin;
> >             writel(mask, &at91_port->idr);
> >             at91_set_pio_pullup(port, pin, use_pullup);
> > -           writel(readl(&at91_port->abcdsr1) & ~mask,
> > -                  &at91_port->abcdsr1);
> > -           writel(readl(&at91_port->abcdsr2) | mask,
> > -                  &at91_port->abcdsr2);
> > +           writel(readl(&at91_port->mux.pio3.abcdsr1) & ~mask,
> > +                  &at91_port->mux.pio3.abcdsr1);
> > +           writel(readl(&at91_port->mux.pio3.abcdsr2) | mask,
> > +                  &at91_port->mux.pio3.abcdsr2);
> >             writel(mask, &at91_port->pdr);
> >     }
> >
> > @@ -166,7 +191,7 @@ int at91_set_c_periph(unsigned port, unsigned pin, int
> use_pullup)
> >  /*
> >   * mux the pin to the "D" internal peripheral role.
> >   */
> > -int at91_set_d_periph(unsigned port, unsigned pin, int use_pullup)
> > +int at91_pio3_set_d_periph(unsigned port, unsigned pin, int use_pullup)
> >  {
> >     struct at91_port *at91_port = at91_pio_get_port(port);
> >     u32 mask;
> > @@ -175,16 +200,15 @@ int at91_set_d_periph(unsigned port, unsigned pin,
> int use_pullup)
> >             mask = 1 << pin;
> >             writel(mask, &at91_port->idr);
> >             at91_set_pio_pullup(port, pin, use_pullup);
> > -           writel(readl(&at91_port->abcdsr1) | mask,
> > -                  &at91_port->abcdsr1);
> > -           writel(readl(&at91_port->abcdsr2) | mask,
> > -                  &at91_port->abcdsr2);
> > +           writel(readl(&at91_port->mux.pio3.abcdsr1) | mask,
> > +                  &at91_port->mux.pio3.abcdsr1);
> > +           writel(readl(&at91_port->mux.pio3.abcdsr2) | mask,
> > +                  &at91_port->mux.pio3.abcdsr2);
> >             writel(mask, &at91_port->pdr);
> >     }
> >
> >     return 0;
> >  }
> > -#endif
> >
> >  #ifdef CONFIG_DM_GPIO
> >  static bool at91_get_port_output(struct at91_port *at91_port, int offset)
> > @@ -263,10 +287,27 @@ int at91_set_pio_deglitch(unsigned port, unsigned
> pin, int is_on)
> >
> >     if (at91_port && (pin < GPIO_PER_BANK)) {
> >             mask = 1 << pin;
> > +           if (is_on)
> > +                   writel(mask, &at91_port->ifer);
> > +           else
> > +                   writel(mask, &at91_port->ifdr);
> > +   }
> > +
> > +   return 0;
> > +}
> > +
> > +/*
> > + * enable/disable the glitch filter. mostly used with IRQ handling.
> > + */
> > +int at91_pio3_set_pio_deglitch(unsigned port, unsigned pin, int is_on)
> > +{
> > +   struct at91_port *at91_port = at91_pio_get_port(port);
> > +   u32 mask;
> > +
> > +   if (at91_port && (pin < GPIO_PER_BANK)) {
> > +           mask = 1 << pin;
> >             if (is_on) {
> > -#if defined(CPU_HAS_PIO3)
> > -                   writel(mask, &at91_port->ifscdr);
> > -#endif
> > +                   writel(mask, &at91_port->mux.pio3.ifscdr);
> >                     writel(mask, &at91_port->ifer);
> >             } else {
> >                     writel(mask, &at91_port->ifdr);
> > @@ -276,11 +317,10 @@ int at91_set_pio_deglitch(unsigned port, unsigned
> pin, int is_on)
> >     return 0;
> >  }
> >
> > -#if defined(CPU_HAS_PIO3)
> >  /*
> >   * enable/disable the debounce filter.
> >   */
> > -int at91_set_pio_debounce(unsigned port, unsigned pin, int is_on, int div)
> > +int at91_pio3_set_pio_debounce(unsigned port, unsigned pin, int is_on, int 
> > div)
> >  {
> >     struct at91_port *at91_port = at91_pio_get_port(port);
> >     u32 mask;
> > @@ -288,8 +328,8 @@ int at91_set_pio_debounce(unsigned port, unsigned pin,
> int is_on, int div)
> >     if (at91_port && (pin < GPIO_PER_BANK)) {
> >             mask = 1 << pin;
> >             if (is_on) {
> > -                   writel(mask, &at91_port->ifscer);
> > -                   writel(div & PIO_SCDR_DIV, &at91_port->scdr);
> > +                   writel(mask, &at91_port->mux.pio3.ifscer);
> > +                   writel(div & PIO_SCDR_DIV, &at91_port->mux.pio3.scdr);
> >                     writel(mask, &at91_port->ifer);
> >             } else {
> >                     writel(mask, &at91_port->ifdr);
> > @@ -303,7 +343,7 @@ int at91_set_pio_debounce(unsigned port, unsigned pin,
> int is_on, int div)
> >   * enable/disable the pull-down.
> >   * If pull-up already enabled while calling the function, we disable it.
> >   */
> > -int at91_set_pio_pulldown(unsigned port, unsigned pin, int is_on)
> > +int at91_pio3_set_pio_pulldown(unsigned port, unsigned pin, int is_on)
> >  {
> >     struct at91_port *at91_port = at91_pio_get_port(port);
> >     u32 mask;
> > @@ -312,18 +352,31 @@ int at91_set_pio_pulldown(unsigned port, unsigned
> pin, int is_on)
> >             mask = 1 << pin;
> >             if (is_on) {
> >                     at91_set_pio_pullup(port, pin, 0);
> > -                   writel(mask, &at91_port->ppder);
> > +                   writel(mask, &at91_port->mux.pio3.ppder);
> >             } else
> > -                   writel(mask, &at91_port->ppddr);
> > +                   writel(mask, &at91_port->mux.pio3.ppddr);
> >     }
> >
> >     return 0;
> >  }
> >
> > +int at91_pio3_set_pio_pullup(unsigned port, unsigned pin, int use_pullup)
> > +{
> > +   struct at91_port *at91_port = at91_pio_get_port(port);
> > +
> > +   if (use_pullup)
> > +           at91_pio3_set_pio_pulldown(port, pin, 0);
> > +
> > +   if (at91_port && (pin < GPIO_PER_BANK))
> > +           at91_set_port_pullup(at91_port, pin, use_pullup);
> > +
> > +   return 0;
> > +}
> > +
> >  /*
> >   * disable Schmitt trigger
> >   */
> > -int at91_set_pio_disable_schmitt_trig(unsigned port, unsigned pin)
> > +int at91_pio3_set_pio_disable_schmitt_trig(unsigned port, unsigned pin)
> >  {
> >     struct at91_port *at91_port = at91_pio_get_port(port);
> >     u32 mask;
> > @@ -336,7 +389,6 @@ int at91_set_pio_disable_schmitt_trig(unsigned port,
> unsigned pin)
> >
> >     return 0;
> >  }
> > -#endif
> >
> >  /*
> >   * enable/disable the multi-driver. This is only valid for output and
> >
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to