diff options
author | Matt Turner <mattst88@gmail.com> | 2010-07-05 15:43:01 -0400 |
---|---|---|
committer | Matt Turner <mattst88@gmail.com> | 2010-08-13 19:49:50 -0400 |
commit | 1e6b77af0ec7dc274195718169313f026e40827a (patch) | |
tree | 4c2e737b4d5162484aefd45e8d28b43dd063376f | |
parent | 248befa5a7593ee172a8abc7d3787465b635829f (diff) | |
download | glint-1e6b77af0ec7dc274195718169313f026e40827a.tar.gz |
drm/glint: more CRTC work, fill drm_crtc_helper_funcs
Signed-off-by: Matt Turner <mattst88@gmail.com>
-rw-r--r-- | drivers/gpu/drm/glint/glint_crtc.c | 81 | ||||
-rw-r--r-- | drivers/gpu/drm/glint/glint_drv.h | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/glint/glint_mode.h | 3 |
3 files changed, 91 insertions, 0 deletions
diff --git a/drivers/gpu/drm/glint/glint_crtc.c b/drivers/gpu/drm/glint/glint_crtc.c index 126a0e8e767f0..01f5a5fddfc87 100644 --- a/drivers/gpu/drm/glint/glint_crtc.c +++ b/drivers/gpu/drm/glint/glint_crtc.c @@ -26,6 +26,72 @@ static void glint_crtc_load_lut(struct drm_crtc *crtc) } } +static void glint_crtc_dpms(struct drm_crtc *crtc, int mode) +{ + struct glint_crtc *glint_crtc = to_glint_crtc(crtc); + struct drm_device *dev = crtc->dev; + struct glint_device *gdev = dev->dev_private; + + if (mode == glint_crtc->last_dpms) /* Don't do unnecesary mode changes. */ + return; + + glint_crtc->last_dpms = mode; + + switch (mode) { + case DRM_MODE_DPMS_STANDBY: + case DRM_MODE_DPMS_SUSPEND: + case DRM_MODE_DPMS_OFF: + glint_crtc->enabled = false; + break; + case DRM_MODE_DPMS_ON: + glint_crtc->enabled = true; + glint_crtc_load_lut(crtc); + break; + } +} + +static bool glint_crtc_mode_fixup(struct drm_crtc *crtc, + struct drm_display_mode *mode, + struct drm_display_mode *adjusted_mode) +{ + return true; +} + +static int glint_crtc_mode_set(struct drm_crtc *crtc, + struct drm_display_mode *mode, + struct drm_display_mode *adjusted_mode, + int x, int y, struct drm_framebuffer *old_fb) +{ + /* + struct glint_crtc *glint_crtc = to_glint_crtc(crtc); + + glint_crtc_set_base(crtc, x, y, old_fb); + glint_set_crtc_timing(crtc, adjusted_mode); + glint_set_pll(crtc, adjusted_mode); + */ + return 0; +} + +static void glint_crtc_prepare(struct drm_crtc *crtc) +{ + struct drm_device *dev = crtc->dev; + struct drm_crtc *crtci; + + list_for_each_entry(crtci, &dev->mode_config.crtc_list, head) + glint_crtc_dpms(crtci, DRM_MODE_DPMS_OFF); +} + +static void glint_crtc_commit(struct drm_crtc *crtc) +{ + struct drm_device *dev = crtc->dev; + struct drm_crtc *crtci; + + list_for_each_entry(crtci, &dev->mode_config.crtc_list, head) { + if (crtci->enabled) + glint_crtc_dpms(crtci, DRM_MODE_DPMS_ON); + } +} + static void glint_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green, u16 *blue, uint32_t size) { @@ -64,6 +130,18 @@ static const struct drm_crtc_funcs glint_crtc_funcs = { .destroy = glint_crtc_destroy, }; +static const struct drm_crtc_helper_funcs glint_helper_funcs = { + .dpms = glint_crtc_dpms, + .mode_fixup = glint_crtc_mode_fixup, + .mode_set = glint_crtc_mode_set, + /* + .mode_set_base = glint_crtc_set_base, + */ + .prepare = glint_crtc_prepare, + .commit = glint_crtc_commit, + .load_lut = glint_crtc_load_lut, +}; + void glint_crtc_init(struct drm_device *dev, int index) { struct glint_device *gdev = dev->dev_private; @@ -78,6 +156,7 @@ void glint_crtc_init(struct drm_device *dev, int index) drm_mode_crtc_set_gamma_size(&glint_crtc->base, 256); glint_crtc->crtc_id = index; + glint_crtc->last_dpms = GLINT_DPMS_CLEARED; gdev->mode_info.crtcs[index] = glint_crtc; for (i = 0; i < 256; i++) { @@ -85,4 +164,6 @@ void glint_crtc_init(struct drm_device *dev, int index) glint_crtc->lut_g[i] = i; glint_crtc->lut_b[i] = i; } + + drm_crtc_helper_add(&glint_crtc->base, &glint_helper_funcs); } diff --git a/drivers/gpu/drm/glint/glint_drv.h b/drivers/gpu/drm/glint/glint_drv.h index 5c419f779a8b7..12fd4685a829a 100644 --- a/drivers/gpu/drm/glint/glint_drv.h +++ b/drivers/gpu/drm/glint/glint_drv.h @@ -21,6 +21,13 @@ #define RREG32(reg) ioread32(((void __iomem *)gdev->rmmio) + (reg)) #define WREG32(reg, v) iowrite32(v, ((void __iomem *)gdev->rmmio) + (reg)) +#define WREG_DAC(reg, v) \ + do { \ + WREG8(PM3RD_IndexHigh, ((reg) >> 8) & 0xff); \ + WREG8(PM3RD_IndexLow, (reg) & 0xff); \ + WREG8(PM3RD_IndexedData, (v)); \ + } while (0) + #define MB (1024 * 1024) #include "glint.h" diff --git a/drivers/gpu/drm/glint/glint_mode.h b/drivers/gpu/drm/glint/glint_mode.h index 151bc444ad897..d86e00ad0fbef 100644 --- a/drivers/gpu/drm/glint/glint_mode.h +++ b/drivers/gpu/drm/glint/glint_mode.h @@ -7,12 +7,15 @@ #define GLINT_MAX_FB_HEIGHT 4096 #define GLINT_MAX_FB_WIDTH 4096 +#define GLINT_DPMS_CLEARED (-1) + #define to_glint_crtc(x) container_of(x, struct glint_crtc, base) struct glint_crtc { struct drm_crtc base; u8 lut_r[256], lut_g[256], lut_b[256]; int crtc_id; + int last_dpms; bool enabled; }; |