return (0);
 }
 
-void uart_port_conf(void)
+void uart_port_conf(int port)
 {
        volatile gpio_t *gpio = (gpio_t *) MMAP_GPIO;
 
        /* Setup Ports: */
-       switch (CONFIG_SYS_UART_PORT) {
+       switch (port) {
        case 0:
                gpio->par_uart &=
                    (GPIO_PAR_UART_U0TXD_UNMASK & GPIO_PAR_UART_U0RXD_UNMASK);
 
        return (0);
 }
 
-void uart_port_conf(void)
+void uart_port_conf(int port)
 {
        volatile gpio_t *gpio = (gpio_t *) MMAP_GPIO;
 
        /* Setup Ports: */
-       switch (CONFIG_SYS_UART_PORT) {
+       switch (port) {
        case 0:
-               gpio->par_uart = (GPIO_PAR_UART_U0RXD | GPIO_PAR_UART_U0TXD);
+               gpio->par_uart &= ~(GPIO_PAR_UART_U0RXD | GPIO_PAR_UART_U0TXD);
+               gpio->par_uart |= (GPIO_PAR_UART_U0RXD | GPIO_PAR_UART_U0TXD);
                break;
        case 1:
-               gpio->par_uart =
-                       (GPIO_PAR_UART_U1RXD_U1RXD | GPIO_PAR_UART_U1TXD_U1TXD);
+               gpio->par_uart &=
+                   ~(GPIO_PAR_UART_U1RXD_MASK | GPIO_PAR_UART_U1TXD_MASK);
+               gpio->par_uart |=
+                   (GPIO_PAR_UART_U1RXD_U1RXD | GPIO_PAR_UART_U1TXD_U1TXD);
                break;
        case 2:
-               gpio->par_timer = (GPIO_PAR_UART_U2RXD | GPIO_PAR_UART_U2TXD);
+#ifdef CONFIG_SYS_UART2_PRI_GPIO
+               gpio->par_uart &= ~(GPIO_PAR_UART_U2RXD | GPIO_PAR_UART_U2TXD);
+               gpio->par_uart |= (GPIO_PAR_UART_U2RXD | GPIO_PAR_UART_U2TXD);
+#elif defined(CONFIG_SYS_UART2_ALT1_GPIO)
+               gpio->feci2c &=
+                   ~(GPIO_PAR_FECI2C_EMDC_MASK | GPIO_PAR_FECI2C_EMDIO_MASK);
+               gpio->feci2c |=
+                   (GPIO_PAR_FECI2C_EMDC_U2TXD | GPIO_PAR_FECI2C_EMDIO_U2RXD);
+#endif
                break;
        }
 }
 
        if (setclear) {
                gpio->par_feci2c |=
-                   (GPIO_PAR_FECI2C_EMDC_FECEMDC | GPIO_PAR_FECI2C_EMDIO_FECEMDIO);
+                   (GPIO_PAR_FECI2C_EMDC_FECEMDC |
+                    GPIO_PAR_FECI2C_EMDIO_FECEMDIO);
        } else {
                gpio->par_feci2c &=
                    ~(GPIO_PAR_FECI2C_EMDC_MASK | GPIO_PAR_FECI2C_EMDIO_MASK);
 
        return (0);
 }
 
-void uart_port_conf(void)
+void uart_port_conf(int port)
 {
        volatile gpio_t *gpio = (gpio_t *) MMAP_GPIO;
 
        /* Setup Ports: */
-       switch (CONFIG_SYS_UART_PORT) {
+       switch (port) {
        case 0:
                gpio->par_uart &= GPIO_PAR_UART0_UNMASK;
                gpio->par_uart |= (GPIO_PAR_UART_U0TXD | GPIO_PAR_UART_U0RXD);
        return (0);
 }
 
-void uart_port_conf(void)
+void uart_port_conf(int port)
 {
+       volatile u32 *par = (u32 *) MMAP_PAR;
+
        /* Setup Ports: */
-       switch (CONFIG_SYS_UART_PORT) {
-       case 0:
-               break;
+       switch (port) {
        case 1:
+               *par &= 0xFFE7FFFF;
+               *par |= 0x00180000;
                break;
        case 2:
+               *par &= 0xFFFFFFFC;
+               *par &= 0x00000003;
                break;
        }
 }
        return (0);
 }
 
-void uart_port_conf(void)
+void uart_port_conf(int port)
 {
+       u16 temp;
+
        /* Setup Ports: */
-       switch (CONFIG_SYS_UART_PORT) {
+       switch (port) {
        case 0:
-               mbar_writeShort(MCF_GPIO_PAR_UART, MCF_GPIO_PAR_UART_U0TXD |
-                               MCF_GPIO_PAR_UART_U0RXD);
+               temp = mbar_readShort(MCF_GPIO_PAR_UART) & 0xFFF3;
+               temp |= (MCF_GPIO_PAR_UART_U0TXD | MCF_GPIO_PAR_UART_U0RXD);
+               mbar_writeShort(MCF_GPIO_PAR_UART, temp);
                break;
        case 1:
-               mbar_writeShort(MCF_GPIO_PAR_UART,
-                               MCF_GPIO_PAR_UART_U1RXD_UART1 |
-                               MCF_GPIO_PAR_UART_U1TXD_UART1);
+               temp = mbar_readShort(MCF_GPIO_PAR_UART) & 0xF0FF;
+               temp |= (MCF_GPIO_PAR_UART_U1RXD_UART1 | MCF_GPIO_PAR_UART_U1TXD_UART1);
+               mbar_writeShort(MCF_GPIO_PAR_UART, temp);
                break;
        case 2:
-               mbar_writeShort(MCF_GPIO_PAR_UART, 0x3000);
+               temp = mbar_readShort(MCF_GPIO_PAR_UART) & 0xCFFF;
+               temp |= (0x3000);
+               mbar_writeShort(MCF_GPIO_PAR_UART, temp);
                break;
        }
 }
        return (0);
 }
 
-void uart_port_conf(void)
+void uart_port_conf(int port)
 {
        volatile gpio_t *gpio = (gpio_t *) MMAP_GPIO;
 
        /* Setup Ports: */
-       switch (CONFIG_SYS_UART_PORT) {
+       switch (port) {
        case 0:
                gpio->gpio_pbcnt &= ~(GPIO_PBCNT_PB0MSK | GPIO_PBCNT_PB1MSK);
                gpio->gpio_pbcnt |= (GPIO_PBCNT_URT0_TXD | GPIO_PBCNT_URT0_RXD);
        return (0);
 }
 
-void uart_port_conf(void)
+void uart_port_conf(int port)
 {
        volatile gpio_t *gpio = (gpio_t *) MMAP_GPIO;
 
        /* Setup Ports: */
-       switch (CONFIG_SYS_UART_PORT) {
+       switch (port) {
        case 0:
+               gpio->par_uart &= ~UART0_ENABLE_MASK;
                gpio->par_uart |= UART0_ENABLE_MASK;
                break;
        case 1:
+               gpio->par_uart &= ~UART1_ENABLE_MASK;
                gpio->par_uart |= UART1_ENABLE_MASK;
                break;
        case 2:
+               gpio->par_uart &= ~UART2_ENABLE_MASK;
                gpio->par_uart |= UART2_ENABLE_MASK;
                break;
        }
        return (0);
 }
 
-void uart_port_conf(void)
+void uart_port_conf(int port)
 {
        /* Setup Ports: */
-       switch (CONFIG_SYS_UART_PORT) {
+       switch (port) {
        case 0:
                MCFGPIO_PUAPAR &= 0xFc;
                MCFGPIO_PUAPAR |= 0x03;
        return (0);
 }
 
-void uart_port_conf(void)
+void uart_port_conf(int port)
 {
-       /* Setup Ports: */
-       switch (CONFIG_SYS_UART_PORT) {
-       case 0:
-               break;
-       case 1:
-               break;
-       }
 }
 #endif                         /* #if defined(CONFIG_M5249) */
 
        return (0);
 }
 
-void uart_port_conf(void)
+void uart_port_conf(int port)
 {
        volatile gpio_t *gpio = (gpio_t *) MMAP_GPIO;
 
        /* Setup Ports: */
-       switch (CONFIG_SYS_UART_PORT) {
+       switch (port) {
        case 0:
-               gpio->par_uart = (GPIO_PAR_UART_U0TXD | GPIO_PAR_UART_U0RXD);
+               gpio->par_uart &= ~(GPIO_PAR_UART_U0TXD | GPIO_PAR_UART_U0RXD);
+               gpio->par_uart |= (GPIO_PAR_UART_U0TXD | GPIO_PAR_UART_U0RXD);
                break;
        case 1:
 #ifdef CONFIG_SYS_UART1_ALT1_GPIO
                gpio->par_simp1h &=
-                   ~(GPIO_PAR_SIMP1H_DATA1_UNMASK | GPIO_PAR_SIMP1H_VEN1_UNMASK);
+                   ~(GPIO_PAR_SIMP1H_DATA1_UNMASK |
+                     GPIO_PAR_SIMP1H_VEN1_UNMASK);
                gpio->par_simp1h |=
                    (GPIO_PAR_SIMP1H_DATA1_U1TXD | GPIO_PAR_SIMP1H_VEN1_U1RXD);
 #elif defined(CONFIG_SYS_UART1_ALT2_GPIO)
        return (0);
 }
 
-void uart_port_conf(void)
+void uart_port_conf(int port)
 {
        volatile gpio_t *gpio = (gpio_t *) MMAP_GPIO;
 
        /* Setup Ports: */
-       switch (CONFIG_SYS_UART_PORT) {
+       switch (port) {
        case 0:
-               gpio->par_uart = (GPIO_PAR_UART_TXD0 | GPIO_PAR_UART_RXD0);
+               gpio->par_uart &= ~(GPIO_PAR_UART_TXD0 | GPIO_PAR_UART_RXD0);
+               gpio->par_uart |= (GPIO_PAR_UART_TXD0 | GPIO_PAR_UART_RXD0);
                break;
        case 1:
-               gpio->par_uart =
+               gpio->par_uart &=
+                   ~(GPIO_PAR_UART_TXD1(3) | GPIO_PAR_UART_RXD1(3));
+               gpio->par_uart |=
                    (GPIO_PAR_UART_TXD1(3) | GPIO_PAR_UART_RXD1(3));
                break;
        case 2:
+#ifdef CONFIG_SYS_UART2_ALT1_GPIO
                gpio->par_timer &= 0x0F;
                gpio->par_timer |= (GPIO_PAR_TIN3_URXD2 | GPIO_PAR_TIN2_UTXD2);
+#elif defined(CONFIG_SYS_UART2_ALT2_GPIO)
+               gpio->par_feci2c &= 0xFF00;
+               gpio->par_feci2c |= (GPIO_PAR_FECI2C_SCL_UTXD2 | GPIO_PAR_FECI2C_SDA_URXD2);
+#elif defined(CONFIG_SYS_UART2_ALT3_GPIO)
+               gpio->par_ssi &= 0xF0FF;
+               gpio->par_ssi |= (GPIO_PAR_SSI_RXD(2) | GPIO_PAR_SSI_TXD(2));
+#endif
                break;
        }
 }
 
        return (0);
 }
 
-void uart_port_conf(void)
+void uart_port_conf(int port)
 {
        volatile gpio_t *gpio = (gpio_t *) MMAP_GPIO;
 
        /* Setup Ports: */
-       switch (CONFIG_SYS_UART_PORT) {
+       switch (port) {
        case 0:
-               gpio->par_uart =
+               gpio->par_uart &=
+                   ~(GPIO_PAR_UART_U0TXD_U0TXD | GPIO_PAR_UART_U0RXD_U0RXD);
+               gpio->par_uart |=
                    (GPIO_PAR_UART_U0TXD_U0TXD | GPIO_PAR_UART_U0RXD_U0RXD);
                break;
        case 1:
-               gpio->par_uart =
+#ifdef CONFIG_SYS_UART1_PRI_GPIO
+               gpio->par_uart &=
+                   ~(GPIO_PAR_UART_U1TXD_U1TXD | GPIO_PAR_UART_U1RXD_U1RXD);
+               gpio->par_uart |=
                    (GPIO_PAR_UART_U1TXD_U1TXD | GPIO_PAR_UART_U1RXD_U1RXD);
+#elif defined(CONFIG_SYS_UART1_ALT1_GPIO)
+               gpio->par_ssi &=
+                   (GPIO_PAR_SSI_SRXD_UNMASK | GPIO_PAR_SSI_STXD_UNMASK);
+               gpio->par_ssi |=
+                   (GPIO_PAR_SSI_SRXD_U1RXD | GPIO_PAR_SSI_STXD_U1TXD);
+#endif
+               break;
+       case 2:
+#if defined(CONFIG_SYS_UART2_ALT1_GPIO)
+               gpio->par_timer &=
+                   (GPIO_PAR_TIMER_T3IN_UNMASK | GPIO_PAR_TIMER_T2IN_UNMASK);
+               gpio->par_timer |=
+                   (GPIO_PAR_TIMER_T3IN_U2RXD | GPIO_PAR_TIMER_T2IN_U2TXD);
+#elif defined(CONFIG_SYS_UART2_ALT2_GPIO)
+               gpio->par_timer &=
+                   (GPIO_PAR_FECI2C_SCL_UNMASK | GPIO_PAR_FECI2C_SDA_UNMASK);
+               gpio->par_timer |=
+                   (GPIO_PAR_FECI2C_SCL_U2TXD | GPIO_PAR_FECI2C_SDA_U2RXD);
+#endif
                break;
        }
 }
 
        return (0);
 }
 
-void uart_port_conf(void)
+void uart_port_conf(int port)
 {
        volatile gpio_t *gpio = (gpio_t *) MMAP_GPIO;
        volatile u8 *pscsicr = (u8 *) (CONFIG_SYS_UART_BASE + 0x40);
 
        /* Setup Ports: */
-       switch (CONFIG_SYS_UART_PORT) {
+       switch (port) {
        case 0:
                gpio->par_psc0 = (GPIO_PAR_PSC0_TXD0 | GPIO_PAR_PSC0_RXD0);
                break;
 
 #define MMAP_CAN0              (CONFIG_SYS_MBAR + 0x00010000)
 #define MMAP_CAN1              (CONFIG_SYS_MBAR + 0x00011000)
 
+#define MMAP_PAR               (CONFIG_SYS_MBAR2 + 0x0000019C)
 #define MMAP_I2C1              (CONFIG_SYS_MBAR2 + 0x00000440)
 #define MMAP_UART2             (CONFIG_SYS_MBAR2 + 0x00000C00)