drm/glint: initial connector/vga work, fill in drm_connector_helper_funcs

Signed-off-by: Matt Turner <mattst88@gmail.com>
diff --git a/drivers/gpu/drm/glint/Makefile b/drivers/gpu/drm/glint/Makefile
index 661ebbc..27f4c94 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 ecfeef5..a69a8fa 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 @@
 		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 3a2cdba..c48518c 100644
--- a/drivers/gpu/drm/glint/glint_drv.h
+++ b/drivers/gpu/drm/glint/glint_drv.h
@@ -61,4 +61,7 @@
 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 0a125d5..d0a2cc6 100644
--- a/drivers/gpu/drm/glint/glint_mode.h
+++ b/drivers/gpu/drm/glint/glint_mode.h
@@ -30,4 +30,8 @@
 	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 0000000..58bc903
--- /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;
+}