162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * File: arch/arm/plat-omap/fb.c
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Framebuffer device registration for TI OMAP platforms
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Copyright (C) 2006 Nokia Corporation
862306a36Sopenharmony_ci * Author: Imre Deak <imre.deak@nokia.com>
962306a36Sopenharmony_ci */
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <linux/module.h>
1262306a36Sopenharmony_ci#include <linux/kernel.h>
1362306a36Sopenharmony_ci#include <linux/mm.h>
1462306a36Sopenharmony_ci#include <linux/init.h>
1562306a36Sopenharmony_ci#include <linux/platform_device.h>
1662306a36Sopenharmony_ci#include <linux/memblock.h>
1762306a36Sopenharmony_ci#include <linux/io.h>
1862306a36Sopenharmony_ci#include <linux/omapfb.h>
1962306a36Sopenharmony_ci#include <linux/dma-mapping.h>
2062306a36Sopenharmony_ci#include <linux/irq.h>
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci#include <asm/mach/map.h>
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci#include "irqs.h"
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_FB_OMAP)
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_cistatic bool omapfb_lcd_configured;
2962306a36Sopenharmony_cistatic struct omapfb_platform_data omapfb_config;
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_cistatic u64 omap_fb_dma_mask = ~(u32)0;
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_cistatic struct resource omap_fb_resources[] = {
3462306a36Sopenharmony_ci	{
3562306a36Sopenharmony_ci		.name  = "irq",
3662306a36Sopenharmony_ci		.start = INT_LCD_CTRL,
3762306a36Sopenharmony_ci		.flags = IORESOURCE_IRQ,
3862306a36Sopenharmony_ci	},
3962306a36Sopenharmony_ci	{
4062306a36Sopenharmony_ci		.name  = "irq",
4162306a36Sopenharmony_ci		.start = INT_SOSSI_MATCH,
4262306a36Sopenharmony_ci		.flags = IORESOURCE_IRQ,
4362306a36Sopenharmony_ci	},
4462306a36Sopenharmony_ci};
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_cistatic struct platform_device omap_fb_device = {
4762306a36Sopenharmony_ci	.name		= "omapfb",
4862306a36Sopenharmony_ci	.id		= -1,
4962306a36Sopenharmony_ci	.dev = {
5062306a36Sopenharmony_ci		.dma_mask		= &omap_fb_dma_mask,
5162306a36Sopenharmony_ci		.coherent_dma_mask	= DMA_BIT_MASK(32),
5262306a36Sopenharmony_ci		.platform_data		= &omapfb_config,
5362306a36Sopenharmony_ci	},
5462306a36Sopenharmony_ci	.num_resources = ARRAY_SIZE(omap_fb_resources),
5562306a36Sopenharmony_ci	.resource = omap_fb_resources,
5662306a36Sopenharmony_ci};
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_civoid __init omapfb_set_lcd_config(const struct omap_lcd_config *config)
5962306a36Sopenharmony_ci{
6062306a36Sopenharmony_ci	omapfb_config.lcd = *config;
6162306a36Sopenharmony_ci	omapfb_lcd_configured = true;
6262306a36Sopenharmony_ci}
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_cistatic int __init omap_init_fb(void)
6562306a36Sopenharmony_ci{
6662306a36Sopenharmony_ci	/*
6762306a36Sopenharmony_ci	 * If the board file has not set the lcd config with
6862306a36Sopenharmony_ci	 * omapfb_set_lcd_config(), don't bother registering the omapfb device
6962306a36Sopenharmony_ci	 */
7062306a36Sopenharmony_ci	if (!omapfb_lcd_configured)
7162306a36Sopenharmony_ci		return 0;
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci	return platform_device_register(&omap_fb_device);
7462306a36Sopenharmony_ci}
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ciarch_initcall(omap_init_fb);
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ci#else
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_civoid __init omapfb_set_lcd_config(const struct omap_lcd_config *config)
8162306a36Sopenharmony_ci{
8262306a36Sopenharmony_ci}
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci#endif
85