diff options
Diffstat (limited to 'drivers/mtd/devices/pmc551.c')
-rw-r--r-- | drivers/mtd/devices/pmc551.c | 99 |
1 files changed, 47 insertions, 52 deletions
diff --git a/drivers/mtd/devices/pmc551.c b/drivers/mtd/devices/pmc551.c index 5d53c5760a6c..0c51b988e1f8 100644 --- a/drivers/mtd/devices/pmc551.c +++ b/drivers/mtd/devices/pmc551.c | |||
@@ -94,12 +94,48 @@ | |||
94 | #include <linux/ioctl.h> | 94 | #include <linux/ioctl.h> |
95 | #include <asm/io.h> | 95 | #include <asm/io.h> |
96 | #include <linux/pci.h> | 96 | #include <linux/pci.h> |
97 | |||
98 | #include <linux/mtd/mtd.h> | 97 | #include <linux/mtd/mtd.h> |
99 | #include <linux/mtd/pmc551.h> | 98 | |
99 | #define PMC551_VERSION \ | ||
100 | "Ramix PMC551 PCI Mezzanine Ram Driver. (C) 1999,2000 Nortel Networks.\n" | ||
101 | |||
102 | #define PCI_VENDOR_ID_V3_SEMI 0x11b0 | ||
103 | #define PCI_DEVICE_ID_V3_SEMI_V370PDC 0x0200 | ||
104 | |||
105 | #define PMC551_PCI_MEM_MAP0 0x50 | ||
106 | #define PMC551_PCI_MEM_MAP1 0x54 | ||
107 | #define PMC551_PCI_MEM_MAP_MAP_ADDR_MASK 0x3ff00000 | ||
108 | #define PMC551_PCI_MEM_MAP_APERTURE_MASK 0x000000f0 | ||
109 | #define PMC551_PCI_MEM_MAP_REG_EN 0x00000002 | ||
110 | #define PMC551_PCI_MEM_MAP_ENABLE 0x00000001 | ||
111 | |||
112 | #define PMC551_SDRAM_MA 0x60 | ||
113 | #define PMC551_SDRAM_CMD 0x62 | ||
114 | #define PMC551_DRAM_CFG 0x64 | ||
115 | #define PMC551_SYS_CTRL_REG 0x78 | ||
116 | |||
117 | #define PMC551_DRAM_BLK0 0x68 | ||
118 | #define PMC551_DRAM_BLK1 0x6c | ||
119 | #define PMC551_DRAM_BLK2 0x70 | ||
120 | #define PMC551_DRAM_BLK3 0x74 | ||
121 | #define PMC551_DRAM_BLK_GET_SIZE(x) (524288 << ((x >> 4) & 0x0f)) | ||
122 | #define PMC551_DRAM_BLK_SET_COL_MUX(x, v) (((x) & ~0x00007000) | (((v) & 0x7) << 12)) | ||
123 | #define PMC551_DRAM_BLK_SET_ROW_MUX(x, v) (((x) & ~0x00000f00) | (((v) & 0xf) << 8)) | ||
124 | |||
125 | struct mypriv { | ||
126 | struct pci_dev *dev; | ||
127 | u_char *start; | ||
128 | u32 base_map0; | ||
129 | u32 curr_map0; | ||
130 | u32 asize; | ||
131 | struct mtd_info *nextpmc551; | ||
132 | }; | ||
100 | 133 | ||
101 | static struct mtd_info *pmc551list; | 134 | static struct mtd_info *pmc551list; |
102 | 135 | ||
136 | static int pmc551_point(struct mtd_info *mtd, loff_t from, size_t len, | ||
137 | size_t *retlen, void **virt, resource_size_t *phys); | ||
138 | |||
103 | static int pmc551_erase(struct mtd_info *mtd, struct erase_info *instr) | 139 | static int pmc551_erase(struct mtd_info *mtd, struct erase_info *instr) |
104 | { | 140 | { |
105 | struct mypriv *priv = mtd->priv; | 141 | struct mypriv *priv = mtd->priv; |
@@ -115,16 +151,6 @@ static int pmc551_erase(struct mtd_info *mtd, struct erase_info *instr) | |||
115 | #endif | 151 | #endif |
116 | 152 | ||
117 | end = instr->addr + instr->len - 1; | 153 | end = instr->addr + instr->len - 1; |
118 | |||
119 | /* Is it past the end? */ | ||
120 | if (end > mtd->size) { | ||
121 | #ifdef CONFIG_MTD_PMC551_DEBUG | ||
122 | printk(KERN_DEBUG "pmc551_erase() out of bounds (%ld > %ld)\n", | ||
123 | (long)end, (long)mtd->size); | ||
124 | #endif | ||
125 | return -EINVAL; | ||
126 | } | ||
127 | |||
128 | eoff_hi = end & ~(priv->asize - 1); | 154 | eoff_hi = end & ~(priv->asize - 1); |
129 | soff_hi = instr->addr & ~(priv->asize - 1); | 155 | soff_hi = instr->addr & ~(priv->asize - 1); |
130 | eoff_lo = end & (priv->asize - 1); | 156 | eoff_lo = end & (priv->asize - 1); |
@@ -178,18 +204,6 @@ static int pmc551_point(struct mtd_info *mtd, loff_t from, size_t len, | |||
178 | printk(KERN_DEBUG "pmc551_point(%ld, %ld)\n", (long)from, (long)len); | 204 | printk(KERN_DEBUG "pmc551_point(%ld, %ld)\n", (long)from, (long)len); |
179 | #endif | 205 | #endif |
180 | 206 | ||
181 | if (from + len > mtd->size) { | ||
182 | #ifdef CONFIG_MTD_PMC551_DEBUG | ||
183 | printk(KERN_DEBUG "pmc551_point() out of bounds (%ld > %ld)\n", | ||
184 | (long)from + len, (long)mtd->size); | ||
185 | #endif | ||
186 | return -EINVAL; | ||
187 | } | ||
188 | |||
189 | /* can we return a physical address with this driver? */ | ||
190 | if (phys) | ||
191 | return -EINVAL; | ||
192 | |||
193 | soff_hi = from & ~(priv->asize - 1); | 207 | soff_hi = from & ~(priv->asize - 1); |
194 | soff_lo = from & (priv->asize - 1); | 208 | soff_lo = from & (priv->asize - 1); |
195 | 209 | ||
@@ -205,11 +219,12 @@ static int pmc551_point(struct mtd_info *mtd, loff_t from, size_t len, | |||
205 | return 0; | 219 | return 0; |
206 | } | 220 | } |
207 | 221 | ||
208 | static void pmc551_unpoint(struct mtd_info *mtd, loff_t from, size_t len) | 222 | static int pmc551_unpoint(struct mtd_info *mtd, loff_t from, size_t len) |
209 | { | 223 | { |
210 | #ifdef CONFIG_MTD_PMC551_DEBUG | 224 | #ifdef CONFIG_MTD_PMC551_DEBUG |
211 | printk(KERN_DEBUG "pmc551_unpoint()\n"); | 225 | printk(KERN_DEBUG "pmc551_unpoint()\n"); |
212 | #endif | 226 | #endif |
227 | return 0; | ||
213 | } | 228 | } |
214 | 229 | ||
215 | static int pmc551_read(struct mtd_info *mtd, loff_t from, size_t len, | 230 | static int pmc551_read(struct mtd_info *mtd, loff_t from, size_t len, |
@@ -228,16 +243,6 @@ static int pmc551_read(struct mtd_info *mtd, loff_t from, size_t len, | |||
228 | #endif | 243 | #endif |
229 | 244 | ||
230 | end = from + len - 1; | 245 | end = from + len - 1; |
231 | |||
232 | /* Is it past the end? */ | ||
233 | if (end > mtd->size) { | ||
234 | #ifdef CONFIG_MTD_PMC551_DEBUG | ||
235 | printk(KERN_DEBUG "pmc551_read() out of bounds (%ld > %ld)\n", | ||
236 | (long)end, (long)mtd->size); | ||
237 | #endif | ||
238 | return -EINVAL; | ||
239 | } | ||
240 | |||
241 | soff_hi = from & ~(priv->asize - 1); | 246 | soff_hi = from & ~(priv->asize - 1); |
242 | eoff_hi = end & ~(priv->asize - 1); | 247 | eoff_hi = end & ~(priv->asize - 1); |
243 | soff_lo = from & (priv->asize - 1); | 248 | soff_lo = from & (priv->asize - 1); |
@@ -295,16 +300,6 @@ static int pmc551_write(struct mtd_info *mtd, loff_t to, size_t len, | |||
295 | #endif | 300 | #endif |
296 | 301 | ||
297 | end = to + len - 1; | 302 | end = to + len - 1; |
298 | /* Is it past the end? or did the u32 wrap? */ | ||
299 | if (end > mtd->size) { | ||
300 | #ifdef CONFIG_MTD_PMC551_DEBUG | ||
301 | printk(KERN_DEBUG "pmc551_write() out of bounds (end: %ld, " | ||
302 | "size: %ld, to: %ld)\n", (long)end, (long)mtd->size, | ||
303 | (long)to); | ||
304 | #endif | ||
305 | return -EINVAL; | ||
306 | } | ||
307 | |||
308 | soff_hi = to & ~(priv->asize - 1); | 303 | soff_hi = to & ~(priv->asize - 1); |
309 | eoff_hi = end & ~(priv->asize - 1); | 304 | eoff_hi = end & ~(priv->asize - 1); |
310 | soff_lo = to & (priv->asize - 1); | 305 | soff_lo = to & (priv->asize - 1); |
@@ -358,7 +353,7 @@ static int pmc551_write(struct mtd_info *mtd, loff_t to, size_t len, | |||
358 | * mechanism | 353 | * mechanism |
359 | * returns the size of the memory region found. | 354 | * returns the size of the memory region found. |
360 | */ | 355 | */ |
361 | static u32 fixup_pmc551(struct pci_dev *dev) | 356 | static int fixup_pmc551(struct pci_dev *dev) |
362 | { | 357 | { |
363 | #ifdef CONFIG_MTD_PMC551_BUGFIX | 358 | #ifdef CONFIG_MTD_PMC551_BUGFIX |
364 | u32 dram_data; | 359 | u32 dram_data; |
@@ -668,7 +663,7 @@ static int __init init_pmc551(void) | |||
668 | struct mypriv *priv; | 663 | struct mypriv *priv; |
669 | int found = 0; | 664 | int found = 0; |
670 | struct mtd_info *mtd; | 665 | struct mtd_info *mtd; |
671 | u32 length = 0; | 666 | int length = 0; |
672 | 667 | ||
673 | if (msize) { | 668 | if (msize) { |
674 | msize = (1 << (ffs(msize) - 1)) << 20; | 669 | msize = (1 << (ffs(msize) - 1)) << 20; |
@@ -786,11 +781,11 @@ static int __init init_pmc551(void) | |||
786 | 781 | ||
787 | mtd->size = msize; | 782 | mtd->size = msize; |
788 | mtd->flags = MTD_CAP_RAM; | 783 | mtd->flags = MTD_CAP_RAM; |
789 | mtd->erase = pmc551_erase; | 784 | mtd->_erase = pmc551_erase; |
790 | mtd->read = pmc551_read; | 785 | mtd->_read = pmc551_read; |
791 | mtd->write = pmc551_write; | 786 | mtd->_write = pmc551_write; |
792 | mtd->point = pmc551_point; | 787 | mtd->_point = pmc551_point; |
793 | mtd->unpoint = pmc551_unpoint; | 788 | mtd->_unpoint = pmc551_unpoint; |
794 | mtd->type = MTD_RAM; | 789 | mtd->type = MTD_RAM; |
795 | mtd->name = "PMC551 RAM board"; | 790 | mtd->name = "PMC551 RAM board"; |
796 | mtd->erasesize = 0x10000; | 791 | mtd->erasesize = 0x10000; |