aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatt Turner <mattst88@gmail.com>2010-07-12 16:12:23 -0400
committerMatt Turner <mattst88@gmail.com>2011-01-25 13:27:07 -0500
commitdf64ca7602fa48346fb63e9dcdae53b990ce0897 (patch)
treeb0c755c46215d34ce8a0a2f676689f0d85cffe35
parenta95c4480c7f249cf9368d0ef6fb5dbb8c74f945c (diff)
downloadglint-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/Makefile2
-rw-r--r--drivers/gpu/drm/glint/glint_display.c7
-rw-r--r--drivers/gpu/drm/glint/glint_drv.h3
-rw-r--r--drivers/gpu/drm/glint/glint_mode.h4
-rw-r--r--drivers/gpu/drm/glint/glint_vga.c83
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;
+}