aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarek Szyprowski2014-02-28 07:42:49 -0600
committerMark Brown2014-08-12 06:42:54 -0500
commit61c2521e81afc2c2286f633e6130d0ffa2b93684 (patch)
tree6ab310a6125cc5c9129611d322317435164ebece
parente337f7e8b0fe7cec6a72fe6f5e3ac09c72b4152d (diff)
downloadkernel-video-61c2521e81afc2c2286f633e6130d0ffa2b93684.tar.gz
kernel-video-61c2521e81afc2c2286f633e6130d0ffa2b93684.tar.xz
kernel-video-61c2521e81afc2c2286f633e6130d0ffa2b93684.zip
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> (cherry picked from commit f618c4703a14672d27bc2ca5d132a844363d6f5f) Signed-off-by: Mark Brown <broonie@linaro.org>
-rw-r--r--drivers/of/of_reserved_mem.c29
-rw-r--r--include/asm-generic/vmlinux.lds.h11
-rw-r--r--include/linux/of_reserved_mem.h32
3 files changed, 72 insertions, 0 deletions
diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c
index 69b81177958..daaaf935911 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,
170 return 0; 170 return 0;
171} 171}
172 172
173static const struct of_device_id __rmem_of_table_sentinel
174 __used __section(__reservedmem_of_table_end);
175
176/**
177 * res_mem_init_node() - call region specific reserved memory init code
178 */
179static int __init __reserved_mem_init_node(struct reserved_mem *rmem)
180{
181 extern const struct of_device_id __reservedmem_of_table[];
182 const struct of_device_id *i;
183
184 for (i = __reservedmem_of_table; i < &__rmem_of_table_sentinel; i++) {
185 reservedmem_of_init_fn initfn = i->data;
186 const char *compat = i->compatible;
187
188 if (!of_flat_dt_is_compatible(rmem->fdt_node, compat))
189 continue;
190
191 if (initfn(rmem, rmem->fdt_node, rmem->name) == 0) {
192 pr_info("Reserved memory: initialized node %s, compatible id %s\n",
193 rmem->name, compat);
194 return 0;
195 }
196 }
197 return -ENOENT;
198}
199
173/** 200/**
174 * fdt_init_reserved_mem - allocate and init all saved reserved memory regions 201 * fdt_init_reserved_mem - allocate and init all saved reserved memory regions
175 */ 202 */
@@ -184,5 +211,7 @@ void __init fdt_init_reserved_mem(void)
184 if (rmem->size == 0) 211 if (rmem->size == 0)
185 err = __reserved_mem_alloc_size(node, rmem->name, 212 err = __reserved_mem_alloc_size(node, rmem->name,
186 &rmem->base, &rmem->size); 213 &rmem->base, &rmem->size);
214 if (err == 0)
215 __reserved_mem_init_node(rmem);
187 } 216 }
188} 217}
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
index bc2121fa913..f10f64fcc81 100644
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -167,6 +167,16 @@
167#define CLK_OF_TABLES() 167#define CLK_OF_TABLES()
168#endif 168#endif
169 169
170#ifdef CONFIG_OF_RESERVED_MEM
171#define RESERVEDMEM_OF_TABLES() \
172 . = ALIGN(8); \
173 VMLINUX_SYMBOL(__reservedmem_of_table) = .; \
174 *(__reservedmem_of_table) \
175 *(__reservedmem_of_table_end)
176#else
177#define RESERVEDMEM_OF_TABLES()
178#endif
179
170#define KERNEL_DTB() \ 180#define KERNEL_DTB() \
171 STRUCT_ALIGN(); \ 181 STRUCT_ALIGN(); \
172 VMLINUX_SYMBOL(__dtb_start) = .; \ 182 VMLINUX_SYMBOL(__dtb_start) = .; \
@@ -490,6 +500,7 @@
490 TRACE_SYSCALLS() \ 500 TRACE_SYSCALLS() \
491 MEM_DISCARD(init.rodata) \ 501 MEM_DISCARD(init.rodata) \
492 CLK_OF_TABLES() \ 502 CLK_OF_TABLES() \
503 RESERVEDMEM_OF_TABLES() \
493 CLKSRC_OF_TABLES() \ 504 CLKSRC_OF_TABLES() \
494 KERNEL_DTB() \ 505 KERNEL_DTB() \
495 IRQCHIP_OF_MATCH_TABLE() 506 IRQCHIP_OF_MATCH_TABLE()
diff --git a/include/linux/of_reserved_mem.h b/include/linux/of_reserved_mem.h
index 89226ed7d95..9b1fbb7f29f 100644
--- a/include/linux/of_reserved_mem.h
+++ b/include/linux/of_reserved_mem.h
@@ -1,21 +1,53 @@
1#ifndef __OF_RESERVED_MEM_H 1#ifndef __OF_RESERVED_MEM_H
2#define __OF_RESERVED_MEM_H 2#define __OF_RESERVED_MEM_H
3 3
4struct device;
5struct of_phandle_args;
6struct reserved_mem_ops;
7
4struct reserved_mem { 8struct reserved_mem {
5 const char *name; 9 const char *name;
6 unsigned long fdt_node; 10 unsigned long fdt_node;
11 const struct reserved_mem_ops *ops;
7 phys_addr_t base; 12 phys_addr_t base;
8 phys_addr_t size; 13 phys_addr_t size;
14 void *priv;
15};
16
17struct reserved_mem_ops {
18 void (*device_init)(struct reserved_mem *rmem,
19 struct device *dev);
20 void (*device_release)(struct reserved_mem *rmem,
21 struct device *dev);
9}; 22};
10 23
24typedef int (*reservedmem_of_init_fn)(struct reserved_mem *rmem,
25 unsigned long node, const char *uname);
26
11#ifdef CONFIG_OF_RESERVED_MEM 27#ifdef CONFIG_OF_RESERVED_MEM
12void fdt_init_reserved_mem(void); 28void fdt_init_reserved_mem(void);
13void fdt_reserved_mem_save_node(unsigned long node, const char *uname, 29void fdt_reserved_mem_save_node(unsigned long node, const char *uname,
14 phys_addr_t base, phys_addr_t size); 30 phys_addr_t base, phys_addr_t size);
31
32#define RESERVEDMEM_OF_DECLARE(name, compat, init) \
33 static const struct of_device_id __reservedmem_of_table_##name \
34 __used __section(__reservedmem_of_table) \
35 = { .compatible = compat, \
36 .data = (init == (reservedmem_of_init_fn)NULL) ? \
37 init : init }
38
15#else 39#else
16static inline void fdt_init_reserved_mem(void) { } 40static inline void fdt_init_reserved_mem(void) { }
17static inline void fdt_reserved_mem_save_node(unsigned long node, 41static inline void fdt_reserved_mem_save_node(unsigned long node,
18 const char *uname, phys_addr_t base, phys_addr_t size) { } 42 const char *uname, phys_addr_t base, phys_addr_t size) { }
43
44#define RESERVEDMEM_OF_DECLARE(name, compat, init) \
45 static const struct of_device_id __reservedmem_of_table_##name \
46 __attribute__((unused)) \
47 = { .compatible = compat, \
48 .data = (init == (reservedmem_of_init_fn)NULL) ? \
49 init : init }
50
19#endif 51#endif
20 52
21#endif /* __OF_RESERVED_MEM_H */ 53#endif /* __OF_RESERVED_MEM_H */