mirror of
https://github.com/torvalds/linux.git
synced 2024-12-01 08:31:37 +00:00
2874c5fd28
Based on 1 normalized pattern(s): this program is free software you can redistribute it and or modify it under the terms of the gnu general public license as published by the free software foundation either version 2 of the license or at your option any later version extracted by the scancode license scanner the SPDX license identifier GPL-2.0-or-later has been chosen to replace the boilerplate/reference in 3029 file(s). Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Allison Randal <allison@lohutok.net> Cc: linux-spdx@vger.kernel.org Link: https://lkml.kernel.org/r/20190527070032.746973796@linutronix.de Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
71 lines
2.3 KiB
C
71 lines
2.3 KiB
C
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
/*
|
|
* Generic System Framebuffers on x86
|
|
* Copyright (c) 2012-2013 David Herrmann <dh.herrmann@gmail.com>
|
|
*/
|
|
|
|
/*
|
|
* Simple-Framebuffer support for x86 systems
|
|
* Create a platform-device for any available boot framebuffer. The
|
|
* simple-framebuffer platform device is already available on DT systems, so
|
|
* this module parses the global "screen_info" object and creates a suitable
|
|
* platform device compatible with the "simple-framebuffer" DT object. If
|
|
* the framebuffer is incompatible, we instead create a legacy
|
|
* "vesa-framebuffer", "efi-framebuffer" or "platform-framebuffer" device and
|
|
* pass the screen_info as platform_data. This allows legacy drivers
|
|
* to pick these devices up without messing with simple-framebuffer drivers.
|
|
* The global "screen_info" is still valid at all times.
|
|
*
|
|
* If CONFIG_X86_SYSFB is not selected, we never register "simple-framebuffer"
|
|
* platform devices, but only use legacy framebuffer devices for
|
|
* backwards compatibility.
|
|
*
|
|
* TODO: We set the dev_id field of all platform-devices to 0. This allows
|
|
* other x86 OF/DT parsers to create such devices, too. However, they must
|
|
* start at offset 1 for this to work.
|
|
*/
|
|
|
|
#include <linux/err.h>
|
|
#include <linux/init.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/mm.h>
|
|
#include <linux/platform_data/simplefb.h>
|
|
#include <linux/platform_device.h>
|
|
#include <linux/screen_info.h>
|
|
#include <asm/sysfb.h>
|
|
|
|
static __init int sysfb_init(void)
|
|
{
|
|
struct screen_info *si = &screen_info;
|
|
struct simplefb_platform_data mode;
|
|
struct platform_device *pd;
|
|
const char *name;
|
|
bool compatible;
|
|
int ret;
|
|
|
|
sysfb_apply_efi_quirks();
|
|
|
|
/* try to create a simple-framebuffer device */
|
|
compatible = parse_mode(si, &mode);
|
|
if (compatible) {
|
|
ret = create_simplefb(si, &mode);
|
|
if (!ret)
|
|
return 0;
|
|
}
|
|
|
|
/* if the FB is incompatible, create a legacy framebuffer device */
|
|
if (si->orig_video_isVGA == VIDEO_TYPE_EFI)
|
|
name = "efi-framebuffer";
|
|
else if (si->orig_video_isVGA == VIDEO_TYPE_VLFB)
|
|
name = "vesa-framebuffer";
|
|
else
|
|
name = "platform-framebuffer";
|
|
|
|
pd = platform_device_register_resndata(NULL, name, 0,
|
|
NULL, 0, si, sizeof(*si));
|
|
return PTR_ERR_OR_ZERO(pd);
|
|
}
|
|
|
|
/* must execute after PCI subsystem for EFI quirks */
|
|
device_initcall(sysfb_init);
|