diff options
author | Matt Turner <mattst88@gmail.com> | 2010-07-12 16:12:23 -0400 |
---|---|---|
committer | Matt Turner <mattst88@gmail.com> | 2011-01-25 13:27:07 -0500 |
commit | df64ca7602fa48346fb63e9dcdae53b990ce0897 (patch) | |
tree | b0c755c46215d34ce8a0a2f676689f0d85cffe35 | |
parent | a95c4480c7f249cf9368d0ef6fb5dbb8c74f945c (diff) | |
download | glint-df64ca7602fa48346fb63e9dcdae53b990ce0897.tar.gz |
drm/glint: initial connector/vga work, fill in drm_connector_helper_funcs
Signed-off-by: Matt Turner <mattst88@gmail.com>
-rw-r--r-- | drivers/gpu/drm/glint/Makefile | 2 | ||||
-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 | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/glint/glint_vga.c | 83 |
5 files changed, 98 insertions, 1 deletions
diff --git a/drivers/gpu/drm/glint/Makefile b/drivers/gpu/drm/glint/Makefile index 661ebbc1a46c05..27f4c9474b5c5e 100644 --- a/drivers/gpu/drm/glint/Makefile +++ b/drivers/gpu/drm/glint/Makefile @@ -4,6 +4,6 @@ ccflags-y := -Iinclude/drm glint-y := glint_crtc.o glint_dac.o glint_device.o glint_display.o \ - glint_drv.o glint_irq.o glint_kms.o + glint_drv.o glint_irq.o glint_kms.o glint_vga.o obj-$(CONFIG_DRM_GLINT) += glint.o diff --git a/drivers/gpu/drm/glint/glint_display.c b/drivers/gpu/drm/glint/glint_display.c index ecfeef50ac1725..a69a8fa38e37a3 100644 --- a/drivers/gpu/drm/glint/glint_display.c +++ b/drivers/gpu/drm/glint/glint_display.c @@ -8,6 +8,7 @@ int glint_modeset_init(struct glint_device *gdev) { struct drm_encoder *encoder; + struct drm_connector *connector; int i; drm_mode_config_init(gdev->ddev); @@ -29,6 +30,12 @@ int glint_modeset_init(struct glint_device *gdev) return -1; } + connector = glint_vga_init(gdev->ddev); + if (!connector) { + GLINT_ERROR("glint_vga_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 3a2cdbae300fdd..c48518c7cd4a2e 100644 --- a/drivers/gpu/drm/glint/glint_drv.h +++ b/drivers/gpu/drm/glint/glint_drv.h @@ -61,4 +61,7 @@ int glint_driver_unload(struct drm_device *dev); extern struct drm_ioctl_desc glint_ioctls[]; extern int glint_max_ioctl; + /* glint_vga.c */ +struct drm_connector *glint_vga_init(struct drm_device *dev); + #endif /* __GLINT_DRV_H__ */ diff --git a/drivers/gpu/drm/glint/glint_mode.h b/drivers/gpu/drm/glint/glint_mode.h index 0a125d55ab9f4c..d0a2cc608cfcc4 100644 --- a/drivers/gpu/drm/glint/glint_mode.h +++ b/drivers/gpu/drm/glint/glint_mode.h @@ -30,4 +30,8 @@ struct glint_encoder { int last_dpms; }; +struct glint_connector { + struct drm_connector base; +}; + #endif /* __GLINT_MODE_H__ */ diff --git a/drivers/gpu/drm/glint/glint_vga.c b/drivers/gpu/drm/glint/glint_vga.c new file mode 100644 index 00000000000000..58bc903b28e88d --- /dev/null +++ b/drivers/gpu/drm/glint/glint_vga.c @@ -0,0 +1,83 @@ +#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 int glint_vga_get_modes(struct drm_connector *connector) +{ + /* return 0 modes, so that we don't have to implement DDC/I2C yet. */ + return 0; +} + +static int glint_vga_mode_valid(struct drm_connector *connector, + struct drm_display_mode *mode) +{ + /* XXX check mode bandwidth */ + /* XXX verify against max DAC output frequency */ + return MODE_OK; +} + +struct drm_encoder *glint_connector_best_encoder(struct drm_connector *connector) +{ + int enc_id = connector->encoder_ids[0]; + struct drm_mode_object *obj; + struct drm_encoder *encoder; + + /* pick the encoder ids */ + if (enc_id) { + obj = drm_mode_object_find(connector->dev, enc_id, DRM_MODE_OBJECT_ENCODER); + if (!obj) + return NULL; + encoder = obj_to_encoder(obj); + return encoder; + } + return NULL; +} + +static enum drm_connector_status glint_vga_detect(struct drm_connector *connector) +{ + return connector_status_connected; +} + +static void glint_connector_destroy(struct drm_connector *connector) +{ + drm_connector_cleanup(connector); + kfree(connector); +} + +struct drm_connector_helper_funcs glint_vga_connector_helper_funcs = { + .get_modes = glint_vga_get_modes, + .mode_valid = glint_vga_mode_valid, + .best_encoder = glint_connector_best_encoder, +}; + +struct drm_connector_funcs glint_vga_connector_funcs = { + .dpms = drm_helper_connector_dpms, + .detect = glint_vga_detect, + .fill_modes = drm_helper_probe_single_connector_modes, + .destroy = glint_connector_destroy, +}; + +struct drm_connector *glint_vga_init(struct drm_device *dev) +{ + struct drm_connector *connector; + struct glint_connector *glint_connector; + + glint_connector = kzalloc(sizeof(struct glint_connector), GFP_KERNEL); + if (!glint_connector) + return NULL; + + connector = &glint_connector->base; + + drm_connector_init(dev, connector, + &glint_vga_connector_funcs, DRM_MODE_CONNECTOR_VGA); + + drm_connector_helper_add(connector, &glint_vga_connector_helper_funcs); + + return connector; +} |