Commit 9a23409b authored by Maxim Shchetynin's avatar Maxim Shchetynin Committed by Benjamin Herrenschmidt

powerpc/axonram: Use only one block device major number

Axonram module registers one block device for each DDR2 DIMM found
on a system. This means that each DDR2 DIMM becomes its own block device
major number. This patch lets axonram module to register the only one
block device for all DDR2 DIMMs which also spares kernel resources.
Signed-off-by: default avatarMaxim Shchetynin <maxim@de.ibm.com>
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent 18ad7a61
...@@ -57,6 +57,8 @@ ...@@ -57,6 +57,8 @@
#define AXON_RAM_SECTOR_SIZE 1 << AXON_RAM_SECTOR_SHIFT #define AXON_RAM_SECTOR_SIZE 1 << AXON_RAM_SECTOR_SHIFT
#define AXON_RAM_IRQ_FLAGS IRQF_SHARED | IRQF_TRIGGER_RISING #define AXON_RAM_IRQ_FLAGS IRQF_SHARED | IRQF_TRIGGER_RISING
static int azfs_major, azfs_minor;
struct axon_ram_bank { struct axon_ram_bank {
struct of_device *device; struct of_device *device;
struct gendisk *disk; struct gendisk *disk;
...@@ -227,19 +229,14 @@ axon_ram_probe(struct of_device *device, const struct of_device_id *device_id) ...@@ -227,19 +229,14 @@ axon_ram_probe(struct of_device *device, const struct of_device_id *device_id)
goto failed; goto failed;
} }
bank->disk->first_minor = 0; bank->disk->major = azfs_major;
bank->disk->first_minor = azfs_minor;
bank->disk->fops = &axon_ram_devops; bank->disk->fops = &axon_ram_devops;
bank->disk->private_data = bank; bank->disk->private_data = bank;
bank->disk->driverfs_dev = &device->dev; bank->disk->driverfs_dev = &device->dev;
sprintf(bank->disk->disk_name, "%s%d", sprintf(bank->disk->disk_name, "%s%d",
AXON_RAM_DEVICE_NAME, axon_ram_bank_id); AXON_RAM_DEVICE_NAME, axon_ram_bank_id);
bank->disk->major = register_blkdev(0, bank->disk->disk_name);
if (bank->disk->major < 0) {
dev_err(&device->dev, "Cannot register block device\n");
rc = -EFAULT;
goto failed;
}
bank->disk->queue = blk_alloc_queue(GFP_KERNEL); bank->disk->queue = blk_alloc_queue(GFP_KERNEL);
if (bank->disk->queue == NULL) { if (bank->disk->queue == NULL) {
...@@ -276,6 +273,8 @@ axon_ram_probe(struct of_device *device, const struct of_device_id *device_id) ...@@ -276,6 +273,8 @@ axon_ram_probe(struct of_device *device, const struct of_device_id *device_id)
goto failed; goto failed;
} }
azfs_minor += bank->disk->minors;
return 0; return 0;
failed: failed:
...@@ -310,7 +309,6 @@ axon_ram_remove(struct of_device *device) ...@@ -310,7 +309,6 @@ axon_ram_remove(struct of_device *device)
device_remove_file(&device->dev, &dev_attr_ecc); device_remove_file(&device->dev, &dev_attr_ecc);
free_irq(bank->irq_id, device); free_irq(bank->irq_id, device);
unregister_blkdev(bank->disk->major, bank->disk->disk_name);
del_gendisk(bank->disk); del_gendisk(bank->disk);
iounmap((void __iomem *) bank->io_addr); iounmap((void __iomem *) bank->io_addr);
kfree(bank); kfree(bank);
...@@ -341,6 +339,14 @@ static struct of_platform_driver axon_ram_driver = { ...@@ -341,6 +339,14 @@ static struct of_platform_driver axon_ram_driver = {
static int __init static int __init
axon_ram_init(void) axon_ram_init(void)
{ {
azfs_major = register_blkdev(azfs_major, AXON_RAM_DEVICE_NAME);
if (azfs_major < 0) {
printk(KERN_ERR "%s cannot become block device major number\n",
AXON_RAM_MODULE_NAME);
return -EFAULT;
}
azfs_minor = 0;
return of_register_platform_driver(&axon_ram_driver); return of_register_platform_driver(&axon_ram_driver);
} }
...@@ -351,6 +357,7 @@ static void __exit ...@@ -351,6 +357,7 @@ static void __exit
axon_ram_exit(void) axon_ram_exit(void)
{ {
of_unregister_platform_driver(&axon_ram_driver); of_unregister_platform_driver(&axon_ram_driver);
unregister_blkdev(azfs_major, AXON_RAM_DEVICE_NAME);
} }
module_init(axon_ram_init); module_init(axon_ram_init);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment