/*
 * 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/cpm1.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);
