/*
 * $Id: ebony.c,v 1.15 2004/12/09 18:39:54 holindho Exp $
 * 
 * Mapping for Ebony user flash
 *
 * Matt Porter <mporter@kernel.crashing.org>
 *
 * Copyright 2002-2004 MontaVista Software Inc.
 *
 * 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/module.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/map.h>
#include <linux/mtd/partitions.h>
#include <linux/config.h>
#include <linux/version.h>
#include <asm/io.h>
#include <asm/ibm44x.h>
#include <platforms/4xx/ebony.h>

static struct mtd_info *flash;

static struct map_info ebony_small_map = {
	.name =		"Ebony small flash",
	.size =		EBONY_SMALL_FLASH_SIZE,
	.bankwidth =	1,
};

static struct map_info ebony_large_map = {
	.name =		"Ebony large flash",
	.size =		EBONY_LARGE_FLASH_SIZE,
	.bankwidth =	1,
};

static struct mtd_partition ebony_small_partitions[] = {
	{
		.name =   "OpenBIOS",
		.offset = 0x0,
		.size =   0x80000,
	}
};

static struct mtd_partition ebony_large_partitions[] = {
	{
		.name =   "fs",
		.offset = 0,
		.size =   0x380000,
	},
	{
		.name =   "firmware",
		.offset = 0x380000,
		.size =   0x80000,
	}
};

int __init init_ebony(void)
{
	u8 fpga0_reg;
	u8 __iomem *fpga0_adr;
	unsigned long long small_flash_base, large_flash_base;

	fpga0_adr = ioremap64(EBONY_FPGA_ADDR, 16);
	if (!fpga0_adr)
		return -ENOMEM;

	fpga0_reg = readb(fpga0_adr);
	iounmap(fpga0_adr);

	if (EBONY_BOOT_SMALL_FLASH(fpga0_reg) &&
			!EBONY_FLASH_SEL(fpga0_reg))
		small_flash_base = EBONY_SMALL_FLASH_HIGH2;
	else if (EBONY_BOOT_SMALL_FLASH(fpga0_reg) &&
			EBONY_FLASH_SEL(fpga0_reg))
		small_flash_base = EBONY_SMALL_FLASH_HIGH1;
	else if (!EBONY_BOOT_SMALL_FLASH(fpga0_reg) &&
			!EBONY_FLASH_SEL(fpga0_reg))
		small_flash_base = EBONY_SMALL_FLASH_LOW2;
	else
		small_flash_base = EBONY_SMALL_FLASH_LOW1;
			
	if (EBONY_BOOT_SMALL_FLASH(fpga0_reg) &&
			!EBONY_ONBRD_FLASH_EN(fpga0_reg))
		large_flash_base = EBONY_LARGE_FLASH_LOW;
	else
		large_flash_base = EBONY_LARGE_FLASH_HIGH;

	ebony_small_map.phys = small_flash_base;
	ebony_small_map.virt = ioremap64(small_flash_base,
					 ebony_small_map.size);

	if (!ebony_small_map.virt) {
		printk("Failed to ioremap flash\n");
		return -EIO;
	}

	simple_map_init(&ebony_small_map);

	flash = do_map_probe("jedec_probe", &ebony_small_map);
	if (flash) {
		flash->owner = THIS_MODULE;
		add_mtd_partitions(flash, ebony_small_partitions,
					ARRAY_SIZE(ebony_small_partitions));
	} else {
		printk("map probe failed for flash\n");
		return -ENXIO;
	}

	ebony_large_map.phys = large_flash_base;
	ebony_large_map.virt = ioremap64(large_flash_base,
					 ebony_large_map.size);

	if (!ebony_large_map.virt) {
		printk("Failed to ioremap flash\n");
		return -EIO;
	}

	simple_map_init(&ebony_large_map);

	flash = do_map_probe("jedec_probe", &ebony_large_map);
	if (flash) {
		flash->owner = THIS_MODULE;
		add_mtd_partitions(flash, ebony_large_partitions,
					ARRAY_SIZE(ebony_large_partitions));
	} else {
		printk("map probe failed for flash\n");
		return -ENXIO;
	}

	return 0;
}

static void __exit cleanup_ebony(void)
{
	if (flash) {
		del_mtd_partitions(flash);
		map_destroy(flash);
	}

	if (ebony_small_map.virt) {
		iounmap(ebony_small_map.virt);
		ebony_small_map.virt = NULL;
	}

	if (ebony_large_map.virt) {
		iounmap(ebony_large_map.virt);
		ebony_large_map.virt = NULL;
	}
}

module_init(init_ebony);
module_exit(cleanup_ebony);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Matt Porter <mporter@kernel.crashing.org>");
MODULE_DESCRIPTION("MTD map and partitions for IBM 440GP Ebony boards");
