diff options
| author | Patrik Jakobsson <patrik.r.jakobsson@gmail.com> | 2013-07-12 09:30:56 -0400 |
|---|---|---|
| committer | Patrik Jakobsson <patrik.r.jakobsson@gmail.com> | 2013-07-23 19:47:30 -0400 |
| commit | 2e775700a297982a3ffbfe72935982b6fb51e015 (patch) | |
| tree | 0b6cb2a504966997db9f95c715beab4a9e184676 | |
| parent | c9d4959000c0b11c4265af820434b868c4066e0e (diff) | |
drm/gma500: Add generic crtc save/restore funcs
Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
| -rw-r--r-- | drivers/gpu/drm/gma500/gma_display.c | 105 | ||||
| -rw-r--r-- | drivers/gpu/drm/gma500/gma_display.h | 3 |
2 files changed, 108 insertions, 0 deletions
diff --git a/drivers/gpu/drm/gma500/gma_display.c b/drivers/gpu/drm/gma500/gma_display.c index 67d86d8fcd4d..cca40c0b64e4 100644 --- a/drivers/gpu/drm/gma500/gma_display.c +++ b/drivers/gpu/drm/gma500/gma_display.c | |||
| @@ -519,6 +519,111 @@ void gma_crtc_destroy(struct drm_crtc *crtc) | |||
| 519 | kfree(psb_intel_crtc); | 519 | kfree(psb_intel_crtc); |
| 520 | } | 520 | } |
| 521 | 521 | ||
| 522 | /** | ||
| 523 | * Save HW states of given crtc | ||
| 524 | */ | ||
| 525 | void gma_crtc_save(struct drm_crtc *crtc) | ||
| 526 | { | ||
| 527 | struct drm_device *dev = crtc->dev; | ||
| 528 | struct drm_psb_private *dev_priv = dev->dev_private; | ||
| 529 | struct psb_intel_crtc *psb_intel_crtc = to_psb_intel_crtc(crtc); | ||
| 530 | struct psb_intel_crtc_state *crtc_state = psb_intel_crtc->crtc_state; | ||
| 531 | const struct psb_offset *map = &dev_priv->regmap[psb_intel_crtc->pipe]; | ||
| 532 | uint32_t palette_reg; | ||
| 533 | int i; | ||
| 534 | |||
| 535 | if (!crtc_state) { | ||
| 536 | dev_err(dev->dev, "No CRTC state found\n"); | ||
| 537 | return; | ||
| 538 | } | ||
| 539 | |||
| 540 | crtc_state->saveDSPCNTR = REG_READ(map->cntr); | ||
| 541 | crtc_state->savePIPECONF = REG_READ(map->conf); | ||
| 542 | crtc_state->savePIPESRC = REG_READ(map->src); | ||
| 543 | crtc_state->saveFP0 = REG_READ(map->fp0); | ||
| 544 | crtc_state->saveFP1 = REG_READ(map->fp1); | ||
| 545 | crtc_state->saveDPLL = REG_READ(map->dpll); | ||
| 546 | crtc_state->saveHTOTAL = REG_READ(map->htotal); | ||
| 547 | crtc_state->saveHBLANK = REG_READ(map->hblank); | ||
| 548 | crtc_state->saveHSYNC = REG_READ(map->hsync); | ||
| 549 | crtc_state->saveVTOTAL = REG_READ(map->vtotal); | ||
| 550 | crtc_state->saveVBLANK = REG_READ(map->vblank); | ||
| 551 | crtc_state->saveVSYNC = REG_READ(map->vsync); | ||
| 552 | crtc_state->saveDSPSTRIDE = REG_READ(map->stride); | ||
| 553 | |||
| 554 | /* NOTE: DSPSIZE DSPPOS only for psb */ | ||
| 555 | crtc_state->saveDSPSIZE = REG_READ(map->size); | ||
| 556 | crtc_state->saveDSPPOS = REG_READ(map->pos); | ||
| 557 | |||
| 558 | crtc_state->saveDSPBASE = REG_READ(map->base); | ||
| 559 | |||
| 560 | palette_reg = map->palette; | ||
| 561 | for (i = 0; i < 256; ++i) | ||
| 562 | crtc_state->savePalette[i] = REG_READ(palette_reg + (i << 2)); | ||
| 563 | } | ||
| 564 | |||
| 565 | /** | ||
| 566 | * Restore HW states of given crtc | ||
| 567 | */ | ||
| 568 | void gma_crtc_restore(struct drm_crtc *crtc) | ||
| 569 | { | ||
| 570 | struct drm_device *dev = crtc->dev; | ||
| 571 | struct drm_psb_private *dev_priv = dev->dev_private; | ||
| 572 | struct psb_intel_crtc *psb_intel_crtc = to_psb_intel_crtc(crtc); | ||
| 573 | struct psb_intel_crtc_state *crtc_state = psb_intel_crtc->crtc_state; | ||
| 574 | const struct psb_offset *map = &dev_priv->regmap[psb_intel_crtc->pipe]; | ||
| 575 | uint32_t palette_reg; | ||
| 576 | int i; | ||
| 577 | |||
| 578 | if (!crtc_state) { | ||
| 579 | dev_err(dev->dev, "No crtc state\n"); | ||
| 580 | return; | ||
| 581 | } | ||
| 582 | |||
| 583 | if (crtc_state->saveDPLL & DPLL_VCO_ENABLE) { | ||
| 584 | REG_WRITE(map->dpll, | ||
| 585 | crtc_state->saveDPLL & ~DPLL_VCO_ENABLE); | ||
| 586 | REG_READ(map->dpll); | ||
| 587 | udelay(150); | ||
| 588 | } | ||
| 589 | |||
| 590 | REG_WRITE(map->fp0, crtc_state->saveFP0); | ||
| 591 | REG_READ(map->fp0); | ||
| 592 | |||
| 593 | REG_WRITE(map->fp1, crtc_state->saveFP1); | ||
| 594 | REG_READ(map->fp1); | ||
| 595 | |||
| 596 | REG_WRITE(map->dpll, crtc_state->saveDPLL); | ||
| 597 | REG_READ(map->dpll); | ||
| 598 | udelay(150); | ||
| 599 | |||
| 600 | REG_WRITE(map->htotal, crtc_state->saveHTOTAL); | ||
| 601 | REG_WRITE(map->hblank, crtc_state->saveHBLANK); | ||
| 602 | REG_WRITE(map->hsync, crtc_state->saveHSYNC); | ||
| 603 | REG_WRITE(map->vtotal, crtc_state->saveVTOTAL); | ||
| 604 | REG_WRITE(map->vblank, crtc_state->saveVBLANK); | ||
| 605 | REG_WRITE(map->vsync, crtc_state->saveVSYNC); | ||
| 606 | REG_WRITE(map->stride, crtc_state->saveDSPSTRIDE); | ||
| 607 | |||
| 608 | REG_WRITE(map->size, crtc_state->saveDSPSIZE); | ||
| 609 | REG_WRITE(map->pos, crtc_state->saveDSPPOS); | ||
| 610 | |||
| 611 | REG_WRITE(map->src, crtc_state->savePIPESRC); | ||
| 612 | REG_WRITE(map->base, crtc_state->saveDSPBASE); | ||
| 613 | REG_WRITE(map->conf, crtc_state->savePIPECONF); | ||
| 614 | |||
| 615 | gma_wait_for_vblank(dev); | ||
| 616 | |||
| 617 | REG_WRITE(map->cntr, crtc_state->saveDSPCNTR); | ||
| 618 | REG_WRITE(map->base, crtc_state->saveDSPBASE); | ||
| 619 | |||
| 620 | gma_wait_for_vblank(dev); | ||
| 621 | |||
| 622 | palette_reg = map->palette; | ||
| 623 | for (i = 0; i < 256; ++i) | ||
| 624 | REG_WRITE(palette_reg + (i << 2), crtc_state->savePalette[i]); | ||
| 625 | } | ||
| 626 | |||
| 522 | void gma_encoder_prepare(struct drm_encoder *encoder) | 627 | void gma_encoder_prepare(struct drm_encoder *encoder) |
| 523 | { | 628 | { |
| 524 | struct drm_encoder_helper_funcs *encoder_funcs = | 629 | struct drm_encoder_helper_funcs *encoder_funcs = |
diff --git a/drivers/gpu/drm/gma500/gma_display.h b/drivers/gpu/drm/gma500/gma_display.h index 1e7016529d75..8847de069516 100644 --- a/drivers/gpu/drm/gma500/gma_display.h +++ b/drivers/gpu/drm/gma500/gma_display.h | |||
| @@ -81,6 +81,9 @@ extern void gma_crtc_commit(struct drm_crtc *crtc); | |||
| 81 | extern void gma_crtc_disable(struct drm_crtc *crtc); | 81 | extern void gma_crtc_disable(struct drm_crtc *crtc); |
| 82 | extern void gma_crtc_destroy(struct drm_crtc *crtc); | 82 | extern void gma_crtc_destroy(struct drm_crtc *crtc); |
| 83 | 83 | ||
| 84 | extern void gma_crtc_save(struct drm_crtc *crtc); | ||
| 85 | extern void gma_crtc_restore(struct drm_crtc *crtc); | ||
| 86 | |||
| 84 | extern void gma_encoder_prepare(struct drm_encoder *encoder); | 87 | extern void gma_encoder_prepare(struct drm_encoder *encoder); |
| 85 | extern void gma_encoder_commit(struct drm_encoder *encoder); | 88 | extern void gma_encoder_commit(struct drm_encoder *encoder); |
| 86 | extern void gma_encoder_destroy(struct drm_encoder *encoder); | 89 | extern void gma_encoder_destroy(struct drm_encoder *encoder); |
