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_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_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, 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_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_set_a_periph(AT91_PIO_PORTB, 11, 0);	/* GRXCK */
-	at91_set_a_periph(AT91_PIO_PORTB, 13, 0);	/* GRXER */
+	at91_pio3_set_a_periph(AT91_PIO_PORTB, 11, 0);	/* GRXCK */
+	at91_pio3_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, 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_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_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, 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_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_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_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_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_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_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, 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_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_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_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_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, 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_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, 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_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_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_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_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_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_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, 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,17 @@ 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;
 }
 
-#if defined(CPU_HAS_PIO3)
 /*
- * mux the pin to the "C" internal peripheral role.
+ * mux the pin to the "A" internal peripheral role.
  */
-int at91_set_c_periph(unsigned port, unsigned pin, int use_pullup)
+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;
@@ -153,10 +133,55 @@ 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);
+	}
+
+	return 0;
+}
+
+/*
+ * 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_pio3_set_c_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);
 	}
 
@@ -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)
@@ -261,12 +285,29 @@ int at91_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)
+			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
diff --git a/drivers/net/at91_emac.c b/drivers/net/at91_emac.c
index be3d82e67e..eb8d2b31ec 100644
--- a/drivers/net/at91_emac.c
+++ b/drivers/net/at91_emac.c
@@ -333,7 +333,7 @@ static int at91emac_init(struct eth_device *netdev, bd_t *bd)
 		ATMEL_PMX_AA_ETXEN |	ATMEL_PMX_AA_EREFCK;
 
 	writel(value, &pio->pioa.pdr);
-	writel(value, &pio->pioa.asr);
+	writel(value, &pio->pioa.mux.pio2.asr);
 
 #ifdef CONFIG_RMII
 	value = ATMEL_PMX_BA_ERXCK;
@@ -344,7 +344,7 @@ static int at91emac_init(struct eth_device *netdev, bd_t *bd)
 		ATMEL_PMX_BA_ETX3 |	ATMEL_PMX_BA_ETX2;
 #endif
 	writel(value, &pio->piob.pdr);
-	writel(value, &pio->piob.bsr);
+	writel(value, &pio->piob.mux.pio2.bsr);
 
 	at91_periph_clk_enable(ATMEL_ID_EMAC);