diff options
author | Matt Turner <mattst88@gmail.com> | 2010-07-05 17:48:05 -0400 |
---|---|---|
committer | Matt Turner <mattst88@gmail.com> | 2011-01-25 13:27:07 -0500 |
commit | a95c4480c7f249cf9368d0ef6fb5dbb8c74f945c (patch) | |
tree | d876db85833aa1024988a544cdea41f103ab8203 | |
parent | 1e6b77af0ec7dc274195718169313f026e40827a (diff) | |
download | glint-a95c4480c7f249cf9368d0ef6fb5dbb8c74f945c.tar.gz |
drm/glint: initial encoder/dac work, fill in drm_encoder_helper_funcs
Signed-off-by: Matt Turner <mattst88@gmail.com>
-rw-r--r-- | drivers/gpu/drm/glint/Makefile | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/glint/glint_dac.c | 94 | ||||
-rw-r--r-- | drivers/gpu/drm/glint/glint_display.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/glint/glint_drv.h | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/glint/glint_mode.h | 6 |
5 files changed, 112 insertions, 2 deletions
diff --git a/drivers/gpu/drm/glint/Makefile b/drivers/gpu/drm/glint/Makefile index c6bc2bd41d4e5a..661ebbc1a46c05 100644 --- a/drivers/gpu/drm/glint/Makefile +++ b/drivers/gpu/drm/glint/Makefile @@ -3,7 +3,7 @@ # Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher. ccflags-y := -Iinclude/drm -glint-y := glint_crtc.o glint_display.o glint_device.o glint_drv.o \ - glint_irq.o glint_kms.o +glint-y := glint_crtc.o glint_dac.o glint_device.o glint_display.o \ + glint_drv.o glint_irq.o glint_kms.o obj-$(CONFIG_DRM_GLINT) += glint.o diff --git a/drivers/gpu/drm/glint/glint_dac.c b/drivers/gpu/drm/glint/glint_dac.c new file mode 100644 index 00000000000000..de495f1d0a553b --- /dev/null +++ b/drivers/gpu/drm/glint/glint_dac.c @@ -0,0 +1,94 @@ +#include "drmP.h" +#include "drm.h" +#include "drm_crtc_helper.h" + +#include <video/pm3fb.h> + +#include "glint.h" +#include "glint_drv.h" +#include "glint_mode.h" + +static void glint_dac_dpms(struct drm_encoder *encoder, int mode) +{ + struct drm_device *dev = encoder->dev; + struct glint_device *gdev = dev->dev_private; + struct glint_encoder *glint_encoder = to_glint_encoder(encoder); + + if (mode == glint_encoder->last_dpms) /* Don't do unnecesary mode changes. */ + return; + + glint_encoder->last_dpms = mode; + + switch (mode) { + case DRM_MODE_DPMS_STANDBY: + case DRM_MODE_DPMS_SUSPEND: + case DRM_MODE_DPMS_OFF: + WREG_DAC(PM3RD_DACControl, PM3RD_DACControl_DAC_POWER_OFF); + break; + case DRM_MODE_DPMS_ON: + WREG_DAC(PM3RD_DACControl, PM3RD_DACControl_DAC_POWER_OFF); + break; + } +} + +static bool glint_dac_mode_fixup(struct drm_encoder *encoder, + struct drm_display_mode *mode, + struct drm_display_mode *adjusted_mode) +{ + return true; +} + +static void glint_dac_mode_set(struct drm_encoder *encoder, + struct drm_display_mode *mode, + struct drm_display_mode *adjusted_mode) +{ + +} + +static void glint_dac_prepare(struct drm_encoder *encoder) +{ + glint_dac_dpms(encoder, DRM_MODE_DPMS_OFF); +} + +static void glint_dac_commit(struct drm_encoder *encoder) +{ + glint_dac_dpms(encoder, DRM_MODE_DPMS_ON); +} + +void glint_encoder_destroy(struct drm_encoder *encoder) +{ + struct glint_encoder *glint_encoder = to_glint_encoder(encoder); + drm_encoder_cleanup(encoder); + kfree(glint_encoder); +} + +static const struct drm_encoder_helper_funcs glint_dac_helper_funcs = { + .dpms = glint_dac_dpms, + .mode_fixup = glint_dac_mode_fixup, + .mode_set = glint_dac_mode_set, + .prepare = glint_dac_prepare, + .commit = glint_dac_commit, +}; + +static const struct drm_encoder_funcs glint_dac_encoder_funcs = { + .destroy = glint_encoder_destroy, +}; + +struct drm_encoder *glint_dac_init(struct drm_device *dev) +{ + struct drm_encoder *encoder; + struct glint_encoder *glint_encoder; + + glint_encoder = kzalloc(sizeof(struct glint_encoder), GFP_KERNEL); + if (!glint_encoder) + return NULL; + + glint_encoder->last_dpms = GLINT_DPMS_CLEARED; + encoder = &glint_encoder->base; + encoder->possible_crtcs = 0x1; + + drm_encoder_init(dev, encoder, &glint_dac_encoder_funcs, DRM_MODE_ENCODER_DAC); + drm_encoder_helper_add(encoder, &glint_dac_helper_funcs); + + return encoder; +} diff --git a/drivers/gpu/drm/glint/glint_display.c b/drivers/gpu/drm/glint/glint_display.c index a8061ea041976e..ecfeef50ac1725 100644 --- a/drivers/gpu/drm/glint/glint_display.c +++ b/drivers/gpu/drm/glint/glint_display.c @@ -7,6 +7,7 @@ int glint_modeset_init(struct glint_device *gdev) { + struct drm_encoder *encoder; int i; drm_mode_config_init(gdev->ddev); @@ -22,6 +23,12 @@ int glint_modeset_init(struct glint_device *gdev) glint_crtc_init(gdev->ddev, i); } + encoder = glint_dac_init(gdev->ddev); + if (!encoder) { + GLINT_ERROR("glint_dac_init failed\n"); + return -1; + } + return 0; } diff --git a/drivers/gpu/drm/glint/glint_drv.h b/drivers/gpu/drm/glint/glint_drv.h index 12fd4685a829a0..3a2cdbae300fdd 100644 --- a/drivers/gpu/drm/glint/glint_drv.h +++ b/drivers/gpu/drm/glint/glint_drv.h @@ -35,6 +35,9 @@ /* glint_crtc.c */ void glint_crtc_init(struct drm_device *dev, int index); + /* glint_dac.c */ +struct drm_encoder *glint_dac_init(struct drm_device *dev); + /* glint_device.c */ int glint_device_init(struct glint_device *gdev, struct drm_device *ddev, diff --git a/drivers/gpu/drm/glint/glint_mode.h b/drivers/gpu/drm/glint/glint_mode.h index d86e00ad0fbefc..0a125d55ab9f4c 100644 --- a/drivers/gpu/drm/glint/glint_mode.h +++ b/drivers/gpu/drm/glint/glint_mode.h @@ -10,6 +10,7 @@ #define GLINT_DPMS_CLEARED (-1) #define to_glint_crtc(x) container_of(x, struct glint_crtc, base) +#define to_glint_encoder(x) container_of(x, struct glint_encoder, base) struct glint_crtc { struct drm_crtc base; @@ -24,4 +25,9 @@ struct glint_mode_info { struct glint_crtc *crtcs[2]; /* FIXME: how many CRTCs? */ }; +struct glint_encoder { + struct drm_encoder base; + int last_dpms; +}; + #endif /* __GLINT_MODE_H__ */ |