diff options
Diffstat (limited to 'drivers/misc')
-rw-r--r-- | drivers/misc/mem.c | 35 |
1 files changed, 32 insertions, 3 deletions
diff --git a/drivers/misc/mem.c b/drivers/misc/mem.c index 60981a3e98..6dd7f687c9 100644 --- a/drivers/misc/mem.c +++ b/drivers/misc/mem.c @@ -21,8 +21,18 @@ static int mem_probe(struct device_d *dev) dev->priv = cdev; cdev->name = (char*)dev->resource[0].name; - cdev->size = min_t(unsigned long long, resource_size(&dev->resource[0]), - S64_MAX); + if (dev->resource[0].start == 0 && dev->resource[0].end == ~0) { + /* + * Special case for /dev/mem. We can't express it's size as it's + * outside of our address range. Set DEVFS_IS_CHARACTER_DEV to + * bypass size checks. + */ + cdev->size = 0; + cdev->flags = DEVFS_IS_CHARACTER_DEV; + } else { + cdev->size = resource_size(&dev->resource[0]); + } + cdev->ops = &memops; cdev->dev = dev; @@ -38,7 +48,26 @@ static struct driver_d mem_drv = { static int mem_init(void) { - add_mem_device("mem", 0, ~0, IORESOURCE_MEM_WRITEABLE); + struct device_d *dev; + struct resource res = { + .start = 0, + .end = ~0, + .flags = IORESOURCE_MEM, + .name = "mem", + }; + int ret; + + dev = device_alloc("mem", DEVICE_ID_DYNAMIC); + if (!dev) + return -ENOMEM; + + dev->resource = xmemdup(&res, sizeof(res)); + dev->num_resources = 1; + + ret = platform_device_register(dev); + if (ret) + return ret; + return platform_driver_register(&mem_drv); } device_initcall(mem_init); |