/*
 * arch/ppc/syslib/pq2_devices.c
 *
 * PQ2 Device descriptions
 *
 * Maintainer: Kumar Gala <kumar.gala@freescale.com>
 *
 * 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.
 */


#include <linux/init.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/ioport.h>
#include <asm/cpm2.h>
#include <asm/irq.h>
#include <asm/ppc_sys.h>
#include <asm/machdep.h>

struct platform_device ppc_sys_platform_devices[] = {
	[MPC82xx_CPM_FCC1] = {
		.name = "fsl-cpm-fcc",
		.id	= 1,
		.num_resources	 = 3,
		.resource = (struct resource[]) {
			{
				.name	= "fcc_regs",
				.start	= 0x11300,
				.end	= 0x1131f,
				.flags	= IORESOURCE_MEM,
			},
			{
				.name	= "fcc_pram",
				.start	= 0x8400,
				.end	= 0x84ff,
				.flags	= IORESOURCE_MEM,
			},
			{
				.start	= SIU_INT_FCC1,
				.end	= SIU_INT_FCC1,
				.flags	= IORESOURCE_IRQ,
			},
		},
	},
	[MPC82xx_CPM_FCC2] = {
		.name = "fsl-cpm-fcc",
		.id	= 2,
		.num_resources	 = 3,
		.resource = (struct resource[]) {
			{
				.name	= "fcc_regs",
				.start	= 0x11320,
				.end	= 0x1133f,
				.flags	= IORESOURCE_MEM,
			},
			{
				.name	= "fcc_pram",
				.start	= 0x8500,
				.end	= 0x85ff,
				.flags	= IORESOURCE_MEM,
			},
			{
				.start	= SIU_INT_FCC2,
				.end	= SIU_INT_FCC2,
				.flags	= IORESOURCE_IRQ,
			},
		},
	},
	[MPC82xx_CPM_FCC3] = {
		.name = "fsl-cpm-fcc",
		.id	= 3,
		.num_resources	 = 3,
		.resource = (struct resource[]) {
			{
				.name	= "fcc_regs",
				.start	= 0x11340,
				.end	= 0x1135f,
				.flags	= IORESOURCE_MEM,
			},
			{
				.name	= "fcc_pram",
				.start	= 0x8600,
				.end	= 0x86ff,
				.flags	= IORESOURCE_MEM,
			},
			{
				.start	= SIU_INT_FCC3,
				.end	= SIU_INT_FCC3,
				.flags	= IORESOURCE_IRQ,
			},
		},
	},
	[MPC82xx_CPM_I2C] = {
		.name = "fsl-cpm-i2c",
		.id	= 1,
		.num_resources	 = 3,
		.resource = (struct resource[]) {
			{
				.name	= "i2c_mem",
				.start	= 0x11860,
				.end	= 0x118BF,
				.flags	= IORESOURCE_MEM,
			},
			{
				.name	= "i2c_pram",
				.start 	= 0x8afc,
				.end	= 0x8afd,
				.flags	= IORESOURCE_MEM,
			},
			{
				.start	= SIU_INT_I2C,
				.end	= SIU_INT_I2C,
				.flags	= IORESOURCE_IRQ,
			},
		},
	},
	[MPC82xx_CPM_SCC1] = {
		.name = "fsl-cpm-scc",
		.id	= 1,
		.num_resources	 = 3,
		.resource = (struct resource[]) {
			{
				.name	= "scc_mem",
				.start	= 0x11A00,
				.end	= 0x11A1F,
				.flags	= IORESOURCE_MEM,
			},
			{
				.name	= "scc_pram",
				.start	= 0x8000,
				.end	= 0x80ff,
				.flags	= IORESOURCE_MEM,
			},
			{
				.start	= SIU_INT_SCC1,
				.end	= SIU_INT_SCC1,
				.flags	= IORESOURCE_IRQ,
			},
		},
	},
	[MPC82xx_CPM_SCC2] = {
		.name = "fsl-cpm-scc",
		.id	= 2,
		.num_resources	 = 3,
		.resource = (struct resource[]) {
			{
				.name	= "scc_mem",
				.start	= 0x11A20,
				.end	= 0x11A3F,
				.flags	= IORESOURCE_MEM,
			},
			{
				.name	= "scc_pram",
				.start	= 0x8100,
				.end	= 0x81ff,
				.flags	= IORESOURCE_MEM,
			},
			{
				.start	= SIU_INT_SCC2,
				.end	= SIU_INT_SCC2,
				.flags	= IORESOURCE_IRQ,
			},
		},
	},
	[MPC82xx_CPM_SCC3] = {
		.name = "fsl-cpm-scc",
		.id	= 3,
		.num_resources	 = 3,
		.resource = (struct resource[]) {
			{
				.name 	= "scc_mem",
				.start	= 0x11A40,
				.end	= 0x11A5F,
				.flags	= IORESOURCE_MEM,
			},
			{
				.name	= "scc_pram",
				.start	= 0x8200,
				.end	= 0x82ff,
				.flags	= IORESOURCE_MEM,
			},
			{
				.start	= SIU_INT_SCC3,
				.end	= SIU_INT_SCC3,
				.flags	= IORESOURCE_IRQ,
			},
		},
	},
	[MPC82xx_CPM_SCC4] = {
		.name = "fsl-cpm-scc",
		.id	= 4,
		.num_resources	 = 3,
		.resource = (struct resource[]) {
			{
				.name	= "scc_mem",
				.start	= 0x11A60,
				.end	= 0x11A7F,
				.flags	= IORESOURCE_MEM,
			},
			{
				.name	= "scc_pram",
				.start	= 0x8300,
				.end	= 0x83ff,
				.flags	= IORESOURCE_MEM,
			},
			{
				.start	= SIU_INT_SCC4,
				.end	= SIU_INT_SCC4,
				.flags	= IORESOURCE_IRQ,
			},
		},
	},
	[MPC82xx_CPM_SPI] = {
		.name = "fsl-cpm-spi",
		.id	= 1,
		.num_resources	 = 3,
		.resource = (struct resource[]) {
			{
				.name	= "spi_mem",
				.start	= 0x11AA0,
				.end	= 0x11AFF,
				.flags	= IORESOURCE_MEM,
			},
			{
				.name	= "spi_pram",
				.start	= 0x89fc,
				.end	= 0x89fd,
				.flags	= IORESOURCE_MEM,
			},
			{
				.start	= SIU_INT_SPI,
				.end	= SIU_INT_SPI,
				.flags	= IORESOURCE_IRQ,
			},
		},
	},
	[MPC82xx_CPM_MCC1] = {
		.name = "fsl-cpm-mcc",
		.id	= 1,
		.num_resources	 = 3,
		.resource = (struct resource[]) {
			{
				.name	= "mcc_mem",
				.start	= 0x11B30,
				.end	= 0x11B3F,
				.flags	= IORESOURCE_MEM,
			},
			{
				.name	= "mcc_pram",
				.start	= 0x8700,
				.end	= 0x877f,
				.flags	= IORESOURCE_MEM,
			},
			{
				.start	= SIU_INT_MCC1,
				.end	= SIU_INT_MCC1,
				.flags	= IORESOURCE_IRQ,
			},
		},
	},
	[MPC82xx_CPM_MCC2] = {
		.name = "fsl-cpm-mcc",
		.id	= 2,
		.num_resources	 = 3,
		.resource = (struct resource[]) {
			{
				.name	= "mcc_mem",
				.start	= 0x11B50,
				.end	= 0x11B5F,
				.flags	= IORESOURCE_MEM,
			},
			{
				.name	= "mcc_pram",
				.start	= 0x8800,
				.end	= 0x887f,
				.flags	= IORESOURCE_MEM,
			},
			{
				.start	= SIU_INT_MCC2,
				.end	= SIU_INT_MCC2,
				.flags	= IORESOURCE_IRQ,
			},
		},
	},
	[MPC82xx_CPM_SMC1] = {
		.name = "fsl-cpm-smc",
		.id	= 1,
		.num_resources	 = 3,
		.resource = (struct resource[]) {
			{
				.name	= "smc_mem",
				.start	= 0x11A80,
				.end	= 0x11A8F,
				.flags	= IORESOURCE_MEM,
			},
			{
				.name	= "smc_pram",
				.start	= 0x87fc,
				.end	= 0x87fd,
				.flags	= IORESOURCE_MEM,
			},
			{
				.start	= SIU_INT_SMC1,
				.end	= SIU_INT_SMC1,
				.flags	= IORESOURCE_IRQ,
			},
		},
	},
	[MPC82xx_CPM_SMC2] = {
		.name = "fsl-cpm-smc",
		.id	= 2,
		.num_resources	 = 3,
		.resource = (struct resource[]) {
			{
				.name	= "smc_mem",
				.start	= 0x11A90,
				.end	= 0x11A9F,
				.flags	= IORESOURCE_MEM,
			},
			{
				.name	= "smc_pram",
				.start	= 0x88fc,
				.end	= 0x88fd,
				.flags	= IORESOURCE_MEM,
			},
			{
				.start	= SIU_INT_SMC2,
				.end	= SIU_INT_SMC2,
				.flags	= IORESOURCE_IRQ,
			},
		},
	},
	[MPC82xx_CPM_USB] = {
		.name = "fsl-cpm-usb",
		.id	= 1,
		.num_resources	= 3,
		.resource = (struct resource[]) {
			{
				.name	= "usb_mem",
				.start	= 0x11b60,
				.end	= 0x11b78,
				.flags	= IORESOURCE_MEM,
			},
			{
				.name	= "usb_pram",
				.start	= 0x8b00,
				.end	= 0x8bff,
				.flags 	= IORESOURCE_MEM,
			},
			{
				.start	= SIU_INT_USB,
				.end	= SIU_INT_USB,
				.flags	= IORESOURCE_IRQ,
			},

		},
	},
	[MPC82xx_SEC1] = {
		.name = "fsl-sec",
		.id = 1,
		.num_resources = 1,
		.resource = (struct resource[]) {
			{
				.name	= "sec_mem",
				.start	= 0x40000,
				.end	= 0x52fff,
				.flags	= IORESOURCE_MEM,
			},
		},
	},
};

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

static int __init mach_mpc82xx_init(void)
{
	if (ppc_md.progress)
		ppc_md.progress("mach_mpc82xx_init:enter", 0);
	ppc_sys_device_fixup = mach_mpc82xx_fixup;
	return 0;
}

postcore_initcall(mach_mpc82xx_init);
