linux/drivers/mtd/maps/impa7.c
<<
>>
Prefs
   1/*
   2 * Handle mapping of the NOR flash on implementa A7 boards
   3 *
   4 * Copyright 2002 SYSGO Real-Time Solutions GmbH
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License version 2 as
   8 * published by the Free Software Foundation.
   9 */
  10
  11#include <linux/module.h>
  12#include <linux/types.h>
  13#include <linux/kernel.h>
  14#include <linux/init.h>
  15#include <asm/io.h>
  16#include <linux/mtd/mtd.h>
  17#include <linux/mtd/map.h>
  18#include <linux/mtd/partitions.h>
  19
  20#define WINDOW_ADDR0 0x00000000      /* physical properties of flash */
  21#define WINDOW_SIZE0 0x00800000
  22#define WINDOW_ADDR1 0x10000000      /* physical properties of flash */
  23#define WINDOW_SIZE1 0x00800000
  24#define NUM_FLASHBANKS 2
  25#define BUSWIDTH     4
  26
  27#define MSG_PREFIX "impA7:"   /* prefix for our printk()'s */
  28#define MTDID      "impa7-%d"  /* for mtdparts= partitioning */
  29
  30static struct mtd_info *impa7_mtd[NUM_FLASHBANKS];
  31
  32static const char * const rom_probe_types[] = { "jedec_probe", NULL };
  33
  34static struct map_info impa7_map[NUM_FLASHBANKS] = {
  35        {
  36                .name = "impA7 NOR Flash Bank #0",
  37                .size = WINDOW_SIZE0,
  38                .bankwidth = BUSWIDTH,
  39        },
  40        {
  41                .name = "impA7 NOR Flash Bank #1",
  42                .size = WINDOW_SIZE1,
  43                .bankwidth = BUSWIDTH,
  44        },
  45};
  46
  47/*
  48 * MTD partitioning stuff
  49 */
  50static const struct mtd_partition partitions[] =
  51{
  52        {
  53                .name = "FileSystem",
  54                .size = 0x800000,
  55                .offset = 0x00000000
  56        },
  57};
  58
  59static int __init init_impa7(void)
  60{
  61        const char * const *type;
  62        int i;
  63        static struct { u_long addr; u_long size; } pt[NUM_FLASHBANKS] = {
  64          { WINDOW_ADDR0, WINDOW_SIZE0 },
  65          { WINDOW_ADDR1, WINDOW_SIZE1 },
  66        };
  67        int devicesfound = 0;
  68
  69        for(i=0; i<NUM_FLASHBANKS; i++)
  70        {
  71                printk(KERN_NOTICE MSG_PREFIX "probing 0x%08lx at 0x%08lx\n",
  72                       pt[i].size, pt[i].addr);
  73
  74                impa7_map[i].phys = pt[i].addr;
  75                impa7_map[i].virt = ioremap(pt[i].addr, pt[i].size);
  76                if (!impa7_map[i].virt) {
  77                        printk(MSG_PREFIX "failed to ioremap\n");
  78                        return -EIO;
  79                }
  80                simple_map_init(&impa7_map[i]);
  81
  82                impa7_mtd[i] = NULL;
  83                type = rom_probe_types;
  84                for(; !impa7_mtd[i] && *type; type++) {
  85                        impa7_mtd[i] = do_map_probe(*type, &impa7_map[i]);
  86                }
  87
  88                if (impa7_mtd[i]) {
  89                        impa7_mtd[i]->owner = THIS_MODULE;
  90                        devicesfound++;
  91                        mtd_device_parse_register(impa7_mtd[i], NULL, NULL,
  92                                                  partitions,
  93                                                  ARRAY_SIZE(partitions));
  94                } else {
  95                        iounmap((void __iomem *)impa7_map[i].virt);
  96                }
  97        }
  98        return devicesfound == 0 ? -ENXIO : 0;
  99}
 100
 101static void __exit cleanup_impa7(void)
 102{
 103        int i;
 104        for (i=0; i<NUM_FLASHBANKS; i++) {
 105                if (impa7_mtd[i]) {
 106                        mtd_device_unregister(impa7_mtd[i]);
 107                        map_destroy(impa7_mtd[i]);
 108                        iounmap((void __iomem *)impa7_map[i].virt);
 109                        impa7_map[i].virt = NULL;
 110                }
 111        }
 112}
 113
 114module_init(init_impa7);
 115module_exit(cleanup_impa7);
 116
 117MODULE_LICENSE("GPL");
 118MODULE_AUTHOR("Pavel Bartusek <pba@sysgo.de>");
 119MODULE_DESCRIPTION("MTD map driver for implementa impA7");
 120