18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Framebuffer device registration for TI OMAP platforms
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright (C) 2006 Nokia Corporation
68c2ecf20Sopenharmony_ci * Author: Imre Deak <imre.deak@nokia.com>
78c2ecf20Sopenharmony_ci */
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#include <linux/module.h>
108c2ecf20Sopenharmony_ci#include <linux/kernel.h>
118c2ecf20Sopenharmony_ci#include <linux/mm.h>
128c2ecf20Sopenharmony_ci#include <linux/init.h>
138c2ecf20Sopenharmony_ci#include <linux/platform_device.h>
148c2ecf20Sopenharmony_ci#include <linux/memblock.h>
158c2ecf20Sopenharmony_ci#include <linux/io.h>
168c2ecf20Sopenharmony_ci#include <linux/omapfb.h>
178c2ecf20Sopenharmony_ci#include <linux/dma-mapping.h>
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci#include <asm/mach/map.h>
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci#include "soc.h"
228c2ecf20Sopenharmony_ci#include "display.h"
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ci#ifdef CONFIG_OMAP2_VRFB
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ci/*
278c2ecf20Sopenharmony_ci * The first memory resource is the register region for VRFB,
288c2ecf20Sopenharmony_ci * the rest are VRFB virtual memory areas for each VRFB context.
298c2ecf20Sopenharmony_ci */
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_cistatic const struct resource omap2_vrfb_resources[] = {
328c2ecf20Sopenharmony_ci	DEFINE_RES_MEM_NAMED(0x68008000u, 0x40, "vrfb-regs"),
338c2ecf20Sopenharmony_ci	DEFINE_RES_MEM_NAMED(0x70000000u, 0x4000000, "vrfb-area-0"),
348c2ecf20Sopenharmony_ci	DEFINE_RES_MEM_NAMED(0x74000000u, 0x4000000, "vrfb-area-1"),
358c2ecf20Sopenharmony_ci	DEFINE_RES_MEM_NAMED(0x78000000u, 0x4000000, "vrfb-area-2"),
368c2ecf20Sopenharmony_ci	DEFINE_RES_MEM_NAMED(0x7c000000u, 0x4000000, "vrfb-area-3"),
378c2ecf20Sopenharmony_ci};
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_cistatic const struct resource omap3_vrfb_resources[] = {
408c2ecf20Sopenharmony_ci	DEFINE_RES_MEM_NAMED(0x6C000180u, 0xc0, "vrfb-regs"),
418c2ecf20Sopenharmony_ci	DEFINE_RES_MEM_NAMED(0x70000000u, 0x4000000, "vrfb-area-0"),
428c2ecf20Sopenharmony_ci	DEFINE_RES_MEM_NAMED(0x74000000u, 0x4000000, "vrfb-area-1"),
438c2ecf20Sopenharmony_ci	DEFINE_RES_MEM_NAMED(0x78000000u, 0x4000000, "vrfb-area-2"),
448c2ecf20Sopenharmony_ci	DEFINE_RES_MEM_NAMED(0x7c000000u, 0x4000000, "vrfb-area-3"),
458c2ecf20Sopenharmony_ci	DEFINE_RES_MEM_NAMED(0xe0000000u, 0x4000000, "vrfb-area-4"),
468c2ecf20Sopenharmony_ci	DEFINE_RES_MEM_NAMED(0xe4000000u, 0x4000000, "vrfb-area-5"),
478c2ecf20Sopenharmony_ci	DEFINE_RES_MEM_NAMED(0xe8000000u, 0x4000000, "vrfb-area-6"),
488c2ecf20Sopenharmony_ci	DEFINE_RES_MEM_NAMED(0xec000000u, 0x4000000, "vrfb-area-7"),
498c2ecf20Sopenharmony_ci	DEFINE_RES_MEM_NAMED(0xf0000000u, 0x4000000, "vrfb-area-8"),
508c2ecf20Sopenharmony_ci	DEFINE_RES_MEM_NAMED(0xf4000000u, 0x4000000, "vrfb-area-9"),
518c2ecf20Sopenharmony_ci	DEFINE_RES_MEM_NAMED(0xf8000000u, 0x4000000, "vrfb-area-10"),
528c2ecf20Sopenharmony_ci	DEFINE_RES_MEM_NAMED(0xfc000000u, 0x4000000, "vrfb-area-11"),
538c2ecf20Sopenharmony_ci};
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_ciint __init omap_init_vrfb(void)
568c2ecf20Sopenharmony_ci{
578c2ecf20Sopenharmony_ci	struct platform_device *pdev;
588c2ecf20Sopenharmony_ci	const struct resource *res;
598c2ecf20Sopenharmony_ci	unsigned int num_res;
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_ci	if (cpu_is_omap24xx()) {
628c2ecf20Sopenharmony_ci		res = omap2_vrfb_resources;
638c2ecf20Sopenharmony_ci		num_res = ARRAY_SIZE(omap2_vrfb_resources);
648c2ecf20Sopenharmony_ci	} else if (cpu_is_omap34xx()) {
658c2ecf20Sopenharmony_ci		res = omap3_vrfb_resources;
668c2ecf20Sopenharmony_ci		num_res = ARRAY_SIZE(omap3_vrfb_resources);
678c2ecf20Sopenharmony_ci	} else {
688c2ecf20Sopenharmony_ci		return 0;
698c2ecf20Sopenharmony_ci	}
708c2ecf20Sopenharmony_ci
718c2ecf20Sopenharmony_ci	pdev = platform_device_register_resndata(NULL, "omapvrfb", -1,
728c2ecf20Sopenharmony_ci			res, num_res, NULL, 0);
738c2ecf20Sopenharmony_ci
748c2ecf20Sopenharmony_ci	return PTR_ERR_OR_ZERO(pdev);
758c2ecf20Sopenharmony_ci}
768c2ecf20Sopenharmony_ci#else
778c2ecf20Sopenharmony_ciint __init omap_init_vrfb(void) { return 0; }
788c2ecf20Sopenharmony_ci#endif
798c2ecf20Sopenharmony_ci
808c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_FB_OMAP2)
818c2ecf20Sopenharmony_ci
828c2ecf20Sopenharmony_cistatic u64 omap_fb_dma_mask = ~(u32)0;
838c2ecf20Sopenharmony_cistatic struct omapfb_platform_data omapfb_config;
848c2ecf20Sopenharmony_ci
858c2ecf20Sopenharmony_cistatic struct platform_device omap_fb_device = {
868c2ecf20Sopenharmony_ci	.name		= "omapfb",
878c2ecf20Sopenharmony_ci	.id		= -1,
888c2ecf20Sopenharmony_ci	.dev = {
898c2ecf20Sopenharmony_ci		.dma_mask		= &omap_fb_dma_mask,
908c2ecf20Sopenharmony_ci		.coherent_dma_mask	= DMA_BIT_MASK(32),
918c2ecf20Sopenharmony_ci		.platform_data		= &omapfb_config,
928c2ecf20Sopenharmony_ci	},
938c2ecf20Sopenharmony_ci	.num_resources = 0,
948c2ecf20Sopenharmony_ci};
958c2ecf20Sopenharmony_ci
968c2ecf20Sopenharmony_ciint __init omap_init_fb(void)
978c2ecf20Sopenharmony_ci{
988c2ecf20Sopenharmony_ci	return platform_device_register(&omap_fb_device);
998c2ecf20Sopenharmony_ci}
1008c2ecf20Sopenharmony_ci#else
1018c2ecf20Sopenharmony_ciint __init omap_init_fb(void) { return 0; }
1028c2ecf20Sopenharmony_ci#endif
103