diff options
-rw-r--r-- | drivers/video/fbdev/Kconfig | 1 | ||||
-rw-r--r-- | drivers/video/fbdev/efifb.c | 21 |
2 files changed, 21 insertions, 1 deletions
diff --git a/drivers/video/fbdev/Kconfig b/drivers/video/fbdev/Kconfig index 2f615b7f1c9f..2566cfbdebfb 100644 --- a/drivers/video/fbdev/Kconfig +++ b/drivers/video/fbdev/Kconfig @@ -772,6 +772,7 @@ config FB_VESA config FB_EFI bool "EFI-based Framebuffer Support" depends on (FB = y) && !IA64 && EFI + select DRM_PANEL_ORIENTATION_QUIRKS select FB_CFB_FILLRECT select FB_CFB_COPYAREA select FB_CFB_IMAGEBLIT diff --git a/drivers/video/fbdev/efifb.c b/drivers/video/fbdev/efifb.c index d1bf9c2a78a7..46a4484e3da7 100644 --- a/drivers/video/fbdev/efifb.c +++ b/drivers/video/fbdev/efifb.c @@ -16,6 +16,8 @@ #include <linux/screen_info.h> #include <video/vga.h> #include <asm/efi.h> +#include <drm/drm_utils.h> /* For drm_get_panel_orientation_quirk */ +#include <drm/drm_connector.h> /* For DRM_MODE_PANEL_ORIENTATION_* */ static bool request_mem_succeeded = false; static bool nowc = false; @@ -157,7 +159,7 @@ static u64 bar_offset; static int efifb_probe(struct platform_device *dev) { struct fb_info *info; - int err; + int err, orientation; unsigned int size_vmode; unsigned int size_remap; unsigned int size_total; @@ -329,6 +331,23 @@ static int efifb_probe(struct platform_device *dev) info->fix = efifb_fix; info->flags = FBINFO_FLAG_DEFAULT | FBINFO_MISC_FIRMWARE; + orientation = drm_get_panel_orientation_quirk(efifb_defined.xres, + efifb_defined.yres); + switch (orientation) { + default: + info->fbcon_rotate_hint = FB_ROTATE_UR; + break; + case DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP: + info->fbcon_rotate_hint = FB_ROTATE_UD; + break; + case DRM_MODE_PANEL_ORIENTATION_LEFT_UP: + info->fbcon_rotate_hint = FB_ROTATE_CCW; + break; + case DRM_MODE_PANEL_ORIENTATION_RIGHT_UP: + info->fbcon_rotate_hint = FB_ROTATE_CW; + break; + } + err = sysfs_create_groups(&dev->dev.kobj, efifb_groups); if (err) { pr_err("efifb: cannot add sysfs attrs\n"); |