• Home
  • Raw
  • Download

Lines Matching +full:mtd +full:- +full:ram

14 #include <linux/mtd/mtd.h>
26 #include "ms02-nv.h"
30 "ms02-nv.c: v.1.0.0 13 Aug 2001 Maciej W. Rozycki.\n";
32 MODULE_AUTHOR("Maciej W. Rozycki <macro@linux-mips.org>");
33 MODULE_DESCRIPTION("DEC MS02-NV NVRAM module driver");
38 * Addresses we probe for an MS02-NV at. Modules may be located
49 static const char ms02nv_name[] = "DEC MS02-NV NVRAM";
50 static const char ms02nv_res_diag_ram[] = "Diagnostic RAM";
51 static const char ms02nv_res_user_ram[] = "General-purpose RAM";
57 static int ms02nv_read(struct mtd_info *mtd, loff_t from, in ms02nv_read() argument
60 struct ms02nv_private *mp = mtd->priv; in ms02nv_read()
62 memcpy(buf, mp->uaddr + from, len); in ms02nv_read()
67 static int ms02nv_write(struct mtd_info *mtd, loff_t to, in ms02nv_write() argument
70 struct ms02nv_private *mp = mtd->priv; in ms02nv_write()
72 memcpy(mp->uaddr + to, buf, len); in ms02nv_write()
110 struct mtd_info *mtd; in ms02nv_init_one() local
121 int ret = -ENODEV; in ms02nv_init_one()
126 return -ENOMEM; in ms02nv_init_one()
128 mod_res->name = ms02nv_name; in ms02nv_init_one()
129 mod_res->start = addr; in ms02nv_init_one()
130 mod_res->end = addr + MS02NV_SLOT_SIZE - 1; in ms02nv_init_one()
131 mod_res->flags = IORESOURCE_MEM | IORESOURCE_BUSY; in ms02nv_init_one()
144 ret = -ENOMEM; in ms02nv_init_one()
145 mtd = kzalloc(sizeof(*mtd), GFP_KERNEL); in ms02nv_init_one()
146 if (!mtd) in ms02nv_init_one()
152 mtd->priv = mp; in ms02nv_init_one()
153 mp->resource.module = mod_res; in ms02nv_init_one()
160 diag_res->name = ms02nv_res_diag_ram; in ms02nv_init_one()
161 diag_res->start = addr; in ms02nv_init_one()
162 diag_res->end = addr + MS02NV_RAM - 1; in ms02nv_init_one()
163 diag_res->flags = IORESOURCE_BUSY; in ms02nv_init_one()
166 mp->resource.diag_ram = diag_res; in ms02nv_init_one()
168 /* User-available general-purpose NVRAM area. */ in ms02nv_init_one()
173 user_res->name = ms02nv_res_user_ram; in ms02nv_init_one()
174 user_res->start = addr + MS02NV_RAM; in ms02nv_init_one()
175 user_res->end = addr + size - 1; in ms02nv_init_one()
176 user_res->flags = IORESOURCE_BUSY; in ms02nv_init_one()
179 mp->resource.user_ram = user_res; in ms02nv_init_one()
186 csr_res->name = ms02nv_res_csr; in ms02nv_init_one()
187 csr_res->start = addr + MS02NV_CSR; in ms02nv_init_one()
188 csr_res->end = addr + MS02NV_CSR + 3; in ms02nv_init_one()
189 csr_res->flags = IORESOURCE_BUSY; in ms02nv_init_one()
192 mp->resource.csr = csr_res; in ms02nv_init_one()
194 mp->addr = phys_to_virt(addr); in ms02nv_init_one()
195 mp->size = size; in ms02nv_init_one()
201 fixaddr = (addr + MS02NV_RAM + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1); in ms02nv_init_one()
202 fixsize = (size - (fixaddr - addr)) & ~(PAGE_SIZE - 1); in ms02nv_init_one()
203 mp->uaddr = phys_to_virt(fixaddr); in ms02nv_init_one()
205 mtd->type = MTD_RAM; in ms02nv_init_one()
206 mtd->flags = MTD_CAP_RAM; in ms02nv_init_one()
207 mtd->size = fixsize; in ms02nv_init_one()
208 mtd->name = ms02nv_name; in ms02nv_init_one()
209 mtd->owner = THIS_MODULE; in ms02nv_init_one()
210 mtd->_read = ms02nv_read; in ms02nv_init_one()
211 mtd->_write = ms02nv_write; in ms02nv_init_one()
212 mtd->writesize = 1; in ms02nv_init_one()
214 ret = -EIO; in ms02nv_init_one()
215 if (mtd_device_register(mtd, NULL, 0)) { in ms02nv_init_one()
217 "ms02-nv: Unable to register MTD device, aborting!\n"); in ms02nv_init_one()
221 printk(KERN_INFO "mtd%d: %s at 0x%08lx, size %zuMiB.\n", in ms02nv_init_one()
222 mtd->index, ms02nv_name, addr, size >> 20); in ms02nv_init_one()
224 mp->next = root_ms02nv_mtd; in ms02nv_init_one()
225 root_ms02nv_mtd = mtd; in ms02nv_init_one()
242 kfree(mtd); in ms02nv_init_one()
252 struct mtd_info *mtd = root_ms02nv_mtd; in ms02nv_remove_one() local
253 struct ms02nv_private *mp = mtd->priv; in ms02nv_remove_one()
255 root_ms02nv_mtd = mp->next; in ms02nv_remove_one()
257 mtd_device_unregister(mtd); in ms02nv_remove_one()
259 release_resource(mp->resource.csr); in ms02nv_remove_one()
260 kfree(mp->resource.csr); in ms02nv_remove_one()
261 release_resource(mp->resource.user_ram); in ms02nv_remove_one()
262 kfree(mp->resource.user_ram); in ms02nv_remove_one()
263 release_resource(mp->resource.diag_ram); in ms02nv_remove_one()
264 kfree(mp->resource.diag_ram); in ms02nv_remove_one()
265 release_resource(mp->resource.module); in ms02nv_remove_one()
266 kfree(mp->resource.module); in ms02nv_remove_one()
268 kfree(mtd); in ms02nv_remove_one()
292 return -ENODEV; in ms02nv_init()
300 return (count > 0) ? 0 : -ENODEV; in ms02nv_init()