summaryrefslogtreecommitdiff
path: root/target/linux/mvebu/patches-3.10/0045-bus-mvebu-mbus-Add-static-window-allocation-to-the-D.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/mvebu/patches-3.10/0045-bus-mvebu-mbus-Add-static-window-allocation-to-the-D.patch')
-rw-r--r--target/linux/mvebu/patches-3.10/0045-bus-mvebu-mbus-Add-static-window-allocation-to-the-D.patch160
1 files changed, 0 insertions, 160 deletions
diff --git a/target/linux/mvebu/patches-3.10/0045-bus-mvebu-mbus-Add-static-window-allocation-to-the-D.patch b/target/linux/mvebu/patches-3.10/0045-bus-mvebu-mbus-Add-static-window-allocation-to-the-D.patch
deleted file mode 100644
index d9e783a..0000000
--- a/target/linux/mvebu/patches-3.10/0045-bus-mvebu-mbus-Add-static-window-allocation-to-the-D.patch
+++ /dev/null
@@ -1,160 +0,0 @@
-From ece28a7e105cedb5a9ebd2553aa41d965fb83b64 Mon Sep 17 00:00:00 2001
-From: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
-Date: Tue, 28 May 2013 07:58:31 -0300
-Subject: [PATCH 045/203] bus: mvebu-mbus: Add static window allocation to the
- DT binding
-
-This patch adds static window allocation to the device tree binding.
-Each first-child of the mbus-compatible node, with a suitable 'ranges'
-property, declaring an address translation, will trigger an address
-decoding window allocation.
-
-Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
-Tested-by: Andrew Lunn <andrew@lunn.ch>
-Tested-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
----
- drivers/bus/mvebu-mbus.c | 127 ++++++++++++++++++++++++++++++++++++++++++++++-
- 1 file changed, 126 insertions(+), 1 deletion(-)
-
---- a/drivers/bus/mvebu-mbus.c
-+++ b/drivers/bus/mvebu-mbus.c
-@@ -902,6 +902,127 @@ int __init mvebu_mbus_init(const char *s
- }
-
- #ifdef CONFIG_OF
-+/*
-+ * The window IDs in the ranges DT property have the following format:
-+ * - bits 28 to 31: MBus custom field
-+ * - bits 24 to 27: window target ID
-+ * - bits 16 to 23: window attribute ID
-+ * - bits 0 to 15: unused
-+ */
-+#define CUSTOM(id) (((id) & 0xF0000000) >> 24)
-+#define TARGET(id) (((id) & 0x0F000000) >> 24)
-+#define ATTR(id) (((id) & 0x00FF0000) >> 16)
-+
-+static int __init mbus_dt_setup_win(struct mvebu_mbus_state *mbus,
-+ u32 base, u32 size,
-+ u8 target, u8 attr)
-+{
-+ const struct mvebu_mbus_mapping *map = mbus->soc->map;
-+ const char *name;
-+ int i;
-+
-+ /* Search for a suitable window in the existing mappings */
-+ for (i = 0; map[i].name; i++)
-+ if (map[i].target == target &&
-+ map[i].attr == (attr & map[i].attrmask))
-+ break;
-+
-+ name = map[i].name;
-+ if (!name) {
-+ pr_err("window 0x%x:0x%x is unknown, skipping\n",
-+ target, attr);
-+ return -EINVAL;
-+ }
-+
-+ if (!mvebu_mbus_window_conflicts(mbus, base, size, target, attr)) {
-+ pr_err("cannot add window '%s', conflicts with another window\n",
-+ name);
-+ return -EBUSY;
-+ }
-+
-+ if (mvebu_mbus_alloc_window(mbus, base, size, MVEBU_MBUS_NO_REMAP,
-+ target, attr)) {
-+ pr_err("cannot add window '%s', too many windows\n",
-+ name);
-+ return -ENOMEM;
-+ }
-+ return 0;
-+}
-+
-+static int __init
-+mbus_parse_ranges(struct device_node *node,
-+ int *addr_cells, int *c_addr_cells, int *c_size_cells,
-+ int *cell_count, const __be32 **ranges_start,
-+ const __be32 **ranges_end)
-+{
-+ const __be32 *prop;
-+ int ranges_len, tuple_len;
-+
-+ /* Allow a node with no 'ranges' property */
-+ *ranges_start = of_get_property(node, "ranges", &ranges_len);
-+ if (*ranges_start == NULL) {
-+ *addr_cells = *c_addr_cells = *c_size_cells = *cell_count = 0;
-+ *ranges_start = *ranges_end = NULL;
-+ return 0;
-+ }
-+ *ranges_end = *ranges_start + ranges_len / sizeof(__be32);
-+
-+ *addr_cells = of_n_addr_cells(node);
-+
-+ prop = of_get_property(node, "#address-cells", NULL);
-+ *c_addr_cells = be32_to_cpup(prop);
-+
-+ prop = of_get_property(node, "#size-cells", NULL);
-+ *c_size_cells = be32_to_cpup(prop);
-+
-+ *cell_count = *addr_cells + *c_addr_cells + *c_size_cells;
-+ tuple_len = (*cell_count) * sizeof(__be32);
-+
-+ if (ranges_len % tuple_len) {
-+ pr_warn("malformed ranges entry '%s'\n", node->name);
-+ return -EINVAL;
-+ }
-+ return 0;
-+}
-+
-+static int __init mbus_dt_setup(struct mvebu_mbus_state *mbus,
-+ struct device_node *np)
-+{
-+ int addr_cells, c_addr_cells, c_size_cells;
-+ int i, ret, cell_count;
-+ const __be32 *r, *ranges_start, *ranges_end;
-+
-+ ret = mbus_parse_ranges(np, &addr_cells, &c_addr_cells,
-+ &c_size_cells, &cell_count,
-+ &ranges_start, &ranges_end);
-+ if (ret < 0)
-+ return ret;
-+
-+ for (i = 0, r = ranges_start; r < ranges_end; r += cell_count, i++) {
-+ u32 windowid, base, size;
-+ u8 target, attr;
-+
-+ /*
-+ * An entry with a non-zero custom field do not
-+ * correspond to a static window, so skip it.
-+ */
-+ windowid = of_read_number(r, 1);
-+ if (CUSTOM(windowid))
-+ continue;
-+
-+ target = TARGET(windowid);
-+ attr = ATTR(windowid);
-+
-+ base = of_read_number(r + c_addr_cells, addr_cells);
-+ size = of_read_number(r + c_addr_cells + addr_cells,
-+ c_size_cells);
-+ ret = mbus_dt_setup_win(mbus, base, size, target, attr);
-+ if (ret < 0)
-+ return ret;
-+ }
-+ return 0;
-+}
-+
- int __init mvebu_mbus_dt_init(void)
- {
- struct resource mbuswins_res, sdramwins_res;
-@@ -946,6 +1067,10 @@ int __init mvebu_mbus_dt_init(void)
- resource_size(&mbuswins_res),
- sdramwins_res.start,
- resource_size(&sdramwins_res));
-- return ret;
-+ if (ret)
-+ return ret;
-+
-+ /* Setup statically declared windows in the DT */
-+ return mbus_dt_setup(&mbus_state, np);
- }
- #endif