aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/ipq806x/patches/0051-drivers-of-add-support-for-custom-reserved-memory-dr.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/ipq806x/patches/0051-drivers-of-add-support-for-custom-reserved-memory-dr.patch')
-rw-r--r--target/linux/ipq806x/patches/0051-drivers-of-add-support-for-custom-reserved-memory-dr.patch156
1 files changed, 156 insertions, 0 deletions
diff --git a/target/linux/ipq806x/patches/0051-drivers-of-add-support-for-custom-reserved-memory-dr.patch b/target/linux/ipq806x/patches/0051-drivers-of-add-support-for-custom-reserved-memory-dr.patch
new file mode 100644
index 0000000000..ce01a8f084
--- /dev/null
+++ b/target/linux/ipq806x/patches/0051-drivers-of-add-support-for-custom-reserved-memory-dr.patch
@@ -0,0 +1,156 @@
+From fc9e25ed9db2fcfbf16a9cbbf5a1f449da78f1d9 Mon Sep 17 00:00:00 2001
+From: Marek Szyprowski <m.szyprowski@samsung.com>
+Date: Fri, 28 Feb 2014 14:42:49 +0100
+Subject: [PATCH 051/182] drivers: of: add support for custom reserved memory
+ drivers
+
+Add support for custom reserved memory drivers. Call their init() function
+for each reserved region and prepare for using operations provided by them
+with by the reserved_mem->ops array.
+
+Based on previous code provided by Josh Cartwright <joshc@codeaurora.org>
+
+Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
+Signed-off-by: Grant Likely <grant.likely@linaro.org>
+---
+ drivers/of/of_reserved_mem.c | 29 +++++++++++++++++++++++++++++
+ include/asm-generic/vmlinux.lds.h | 11 +++++++++++
+ include/linux/of_reserved_mem.h | 32 ++++++++++++++++++++++++++++++++
+ 3 files changed, 72 insertions(+)
+
+diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c
+index 69b8117..daaaf93 100644
+--- a/drivers/of/of_reserved_mem.c
++++ b/drivers/of/of_reserved_mem.c
+@@ -170,6 +170,33 @@ static int __init __reserved_mem_alloc_size(unsigned long node,
+ return 0;
+ }
+
++static const struct of_device_id __rmem_of_table_sentinel
++ __used __section(__reservedmem_of_table_end);
++
++/**
++ * res_mem_init_node() - call region specific reserved memory init code
++ */
++static int __init __reserved_mem_init_node(struct reserved_mem *rmem)
++{
++ extern const struct of_device_id __reservedmem_of_table[];
++ const struct of_device_id *i;
++
++ for (i = __reservedmem_of_table; i < &__rmem_of_table_sentinel; i++) {
++ reservedmem_of_init_fn initfn = i->data;
++ const char *compat = i->compatible;
++
++ if (!of_flat_dt_is_compatible(rmem->fdt_node, compat))
++ continue;
++
++ if (initfn(rmem, rmem->fdt_node, rmem->name) == 0) {
++ pr_info("Reserved memory: initialized node %s, compatible id %s\n",
++ rmem->name, compat);
++ return 0;
++ }
++ }
++ return -ENOENT;
++}
++
+ /**
+ * fdt_init_reserved_mem - allocate and init all saved reserved memory regions
+ */
+@@ -184,5 +211,7 @@ void __init fdt_init_reserved_mem(void)
+ if (rmem->size == 0)
+ err = __reserved_mem_alloc_size(node, rmem->name,
+ &rmem->base, &rmem->size);
++ if (err == 0)
++ __reserved_mem_init_node(rmem);
+ }
+ }
+diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
+index bd02ca7..146e4ff 100644
+--- a/include/asm-generic/vmlinux.lds.h
++++ b/include/asm-generic/vmlinux.lds.h
+@@ -167,6 +167,16 @@
+ #define CLK_OF_TABLES()
+ #endif
+
++#ifdef CONFIG_OF_RESERVED_MEM
++#define RESERVEDMEM_OF_TABLES() \
++ . = ALIGN(8); \
++ VMLINUX_SYMBOL(__reservedmem_of_table) = .; \
++ *(__reservedmem_of_table) \
++ *(__reservedmem_of_table_end)
++#else
++#define RESERVEDMEM_OF_TABLES()
++#endif
++
+ #ifdef CONFIG_SMP
+ #define CPU_METHOD_OF_TABLES() . = ALIGN(8); \
+ VMLINUX_SYMBOL(__cpu_method_of_table_begin) = .; \
+@@ -499,6 +509,7 @@
+ TRACE_SYSCALLS() \
+ MEM_DISCARD(init.rodata) \
+ CLK_OF_TABLES() \
++ RESERVEDMEM_OF_TABLES() \
+ CLKSRC_OF_TABLES() \
+ CPU_METHOD_OF_TABLES() \
+ KERNEL_DTB() \
+diff --git a/include/linux/of_reserved_mem.h b/include/linux/of_reserved_mem.h
+index 89226ed..9b1fbb7 100644
+--- a/include/linux/of_reserved_mem.h
++++ b/include/linux/of_reserved_mem.h
+@@ -1,21 +1,53 @@
+ #ifndef __OF_RESERVED_MEM_H
+ #define __OF_RESERVED_MEM_H
+
++struct device;
++struct of_phandle_args;
++struct reserved_mem_ops;
++
+ struct reserved_mem {
+ const char *name;
+ unsigned long fdt_node;
++ const struct reserved_mem_ops *ops;
+ phys_addr_t base;
+ phys_addr_t size;
++ void *priv;
++};
++
++struct reserved_mem_ops {
++ void (*device_init)(struct reserved_mem *rmem,
++ struct device *dev);
++ void (*device_release)(struct reserved_mem *rmem,
++ struct device *dev);
+ };
+
++typedef int (*reservedmem_of_init_fn)(struct reserved_mem *rmem,
++ unsigned long node, const char *uname);
++
+ #ifdef CONFIG_OF_RESERVED_MEM
+ void fdt_init_reserved_mem(void);
+ void fdt_reserved_mem_save_node(unsigned long node, const char *uname,
+ phys_addr_t base, phys_addr_t size);
++
++#define RESERVEDMEM_OF_DECLARE(name, compat, init) \
++ static const struct of_device_id __reservedmem_of_table_##name \
++ __used __section(__reservedmem_of_table) \
++ = { .compatible = compat, \
++ .data = (init == (reservedmem_of_init_fn)NULL) ? \
++ init : init }
++
+ #else
+ static inline void fdt_init_reserved_mem(void) { }
+ static inline void fdt_reserved_mem_save_node(unsigned long node,
+ const char *uname, phys_addr_t base, phys_addr_t size) { }
++
++#define RESERVEDMEM_OF_DECLARE(name, compat, init) \
++ static const struct of_device_id __reservedmem_of_table_##name \
++ __attribute__((unused)) \
++ = { .compatible = compat, \
++ .data = (init == (reservedmem_of_init_fn)NULL) ? \
++ init : init }
++
+ #endif
+
+ #endif /* __OF_RESERVED_MEM_H */
+--
+1.7.10.4
+