/*
 * Freescale MPC52xx device descriptions
 *
 *
 * Maintainer : Sylvain Munaut <tnt@246tNt.com>
 *
 * Copyright (C) 2005 Sylvain Munaut <tnt@246tNt.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/fsl_devices.h>
#include <linux/resource.h>
#include <linux/platform_device.h>
#include <asm/mpc52xx.h>
#include <asm/ppc_sys.h>


static u64 mpc52xx_dma_mask = 0xffffffffULL;

static struct fsl_i2c_platform_data mpc52xx_fsl_i2c_pdata = {
	.device_flags = FSL_I2C_DEV_CLOCK_5200,
};


/* We use relative offsets for IORESOURCE_MEM to be independent from the
 * MBAR location at compile time
 */

/* TODO Add the BestComm initiator channel to the device definitions,
   possibly using IORESOURCE_DMA. But that's when BestComm is ready ... */

struct platform_device ppc_sys_platform_devices[] = {
	[MPC52xx_MSCAN1] = {
		.name		= "mpc52xx-mscan",
		.id		= 0,
		.num_resources	= 2,
		.resource = (struct resource[]) {
			{
				.start	= 0x0900,
				.end	= 0x097f,
				.flags	= IORESOURCE_MEM,
			},
			{
				.start	= MPC52xx_MSCAN1_IRQ,
				.end	= MPC52xx_MSCAN1_IRQ,
				.flags	= IORESOURCE_IRQ,
			},
		},
	},
	[MPC52xx_MSCAN2] = {
		.name		= "mpc52xx-mscan",
		.id		= 1,
		.num_resources	= 2,
		.resource = (struct resource[]) {
			{
				.start	= 0x0980,
				.end	= 0x09ff,
				.flags	= IORESOURCE_MEM,
			},
			{
				.start	= MPC52xx_MSCAN2_IRQ,
				.end	= MPC52xx_MSCAN2_IRQ,
				.flags	= IORESOURCE_IRQ,
			},
		},
	},
	[MPC52xx_SPI] = {
		.name		= "mpc52xx-spi",
		.id		= -1,
		.num_resources	= 3,
		.resource	= (struct resource[]) {
			{
				.start	= 0x0f00,
				.end	= 0x0f1f,
				.flags	= IORESOURCE_MEM,
			},
			{
				.name	= "modf",
				.start	= MPC52xx_SPI_MODF_IRQ,
				.end	= MPC52xx_SPI_MODF_IRQ,
				.flags	= IORESOURCE_IRQ,
			},
			{
				.name	= "spif",
				.start	= MPC52xx_SPI_SPIF_IRQ,
				.end	= MPC52xx_SPI_SPIF_IRQ,
				.flags	= IORESOURCE_IRQ,
			},
		},
	},
	[MPC52xx_USB] = {
		.name		= "ppc-soc-ohci",
		.id		= -1,
		.num_resources	= 2,
		.dev.dma_mask	= &mpc52xx_dma_mask,
		.dev.coherent_dma_mask = 0xffffffffULL,
		.resource	= (struct resource[]) {
			{
				.start	= 0x1000,
				.end	= 0x10ff,
				.flags	= IORESOURCE_MEM,
			},
			{
				.start	= MPC52xx_USB_IRQ,
				.end	= MPC52xx_USB_IRQ,
				.flags	= IORESOURCE_IRQ,
			},
		},
	},
	[MPC52xx_BDLC] = {
		.name		= "mpc52xx-bdlc",
		.id		= -1,
		.num_resources	= 2,
		.resource	= (struct resource[]) {
			{
				.start	= 0x1300,
				.end	= 0x130f,
				.flags	= IORESOURCE_MEM,
			},
			{
				.start	= MPC52xx_BDLC_IRQ,
				.end	= MPC52xx_BDLC_IRQ,
				.flags	= IORESOURCE_IRQ,
			},
		},
	},
	[MPC52xx_PSC1] = {
		.name		= "mpc52xx-psc",
		.id		= 0,
		.num_resources	= 2,
		.resource	= (struct resource[]) {
			{
				.start	= 0x2000,
				.end	= 0x209f,
				.flags	= IORESOURCE_MEM,
			},
			{
				.start	= MPC52xx_PSC1_IRQ,
				.end	= MPC52xx_PSC1_IRQ,
				.flags	= IORESOURCE_IRQ,
			},
		},
	},
	[MPC52xx_PSC2] = {
		.name		= "mpc52xx-psc",
		.id		= 1,
		.num_resources	= 2,
		.resource	= (struct resource[]) {
			{
				.start	= 0x2200,
				.end	= 0x229f,
				.flags	= IORESOURCE_MEM,
			},
			{
				.start	= MPC52xx_PSC2_IRQ,
				.end	= MPC52xx_PSC2_IRQ,
				.flags	= IORESOURCE_IRQ,
			},
		},
	},
	[MPC52xx_PSC3] = {
		.name		= "mpc52xx-psc",
		.id		= 2,
		.num_resources	= 2,
		.resource	= (struct resource[]) {
			{
				.start	= 0x2400,
				.end	= 0x249f,
				.flags	= IORESOURCE_MEM,
			},
			{
				.start	= MPC52xx_PSC3_IRQ,
				.end	= MPC52xx_PSC3_IRQ,
				.flags	= IORESOURCE_IRQ,
			},
		},
	},
	[MPC52xx_PSC4] = {
		.name		= "mpc52xx-psc",
		.id		= 3,
		.num_resources	= 2,
		.resource	= (struct resource[]) {
			{
				.start	= 0x2600,
				.end	= 0x269f,
				.flags	= IORESOURCE_MEM,
			},
			{
				.start	= MPC52xx_PSC4_IRQ,
				.end	= MPC52xx_PSC4_IRQ,
				.flags	= IORESOURCE_IRQ,
			},
		},
	},
	[MPC52xx_PSC5] = {
		.name		= "mpc52xx-psc",
		.id		= 4,
		.num_resources	= 2,
		.resource	= (struct resource[]) {
			{
				.start	= 0x2800,
				.end	= 0x289f,
				.flags	= IORESOURCE_MEM,
			},
			{
				.start	= MPC52xx_PSC5_IRQ,
				.end	= MPC52xx_PSC5_IRQ,
				.flags	= IORESOURCE_IRQ,
			},
		},
	},
	[MPC52xx_PSC6] = {
		.name		= "mpc52xx-psc",
		.id		= 5,
		.num_resources	= 2,
		.resource	= (struct resource[]) {
			{
				.start	= 0x2c00,
				.end	= 0x2c9f,
				.flags	= IORESOURCE_MEM,
			},
			{
				.start	= MPC52xx_PSC6_IRQ,
				.end	= MPC52xx_PSC6_IRQ,
				.flags	= IORESOURCE_IRQ,
			},
		},
	},
	[MPC52xx_FEC] = {
		.name		= "mpc52xx-fec",
		.id		= -1,
		.num_resources	= 2,
		.resource	= (struct resource[]) {
			{
				.start	= 0x3000,
				.end	= 0x33ff,
				.flags	= IORESOURCE_MEM,
			},
			{
				.start	= MPC52xx_FEC_IRQ,
				.end	= MPC52xx_FEC_IRQ,
				.flags	= IORESOURCE_IRQ,
			},
		},
	},
	[MPC52xx_ATA] = {
		.name		= "mpc52xx-ata",
		.id		= -1,
		.num_resources	= 2,
		.resource	= (struct resource[]) {
			{
				.start	= 0x3a00,
				.end	= 0x3aff,
				.flags	= IORESOURCE_MEM,
			},
			{
				.start	= MPC52xx_ATA_IRQ,
				.end	= MPC52xx_ATA_IRQ,
				.flags	= IORESOURCE_IRQ,
			},
		},
	},
	[MPC52xx_I2C1] = {
		.name		= "fsl-i2c",
		.id		= 0,
		.dev.platform_data = &mpc52xx_fsl_i2c_pdata,
		.num_resources	= 2,
		.resource	= (struct resource[]) {
			{
				.start	= 0x3d00,
				.end	= 0x3d1f,
				.flags	= IORESOURCE_MEM,
			},
			{
				.start	= MPC52xx_I2C1_IRQ,
				.end	= MPC52xx_I2C1_IRQ,
				.flags	= IORESOURCE_IRQ,
			},
		},
	},
	[MPC52xx_I2C2] = {
		.name		= "fsl-i2c",
		.id		= 1,
		.dev.platform_data = &mpc52xx_fsl_i2c_pdata,
		.num_resources	= 2,
		.resource	= (struct resource[]) {
			{
				.start	= 0x3d40,
				.end	= 0x3d5f,
				.flags	= IORESOURCE_MEM,
			},
			{
				.start	= MPC52xx_I2C2_IRQ,
				.end	= MPC52xx_I2C2_IRQ,
				.flags	= IORESOURCE_IRQ,
			},
		},
	},
};


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

static int __init mach_mpc52xx_init(void)
{
	ppc_sys_device_fixup = mach_mpc52xx_fixup;
	return 0;
}

postcore_initcall(mach_mpc52xx_init);
