|
15 | 15 |
|
16 | 16 | #include <drm/drm_atomic.h>
|
17 | 17 | #include <drm/drm_atomic_helper.h>
|
| 18 | +#include <drm/drm_blend.h> |
18 | 19 | #include <drm/drm_drv.h>
|
19 | 20 | #include <drm/drm_edid.h>
|
20 | 21 | #include <drm/drm_fb_dma_helper.h>
|
@@ -259,10 +260,15 @@ static int vc4_txp_connector_atomic_check(struct drm_connector *conn,
|
259 | 260 | crtc_state = drm_atomic_get_new_crtc_state(state, conn_state->crtc);
|
260 | 261 |
|
261 | 262 | fb = conn_state->writeback_job->fb;
|
262 |
| - if (fb->width != crtc_state->mode.hdisplay || |
263 |
| - fb->height != crtc_state->mode.vdisplay) { |
264 |
| - DRM_DEBUG_KMS("Invalid framebuffer size %ux%u\n", |
265 |
| - fb->width, fb->height); |
| 263 | + if ((conn_state->rotation == DRM_MODE_ROTATE_0 && |
| 264 | + fb->width != crtc_state->mode.hdisplay && |
| 265 | + fb->height != crtc_state->mode.vdisplay) || |
| 266 | + (conn_state->rotation == (DRM_MODE_ROTATE_0 | DRM_MODE_TRANSPOSE) && |
| 267 | + fb->width != crtc_state->mode.vdisplay && |
| 268 | + fb->height != crtc_state->mode.hdisplay)) { |
| 269 | + DRM_DEBUG_KMS("Invalid framebuffer size %ux%u vs mode %ux%u\n", |
| 270 | + fb->width, fb->height, |
| 271 | + crtc_state->mode.hdisplay, crtc_state->mode.vdisplay); |
266 | 272 | return -EINVAL;
|
267 | 273 | }
|
268 | 274 |
|
@@ -330,6 +336,9 @@ static void vc4_txp_connector_atomic_commit(struct drm_connector *conn,
|
330 | 336 | */
|
331 | 337 | ctrl |= TXP_ALPHA_INVERT;
|
332 | 338 |
|
| 339 | + if (conn_state->rotation & DRM_MODE_TRANSPOSE) |
| 340 | + ctrl |= TXP_TRANSPOSE; |
| 341 | + |
333 | 342 | if (!drm_dev_enter(drm, &idx))
|
334 | 343 | return;
|
335 | 344 |
|
@@ -608,6 +617,10 @@ static int vc4_txp_bind(struct device *dev, struct device *master, void *data)
|
608 | 617 | if (ret)
|
609 | 618 | return ret;
|
610 | 619 |
|
| 620 | + drm_connector_create_rotation_property(&txp->connector.base, DRM_MODE_ROTATE_0, |
| 621 | + DRM_MODE_ROTATE_0 | |
| 622 | + DRM_MODE_TRANSPOSE); |
| 623 | + |
611 | 624 | ret = devm_request_irq(dev, irq, vc4_txp_interrupt, 0,
|
612 | 625 | dev_name(dev), txp);
|
613 | 626 | if (ret)
|
|
0 commit comments