linux/drivers/mtd/maps/dmv182.c
<<
>>
Prefs
   1
   2/*
   3 * drivers/mtd/maps/dmv182.c
   4 *
   5 * Flash map driver for the Dy4 SVME182 board
   6 *
   7 * Copyright 2003-2004, TimeSys Corporation
   8 *
   9 * Based on the SVME181 flash map, by Tom Nelson, Dot4, Inc. for TimeSys Corp.
  10 *
  11 * This program is free software; you can redistribute  it and/or modify it
  12 * under  the terms of  the GNU General  Public License as published by the
  13 * Free Software Foundation;  either version 2 of the  License, or (at your
  14 * option) any later version.
  15 */
  16
  17#include <linux/module.h>
  18#include <linux/init.h>
  19#include <linux/types.h>
  20#include <linux/kernel.h>
  21#include <asm/io.h>
  22#include <linux/mtd/mtd.h>
  23#include <linux/mtd/map.h>
  24#include <linux/mtd/partitions.h>
  25#include <linux/errno.h>
  26
  27/*
  28 * This driver currently handles only the 16MiB user flash bank 1 on the
  29 * board.  It does not provide access to bank 0 (contains the Dy4 FFW), bank 2
  30 * (VxWorks boot), or the optional 48MiB expansion flash.
  31 *
  32 * scott.wood@timesys.com: On the newer boards with 128MiB flash, it
  33 * now supports the first 96MiB (the boot flash bank containing FFW
  34 * is excluded).  The VxWorks loader is in partition 1.
  35 */
  36
  37#define FLASH_BASE_ADDR 0xf0000000
  38#define FLASH_BANK_SIZE (128*1024*1024)
  39
  40MODULE_AUTHOR("Scott Wood, TimeSys Corporation <scott.wood@timesys.com>");
  41MODULE_DESCRIPTION("User-programmable flash device on the Dy4 SVME182 board");
  42MODULE_LICENSE("GPL");
  43
  44static struct map_info svme182_map = {
  45        .name           = "Dy4 SVME182",
  46        .bankwidth      = 32,
  47        .size           =  128 * 1024 * 1024
  48};
  49
  50#define BOOTIMAGE_PART_SIZE             ((6*1024*1024)-RESERVED_PART_SIZE)
  51
  52// Allow 6MiB for the kernel
  53#define NEW_BOOTIMAGE_PART_SIZE  (6 * 1024 * 1024)
  54// Allow 1MiB for the bootloader
  55#define NEW_BOOTLOADER_PART_SIZE (1024 * 1024)
  56// Use the remaining 9MiB at the end of flash for the RFS
  57#define NEW_RFS_PART_SIZE        (0x01000000 - NEW_BOOTLOADER_PART_SIZE - \
  58                                  NEW_BOOTIMAGE_PART_SIZE)
  59
  60static struct mtd_partition svme182_partitions[] = {
  61        // The Lower PABS is only 128KiB, but the partition code doesn't
  62        // like partitions that don't end on the largest erase block
  63        // size of the device, even if all of the erase blocks in the
  64        // partition are small ones.  The hardware should prevent
  65        // writes to the actual PABS areas.
  66        {
  67                name:       "Lower PABS and CPU 0 bootloader or kernel",
  68                size:       6*1024*1024,
  69                offset:     0,
  70        },
  71        {
  72                name:       "Root Filesystem",
  73                size:       10*1024*1024,
  74                offset:     MTDPART_OFS_NXTBLK
  75        },
  76        {
  77                name:       "CPU1 Bootloader",
  78                size:       1024*1024,
  79                offset:     MTDPART_OFS_NXTBLK,
  80        },
  81        {
  82                name:       "Extra",
  83                size:       110*1024*1024,
  84                offset:     MTDPART_OFS_NXTBLK
  85        },
  86        {
  87                name:       "Foundation Firmware and Upper PABS",
  88                size:       1024*1024,
  89                offset:     MTDPART_OFS_NXTBLK,
  90                mask_flags: MTD_WRITEABLE // read-only
  91        }
  92};
  93
  94static struct mtd_info *this_mtd;
  95
  96static int __init init_svme182(void)
  97{
  98        struct mtd_partition *partitions;
  99        int num_parts = ARRAY_SIZE(svme182_partitions);
 100
 101        partitions = svme182_partitions;
 102
 103        svme182_map.virt = ioremap(FLASH_BASE_ADDR, svme182_map.size);
 104
 105        if (svme182_map.virt == 0) {
 106                printk("Failed to ioremap FLASH memory area.\n");
 107                return -EIO;
 108        }
 109
 110        simple_map_init(&svme182_map);
 111
 112        this_mtd = do_map_probe("cfi_probe", &svme182_map);
 113        if (!this_mtd)
 114        {
 115                iounmap((void *)svme182_map.virt);
 116                return -ENXIO;
 117        }
 118
 119        printk(KERN_NOTICE "SVME182 flash device: %dMiB at 0x%08x\n",
 120                   this_mtd->size >> 20, FLASH_BASE_ADDR);
 121
 122        this_mtd->owner = THIS_MODULE;
 123        add_mtd_partitions(this_mtd, partitions, num_parts);
 124
 125        return 0;
 126}
 127
 128static void __exit cleanup_svme182(void)
 129{
 130        if (this_mtd)
 131        {
 132                del_mtd_partitions(this_mtd);
 133                map_destroy(this_mtd);
 134        }
 135
 136        if (svme182_map.virt)
 137        {
 138                iounmap((void *)svme182_map.virt);
 139                svme182_map.virt = 0;
 140        }
 141
 142        return;
 143}
 144
 145module_init(init_svme182);
 146module_exit(cleanup_svme182);
 147