|
@@ -702,6 +702,42 @@ void __iomem *of_iomap(struct device_node *np, int index)
|
|
|
}
|
|
|
EXPORT_SYMBOL(of_iomap);
|
|
|
|
|
|
+/*
|
|
|
+ * of_io_request_and_map - Requests a resource and maps the memory mapped IO
|
|
|
+ * for a given device_node
|
|
|
+ * @device: the device whose io range will be mapped
|
|
|
+ * @index: index of the io range
|
|
|
+ * @name: name of the resource
|
|
|
+ *
|
|
|
+ * Returns a pointer to the requested and mapped memory or an ERR_PTR() encoded
|
|
|
+ * error code on failure. Usage example:
|
|
|
+ *
|
|
|
+ * base = of_io_request_and_map(node, 0, "foo");
|
|
|
+ * if (IS_ERR(base))
|
|
|
+ * return PTR_ERR(base);
|
|
|
+ */
|
|
|
+void __iomem *of_io_request_and_map(struct device_node *np, int index,
|
|
|
+ char *name)
|
|
|
+{
|
|
|
+ struct resource res;
|
|
|
+ void __iomem *mem;
|
|
|
+
|
|
|
+ if (of_address_to_resource(np, index, &res))
|
|
|
+ return IOMEM_ERR_PTR(-EINVAL);
|
|
|
+
|
|
|
+ if (!request_mem_region(res.start, resource_size(&res), name))
|
|
|
+ return IOMEM_ERR_PTR(-EBUSY);
|
|
|
+
|
|
|
+ mem = ioremap(res.start, resource_size(&res));
|
|
|
+ if (!mem) {
|
|
|
+ release_mem_region(res.start, resource_size(&res));
|
|
|
+ return IOMEM_ERR_PTR(-ENOMEM);
|
|
|
+ }
|
|
|
+
|
|
|
+ return mem;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(of_io_request_and_map);
|
|
|
+
|
|
|
/**
|
|
|
* of_dma_get_range - Get DMA range info
|
|
|
* @np: device node to get DMA range info
|