root/drivers/mtd/maps/uclinux.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. uclinux_point
  2. uclinux_mtd_init

   1 /****************************************************************************/
   2 
   3 /*
   4  *      uclinux.c -- generic memory mapped MTD driver for uclinux
   5  *
   6  *      (C) Copyright 2002, Greg Ungerer (gerg@snapgear.com)
   7  *
   8  *      License: GPL
   9  */
  10 
  11 /****************************************************************************/
  12 
  13 #include <linux/moduleparam.h>
  14 #include <linux/types.h>
  15 #include <linux/init.h>
  16 #include <linux/kernel.h>
  17 #include <linux/fs.h>
  18 #include <linux/mm.h>
  19 #include <linux/major.h>
  20 #include <linux/mtd/mtd.h>
  21 #include <linux/mtd/map.h>
  22 #include <linux/mtd/partitions.h>
  23 #include <asm/io.h>
  24 #include <asm/sections.h>
  25 
  26 /****************************************************************************/
  27 
  28 #ifdef CONFIG_MTD_ROM
  29 #define MAP_NAME "rom"
  30 #else
  31 #define MAP_NAME "ram"
  32 #endif
  33 
  34 static struct map_info uclinux_ram_map = {
  35         .name = MAP_NAME,
  36         .size = 0,
  37 };
  38 
  39 static unsigned long physaddr = -1;
  40 module_param(physaddr, ulong, S_IRUGO);
  41 
  42 static struct mtd_info *uclinux_ram_mtdinfo;
  43 
  44 /****************************************************************************/
  45 
  46 static const struct mtd_partition uclinux_romfs[] = {
  47         { .name = "ROMfs" }
  48 };
  49 
  50 #define NUM_PARTITIONS  ARRAY_SIZE(uclinux_romfs)
  51 
  52 /****************************************************************************/
  53 
  54 static int uclinux_point(struct mtd_info *mtd, loff_t from, size_t len,
  55         size_t *retlen, void **virt, resource_size_t *phys)
  56 {
  57         struct map_info *map = mtd->priv;
  58         *virt = map->virt + from;
  59         if (phys)
  60                 *phys = map->phys + from;
  61         *retlen = len;
  62         return(0);
  63 }
  64 
  65 /****************************************************************************/
  66 
  67 static int __init uclinux_mtd_init(void)
  68 {
  69         struct mtd_info *mtd;
  70         struct map_info *mapp;
  71 
  72         mapp = &uclinux_ram_map;
  73 
  74         if (physaddr == -1)
  75                 mapp->phys = (resource_size_t)__bss_stop;
  76         else
  77                 mapp->phys = physaddr;
  78 
  79         if (!mapp->size)
  80                 mapp->size = PAGE_ALIGN(ntohl(*((unsigned long *)(mapp->phys + 8))));
  81         mapp->bankwidth = 4;
  82 
  83         printk("uclinux[mtd]: probe address=0x%x size=0x%x\n",
  84                 (int) mapp->phys, (int) mapp->size);
  85 
  86         /*
  87          * The filesystem is guaranteed to be in direct mapped memory. It is
  88          * directly following the kernels own bss region. Following the same
  89          * mechanism used by architectures setting up traditional initrds we
  90          * use phys_to_virt to get the virtual address of its start.
  91          */
  92         mapp->virt = phys_to_virt(mapp->phys);
  93 
  94         if (mapp->virt == 0) {
  95                 printk("uclinux[mtd]: no virtual mapping?\n");
  96                 return(-EIO);
  97         }
  98 
  99         simple_map_init(mapp);
 100 
 101         mtd = do_map_probe("map_" MAP_NAME, mapp);
 102         if (!mtd) {
 103                 printk("uclinux[mtd]: failed to find a mapping?\n");
 104                 return(-ENXIO);
 105         }
 106 
 107         mtd->owner = THIS_MODULE;
 108         mtd->_point = uclinux_point;
 109         mtd->priv = mapp;
 110 
 111         uclinux_ram_mtdinfo = mtd;
 112         mtd_device_register(mtd, uclinux_romfs, NUM_PARTITIONS);
 113 
 114         return(0);
 115 }
 116 device_initcall(uclinux_mtd_init);
 117 
 118 /****************************************************************************/

/* [<][>][^][v][top][bottom][index][help] */