diff options
Diffstat (limited to 'drivers/mtd/mtdcore.c')
-rw-r--r-- | drivers/mtd/mtdcore.c | 82 |
1 files changed, 75 insertions, 7 deletions
diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c index 467a4f177bfb..b177e750efc3 100644 --- a/drivers/mtd/mtdcore.c +++ b/drivers/mtd/mtdcore.c | |||
@@ -2,12 +2,14 @@ | |||
2 | * Core registration and callback routines for MTD | 2 | * Core registration and callback routines for MTD |
3 | * drivers and users. | 3 | * drivers and users. |
4 | * | 4 | * |
5 | * bdi bits are: | ||
6 | * Copyright © 2006 Red Hat, Inc. All Rights Reserved. | ||
7 | * Written by David Howells (dhowells@redhat.com) | ||
5 | */ | 8 | */ |
6 | 9 | ||
7 | #include <linux/module.h> | 10 | #include <linux/module.h> |
8 | #include <linux/kernel.h> | 11 | #include <linux/kernel.h> |
9 | #include <linux/ptrace.h> | 12 | #include <linux/ptrace.h> |
10 | #include <linux/slab.h> | ||
11 | #include <linux/string.h> | 13 | #include <linux/string.h> |
12 | #include <linux/timer.h> | 14 | #include <linux/timer.h> |
13 | #include <linux/major.h> | 15 | #include <linux/major.h> |
@@ -17,11 +19,39 @@ | |||
17 | #include <linux/init.h> | 19 | #include <linux/init.h> |
18 | #include <linux/mtd/compatmac.h> | 20 | #include <linux/mtd/compatmac.h> |
19 | #include <linux/proc_fs.h> | 21 | #include <linux/proc_fs.h> |
22 | #include <linux/backing-dev.h> | ||
20 | 23 | ||
21 | #include <linux/mtd/mtd.h> | 24 | #include <linux/mtd/mtd.h> |
22 | #include "internal.h" | ||
23 | 25 | ||
24 | #include "mtdcore.h" | 26 | #include "mtdcore.h" |
27 | /* | ||
28 | * backing device capabilities for non-mappable devices (such as NAND flash) | ||
29 | * - permits private mappings, copies are taken of the data | ||
30 | */ | ||
31 | struct backing_dev_info mtd_bdi_unmappable = { | ||
32 | .capabilities = BDI_CAP_MAP_COPY, | ||
33 | }; | ||
34 | |||
35 | /* | ||
36 | * backing device capabilities for R/O mappable devices (such as ROM) | ||
37 | * - permits private mappings, copies are taken of the data | ||
38 | * - permits non-writable shared mappings | ||
39 | */ | ||
40 | struct backing_dev_info mtd_bdi_ro_mappable = { | ||
41 | .capabilities = (BDI_CAP_MAP_COPY | BDI_CAP_MAP_DIRECT | | ||
42 | BDI_CAP_EXEC_MAP | BDI_CAP_READ_MAP), | ||
43 | }; | ||
44 | |||
45 | /* | ||
46 | * backing device capabilities for writable mappable devices (such as RAM) | ||
47 | * - permits private mappings, copies are taken of the data | ||
48 | * - permits non-writable shared mappings | ||
49 | */ | ||
50 | struct backing_dev_info mtd_bdi_rw_mappable = { | ||
51 | .capabilities = (BDI_CAP_MAP_COPY | BDI_CAP_MAP_DIRECT | | ||
52 | BDI_CAP_EXEC_MAP | BDI_CAP_READ_MAP | | ||
53 | BDI_CAP_WRITE_MAP), | ||
54 | }; | ||
25 | 55 | ||
26 | static int mtd_cls_suspend(struct device *dev, pm_message_t state); | 56 | static int mtd_cls_suspend(struct device *dev, pm_message_t state); |
27 | static int mtd_cls_resume(struct device *dev); | 57 | static int mtd_cls_resume(struct device *dev); |
@@ -447,7 +477,7 @@ struct mtd_info *get_mtd_device(struct mtd_info *mtd, int num) | |||
447 | for (i=0; i< MAX_MTD_DEVICES; i++) | 477 | for (i=0; i< MAX_MTD_DEVICES; i++) |
448 | if (mtd_table[i] == mtd) | 478 | if (mtd_table[i] == mtd) |
449 | ret = mtd_table[i]; | 479 | ret = mtd_table[i]; |
450 | } else if (num < MAX_MTD_DEVICES) { | 480 | } else if (num >= 0 && num < MAX_MTD_DEVICES) { |
451 | ret = mtd_table[num]; | 481 | ret = mtd_table[num]; |
452 | if (mtd && mtd != ret) | 482 | if (mtd && mtd != ret) |
453 | ret = NULL; | 483 | ret = NULL; |
@@ -629,20 +659,55 @@ done: | |||
629 | /*====================================================================*/ | 659 | /*====================================================================*/ |
630 | /* Init code */ | 660 | /* Init code */ |
631 | 661 | ||
662 | static int __init mtd_bdi_init(struct backing_dev_info *bdi, const char *name) | ||
663 | { | ||
664 | int ret; | ||
665 | |||
666 | ret = bdi_init(bdi); | ||
667 | if (!ret) | ||
668 | ret = bdi_register(bdi, NULL, name); | ||
669 | |||
670 | if (ret) | ||
671 | bdi_destroy(bdi); | ||
672 | |||
673 | return ret; | ||
674 | } | ||
675 | |||
632 | static int __init init_mtd(void) | 676 | static int __init init_mtd(void) |
633 | { | 677 | { |
634 | int ret; | 678 | int ret; |
679 | |||
635 | ret = class_register(&mtd_class); | 680 | ret = class_register(&mtd_class); |
681 | if (ret) | ||
682 | goto err_reg; | ||
683 | |||
684 | ret = mtd_bdi_init(&mtd_bdi_unmappable, "mtd-unmap"); | ||
685 | if (ret) | ||
686 | goto err_bdi1; | ||
687 | |||
688 | ret = mtd_bdi_init(&mtd_bdi_ro_mappable, "mtd-romap"); | ||
689 | if (ret) | ||
690 | goto err_bdi2; | ||
691 | |||
692 | ret = mtd_bdi_init(&mtd_bdi_rw_mappable, "mtd-rwmap"); | ||
693 | if (ret) | ||
694 | goto err_bdi3; | ||
636 | 695 | ||
637 | if (ret) { | ||
638 | pr_err("Error registering mtd class: %d\n", ret); | ||
639 | return ret; | ||
640 | } | ||
641 | #ifdef CONFIG_PROC_FS | 696 | #ifdef CONFIG_PROC_FS |
642 | if ((proc_mtd = create_proc_entry( "mtd", 0, NULL ))) | 697 | if ((proc_mtd = create_proc_entry( "mtd", 0, NULL ))) |
643 | proc_mtd->read_proc = mtd_read_proc; | 698 | proc_mtd->read_proc = mtd_read_proc; |
644 | #endif /* CONFIG_PROC_FS */ | 699 | #endif /* CONFIG_PROC_FS */ |
645 | return 0; | 700 | return 0; |
701 | |||
702 | err_bdi3: | ||
703 | bdi_destroy(&mtd_bdi_ro_mappable); | ||
704 | err_bdi2: | ||
705 | bdi_destroy(&mtd_bdi_unmappable); | ||
706 | err_bdi1: | ||
707 | class_unregister(&mtd_class); | ||
708 | err_reg: | ||
709 | pr_err("Error registering mtd class or bdi: %d\n", ret); | ||
710 | return ret; | ||
646 | } | 711 | } |
647 | 712 | ||
648 | static void __exit cleanup_mtd(void) | 713 | static void __exit cleanup_mtd(void) |
@@ -652,6 +717,9 @@ static void __exit cleanup_mtd(void) | |||
652 | remove_proc_entry( "mtd", NULL); | 717 | remove_proc_entry( "mtd", NULL); |
653 | #endif /* CONFIG_PROC_FS */ | 718 | #endif /* CONFIG_PROC_FS */ |
654 | class_unregister(&mtd_class); | 719 | class_unregister(&mtd_class); |
720 | bdi_destroy(&mtd_bdi_unmappable); | ||
721 | bdi_destroy(&mtd_bdi_ro_mappable); | ||
722 | bdi_destroy(&mtd_bdi_rw_mappable); | ||
655 | } | 723 | } |
656 | 724 | ||
657 | module_init(init_mtd); | 725 | module_init(init_mtd); |