2013-06-15 14:21:51 +02:00
/*
* rcar_du_vgacon . c - - R - Car Display Unit VGA Connector
*
2014-02-06 18:13:52 +01:00
* Copyright ( C ) 2013 - 2014 Renesas Electronics Corporation
2013-06-15 14:21:51 +02:00
*
* Contact : Laurent Pinchart ( laurent . pinchart @ ideasonboard . com )
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*/
# include <drm/drmP.h>
2015-02-20 11:30:59 +02:00
# include <drm/drm_atomic_helper.h>
2013-06-15 14:21:51 +02:00
# include <drm/drm_crtc.h>
# include <drm/drm_crtc_helper.h>
# include "rcar_du_drv.h"
2013-06-15 15:02:12 +02:00
# include "rcar_du_encoder.h"
2013-06-15 14:21:51 +02:00
# include "rcar_du_kms.h"
# include "rcar_du_vgacon.h"
static int rcar_du_vga_connector_get_modes ( struct drm_connector * connector )
{
return 0 ;
}
static const struct drm_connector_helper_funcs connector_helper_funcs = {
. get_modes = rcar_du_vga_connector_get_modes ,
. best_encoder = rcar_du_connector_best_encoder ,
} ;
static void rcar_du_vga_connector_destroy ( struct drm_connector * connector )
{
2014-05-29 16:57:41 +01:00
drm_connector_unregister ( connector ) ;
2013-06-15 14:21:51 +02:00
drm_connector_cleanup ( connector ) ;
}
static enum drm_connector_status
rcar_du_vga_connector_detect ( struct drm_connector * connector , bool force )
{
2013-03-14 22:45:22 +01:00
return connector_status_connected ;
2013-06-15 14:21:51 +02:00
}
static const struct drm_connector_funcs connector_funcs = {
2015-02-22 01:49:11 +02:00
. dpms = drm_atomic_helper_connector_dpms ,
2015-02-20 11:30:59 +02:00
. reset = drm_atomic_helper_connector_reset ,
2013-06-15 14:21:51 +02:00
. detect = rcar_du_vga_connector_detect ,
. fill_modes = drm_helper_probe_single_connector_modes ,
. destroy = rcar_du_vga_connector_destroy ,
2015-02-20 11:30:59 +02:00
. atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state ,
. atomic_destroy_state = drm_atomic_helper_connector_destroy_state ,
2013-06-15 14:21:51 +02:00
} ;
int rcar_du_vga_connector_init ( struct rcar_du_device * rcdu ,
struct rcar_du_encoder * renc )
{
2014-03-31 01:50:16 +02:00
struct drm_encoder * encoder = rcar_encoder_to_drm_encoder ( renc ) ;
2013-06-15 14:21:51 +02:00
struct rcar_du_connector * rcon ;
struct drm_connector * connector ;
int ret ;
rcon = devm_kzalloc ( rcdu - > dev , sizeof ( * rcon ) , GFP_KERNEL ) ;
if ( rcon = = NULL )
return - ENOMEM ;
connector = & rcon - > connector ;
connector - > display_info . width_mm = 0 ;
connector - > display_info . height_mm = 0 ;
2014-12-09 19:11:18 +02:00
connector - > interlace_allowed = true ;
2013-06-15 14:21:51 +02:00
ret = drm_connector_init ( rcdu - > ddev , connector , & connector_funcs ,
DRM_MODE_CONNECTOR_VGA ) ;
if ( ret < 0 )
return ret ;
drm_connector_helper_add ( connector , & connector_helper_funcs ) ;
2014-05-29 16:57:41 +01:00
ret = drm_connector_register ( connector ) ;
2013-06-15 14:21:51 +02:00
if ( ret < 0 )
return ret ;
2015-02-22 01:49:11 +02:00
connector - > dpms = DRM_MODE_DPMS_OFF ;
2013-06-15 14:21:51 +02:00
drm_object_property_set_value ( & connector - > base ,
rcdu - > ddev - > mode_config . dpms_property , DRM_MODE_DPMS_OFF ) ;
2014-03-31 01:50:16 +02:00
ret = drm_mode_connector_attach_encoder ( connector , encoder ) ;
2013-06-15 14:21:51 +02:00
if ( ret < 0 )
return ret ;
rcon - > encoder = renc ;
return 0 ;
}