summaryrefslogtreecommitdiff
path: root/arch/arm/mach-mx6/board-mx6q_sabrelite.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-mx6/board-mx6q_sabrelite.c')
-rw-r--r--arch/arm/mach-mx6/board-mx6q_sabrelite.c93
1 files changed, 91 insertions, 2 deletions
diff --git a/arch/arm/mach-mx6/board-mx6q_sabrelite.c b/arch/arm/mach-mx6/board-mx6q_sabrelite.c
index e1075fec4b68..338c16ab6a52 100644
--- a/arch/arm/mach-mx6/board-mx6q_sabrelite.c
+++ b/arch/arm/mach-mx6/board-mx6q_sabrelite.c
@@ -45,6 +45,7 @@
#include <linux/fec.h>
#include <linux/memblock.h>
#include <linux/gpio.h>
+#include <linux/ion.h>
#include <linux/etherdevice.h>
#include <linux/regulator/anatop-regulator.h>
#include <linux/regulator/consumer.h>
@@ -791,7 +792,7 @@ static const struct flexcan_platform_data
};
static struct viv_gpu_platform_data imx6q_gpu_pdata __initdata = {
- .reserved_mem_size = SZ_128M,
+ .reserved_mem_size = SZ_128M + SZ_64M,
};
static struct imx_asrc_platform_data imx_asrc_data = {
@@ -904,6 +905,17 @@ static struct imx_ipuv3_platform_data ipu_data[] = {
},
};
+static struct ion_platform_data imx_ion_data = {
+ .nr = 1,
+ .heaps = {
+ {
+ .type = ION_HEAP_TYPE_CARVEOUT,
+ .name = "vpu_ion",
+ .size = SZ_64M,
+ },
+ },
+};
+
static struct fsl_mxc_capture_platform_data capture_data[] = {
{
.csi = 0,
@@ -1128,6 +1140,34 @@ static struct mxc_dvfs_platform_data sabrelite_dvfscore_data = {
static void __init fixup_mxc_board(struct machine_desc *desc, struct tag *tags,
char **cmdline, struct meminfo *mi)
{
+ char *str;
+ struct tag *t;
+ int i = 0;
+ struct ipuv3_fb_platform_data *pdata_fb = sabrelite_fb_data;
+
+ for_each_tag(t, tags) {
+ if (t->hdr.tag == ATAG_CMDLINE) {
+ str = t->u.cmdline.cmdline;
+ str = strstr(str, "fbmem=");
+ if (str != NULL) {
+ str += 6;
+ pdata_fb[i++].res_size[0] = memparse(str, &str);
+ while (*str == ',' &&
+ i < ARRAY_SIZE(sabrelite_fb_data)) {
+ str++;
+ pdata_fb[i++].res_size[0] = memparse(str, &str);
+ }
+ }
+ /* GPU reserved memory */
+ str = t->u.cmdline.cmdline;
+ str = strstr(str, "gpumem=");
+ if (str != NULL) {
+ str += 7;
+ imx6q_gpu_pdata.reserved_mem_size = memparse(str, &str);
+ }
+ break;
+ }
+ }
}
static struct mipi_csi2_platform_data mipi_csi2_pdata = {
@@ -1139,6 +1179,26 @@ static struct mipi_csi2_platform_data mipi_csi2_pdata = {
.pixel_clk = "emi_clk",
};
+#ifdef CONFIG_ANDROID_RAM_CONSOLE
+static struct resource ram_console_resource = {
+ .name = "android ram console",
+ .flags = IORESOURCE_MEM,
+};
+
+static struct platform_device android_ram_console = {
+ .name = "ram_console",
+ .num_resources = 1,
+ .resource = &ram_console_resource,
+};
+
+static int __init imx6x_add_ram_console(void)
+{
+ return platform_device_register(&android_ram_console);
+}
+#else
+#define imx6x_add_ram_console() do {} while (0)
+#endif
+
static int __init caam_setup(char *__unused)
{
caam_enabled = 1;
@@ -1253,6 +1313,9 @@ static void __init mx6_sabrelite_board_init(void)
imx6q_add_dvfs_core(&sabrelite_dvfscore_data);
+ imx6q_add_ion(0, &imx_ion_data,
+ sizeof(imx_ion_data) + sizeof(struct ion_platform_heap));
+
sabrelite_add_device_buttons();
imx6q_add_hdmi_soc();
@@ -1304,9 +1367,18 @@ static struct sys_timer mx6_sabrelite_timer = {
static void __init mx6q_sabrelite_reserve(void)
{
-#if defined(CONFIG_MXC_GPU_VIV) || defined(CONFIG_MXC_GPU_VIV_MODULE)
phys_addr_t phys;
+ int i;
+
+#ifdef CONFIG_ANDROID_RAM_CONSOLE
+ phys = memblock_alloc_base(SZ_128K, SZ_4K, SZ_1G);
+ memblock_remove(phys, SZ_128K);
+ memblock_free(phys, SZ_128K);
+ ram_console_resource.start = phys;
+ ram_console_resource.end = phys + SZ_128K - 1;
+#endif
+#if defined(CONFIG_MXC_GPU_VIV) || defined(CONFIG_MXC_GPU_VIV_MODULE)
if (imx6q_gpu_pdata.reserved_mem_size) {
phys = memblock_alloc_base(imx6q_gpu_pdata.reserved_mem_size,
SZ_4K, SZ_1G);
@@ -1314,6 +1386,23 @@ static void __init mx6q_sabrelite_reserve(void)
imx6q_gpu_pdata.reserved_mem_base = phys;
}
#endif
+
+#if defined(CONFIG_ION)
+ if (imx_ion_data.heaps[0].size) {
+ phys = memblock_alloc(imx_ion_data.heaps[0].size, SZ_4K);
+ memblock_remove(phys, imx_ion_data.heaps[0].size);
+ imx_ion_data.heaps[0].base = phys;
+ }
+#endif
+
+ for (i = 0; i < ARRAY_SIZE(sabrelite_fb_data); i++)
+ if (sabrelite_fb_data[i].res_size[0]) {
+ /* reserve for background buffer */
+ phys = memblock_alloc(sabrelite_fb_data[i].res_size[0],
+ SZ_4K);
+ memblock_remove(phys, sabrelite_fb_data[i].res_size[0]);
+ sabrelite_fb_data[i].res_base[0] = phys;
+ }
}
/*