2 * Core registration and callback routines for MTD
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
10 #include <linux/mtd/mtd.h>
11 #include <linux/mtd/compat.h>
12 #include <ubi_uboot.h>
14 struct mtd_info *mtd_table[MAX_MTD_DEVICES];
16 int add_mtd_device(struct mtd_info *mtd)
20 BUG_ON(mtd->writesize == 0);
22 for (i = 0; i < MAX_MTD_DEVICES; i++)
28 printf("mtd: Giving out device %d to %s\n",
30 /* No need to get a refcount on the module containing
31 the notifier, since we hold the mtd_table_mutex */
33 /* We _know_ we aren't being removed, because
34 our caller is still holding us here. So none
35 of this try_ nonsense, and no bitching about it
44 * del_mtd_device - unregister an MTD device
45 * @mtd: pointer to MTD device info structure
47 * Remove a device from the list of MTD devices present in the system,
48 * and notify each currently active MTD 'user' of its departure.
49 * Returns zero on success or 1 on failure, which currently will happen
50 * if the requested device does not appear to be present in the list.
52 int del_mtd_device(struct mtd_info *mtd)
56 if (mtd_table[mtd->index] != mtd) {
58 } else if (mtd->usecount) {
59 printk(KERN_NOTICE "Removing MTD device #%d (%s)"
60 " with use count %d\n",
61 mtd->index, mtd->name, mtd->usecount);
64 /* No need to get a refcount on the module containing
65 * the notifier, since we hold the mtd_table_mutex */
66 mtd_table[mtd->index] = NULL;
75 * get_mtd_device - obtain a validated handle for an MTD device
76 * @mtd: last known address of the required MTD device
77 * @num: internal device number of the required MTD device
79 * Given a number and NULL address, return the num'th entry in the device
80 * table, if any. Given an address and num == -1, search the device table
81 * for a device with that address and return if it's still present. Given
82 * both, return the num'th driver only if its address matches. Return
85 struct mtd_info *get_mtd_device(struct mtd_info *mtd, int num)
87 struct mtd_info *ret = NULL;
91 for (i = 0; i < MAX_MTD_DEVICES; i++)
92 if (mtd_table[i] == mtd)
94 } else if (num < MAX_MTD_DEVICES) {
96 if (mtd && mtd != ret)
111 * get_mtd_device_nm - obtain a validated handle for an MTD device by
113 * @name: MTD device name to open
115 * This function returns MTD device description structure in case of
116 * success and an error code in case of failure.
118 struct mtd_info *get_mtd_device_nm(const char *name)
120 int i, err = -ENODEV;
121 struct mtd_info *mtd = NULL;
123 for (i = 0; i < MAX_MTD_DEVICES; i++) {
124 if (mtd_table[i] && !strcmp(name, mtd_table[i]->name)) {
140 void put_mtd_device(struct mtd_info *mtd)