/*
 * For boards with physically mapped flash and using 
 * drivers/mtd/maps/physmap.c mapping driver.
 *
 * $Id: physmap.h,v 1.3 2004/07/21 00:16:15 jwboyer Exp $
 *
 * Copyright (C) 2003 MontaVista Software Inc.
 * Author: Jun Sun, jsun@mvista.com or jsun@junsun.net
 *
 * 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.
 *
 */

#ifndef __LINUX_MTD_PHYSMAP__

#include <linux/config.h>

#if defined(CONFIG_MTD_PHYSMAP) 

#include <linux/mtd/mtd.h>
#include <linux/mtd/map.h>
#include <linux/mtd/partitions.h>

/*
 * The map_info for physmap.  Board can override size, buswidth, phys,
 * (*set_vpp)(), etc in their initial setup routine.
 */
extern struct map_info physmap_map;

/*
 * Board needs to specify the exact mapping during their setup time.
 */
static inline void physmap_configure(unsigned long addr, unsigned long size, int bankwidth, void (*set_vpp)(struct map_info *, int) )
{
	physmap_map.phys = addr;
	physmap_map.size = size;
	physmap_map.bankwidth = bankwidth;
	physmap_map.set_vpp = set_vpp;
}

#if defined(CONFIG_MTD_PARTITIONS)

/*
 * Machines that wish to do flash partition may want to call this function in 
 * their setup routine.  
 *
 *	physmap_set_partitions(mypartitions, num_parts);
 *
 * Note that one can always override this hard-coded partition with 
 * command line partition (you need to enable CONFIG_MTD_CMDLINE_PARTS).
 */
void physmap_set_partitions(struct mtd_partition *parts, int num_parts);

#endif /* defined(CONFIG_MTD_PARTITIONS) */
#endif /* defined(CONFIG_MTD) */

#endif /* __LINUX_MTD_PHYSMAP__ */

