/* Handle mapping of the flash on the ASB2303 board
 *
 * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
 * Written by David Howells (dhowells@redhat.com)
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public Licence
 * as published by the Free Software Foundation; either version
 * 2 of the Licence, or (at your option) any later version.
 */
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/mtd/partitions.h>
#include <linux/mtd/physmap.h>

#define ASB2303_PROM_ADDR	0xA0000000	/* Boot PROM */
#define ASB2303_PROM_SIZE	(2 * 1024 * 1024)
#define ASB2303_FLASH_ADDR	0xA4000000	/* System Flash */
#define ASB2303_FLASH_SIZE	(32 * 1024 * 1024)
#define ASB2303_CONFIG_ADDR	0xA6000000	/* System Config EEPROM */
#define ASB2303_CONFIG_SIZE	(8 * 1024)

/*
 * default MTD partition table for both main flash devices, expected to be
 * overridden by RedBoot
 */
static struct mtd_partition asb2303_partitions[] = {
	{
		.name		= "Bootloader",
		.size		= 0x00040000,
		.offset		= 0,
		.mask_flags	= MTD_CAP_ROM /* force read-only */
	}, {
		.name		= "Kernel",
		.size		= 0x00400000,
		.offset		= 0x00040000,
	}, {
		.name		= "Filesystem",
		.size		= MTDPART_SIZ_FULL,
		.offset		= 0x00440000
	}
};

/*
 * the ASB2303 Boot PROM definition
 */
static struct physmap_flash_data asb2303_bootprom_data = {
	.width		= 2,
	.nr_parts	= 1,
	.parts		= asb2303_partitions,
};

static struct resource asb2303_bootprom_resource = {
	.start		= ASB2303_PROM_ADDR,
	.end		= ASB2303_PROM_ADDR + ASB2303_PROM_SIZE,
	.flags		= IORESOURCE_MEM,
};

static struct platform_device asb2303_bootprom = {
	.name		= "physmap-flash",
	.id		= 0,
	.dev.platform_data = &asb2303_bootprom_data,
	.num_resources	= 1,
	.resource	= &asb2303_bootprom_resource,
};

/*
 * the ASB2303 System Flash definition
 */
static struct physmap_flash_data asb2303_sysflash_data = {
	.width		= 4,
	.nr_parts	= 1,
	.parts		= asb2303_partitions,
};

static struct resource asb2303_sysflash_resource = {
	.start		= ASB2303_FLASH_ADDR,
	.end		= ASB2303_FLASH_ADDR + ASB2303_FLASH_SIZE,
	.flags		= IORESOURCE_MEM,
};

static struct platform_device asb2303_sysflash = {
	.name		= "physmap-flash",
	.id		= 1,
	.dev.platform_data = &asb2303_sysflash_data,
	.num_resources	= 1,
	.resource	= &asb2303_sysflash_resource,
};

/*
 * register the ASB2303 flashes
 */
static int __init asb2303_mtd_init(void)
{
	platform_device_register(&asb2303_bootprom);
	platform_device_register(&asb2303_sysflash);
	return 0;
}

module_init(asb2303_mtd_init);
