/*
 * MPC8xx Device descriptions
 *
 * Maintainer: Kumar Gala <galak@kernel.crashing.org>
 *
 * Copyright 2005 MontaVista Software, Inc. by Vitaly Bordug<vbordug@ru.mvista.com>
 *
 * 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/init.h>
#include <linux/module.h>
#include <linux/device.h>
#include <linux/serial_8250.h>
#include <linux/mii.h>
#include <asm/commproc.h>
#include <asm/mpc8xx.h>
#include <asm/irq.h>
#include <asm/ppc_sys.h>

/* We use offsets for IORESOURCE_MEM to do not set dependencies at compile time.
 * They will get fixed up by mach_mpc8xx_fixup
 */

struct platform_device ppc_sys_platform_devices[] = {
	[MPC8xx_CPM_FEC1] =	{
		.name = "fsl-cpm-fec",
		.id	= 1,
		.num_resources = 2,
		.resource = (struct resource[])	{
			{
				.name 	= "regs",
				.start	= 0xe00,
				.end	= 0xe88,
				.flags	= IORESOURCE_MEM,
			},
			{
				.name	= "interrupt",
				.start	= MPC8xx_INT_FEC1,
				.end	= MPC8xx_INT_FEC1,
				.flags	= IORESOURCE_IRQ,
			},
		},
	},
	[MPC8xx_CPM_FEC2] =	{
		.name = "fsl-cpm-fec",
		.id	= 2,
		.num_resources = 2,
		.resource = (struct resource[])	{
			{
				.name	= "regs",
				.start	= 0x1e00,
				.end	= 0x1e88,
				.flags	= IORESOURCE_MEM,
			},
			{
				.name	= "interrupt",
				.start	= MPC8xx_INT_FEC2,
				.end	= MPC8xx_INT_FEC2,
				.flags	= IORESOURCE_IRQ,
			},
		},
	},
	[MPC8xx_CPM_SCC1] = {
		.name = "fsl-cpm-scc",
		.id	= 1,
		.num_resources = 3,
		.resource = (struct resource[]) {
			{
				.name	= "regs",
				.start	= 0xa00,
				.end	= 0xa18,
				.flags	= IORESOURCE_MEM,
			},
			{
				.name 	= "pram",
				.start 	= 0x3c00,
				.end 	= 0x3c7f,
				.flags 	= IORESOURCE_MEM,
			},
			{
				.name	= "interrupt",
				.start	= MPC8xx_INT_SCC1,
				.end	= MPC8xx_INT_SCC1,
				.flags	= IORESOURCE_IRQ,
			},
		},
	},
	[MPC8xx_CPM_SCC2] = {
		.name = "fsl-cpm-scc",
		.id	= 2,
		.num_resources	= 3,
		.resource = (struct resource[]) {
			{
				.name	= "regs",
				.start	= 0xa20,
				.end	= 0xa38,
				.flags	= IORESOURCE_MEM,
			},
			{
				.name 	= "pram",
				.start 	= 0x3d00,
				.end 	= 0x3d7f,
				.flags 	= IORESOURCE_MEM,
			},

			{
				.name	= "interrupt",
				.start	= MPC8xx_INT_SCC2,
				.end	= MPC8xx_INT_SCC2,
				.flags	= IORESOURCE_IRQ,
			},
		},
	},
	[MPC8xx_CPM_SCC3] = {
		.name = "fsl-cpm-scc",
		.id	= 3,
		.num_resources	= 3,
		.resource = (struct resource[]) {
			{
				.name	= "regs",
				.start	= 0xa40,
				.end	= 0xa58,
				.flags	= IORESOURCE_MEM,
			},
			{
				.name 	= "pram",
				.start 	= 0x3e00,
				.end 	= 0x3e7f,
				.flags 	= IORESOURCE_MEM,
			},

			{
				.name	= "interrupt",
				.start	= MPC8xx_INT_SCC3,
				.end	= MPC8xx_INT_SCC3,
				.flags	= IORESOURCE_IRQ,
			},
		},
	},
	[MPC8xx_CPM_SCC4] = {
		.name = "fsl-cpm-scc",
		.id	= 4,
		.num_resources	= 3,
		.resource = (struct resource[]) {
			{
				.name	= "regs",
				.start	= 0xa60,
				.end	= 0xa78,
				.flags	= IORESOURCE_MEM,
			},
			{
				.name 	= "pram",
				.start 	= 0x3f00,
				.end 	= 0x3f7f,
				.flags 	= IORESOURCE_MEM,
			},

			{
				.name	= "interrupt",
				.start	= MPC8xx_INT_SCC4,
				.end	= MPC8xx_INT_SCC4,
				.flags	= IORESOURCE_IRQ,
			},
		},
	},
	[MPC8xx_CPM_SMC1] = {
		.name = "fsl-cpm-smc",
		.id	= 1,
		.num_resources	= 3,
		.resource = (struct resource[]) {
			{
				.name	= "regs",
				.start	= 0xa80,
				.end	= 0xa8f,
				.flags	= IORESOURCE_MEM,
			},
			{
				.name	= "pram",
				.start	= 0x3e80,
				.end	= 0x3ebf,
				.flags	= IORESOURCE_MEM,
			},
			{
				.name	= "interrupt",
				.start	= MPC8xx_INT_SMC1,
				.end	= MPC8xx_INT_SMC1,
				.flags	= IORESOURCE_IRQ,
			},
		},
	},
	[MPC8xx_CPM_SMC2] = {
		.name = "fsl-cpm-smc",
		.id	= 2,
		.num_resources	= 3,
		.resource = (struct resource[]) {
			{
				.name	= "regs",
				.start	= 0xa90,
				.end	= 0xa9f,
				.flags	= IORESOURCE_MEM,
			},
			{
 				.name	= "pram",
 				.start	= 0x3f80,
 				.end	= 0x3fbf,
 				.flags	= IORESOURCE_MEM,

			},
			{
				.name	= "interrupt",
				.start	= MPC8xx_INT_SMC2,
				.end	= MPC8xx_INT_SMC2,
				.flags	= IORESOURCE_IRQ,
			},
		},
	},

        [MPC8xx_MDIO_FEC] = {
                .name = "fsl-cpm-fec-mdio",
                .id = 0,
                .num_resources = 0,

        },

};

static int __init mach_mpc8xx_fixup(struct platform_device *pdev)
{
	ppc_sys_fixup_mem_resource (pdev, IMAP_ADDR);
	return 0;
}

static int __init mach_mpc8xx_init(void)
{
	ppc_sys_device_fixup = mach_mpc8xx_fixup;
	return 0;
}

postcore_initcall(mach_mpc8xx_init);
