Lines Matching +full:mtd +full:- +full:name

1 // SPDX-License-Identifier: GPL-2.0-or-later
10 #include <linux/mtd/mtd.h>
22 #include "ms02-nv.h"
26 "ms02-nv.c: v.1.0.0 13 Aug 2001 Maciej W. Rozycki.\n";
28 MODULE_AUTHOR("Maciej W. Rozycki <macro@linux-mips.org>");
29 MODULE_DESCRIPTION("DEC MS02-NV NVRAM module driver");
34 * Addresses we probe for an MS02-NV at. Modules may be located
45 static const char ms02nv_name[] = "DEC MS02-NV NVRAM";
47 static const char ms02nv_res_user_ram[] = "General-purpose RAM";
53 static int ms02nv_read(struct mtd_info *mtd, loff_t from, in ms02nv_read() argument
56 struct ms02nv_private *mp = mtd->priv; in ms02nv_read()
58 memcpy(buf, mp->uaddr + from, len); in ms02nv_read()
63 static int ms02nv_write(struct mtd_info *mtd, loff_t to, in ms02nv_write() argument
66 struct ms02nv_private *mp = mtd->priv; in ms02nv_write()
68 memcpy(mp->uaddr + to, buf, len); in ms02nv_write()
106 struct mtd_info *mtd; in ms02nv_init_one() local
117 int ret = -ENODEV; in ms02nv_init_one()
122 return -ENOMEM; in ms02nv_init_one()
124 mod_res->name = ms02nv_name; in ms02nv_init_one()
125 mod_res->start = addr; in ms02nv_init_one()
126 mod_res->end = addr + MS02NV_SLOT_SIZE - 1; in ms02nv_init_one()
127 mod_res->flags = IORESOURCE_MEM | IORESOURCE_BUSY; in ms02nv_init_one()
140 ret = -ENOMEM; in ms02nv_init_one()
141 mtd = kzalloc(sizeof(*mtd), GFP_KERNEL); in ms02nv_init_one()
142 if (!mtd) in ms02nv_init_one()
148 mtd->priv = mp; in ms02nv_init_one()
149 mp->resource.module = mod_res; in ms02nv_init_one()
156 diag_res->name = ms02nv_res_diag_ram; in ms02nv_init_one()
157 diag_res->start = addr; in ms02nv_init_one()
158 diag_res->end = addr + MS02NV_RAM - 1; in ms02nv_init_one()
159 diag_res->flags = IORESOURCE_BUSY; in ms02nv_init_one()
162 mp->resource.diag_ram = diag_res; in ms02nv_init_one()
164 /* User-available general-purpose NVRAM area. */ in ms02nv_init_one()
169 user_res->name = ms02nv_res_user_ram; in ms02nv_init_one()
170 user_res->start = addr + MS02NV_RAM; in ms02nv_init_one()
171 user_res->end = addr + size - 1; in ms02nv_init_one()
172 user_res->flags = IORESOURCE_BUSY; in ms02nv_init_one()
175 mp->resource.user_ram = user_res; in ms02nv_init_one()
182 csr_res->name = ms02nv_res_csr; in ms02nv_init_one()
183 csr_res->start = addr + MS02NV_CSR; in ms02nv_init_one()
184 csr_res->end = addr + MS02NV_CSR + 3; in ms02nv_init_one()
185 csr_res->flags = IORESOURCE_BUSY; in ms02nv_init_one()
188 mp->resource.csr = csr_res; in ms02nv_init_one()
190 mp->addr = phys_to_virt(addr); in ms02nv_init_one()
191 mp->size = size; in ms02nv_init_one()
197 fixaddr = (addr + MS02NV_RAM + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1); in ms02nv_init_one()
198 fixsize = (size - (fixaddr - addr)) & ~(PAGE_SIZE - 1); in ms02nv_init_one()
199 mp->uaddr = phys_to_virt(fixaddr); in ms02nv_init_one()
201 mtd->type = MTD_RAM; in ms02nv_init_one()
202 mtd->flags = MTD_CAP_RAM; in ms02nv_init_one()
203 mtd->size = fixsize; in ms02nv_init_one()
204 mtd->name = ms02nv_name; in ms02nv_init_one()
205 mtd->owner = THIS_MODULE; in ms02nv_init_one()
206 mtd->_read = ms02nv_read; in ms02nv_init_one()
207 mtd->_write = ms02nv_write; in ms02nv_init_one()
208 mtd->writesize = 1; in ms02nv_init_one()
210 ret = -EIO; in ms02nv_init_one()
211 if (mtd_device_register(mtd, NULL, 0)) { in ms02nv_init_one()
213 "ms02-nv: Unable to register MTD device, aborting!\n"); in ms02nv_init_one()
217 printk(KERN_INFO "mtd%d: %s at 0x%08lx, size %zuMiB.\n", in ms02nv_init_one()
218 mtd->index, ms02nv_name, addr, size >> 20); in ms02nv_init_one()
220 mp->next = root_ms02nv_mtd; in ms02nv_init_one()
221 root_ms02nv_mtd = mtd; in ms02nv_init_one()
238 kfree(mtd); in ms02nv_init_one()
248 struct mtd_info *mtd = root_ms02nv_mtd; in ms02nv_remove_one() local
249 struct ms02nv_private *mp = mtd->priv; in ms02nv_remove_one()
251 root_ms02nv_mtd = mp->next; in ms02nv_remove_one()
253 mtd_device_unregister(mtd); in ms02nv_remove_one()
255 release_resource(mp->resource.csr); in ms02nv_remove_one()
256 kfree(mp->resource.csr); in ms02nv_remove_one()
257 release_resource(mp->resource.user_ram); in ms02nv_remove_one()
258 kfree(mp->resource.user_ram); in ms02nv_remove_one()
259 release_resource(mp->resource.diag_ram); in ms02nv_remove_one()
260 kfree(mp->resource.diag_ram); in ms02nv_remove_one()
261 release_resource(mp->resource.module); in ms02nv_remove_one()
262 kfree(mp->resource.module); in ms02nv_remove_one()
264 kfree(mtd); in ms02nv_remove_one()
288 return -ENODEV; in ms02nv_init()
295 return (count > 0) ? 0 : -ENODEV; in ms02nv_init()