summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/misc/mem.c35
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);