/*
 * For boards with physically mapped flash and using
 * drivers/mtd/maps/physmap.c mapping driver.
 *
 * $Id: physmap.h,v 1.4 2005/11/07 11:14:55 gleixner 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__ */

