summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/firmware/efi/sysfb_efi.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/drivers/firmware/efi/sysfb_efi.c b/drivers/firmware/efi/sysfb_efi.c
index 60495eb3441c..dc4d70b7737c 100644
--- a/drivers/firmware/efi/sysfb_efi.c
+++ b/drivers/firmware/efi/sysfb_efi.c
@@ -231,6 +231,17 @@ static const struct dmi_system_id efifb_dmi_system_table[] __initconst = {
{},
};
+static int __init efifb_swap_width_height(const struct dmi_system_id *id)
+{
+ struct screen_info *si = &screen_info;
+ u32 bpp = __screen_info_lfb_bits_per_pixel(si);
+
+ swap(si->lfb_width, si->lfb_height);
+ si->lfb_linelength = bpp * si->lfb_width / BITS_PER_BYTE;
+
+ return 1;
+}
+
/*
* Some devices have a portrait LCD but advertise a landscape resolution (and
* pitch). We simply swap width and height for these devices so that we can
@@ -248,6 +259,7 @@ static const struct dmi_system_id efifb_dmi_swap_width_height[] __initconst = {
DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "MIIX 310-10ICR"),
DMI_EXACT_MATCH(DMI_BIOS_VERSION, "1HCN44WW"),
},
+ .callback = efifb_swap_width_height,
},
{
/* Lenovo MIIX 320-10ICR with 800x1280 portrait screen */
@@ -256,6 +268,7 @@ static const struct dmi_system_id efifb_dmi_swap_width_height[] __initconst = {
DMI_EXACT_MATCH(DMI_PRODUCT_VERSION,
"Lenovo MIIX 320-10ICR"),
},
+ .callback = efifb_swap_width_height,
},
{
/* Lenovo D330 with 800x1280 or 1200x1920 portrait screen */
@@ -264,6 +277,7 @@ static const struct dmi_system_id efifb_dmi_swap_width_height[] __initconst = {
DMI_EXACT_MATCH(DMI_PRODUCT_VERSION,
"Lenovo ideapad D330-10IGM"),
},
+ .callback = efifb_swap_width_height,
},
{
/* Lenovo IdeaPad Duet 3 10IGL5 with 1200x1920 portrait screen */
@@ -272,6 +286,7 @@ static const struct dmi_system_id efifb_dmi_swap_width_height[] __initconst = {
DMI_EXACT_MATCH(DMI_PRODUCT_VERSION,
"IdeaPad Duet 3 10IGL5"),
},
+ .callback = efifb_swap_width_height,
},
{
/* Lenovo Yoga Book X91F / X91L */
@@ -280,6 +295,7 @@ static const struct dmi_system_id efifb_dmi_swap_width_height[] __initconst = {
/* Non exact match to match F + L versions */
DMI_MATCH(DMI_PRODUCT_NAME, "Lenovo YB1-X91"),
},
+ .callback = efifb_swap_width_height,
},
{},
};
@@ -355,14 +371,8 @@ __init void sysfb_apply_efi_quirks(void)
!(screen_info.capabilities & VIDEO_CAPABILITY_SKIP_QUIRKS))
dmi_check_system(efifb_dmi_system_table);
- if (screen_info.orig_video_isVGA == VIDEO_TYPE_EFI &&
- dmi_check_system(efifb_dmi_swap_width_height)) {
- u32 bpp = __screen_info_lfb_bits_per_pixel(&screen_info);
-
- swap(screen_info.lfb_width, screen_info.lfb_height);
- screen_info.lfb_linelength = bpp * screen_info.lfb_width /
- BITS_PER_BYTE;
- }
+ if (screen_info.orig_video_isVGA == VIDEO_TYPE_EFI)
+ dmi_check_system(efifb_dmi_swap_width_height);
}
__init void sysfb_set_efifb_fwnode(struct platform_device *pd)