Commit | Line | Data |
---|---|---|
d9c452f4 | 1 | /* |
0f75a96b KD |
2 | * Copyright (C) 2010-2011 Samsung Electronics Co.Ltd |
3 | * | |
4 | * Base S5P MFC resource and device definitions | |
5 | * | |
6 | * This program is free software; you can redistribute it and/or modify | |
7 | * it under the terms of the GNU General Public License version 2 as | |
8 | * published by the Free Software Foundation. | |
9 | */ | |
10 | ||
0f75a96b KD |
11 | #include <linux/kernel.h> |
12 | #include <linux/interrupt.h> | |
13 | #include <linux/platform_device.h> | |
14 | #include <linux/dma-mapping.h> | |
15 | #include <linux/memblock.h> | |
16 | #include <linux/ioport.h> | |
2eae613b AK |
17 | #include <linux/of_fdt.h> |
18 | #include <linux/of.h> | |
0f75a96b | 19 | |
07fbe13d TF |
20 | static struct platform_device s5p_device_mfc_l; |
21 | static struct platform_device s5p_device_mfc_r; | |
d78c16cc TF |
22 | |
23 | struct s5p_mfc_dt_meminfo { | |
24 | unsigned long loff; | |
25 | unsigned long lsize; | |
26 | unsigned long roff; | |
27 | unsigned long rsize; | |
28 | char *compatible; | |
29 | }; | |
f76da510 | 30 | |
0f75a96b KD |
31 | struct s5p_mfc_reserved_mem { |
32 | phys_addr_t base; | |
33 | unsigned long size; | |
34 | struct device *dev; | |
35 | }; | |
36 | ||
37 | static struct s5p_mfc_reserved_mem s5p_mfc_mem[2] __initdata; | |
38 | ||
07fbe13d | 39 | |
d78c16cc | 40 | static void __init s5p_mfc_reserve_mem(phys_addr_t rbase, unsigned int rsize, |
0f75a96b KD |
41 | phys_addr_t lbase, unsigned int lsize) |
42 | { | |
43 | int i; | |
44 | ||
45 | s5p_mfc_mem[0].dev = &s5p_device_mfc_r.dev; | |
46 | s5p_mfc_mem[0].base = rbase; | |
47 | s5p_mfc_mem[0].size = rsize; | |
48 | ||
49 | s5p_mfc_mem[1].dev = &s5p_device_mfc_l.dev; | |
50 | s5p_mfc_mem[1].base = lbase; | |
51 | s5p_mfc_mem[1].size = lsize; | |
52 | ||
53 | for (i = 0; i < ARRAY_SIZE(s5p_mfc_mem); i++) { | |
54 | struct s5p_mfc_reserved_mem *area = &s5p_mfc_mem[i]; | |
55 | if (memblock_remove(area->base, area->size)) { | |
56 | printk(KERN_ERR "Failed to reserve memory for MFC device (%ld bytes at 0x%08lx)\n", | |
57 | area->size, (unsigned long) area->base); | |
58 | area->base = 0; | |
59 | } | |
60 | } | |
61 | } | |
62 | ||
8b3e8bbd | 63 | int __init s5p_fdt_alloc_mfc_mem(unsigned long node, const char *uname, |
2eae613b AK |
64 | int depth, void *data) |
65 | { | |
9d0c4dfe RH |
66 | const __be32 *prop; |
67 | int len; | |
8b3e8bbd | 68 | struct s5p_mfc_dt_meminfo mfc_mem; |
2eae613b AK |
69 | |
70 | if (!data) | |
71 | return 0; | |
72 | ||
8b3e8bbd | 73 | if (!of_flat_dt_is_compatible(node, data)) |
2eae613b AK |
74 | return 0; |
75 | ||
76 | prop = of_get_flat_dt_prop(node, "samsung,mfc-l", &len); | |
77 | if (!prop || (len != 2 * sizeof(unsigned long))) | |
78 | return 0; | |
79 | ||
8b3e8bbd TB |
80 | mfc_mem.loff = be32_to_cpu(prop[0]); |
81 | mfc_mem.lsize = be32_to_cpu(prop[1]); | |
2eae613b AK |
82 | |
83 | prop = of_get_flat_dt_prop(node, "samsung,mfc-r", &len); | |
84 | if (!prop || (len != 2 * sizeof(unsigned long))) | |
85 | return 0; | |
86 | ||
8b3e8bbd TB |
87 | mfc_mem.roff = be32_to_cpu(prop[0]); |
88 | mfc_mem.rsize = be32_to_cpu(prop[1]); | |
89 | ||
90 | s5p_mfc_reserve_mem(mfc_mem.roff, mfc_mem.rsize, | |
91 | mfc_mem.loff, mfc_mem.lsize); | |
2eae613b AK |
92 | |
93 | return 1; | |
94 | } |