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