19e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart/*
29e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart * rcar_du_vgacon.c  --  R-Car Display Unit VGA Connector
39e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart *
436d50464e05f498fa4024270e091b306af5de898Laurent Pinchart * Copyright (C) 2013-2014 Renesas Electronics Corporation
59e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart *
69e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart * Contact: Laurent Pinchart (laurent.pinchart@ideasonboard.com)
79e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart *
89e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart * This program is free software; you can redistribute it and/or modify
99e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart * it under the terms of the GNU General Public License as published by
109e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart * the Free Software Foundation; either version 2 of the License, or
119e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart * (at your option) any later version.
129e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart */
139e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart
149e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart#include <drm/drmP.h>
159e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart#include <drm/drm_crtc.h>
169e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart#include <drm/drm_crtc_helper.h>
179e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart
189e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart#include "rcar_du_drv.h"
196978f123776594b251d26dac9bcdf3ce8e9781c8Laurent Pinchart#include "rcar_du_encoder.h"
209e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart#include "rcar_du_kms.h"
219e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart#include "rcar_du_vgacon.h"
229e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart
239e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchartstatic int rcar_du_vga_connector_get_modes(struct drm_connector *connector)
249e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart{
259e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart	return 0;
269e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart}
279e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart
289e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchartstatic const struct drm_connector_helper_funcs connector_helper_funcs = {
299e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart	.get_modes = rcar_du_vga_connector_get_modes,
309e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart	.best_encoder = rcar_du_connector_best_encoder,
319e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart};
329e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart
339e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchartstatic void rcar_du_vga_connector_destroy(struct drm_connector *connector)
349e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart{
3534ea3d386347cd6de4c2fa2491dd85c9e753e7e4Thomas Wood	drm_connector_unregister(connector);
369e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart	drm_connector_cleanup(connector);
379e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart}
389e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart
399e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchartstatic enum drm_connector_status
409e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchartrcar_du_vga_connector_detect(struct drm_connector *connector, bool force)
419e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart{
423864c6f446f3c2ebbeca1d45e28452682706c1aaLaurent Pinchart	return connector_status_connected;
439e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart}
449e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart
459e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchartstatic const struct drm_connector_funcs connector_funcs = {
469e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart	.dpms = drm_helper_connector_dpms,
479e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart	.detect = rcar_du_vga_connector_detect,
489e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart	.fill_modes = drm_helper_probe_single_connector_modes,
499e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart	.destroy = rcar_du_vga_connector_destroy,
509e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart};
519e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart
529e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchartint rcar_du_vga_connector_init(struct rcar_du_device *rcdu,
539e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart			       struct rcar_du_encoder *renc)
549e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart{
559e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart	struct rcar_du_connector *rcon;
569e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart	struct drm_connector *connector;
579e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart	int ret;
589e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart
599e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart	rcon = devm_kzalloc(rcdu->dev, sizeof(*rcon), GFP_KERNEL);
609e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart	if (rcon == NULL)
619e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart		return -ENOMEM;
629e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart
639e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart	connector = &rcon->connector;
649e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart	connector->display_info.width_mm = 0;
659e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart	connector->display_info.height_mm = 0;
669e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart
679e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart	ret = drm_connector_init(rcdu->ddev, connector, &connector_funcs,
689e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart				 DRM_MODE_CONNECTOR_VGA);
699e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart	if (ret < 0)
709e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart		return ret;
719e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart
729e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart	drm_connector_helper_add(connector, &connector_helper_funcs);
7334ea3d386347cd6de4c2fa2491dd85c9e753e7e4Thomas Wood	ret = drm_connector_register(connector);
749e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart	if (ret < 0)
759e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart		return ret;
769e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart
779e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart	drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF);
789e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart	drm_object_property_set_value(&connector->base,
799e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart		rcdu->ddev->mode_config.dpms_property, DRM_MODE_DPMS_OFF);
809e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart
819e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart	ret = drm_mode_connector_attach_encoder(connector, &renc->encoder);
829e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart	if (ret < 0)
839e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart		return ret;
849e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart
859e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart	connector->encoder = &renc->encoder;
869e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart	rcon->encoder = renc;
879e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart
889e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart	return 0;
899e8be27233c1e98b06edeb801640b1f96b09e466Laurent Pinchart}
90