|
@@ -1478,7 +1478,7 @@ void __devm_release_region(struct device *dev, struct resource *parent,
|
|
|
EXPORT_SYMBOL(__devm_release_region);
|
|
|
|
|
|
/*
|
|
|
- * Called from init/main.c to reserve IO ports.
|
|
|
+ * Reserve I/O ports or memory based on "reserve=" kernel parameter.
|
|
|
*/
|
|
|
#define MAXRESERVE 4
|
|
|
static int __init reserve_setup(char *str)
|
|
@@ -1489,26 +1489,38 @@ static int __init reserve_setup(char *str)
|
|
|
for (;;) {
|
|
|
unsigned int io_start, io_num;
|
|
|
int x = reserved;
|
|
|
+ struct resource *parent;
|
|
|
|
|
|
- if (get_option (&str, &io_start) != 2)
|
|
|
+ if (get_option(&str, &io_start) != 2)
|
|
|
break;
|
|
|
- if (get_option (&str, &io_num) == 0)
|
|
|
+ if (get_option(&str, &io_num) == 0)
|
|
|
break;
|
|
|
if (x < MAXRESERVE) {
|
|
|
struct resource *res = reserve + x;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * If the region starts below 0x10000, we assume it's
|
|
|
+ * I/O port space; otherwise assume it's memory.
|
|
|
+ */
|
|
|
+ if (io_start < 0x10000) {
|
|
|
+ res->flags = IORESOURCE_IO;
|
|
|
+ parent = &ioport_resource;
|
|
|
+ } else {
|
|
|
+ res->flags = IORESOURCE_MEM;
|
|
|
+ parent = &iomem_resource;
|
|
|
+ }
|
|
|
res->name = "reserved";
|
|
|
res->start = io_start;
|
|
|
res->end = io_start + io_num - 1;
|
|
|
- res->flags = IORESOURCE_BUSY;
|
|
|
+ res->flags |= IORESOURCE_BUSY;
|
|
|
res->desc = IORES_DESC_NONE;
|
|
|
res->child = NULL;
|
|
|
- if (request_resource(res->start >= 0x10000 ? &iomem_resource : &ioport_resource, res) == 0)
|
|
|
+ if (request_resource(parent, res) == 0)
|
|
|
reserved = x+1;
|
|
|
}
|
|
|
}
|
|
|
return 1;
|
|
|
}
|
|
|
-
|
|
|
__setup("reserve=", reserve_setup);
|
|
|
|
|
|
/*
|