upload tizen1.0 source
[kernel/linux-2.6.36.git] / arch / arm / plat-s5p / bootmem.c
1 /* linux/arch/arm/plat-s5p/bootmem.c
2  *
3  * Copyright (c) 2009 Samsung Electronics Co., Ltd.
4  *              http://www.samsung.com/
5  *
6  * Bootmem helper functions
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 as
10  * published by the Free Software Foundation.
11 */
12
13 #include <linux/mm.h>
14 #include <linux/bootmem.h>
15 #include <linux/swap.h>
16 #include <asm/setup.h>
17 #include <linux/io.h>
18 #include <mach/memory.h>
19 #include <plat/media.h>
20 #include <mach/media.h>
21 #include <linux/memblock.h>
22
23 extern struct s5p_media_device media_devs[];
24 extern int nr_media_devs;
25
26 static struct s5p_media_device *s5p_get_media_device(int dev_id, int bank)
27 {
28         struct s5p_media_device *mdev = NULL;
29         int i = 0, found = 0, nr_devs;
30
31         nr_devs = nr_media_devs;
32
33         if (dev_id < 0)
34                 return NULL;
35
36         while (!found && (i < nr_devs)) {
37                 mdev = &media_devs[i];
38                 if (mdev->id == dev_id && mdev->bank == bank)
39                         found = 1;
40                 else
41                         i++;
42         }
43
44         if (!found)
45                 mdev = NULL;
46
47         return mdev;
48 }
49
50 dma_addr_t s5p_get_media_memory_bank(int dev_id, int bank)
51 {
52         struct s5p_media_device *mdev;
53
54         mdev = s5p_get_media_device(dev_id, bank);
55         if (!mdev) {
56                 printk(KERN_ERR "invalid media device\n");
57                 return 0;
58         }
59
60         if (!mdev->paddr) {
61                 printk(KERN_ERR "no memory for %s\n", mdev->name);
62                 return 0;
63         }
64
65         return mdev->paddr;
66 }
67 EXPORT_SYMBOL(s5p_get_media_memory_bank);
68
69 size_t s5p_get_media_memsize_bank(int dev_id, int bank)
70 {
71         struct s5p_media_device *mdev;
72
73         mdev = s5p_get_media_device(dev_id, bank);
74         if (!mdev) {
75                 printk(KERN_ERR "invalid media device\n");
76                 return 0;
77         }
78
79         return mdev->memsize;
80 }
81 EXPORT_SYMBOL(s5p_get_media_memsize_bank);
82
83 void s5p_reserve_bootmem(void)
84 {
85         struct s5p_media_device *mdev;
86         int i, nr_devs;
87         unsigned long mdev_end = 0;
88
89         nr_devs = nr_media_devs;
90
91         for (i = 0; i < nr_devs; i++) {
92                 mdev = &media_devs[i];
93                 if (mdev->memsize <= 0)
94                         continue;
95
96                 if (mdev->paddr) {
97                         memblock_reserve(mdev->paddr, mdev->memsize);
98                 } else {
99                         if (i == 0) {
100                                 mdev_end = meminfo.bank[mdev->bank].start + 
101                                                 meminfo.bank[mdev->bank].size;
102                         }
103                         mdev->paddr = mdev_end - mdev->memsize;
104                         memblock_reserve(mdev->paddr, mdev->memsize);
105                         mdev_end = mdev->paddr;
106                 }
107
108                 printk(KERN_INFO "s5pv310: %lu bytes system memory reserved "
109                         "for %s at 0x%08x\n", (unsigned long) mdev->memsize,
110                         mdev->name, mdev->paddr);
111         }
112 }
113
114 /* FIXME: temporary implementation to avoid compile error */
115 int dma_needs_bounce(struct device *dev, dma_addr_t addr, size_t size)
116 {
117         return 0;
118 }
119
120