xref: /openbmc/linux/arch/arm/mach-omap2/fb.c (revision 1a59d1b8)
11a59d1b8SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later
216d60bb8STony Lindgren /*
316d60bb8STony Lindgren  * Framebuffer device registration for TI OMAP platforms
416d60bb8STony Lindgren  *
516d60bb8STony Lindgren  * Copyright (C) 2006 Nokia Corporation
616d60bb8STony Lindgren  * Author: Imre Deak <imre.deak@nokia.com>
716d60bb8STony Lindgren  */
816d60bb8STony Lindgren 
916d60bb8STony Lindgren #include <linux/module.h>
1016d60bb8STony Lindgren #include <linux/kernel.h>
1116d60bb8STony Lindgren #include <linux/mm.h>
1216d60bb8STony Lindgren #include <linux/init.h>
1316d60bb8STony Lindgren #include <linux/platform_device.h>
1416d60bb8STony Lindgren #include <linux/memblock.h>
1516d60bb8STony Lindgren #include <linux/io.h>
1616d60bb8STony Lindgren #include <linux/omapfb.h>
1716d60bb8STony Lindgren #include <linux/dma-mapping.h>
1816d60bb8STony Lindgren 
1916d60bb8STony Lindgren #include <asm/mach/map.h>
2016d60bb8STony Lindgren 
2116d60bb8STony Lindgren #include "soc.h"
22fc8df752SArchit Taneja #include "display.h"
2316d60bb8STony Lindgren 
2416d60bb8STony Lindgren #ifdef CONFIG_OMAP2_VRFB
2516d60bb8STony Lindgren 
2616d60bb8STony Lindgren /*
2716d60bb8STony Lindgren  * The first memory resource is the register region for VRFB,
2816d60bb8STony Lindgren  * the rest are VRFB virtual memory areas for each VRFB context.
2916d60bb8STony Lindgren  */
3016d60bb8STony Lindgren 
3116d60bb8STony Lindgren static const struct resource omap2_vrfb_resources[] = {
3216d60bb8STony Lindgren 	DEFINE_RES_MEM_NAMED(0x68008000u, 0x40, "vrfb-regs"),
3316d60bb8STony Lindgren 	DEFINE_RES_MEM_NAMED(0x70000000u, 0x4000000, "vrfb-area-0"),
3416d60bb8STony Lindgren 	DEFINE_RES_MEM_NAMED(0x74000000u, 0x4000000, "vrfb-area-1"),
3516d60bb8STony Lindgren 	DEFINE_RES_MEM_NAMED(0x78000000u, 0x4000000, "vrfb-area-2"),
3616d60bb8STony Lindgren 	DEFINE_RES_MEM_NAMED(0x7c000000u, 0x4000000, "vrfb-area-3"),
3716d60bb8STony Lindgren };
3816d60bb8STony Lindgren 
3916d60bb8STony Lindgren static const struct resource omap3_vrfb_resources[] = {
4016d60bb8STony Lindgren 	DEFINE_RES_MEM_NAMED(0x6C000180u, 0xc0, "vrfb-regs"),
4116d60bb8STony Lindgren 	DEFINE_RES_MEM_NAMED(0x70000000u, 0x4000000, "vrfb-area-0"),
4216d60bb8STony Lindgren 	DEFINE_RES_MEM_NAMED(0x74000000u, 0x4000000, "vrfb-area-1"),
4316d60bb8STony Lindgren 	DEFINE_RES_MEM_NAMED(0x78000000u, 0x4000000, "vrfb-area-2"),
4416d60bb8STony Lindgren 	DEFINE_RES_MEM_NAMED(0x7c000000u, 0x4000000, "vrfb-area-3"),
4516d60bb8STony Lindgren 	DEFINE_RES_MEM_NAMED(0xe0000000u, 0x4000000, "vrfb-area-4"),
4616d60bb8STony Lindgren 	DEFINE_RES_MEM_NAMED(0xe4000000u, 0x4000000, "vrfb-area-5"),
4716d60bb8STony Lindgren 	DEFINE_RES_MEM_NAMED(0xe8000000u, 0x4000000, "vrfb-area-6"),
4816d60bb8STony Lindgren 	DEFINE_RES_MEM_NAMED(0xec000000u, 0x4000000, "vrfb-area-7"),
4916d60bb8STony Lindgren 	DEFINE_RES_MEM_NAMED(0xf0000000u, 0x4000000, "vrfb-area-8"),
5016d60bb8STony Lindgren 	DEFINE_RES_MEM_NAMED(0xf4000000u, 0x4000000, "vrfb-area-9"),
5116d60bb8STony Lindgren 	DEFINE_RES_MEM_NAMED(0xf8000000u, 0x4000000, "vrfb-area-10"),
5216d60bb8STony Lindgren 	DEFINE_RES_MEM_NAMED(0xfc000000u, 0x4000000, "vrfb-area-11"),
5316d60bb8STony Lindgren };
5416d60bb8STony Lindgren 
omap_init_vrfb(void)55fc8df752SArchit Taneja int __init omap_init_vrfb(void)
5616d60bb8STony Lindgren {
5716d60bb8STony Lindgren 	struct platform_device *pdev;
5816d60bb8STony Lindgren 	const struct resource *res;
5916d60bb8STony Lindgren 	unsigned int num_res;
6016d60bb8STony Lindgren 
6116d60bb8STony Lindgren 	if (cpu_is_omap24xx()) {
6216d60bb8STony Lindgren 		res = omap2_vrfb_resources;
6316d60bb8STony Lindgren 		num_res = ARRAY_SIZE(omap2_vrfb_resources);
6416d60bb8STony Lindgren 	} else if (cpu_is_omap34xx()) {
6516d60bb8STony Lindgren 		res = omap3_vrfb_resources;
6616d60bb8STony Lindgren 		num_res = ARRAY_SIZE(omap3_vrfb_resources);
6716d60bb8STony Lindgren 	} else {
6816d60bb8STony Lindgren 		return 0;
6916d60bb8STony Lindgren 	}
7016d60bb8STony Lindgren 
7116d60bb8STony Lindgren 	pdev = platform_device_register_resndata(NULL, "omapvrfb", -1,
7216d60bb8STony Lindgren 			res, num_res, NULL, 0);
7316d60bb8STony Lindgren 
7487a2028fSNicholas Krause 	return PTR_ERR_OR_ZERO(pdev);
7516d60bb8STony Lindgren }
76fc8df752SArchit Taneja #else
omap_init_vrfb(void)77fc8df752SArchit Taneja int __init omap_init_vrfb(void) { return 0; }
7816d60bb8STony Lindgren #endif
7916d60bb8STony Lindgren 
80502ad2a6SJavier Martinez Canillas #if IS_ENABLED(CONFIG_FB_OMAP2)
8116d60bb8STony Lindgren 
8216d60bb8STony Lindgren static u64 omap_fb_dma_mask = ~(u32)0;
8316d60bb8STony Lindgren static struct omapfb_platform_data omapfb_config;
8416d60bb8STony Lindgren 
8516d60bb8STony Lindgren static struct platform_device omap_fb_device = {
8616d60bb8STony Lindgren 	.name		= "omapfb",
8716d60bb8STony Lindgren 	.id		= -1,
8816d60bb8STony Lindgren 	.dev = {
8916d60bb8STony Lindgren 		.dma_mask		= &omap_fb_dma_mask,
9016d60bb8STony Lindgren 		.coherent_dma_mask	= DMA_BIT_MASK(32),
9116d60bb8STony Lindgren 		.platform_data		= &omapfb_config,
9216d60bb8STony Lindgren 	},
9316d60bb8STony Lindgren 	.num_resources = 0,
9416d60bb8STony Lindgren };
9516d60bb8STony Lindgren 
omap_init_fb(void)96fc8df752SArchit Taneja int __init omap_init_fb(void)
9716d60bb8STony Lindgren {
9816d60bb8STony Lindgren 	return platform_device_register(&omap_fb_device);
9916d60bb8STony Lindgren }
100fc8df752SArchit Taneja #else
omap_init_fb(void)101fc8df752SArchit Taneja int __init omap_init_fb(void) { return 0; }
10216d60bb8STony Lindgren #endif
103