Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9bc7b387 authored by Todd Poynor's avatar Todd Poynor Committed by Thomas Gleixner
Browse files

[MTD] mtdchar.c: Replace DEVFS by udev



Switch from DEVFS to udev for dynamic creation of device nodes for mtd
char devices.

Creates a new LDM class "mtd" with writeable and read-only devices
registered for each mtdchar device.

From: Paolo Galtieri <pgaltieri@mvista.com>
Signed-off-by: default avatarTodd Poynor <tpoynor@mvista.com>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent bd7bcf52
Loading
Loading
Loading
Loading
+24 −28
Original line number Original line Diff line number Diff line
/*
/*
 * $Id: mtdchar.c,v 1.70 2005/04/01 15:36:11 nico Exp $
 * $Id: mtdchar.c,v 1.72 2005/06/30 00:23:24 tpoynor Exp $
 *
 *
 * Character-device access to raw MTD devices.
 * Character-device access to raw MTD devices.
 *
 *
@@ -15,27 +15,30 @@
#include <linux/fs.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
#include <asm/uaccess.h>


#ifdef CONFIG_DEVFS_FS
#include <linux/device.h>
#include <linux/devfs_fs_kernel.h>

static struct class *mtd_class;


static void mtd_notify_add(struct mtd_info* mtd)
static void mtd_notify_add(struct mtd_info* mtd)
{
{
	if (!mtd)
	if (!mtd)
		return;
		return;


	devfs_mk_cdev(MKDEV(MTD_CHAR_MAJOR, mtd->index*2),
	class_device_create(mtd_class, MKDEV(MTD_CHAR_MAJOR, mtd->index*2),
		      S_IFCHR | S_IRUGO | S_IWUGO, "mtd/%d", mtd->index);
			    NULL, "mtd%d", mtd->index);
	
	
	devfs_mk_cdev(MKDEV(MTD_CHAR_MAJOR, mtd->index*2+1),
	class_device_create(mtd_class, 
		      S_IFCHR | S_IRUGO, "mtd/%dro", mtd->index);
			    MKDEV(MTD_CHAR_MAJOR, mtd->index*2+1),
			    NULL, "mtd%dro", mtd->index);
}
}


static void mtd_notify_remove(struct mtd_info* mtd)
static void mtd_notify_remove(struct mtd_info* mtd)
{
{
	if (!mtd)
	if (!mtd)
		return;
		return;
	devfs_remove("mtd/%d", mtd->index);

	devfs_remove("mtd/%dro", mtd->index);
	class_device_destroy(mtd_class, MKDEV(MTD_CHAR_MAJOR, mtd->index*2));
	class_device_destroy(mtd_class, MKDEV(MTD_CHAR_MAJOR, mtd->index*2+1));
}
}


static struct mtd_notifier notifier = {
static struct mtd_notifier notifier = {
@@ -43,22 +46,6 @@ static struct mtd_notifier notifier = {
	.remove	= mtd_notify_remove,
	.remove	= mtd_notify_remove,
};
};


static inline void mtdchar_devfs_init(void)
{
	devfs_mk_dir("mtd");
	register_mtd_user(&notifier);
}

static inline void mtdchar_devfs_exit(void)
{
	unregister_mtd_user(&notifier);
	devfs_remove("mtd");
}
#else /* !DEVFS */
#define mtdchar_devfs_init() do { } while(0)
#define mtdchar_devfs_exit() do { } while(0)
#endif

/*
/*
 * We use file->private_data to store a pointer to the MTDdevice.
 * We use file->private_data to store a pointer to the MTDdevice.
 * Since alighment is at least 32 bits, we have 2 bits free for OTP
 * Since alighment is at least 32 bits, we have 2 bits free for OTP
@@ -657,13 +644,22 @@ static int __init init_mtdchar(void)
		return -EAGAIN;
		return -EAGAIN;
	}
	}


	mtdchar_devfs_init();
	mtd_class = class_create(THIS_MODULE, "mtd");

	if (IS_ERR(mtd_class)) {
		printk(KERN_ERR "Error creating mtd class.\n");
		unregister_chrdev(MTD_CHAR_MAJOR, "mtd");
		return 1;
	}

	register_mtd_user(&notifier);
	return 0;
	return 0;
}
}


static void __exit cleanup_mtdchar(void)
static void __exit cleanup_mtdchar(void)
{
{
	mtdchar_devfs_exit();
	unregister_mtd_user(&notifier);
	class_destroy(mtd_class);
	unregister_chrdev(MTD_CHAR_MAJOR, "mtd");
	unregister_chrdev(MTD_CHAR_MAJOR, "mtd");
}
}