#include <linux/serial_reg.h>
 #include <asm/serial.h>
 
+#if defined(CONFIG_XILINX_VIRTEX)
+#include <platforms/4xx/xparameters/xparameters.h>
+#endif
 #include "nonstdio.h"
 #include "serial.h"
 
 
 #ifdef CONFIG_40x
 #include <asm/io.h>
 #endif
+#ifdef CONFIG_XILINX_VIRTEX
+#include <platforms/4xx/xparameters/xparameters.h>
+#endif
 extern unsigned long timebase_period_ns;
 
 /* For those boards that don't provide one.
 
        depends on ASH || BAMBOO || BUBINGA || CPCI405 || EBONY || EP405 || LUAN || YUCCA || OCOTEA || REDWOOD_5 || REDWOOD_6 || SYCAMORE || WALNUT
        default y
 
-config XILINX_OCP
-       bool
-       depends on XILINX_ML300
-       default y
-
 config IBM_EMAC4
        bool
        depends on 440GX || 440SP || 440SPE
 
 /*
- * arch/ppc/platforms/4xx/virtex.c
+ * Virtex-II Pro & Virtex-4 FX common infrastructure
  *
- * Author: MontaVista Software, Inc.
- *         source@mvista.com
+ * Maintainer: Grant Likely <grant.likely@secretlab.ca>
  *
- * 2002-2004 (c) MontaVista Software, Inc.  This file is licensed under the
- * terms of the GNU General Public License version 2.  This program is licensed
- * "as is" without any warranty of any kind, whether express or implied.
+ * Copyright 2005 Secret Lab Technologies Ltd.
+ * Copyright 2005 General Dynamics Canada Ltd.
+ * Copyright 2005 Freescale Semiconductor Inc.
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
  */
 
-#include <linux/config.h>
 #include <linux/init.h>
-#include <asm/ocp.h>
+#include <linux/module.h>
+#include <linux/device.h>
+#include <linux/serial_8250.h>
+#include <asm/ppc_sys.h>
 #include <platforms/4xx/virtex.h>
+#include <platforms/4xx/xparameters/xparameters.h>
+
+#define XPAR_UART(num) { \
+               .mapbase  = XPAR_UARTNS550_##num##_BASEADDR + 3, \
+               .irq      = XPAR_INTC_0_UARTNS550_##num##_VEC_ID, \
+               .iotype   = UPIO_MEM, \
+               .uartclk  = XPAR_UARTNS550_##num##_CLOCK_FREQ_HZ, \
+               .flags    = UPF_BOOT_AUTOCONF, \
+               .regshift = 2, \
+       }
 
-/* Have OCP take care of the serial ports. */
-struct ocp_def core_ocp[] = {
+struct plat_serial8250_port serial_platform_data[] = {
 #ifdef XPAR_UARTNS550_0_BASEADDR
-       { .vendor       = OCP_VENDOR_XILINX,
-         .function     = OCP_FUNC_16550,
-         .index        = 0,
-         .paddr        = XPAR_UARTNS550_0_BASEADDR,
-         .irq          = XPAR_INTC_0_UARTNS550_0_VEC_ID,
-         .pm           = OCP_CPM_NA
-       },
+       XPAR_UART(0),
+#endif
 #ifdef XPAR_UARTNS550_1_BASEADDR
-       { .vendor       = OCP_VENDOR_XILINX,
-         .function     = OCP_FUNC_16550,
-         .index        = 1,
-         .paddr        = XPAR_UARTNS550_1_BASEADDR,
-         .irq          = XPAR_INTC_0_UARTNS550_1_VEC_ID,
-         .pm           = OCP_CPM_NA
-       },
+       XPAR_UART(1),
+#endif
 #ifdef XPAR_UARTNS550_2_BASEADDR
-       { .vendor       = OCP_VENDOR_XILINX,
-         .function     = OCP_FUNC_16550,
-         .index        = 2,
-         .paddr        = XPAR_UARTNS550_2_BASEADDR,
-         .irq          = XPAR_INTC_0_UARTNS550_2_VEC_ID,
-         .pm           = OCP_CPM_NA
-       },
+       XPAR_UART(2),
+#endif
 #ifdef XPAR_UARTNS550_3_BASEADDR
-       { .vendor       = OCP_VENDOR_XILINX,
-         .function     = OCP_FUNC_16550,
-         .index        = 3,
-         .paddr        = XPAR_UARTNS550_3_BASEADDR,
-         .irq          = XPAR_INTC_0_UARTNS550_3_VEC_ID,
-         .pm           = OCP_CPM_NA
+       XPAR_UART(3),
+#endif
+       { }, /* terminated by empty record */
+};
+
+struct platform_device ppc_sys_platform_devices[] = {
+       [VIRTEX_UART] = {
+               .name           = "serial8250",
+               .id             = 0,
+               .dev.platform_data = serial_platform_data,
        },
-#ifdef XPAR_UARTNS550_4_BASEADDR
-#error Edit this file to add more devices.
-#endif                 /* 4 */
-#endif                 /* 3 */
-#endif                 /* 2 */
-#endif                 /* 1 */
-#endif                 /* 0 */
-       { .vendor       = OCP_VENDOR_INVALID
-       }
 };
+
 
 #ifndef __ASM_VIRTEX_H__
 #define __ASM_VIRTEX_H__
 
-#include <linux/config.h>
-#include <platforms/4xx/xparameters/xparameters.h>
-
 /* serial defines */
 
-#define RS_TABLE_SIZE  4       /* change this and add more devices below
-                                  if you have more then 4 16x50 UARTs */
-
-#define BASE_BAUD              (XPAR_UARTNS550_0_CLOCK_FREQ_HZ/16)
-
-/* The serial ports in the Virtex-II Pro have each I/O byte in the
- * LSByte of a word.  This means that iomem_reg_shift needs to be 2 to
- * change the byte offsets into word offsets.  In addition the base
- * addresses need to have 3 added to them to get to the LSByte.
- */
-#define STD_UART_OP(num)                                                \
-       { 0, BASE_BAUD, 0, XPAR_INTC_0_UARTNS550_##num##_VEC_ID,         \
-               ASYNC_BOOT_AUTOCONF,                                     \
-               .iomem_base = (u8 *)XPAR_UARTNS550_##num##_BASEADDR + 3, \
-               .iomem_reg_shift = 2,                                    \
-               .io_type = SERIAL_IO_MEM},
-
-#if defined(XPAR_INTC_0_UARTNS550_0_VEC_ID)
-#define ML300_UART0 STD_UART_OP(0)
-#else
-#define ML300_UART0
-#endif
-
-#if defined(XPAR_INTC_0_UARTNS550_1_VEC_ID)
-#define ML300_UART1 STD_UART_OP(1)
-#else
-#define ML300_UART1
-#endif
-
-#if defined(XPAR_INTC_0_UARTNS550_2_VEC_ID)
-#define ML300_UART2 STD_UART_OP(2)
-#else
-#define ML300_UART2
-#endif
-
-#if defined(XPAR_INTC_0_UARTNS550_3_VEC_ID)
-#define ML300_UART3 STD_UART_OP(3)
-#else
-#define ML300_UART3
-#endif
-
-#if defined(XPAR_INTC_0_UARTNS550_4_VEC_ID)
-#error Edit this file to add more devices.
-#elif defined(XPAR_INTC_0_UARTNS550_3_VEC_ID)
-#define NR_SER_PORTS   4
-#elif defined(XPAR_INTC_0_UARTNS550_2_VEC_ID)
-#define NR_SER_PORTS   3
-#elif defined(XPAR_INTC_0_UARTNS550_1_VEC_ID)
-#define NR_SER_PORTS   2
-#elif defined(XPAR_INTC_0_UARTNS550_0_VEC_ID)
-#define NR_SER_PORTS   1
-#else
-#define NR_SER_PORTS   0
-#endif
+#include <asm/ibm405.h>
 
-#if defined(CONFIG_UART0_TTYS0)
-#define SERIAL_PORT_DFNS       \
-       ML300_UART0             \
-       ML300_UART1             \
-       ML300_UART2             \
-       ML300_UART3
+/* Ugly, ugly, ugly! BASE_BAUD defined here to keep 8250.c happy. */
+#if !defined(BASE_BAUD)
+ #define BASE_BAUD             (0) /* dummy value; not used */
 #endif
-
-#if defined(CONFIG_UART0_TTYS1)
-#define SERIAL_PORT_DFNS       \
-       ML300_UART1             \
-       ML300_UART0             \
-       ML300_UART2             \
-       ML300_UART3
+  
+/* Device type enumeration for platform bus definitions */
+#ifndef __ASSEMBLY__
+enum ppc_sys_devices {
+       VIRTEX_UART,
+};
 #endif
-
-#define DCRN_CPMFR_BASE        0
-
-#include <asm/ibm405.h>
-
+  
 #endif                         /* __ASM_VIRTEX_H__ */
 #endif                         /* __KERNEL__ */
 
 /*
  * include/asm-ppc/xparameters.h
  *
- * This file includes the correct xparameters.h for the CONFIG'ed board
+ * This file includes the correct xparameters.h for the CONFIG'ed board plus
+ * fixups to translate board specific XPAR values to a common set of names
  *
  * Author: MontaVista Software, Inc.
  *         source@mvista.com
 #include <linux/config.h>
 
 #if defined(CONFIG_XILINX_ML300)
-#include <platforms/4xx/xparameters/xparameters_ml300.h>
+  #include "xparameters_ml300.h"
+#else
+  /* Add other board xparameter includes here before the #else */
+  #error No xparameters_*.h file included
+#endif
+
+#ifndef SERIAL_PORT_DFNS
+  /* zImage serial port definitions */
+  #define RS_TABLE_SIZE 1
+  #define SERIAL_PORT_DFNS {                                           \
+       .baud_base       = XPAR_UARTNS550_0_CLOCK_FREQ_HZ/16,           \
+       .irq             = XPAR_INTC_0_UARTNS550_0_VEC_ID,              \
+       .flags           = ASYNC_BOOT_AUTOCONF,                         \
+       .iomem_base      = (u8 *)XPAR_UARTNS550_0_BASEADDR + 3,         \
+       .iomem_reg_shift = 2,                                           \
+       .io_type         = SERIAL_IO_MEM,                               \
+  },
 #endif
 
 #include <asm/mpc52xx.h>
 #elif defined(CONFIG_MPC10X_BRIDGE)
 #include <asm/mpc10x.h>
+#elif defined(CONFIG_XILINX_VIRTEX)
+#include <platforms/4xx/virtex.h>
 #else
 #error "need definition of ppc_sys_devices"
 #endif