aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatt Turner <mattst88@gmail.com>2010-07-05 15:43:01 -0400
committerMatt Turner <mattst88@gmail.com>2010-08-13 19:49:50 -0400
commit1e6b77af0ec7dc274195718169313f026e40827a (patch)
tree4c2e737b4d5162484aefd45e8d28b43dd063376f
parent248befa5a7593ee172a8abc7d3787465b635829f (diff)
downloadglint-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.c81
-rw-r--r--drivers/gpu/drm/glint/glint_drv.h7
-rw-r--r--drivers/gpu/drm/glint/glint_mode.h3
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;
};