summaryrefslogtreecommitdiff
path: root/drivers/gpu
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/sysfb/corebootdrm.c30
1 files changed, 26 insertions, 4 deletions
diff --git a/drivers/gpu/drm/sysfb/corebootdrm.c b/drivers/gpu/drm/sysfb/corebootdrm.c
index 745318580a5d..5dc6f3c76f7b 100644
--- a/drivers/gpu/drm/sysfb/corebootdrm.c
+++ b/drivers/gpu/drm/sysfb/corebootdrm.c
@@ -110,6 +110,26 @@ static phys_addr_t corebootdrm_get_address_fb(struct drm_device *dev, resource_s
return fb->physical_address;
}
+static enum drm_panel_orientation corebootdrm_get_orientation_fb(struct drm_device *dev,
+ const struct lb_framebuffer *fb)
+{
+ if (!LB_FRAMEBUFFER_HAS_ORIENTATION(fb))
+ return DRM_MODE_PANEL_ORIENTATION_UNKNOWN;
+
+ switch (fb->orientation) {
+ case LB_FRAMEBUFFER_ORIENTATION_NORMAL:
+ return DRM_MODE_PANEL_ORIENTATION_NORMAL;
+ case LB_FRAMEBUFFER_ORIENTATION_BOTTOM_UP:
+ return DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP;
+ case LB_FRAMEBUFFER_ORIENTATION_LEFT_UP:
+ return DRM_MODE_PANEL_ORIENTATION_LEFT_UP;
+ case LB_FRAMEBUFFER_ORIENTATION_RIGHT_UP:
+ return DRM_MODE_PANEL_ORIENTATION_RIGHT_UP;
+ }
+
+ return DRM_MODE_PANEL_ORIENTATION_UNKNOWN;
+}
+
/*
* Simple Framebuffer device
*/
@@ -168,7 +188,8 @@ static const struct drm_mode_config_funcs corebootdrm_mode_config_funcs = {
DRM_SYSFB_MODE_CONFIG_FUNCS,
};
-static int corebootdrm_mode_config_init(struct corebootdrm_device *cdev)
+static int corebootdrm_mode_config_init(struct corebootdrm_device *cdev,
+ enum drm_panel_orientation orientation)
{
struct drm_sysfb_device *sysfb = &cdev->sysfb;
struct drm_device *dev = &sysfb->dev;
@@ -234,8 +255,7 @@ static int corebootdrm_mode_config_init(struct corebootdrm_device *cdev)
if (ret)
return ret;
drm_connector_helper_add(connector, &corebootdrm_connector_helper_funcs);
- drm_connector_set_panel_orientation_with_quirk(connector,
- DRM_MODE_PANEL_ORIENTATION_UNKNOWN,
+ drm_connector_set_panel_orientation_with_quirk(connector, orientation,
width, height);
ret = drm_connector_attach_encoder(connector, encoder);
@@ -276,6 +296,7 @@ static int corebootdrm_probe(struct platform_device *pdev)
int width, height, pitch;
resource_size_t size;
phys_addr_t address;
+ enum drm_panel_orientation orientation;
struct resource *res, *mem = NULL;
struct resource aperture;
void __iomem *screen_base;
@@ -320,6 +341,7 @@ static int corebootdrm_probe(struct platform_device *pdev)
address = corebootdrm_get_address_fb(dev, size, fb);
if (!address)
return -EINVAL;
+ orientation = corebootdrm_get_orientation_fb(dev, fb);
sysfb->fb_mode = drm_sysfb_mode(width, height, 0, 0);
sysfb->fb_format = format;
@@ -375,7 +397,7 @@ static int corebootdrm_probe(struct platform_device *pdev)
* DRM mode setting and registration
*/
- ret = corebootdrm_mode_config_init(cdev);
+ ret = corebootdrm_mode_config_init(cdev, orientation);
if (ret)
return ret;