aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/sysdev
diff options
context:
space:
mode:
Diffstat (limited to 'arch/powerpc/sysdev')
-rw-r--r--arch/powerpc/sysdev/axonram.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/arch/powerpc/sysdev/axonram.c b/arch/powerpc/sysdev/axonram.c
index 7f59188cd9a1..9b639ede06da 100644
--- a/arch/powerpc/sysdev/axonram.c
+++ b/arch/powerpc/sysdev/axonram.c
@@ -57,6 +57,8 @@
57#define AXON_RAM_SECTOR_SIZE 1 << AXON_RAM_SECTOR_SHIFT 57#define AXON_RAM_SECTOR_SIZE 1 << AXON_RAM_SECTOR_SHIFT
58#define AXON_RAM_IRQ_FLAGS IRQF_SHARED | IRQF_TRIGGER_RISING 58#define AXON_RAM_IRQ_FLAGS IRQF_SHARED | IRQF_TRIGGER_RISING
59 59
60static int azfs_major, azfs_minor;
61
60struct axon_ram_bank { 62struct axon_ram_bank {
61 struct of_device *device; 63 struct of_device *device;
62 struct gendisk *disk; 64 struct gendisk *disk;
@@ -227,19 +229,14 @@ axon_ram_probe(struct of_device *device, const struct of_device_id *device_id)
227 goto failed; 229 goto failed;
228 } 230 }
229 231
230 bank->disk->first_minor = 0; 232 bank->disk->major = azfs_major;
233 bank->disk->first_minor = azfs_minor;
231 bank->disk->fops = &axon_ram_devops; 234 bank->disk->fops = &axon_ram_devops;
232 bank->disk->private_data = bank; 235 bank->disk->private_data = bank;
233 bank->disk->driverfs_dev = &device->dev; 236 bank->disk->driverfs_dev = &device->dev;
234 237
235 sprintf(bank->disk->disk_name, "%s%d", 238 sprintf(bank->disk->disk_name, "%s%d",
236 AXON_RAM_DEVICE_NAME, axon_ram_bank_id); 239 AXON_RAM_DEVICE_NAME, axon_ram_bank_id);
237 bank->disk->major = register_blkdev(0, bank->disk->disk_name);
238 if (bank->disk->major < 0) {
239 dev_err(&device->dev, "Cannot register block device\n");
240 rc = -EFAULT;
241 goto failed;
242 }
243 240
244 bank->disk->queue = blk_alloc_queue(GFP_KERNEL); 241 bank->disk->queue = blk_alloc_queue(GFP_KERNEL);
245 if (bank->disk->queue == NULL) { 242 if (bank->disk->queue == NULL) {
@@ -276,6 +273,8 @@ axon_ram_probe(struct of_device *device, const struct of_device_id *device_id)
276 goto failed; 273 goto failed;
277 } 274 }
278 275
276 azfs_minor += bank->disk->minors;
277
279 return 0; 278 return 0;
280 279
281failed: 280failed:
@@ -310,7 +309,6 @@ axon_ram_remove(struct of_device *device)
310 309
311 device_remove_file(&device->dev, &dev_attr_ecc); 310 device_remove_file(&device->dev, &dev_attr_ecc);
312 free_irq(bank->irq_id, device); 311 free_irq(bank->irq_id, device);
313 unregister_blkdev(bank->disk->major, bank->disk->disk_name);
314 del_gendisk(bank->disk); 312 del_gendisk(bank->disk);
315 iounmap((void __iomem *) bank->io_addr); 313 iounmap((void __iomem *) bank->io_addr);
316 kfree(bank); 314 kfree(bank);
@@ -341,6 +339,14 @@ static struct of_platform_driver axon_ram_driver = {
341static int __init 339static int __init
342axon_ram_init(void) 340axon_ram_init(void)
343{ 341{
342 azfs_major = register_blkdev(azfs_major, AXON_RAM_DEVICE_NAME);
343 if (azfs_major < 0) {
344 printk(KERN_ERR "%s cannot become block device major number\n",
345 AXON_RAM_MODULE_NAME);
346 return -EFAULT;
347 }
348 azfs_minor = 0;
349
344 return of_register_platform_driver(&axon_ram_driver); 350 return of_register_platform_driver(&axon_ram_driver);
345} 351}
346 352
@@ -351,6 +357,7 @@ static void __exit
351axon_ram_exit(void) 357axon_ram_exit(void)
352{ 358{
353 of_unregister_platform_driver(&axon_ram_driver); 359 of_unregister_platform_driver(&axon_ram_driver);
360 unregister_blkdev(azfs_major, AXON_RAM_DEVICE_NAME);
354} 361}
355 362
356module_init(axon_ram_init); 363module_init(axon_ram_init);