diff options
Diffstat (limited to 'arch/powerpc/sysdev/axonram.c')
| -rw-r--r-- | arch/powerpc/sysdev/axonram.c | 28 | 
1 files changed, 19 insertions, 9 deletions
diff --git a/arch/powerpc/sysdev/axonram.c b/arch/powerpc/sysdev/axonram.c index 7f59188cd9a1..9e105cbc5e5f 100644 --- a/arch/powerpc/sysdev/axonram.c +++ b/arch/powerpc/sysdev/axonram.c @@ -57,6 +57,8 @@  #define AXON_RAM_SECTOR_SIZE		1 << AXON_RAM_SECTOR_SHIFT  #define AXON_RAM_IRQ_FLAGS		IRQF_SHARED | IRQF_TRIGGER_RISING +static int azfs_major, azfs_minor; +  struct axon_ram_bank {  	struct of_device	*device;  	struct gendisk		*disk; @@ -148,7 +150,10 @@ axon_ram_direct_access(struct block_device *device, sector_t sector,  	struct axon_ram_bank *bank = device->bd_disk->private_data;  	loff_t offset; -	offset = sector << AXON_RAM_SECTOR_SHIFT; +	offset = sector; +	if (device->bd_part != NULL) +		offset += device->bd_part->start_sect; +	offset <<= AXON_RAM_SECTOR_SHIFT;  	if (offset >= bank->size) {  		dev_err(&bank->device->dev, "Access outside of address space\n");  		return -ERANGE; @@ -227,19 +232,14 @@ axon_ram_probe(struct of_device *device, const struct of_device_id *device_id)  		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->private_data = bank;  	bank->disk->driverfs_dev = &device->dev;  	sprintf(bank->disk->disk_name, "%s%d",  			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);  	if (bank->disk->queue == NULL) { @@ -276,6 +276,8 @@ axon_ram_probe(struct of_device *device, const struct of_device_id *device_id)  		goto failed;  	} +	azfs_minor += bank->disk->minors; +  	return 0;  failed: @@ -310,7 +312,6 @@ axon_ram_remove(struct of_device *device)  	device_remove_file(&device->dev, &dev_attr_ecc);  	free_irq(bank->irq_id, device); -	unregister_blkdev(bank->disk->major, bank->disk->disk_name);  	del_gendisk(bank->disk);  	iounmap((void __iomem *) bank->io_addr);  	kfree(bank); @@ -341,6 +342,14 @@ static struct of_platform_driver axon_ram_driver = {  static int __init  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);  } @@ -351,6 +360,7 @@ static void __exit  axon_ram_exit(void)  {  	of_unregister_platform_driver(&axon_ram_driver); +	unregister_blkdev(azfs_major, AXON_RAM_DEVICE_NAME);  }  module_init(axon_ram_init);  |