162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Framebuffer device registration for TI OMAP platforms
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2006 Nokia Corporation
662306a36Sopenharmony_ci * Author: Imre Deak <imre.deak@nokia.com>
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/module.h>
1062306a36Sopenharmony_ci#include <linux/kernel.h>
1162306a36Sopenharmony_ci#include <linux/mm.h>
1262306a36Sopenharmony_ci#include <linux/init.h>
1362306a36Sopenharmony_ci#include <linux/platform_device.h>
1462306a36Sopenharmony_ci#include <linux/memblock.h>
1562306a36Sopenharmony_ci#include <linux/io.h>
1662306a36Sopenharmony_ci#include <linux/omapfb.h>
1762306a36Sopenharmony_ci#include <linux/dma-mapping.h>
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci#include <asm/mach/map.h>
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci#include "soc.h"
2262306a36Sopenharmony_ci#include "display.h"
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci#ifdef CONFIG_OMAP2_VRFB
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci/*
2762306a36Sopenharmony_ci * The first memory resource is the register region for VRFB,
2862306a36Sopenharmony_ci * the rest are VRFB virtual memory areas for each VRFB context.
2962306a36Sopenharmony_ci */
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_cistatic const struct resource omap2_vrfb_resources[] = {
3262306a36Sopenharmony_ci	DEFINE_RES_MEM_NAMED(0x68008000u, 0x40, "vrfb-regs"),
3362306a36Sopenharmony_ci	DEFINE_RES_MEM_NAMED(0x70000000u, 0x4000000, "vrfb-area-0"),
3462306a36Sopenharmony_ci	DEFINE_RES_MEM_NAMED(0x74000000u, 0x4000000, "vrfb-area-1"),
3562306a36Sopenharmony_ci	DEFINE_RES_MEM_NAMED(0x78000000u, 0x4000000, "vrfb-area-2"),
3662306a36Sopenharmony_ci	DEFINE_RES_MEM_NAMED(0x7c000000u, 0x4000000, "vrfb-area-3"),
3762306a36Sopenharmony_ci};
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_cistatic const struct resource omap3_vrfb_resources[] = {
4062306a36Sopenharmony_ci	DEFINE_RES_MEM_NAMED(0x6C000180u, 0xc0, "vrfb-regs"),
4162306a36Sopenharmony_ci	DEFINE_RES_MEM_NAMED(0x70000000u, 0x4000000, "vrfb-area-0"),
4262306a36Sopenharmony_ci	DEFINE_RES_MEM_NAMED(0x74000000u, 0x4000000, "vrfb-area-1"),
4362306a36Sopenharmony_ci	DEFINE_RES_MEM_NAMED(0x78000000u, 0x4000000, "vrfb-area-2"),
4462306a36Sopenharmony_ci	DEFINE_RES_MEM_NAMED(0x7c000000u, 0x4000000, "vrfb-area-3"),
4562306a36Sopenharmony_ci	DEFINE_RES_MEM_NAMED(0xe0000000u, 0x4000000, "vrfb-area-4"),
4662306a36Sopenharmony_ci	DEFINE_RES_MEM_NAMED(0xe4000000u, 0x4000000, "vrfb-area-5"),
4762306a36Sopenharmony_ci	DEFINE_RES_MEM_NAMED(0xe8000000u, 0x4000000, "vrfb-area-6"),
4862306a36Sopenharmony_ci	DEFINE_RES_MEM_NAMED(0xec000000u, 0x4000000, "vrfb-area-7"),
4962306a36Sopenharmony_ci	DEFINE_RES_MEM_NAMED(0xf0000000u, 0x4000000, "vrfb-area-8"),
5062306a36Sopenharmony_ci	DEFINE_RES_MEM_NAMED(0xf4000000u, 0x4000000, "vrfb-area-9"),
5162306a36Sopenharmony_ci	DEFINE_RES_MEM_NAMED(0xf8000000u, 0x4000000, "vrfb-area-10"),
5262306a36Sopenharmony_ci	DEFINE_RES_MEM_NAMED(0xfc000000u, 0x4000000, "vrfb-area-11"),
5362306a36Sopenharmony_ci};
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ciint __init omap_init_vrfb(void)
5662306a36Sopenharmony_ci{
5762306a36Sopenharmony_ci	struct platform_device *pdev;
5862306a36Sopenharmony_ci	const struct resource *res;
5962306a36Sopenharmony_ci	unsigned int num_res;
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci	if (cpu_is_omap24xx()) {
6262306a36Sopenharmony_ci		res = omap2_vrfb_resources;
6362306a36Sopenharmony_ci		num_res = ARRAY_SIZE(omap2_vrfb_resources);
6462306a36Sopenharmony_ci	} else if (cpu_is_omap34xx()) {
6562306a36Sopenharmony_ci		res = omap3_vrfb_resources;
6662306a36Sopenharmony_ci		num_res = ARRAY_SIZE(omap3_vrfb_resources);
6762306a36Sopenharmony_ci	} else {
6862306a36Sopenharmony_ci		return 0;
6962306a36Sopenharmony_ci	}
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci	pdev = platform_device_register_resndata(NULL, "omapvrfb", -1,
7262306a36Sopenharmony_ci			res, num_res, NULL, 0);
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci	return PTR_ERR_OR_ZERO(pdev);
7562306a36Sopenharmony_ci}
7662306a36Sopenharmony_ci#else
7762306a36Sopenharmony_ciint __init omap_init_vrfb(void) { return 0; }
7862306a36Sopenharmony_ci#endif
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_FB_OMAP2)
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_cistatic u64 omap_fb_dma_mask = ~(u32)0;
8362306a36Sopenharmony_cistatic struct omapfb_platform_data omapfb_config;
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_cistatic struct platform_device omap_fb_device = {
8662306a36Sopenharmony_ci	.name		= "omapfb",
8762306a36Sopenharmony_ci	.id		= -1,
8862306a36Sopenharmony_ci	.dev = {
8962306a36Sopenharmony_ci		.dma_mask		= &omap_fb_dma_mask,
9062306a36Sopenharmony_ci		.coherent_dma_mask	= DMA_BIT_MASK(32),
9162306a36Sopenharmony_ci		.platform_data		= &omapfb_config,
9262306a36Sopenharmony_ci	},
9362306a36Sopenharmony_ci	.num_resources = 0,
9462306a36Sopenharmony_ci};
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ciint __init omap_init_fb(void)
9762306a36Sopenharmony_ci{
9862306a36Sopenharmony_ci	return platform_device_register(&omap_fb_device);
9962306a36Sopenharmony_ci}
10062306a36Sopenharmony_ci#else
10162306a36Sopenharmony_ciint __init omap_init_fb(void) { return 0; }
10262306a36Sopenharmony_ci#endif
103