.. | .. |
---|
20 | 20 | |
---|
21 | 21 | #define MTD_VENDOR_PART_START 0 |
---|
22 | 22 | #define MTD_VENDOR_PART_SIZE FLASH_VENDOR_PART_SIZE |
---|
23 | | -#define MTD_VENDOR_NOR_BLOCK_SIZE 128 |
---|
24 | 23 | #define MTD_VENDOR_PART_NUM 1 |
---|
25 | 24 | #define MTD_VENDOR_TAG VENDOR_HEAD_TAG |
---|
26 | 25 | |
---|
.. | .. |
---|
44 | 43 | static struct flash_vendor_info *g_vendor; |
---|
45 | 44 | static DEFINE_MUTEX(vendor_ops_mutex); |
---|
46 | 45 | static struct mtd_info *mtd; |
---|
47 | | -static u32 mtd_erase_size; |
---|
48 | 46 | static const char *vendor_mtd_name = "vnvm"; |
---|
49 | 47 | static struct mtd_nand_info nand_info; |
---|
| 48 | +static struct platform_device *g_pdev; |
---|
50 | 49 | |
---|
51 | 50 | static int mtd_vendor_nand_write(void) |
---|
52 | 51 | { |
---|
.. | .. |
---|
55 | 54 | struct erase_info ei; |
---|
56 | 55 | |
---|
57 | 56 | re_write: |
---|
58 | | - if (nand_info.page_offset >= mtd_erase_size) { |
---|
59 | | - nand_info.blk_offset += mtd_erase_size; |
---|
| 57 | + if (nand_info.page_offset >= mtd->erasesize) { |
---|
| 58 | + nand_info.blk_offset += mtd->erasesize; |
---|
60 | 59 | if (nand_info.blk_offset >= mtd->size) |
---|
61 | 60 | nand_info.blk_offset = 0; |
---|
62 | 61 | if (mtd_block_isbad(mtd, nand_info.blk_offset)) |
---|
.. | .. |
---|
64 | 63 | |
---|
65 | 64 | memset(&ei, 0, sizeof(struct erase_info)); |
---|
66 | 65 | ei.addr = nand_info.blk_offset; |
---|
67 | | - ei.len = mtd_erase_size; |
---|
| 66 | + ei.len = mtd->erasesize; |
---|
68 | 67 | if (mtd_erase(mtd, &ei)) |
---|
69 | 68 | goto re_write; |
---|
70 | 69 | |
---|
.. | .. |
---|
101 | 100 | nand_info.ops_size = (sizeof(*g_vendor) + mtd->writesize - 1) / mtd->writesize; |
---|
102 | 101 | nand_info.ops_size *= mtd->writesize; |
---|
103 | 102 | |
---|
104 | | - /* |
---|
105 | | - * The NOR FLASH erase size maybe config as 4KB, need to re-define |
---|
106 | | - * and maintain consistency with uboot. |
---|
107 | | - */ |
---|
108 | | - mtd_erase_size = mtd->erasesize; |
---|
109 | | - if (mtd_erase_size <= MTD_VENDOR_NOR_BLOCK_SIZE * 512) |
---|
110 | | - mtd_erase_size = MTD_VENDOR_NOR_BLOCK_SIZE * 512; |
---|
111 | | - |
---|
112 | | - for (offset = 0; offset < mtd->size; offset += mtd_erase_size) { |
---|
| 103 | + for (offset = 0; offset < mtd->size; offset += mtd->erasesize) { |
---|
113 | 104 | if (!mtd_block_isbad(mtd, offset)) { |
---|
114 | 105 | err = mtd_read(mtd, offset, sizeof(*g_vendor), |
---|
115 | 106 | &bytes_read, (u8 *)g_vendor); |
---|
.. | .. |
---|
124 | 115 | } |
---|
125 | 116 | } |
---|
126 | 117 | } else if (nand_info.blk_offset == offset) |
---|
127 | | - nand_info.blk_offset += mtd_erase_size; |
---|
| 118 | + nand_info.blk_offset += mtd->erasesize; |
---|
128 | 119 | } |
---|
129 | 120 | |
---|
130 | 121 | if (nand_info.version) { |
---|
131 | | - for (offset = mtd_erase_size - nand_info.ops_size; |
---|
| 122 | + for (offset = mtd->erasesize - nand_info.ops_size; |
---|
132 | 123 | offset >= 0; |
---|
133 | 124 | offset -= nand_info.ops_size) { |
---|
134 | 125 | err = mtd_read(mtd, nand_info.blk_offset + offset, |
---|
.. | .. |
---|
154 | 145 | if (bytes_read == sizeof(*g_vendor) && |
---|
155 | 146 | g_vendor->tag == MTD_VENDOR_TAG && |
---|
156 | 147 | g_vendor->version == g_vendor->version2) { |
---|
157 | | - if (nand_info.version > g_vendor->version) |
---|
158 | | - g_vendor->version = nand_info.version; |
---|
159 | | - else |
---|
160 | | - nand_info.version = g_vendor->version; |
---|
| 148 | + nand_info.version = g_vendor->version; |
---|
161 | 149 | break; |
---|
162 | 150 | } |
---|
163 | 151 | } |
---|
.. | .. |
---|
167 | 155 | g_vendor->tag = MTD_VENDOR_TAG; |
---|
168 | 156 | g_vendor->free_size = sizeof(g_vendor->data); |
---|
169 | 157 | g_vendor->version2 = g_vendor->version; |
---|
170 | | - for (offset = 0; offset < mtd->size; offset += mtd_erase_size) { |
---|
| 158 | + for (offset = 0; offset < mtd->size; offset += mtd->erasesize) { |
---|
171 | 159 | if (!mtd_block_isbad(mtd, offset)) { |
---|
172 | 160 | memset(&ei, 0, sizeof(struct erase_info)); |
---|
173 | 161 | ei.addr = nand_info.blk_offset + offset; |
---|
174 | | - ei.len = mtd_erase_size; |
---|
| 162 | + ei.len = mtd->erasesize; |
---|
175 | 163 | mtd_erase(mtd, &ei); |
---|
176 | 164 | } |
---|
177 | 165 | } |
---|
.. | .. |
---|
419 | 407 | |
---|
420 | 408 | g_idb_buffer = NULL; |
---|
421 | 409 | ret = platform_driver_register(&vendor_storage_driver); |
---|
| 410 | + if (ret) |
---|
| 411 | + return ret; |
---|
422 | 412 | |
---|
423 | 413 | pdev = platform_device_register_simple("mtd_vendor_storage", |
---|
424 | 414 | -1, NULL, 0); |
---|
.. | .. |
---|
426 | 416 | platform_driver_unregister(&vendor_storage_driver); |
---|
427 | 417 | return PTR_ERR(pdev); |
---|
428 | 418 | } |
---|
| 419 | + g_pdev = pdev; |
---|
429 | 420 | |
---|
430 | 421 | return ret; |
---|
431 | 422 | } |
---|
432 | 423 | |
---|
| 424 | +static __exit void vendor_storage_deinit(void) |
---|
| 425 | +{ |
---|
| 426 | + platform_device_unregister(g_pdev); |
---|
| 427 | + platform_driver_unregister(&vendor_storage_driver); |
---|
| 428 | +} |
---|
| 429 | + |
---|
433 | 430 | device_initcall_sync(vendor_storage_init); |
---|
| 431 | +module_exit(vendor_storage_deinit); |
---|
| 432 | +MODULE_LICENSE("GPL"); |
---|