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