/*
 * arch/ppc/syslib/mpc8xx_devices.c
 *
 * MPC8xx Device descriptions
 *
 * Maintainer: Kumar Gala <kumar.gala@freescale.com>
 *
 * 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 dependences 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 	= 0x3c80,
				.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 	= 0x3d80,
				.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 	= 0x3e80,
				.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 	= 0x3f80,
				.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	= 2,
		.resource = (struct resource[]) {
			{
				.name	= "regs",
				.start	= 0xa82,
				.end	= 0xa91,
				.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	= 2,
		.resource = (struct resource[]) {
			{
				.name	= "regs",
				.start	= 0xa92,
				.end	= 0xaa1,
				.flags	= IORESOURCE_MEM,
			},
			{
				.name	= "interrupt",
				.start	= MPC8xx_INT_SMC2,
				.end	= MPC8xx_INT_SMC2,
				.flags	= IORESOURCE_IRQ,
			},
		},
	},
};

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);
