diff options
Diffstat (limited to 'drivers/gpu/drm/drm_simple_kms_helper.c')
| -rw-r--r-- | drivers/gpu/drm/drm_simple_kms_helper.c | 46 | 
1 files changed, 42 insertions, 4 deletions
diff --git a/drivers/gpu/drm/drm_simple_kms_helper.c b/drivers/gpu/drm/drm_simple_kms_helper.c index 15fb516ae2d8..74946690aba4 100644 --- a/drivers/gpu/drm/drm_simple_kms_helper.c +++ b/drivers/gpu/drm/drm_simple_kms_helper.c @@ -26,12 +26,51 @@   * entity. Some flexibility for code reuse is provided through a separately   * allocated &drm_connector object and supporting optional &drm_bridge   * encoder drivers. + * + * Many drivers require only a very simple encoder that fulfills the minimum + * requirements of the display pipeline and does not add additional + * functionality. The function drm_simple_encoder_init() provides an + * implementation of such an encoder.   */ -static const struct drm_encoder_funcs drm_simple_kms_encoder_funcs = { +static const struct drm_encoder_funcs drm_simple_encoder_funcs_cleanup = {  	.destroy = drm_encoder_cleanup,  }; +/** + * drm_simple_encoder_init - Initialize a preallocated encoder with + *                           basic functionality. + * @dev: drm device + * @encoder: the encoder to initialize + * @encoder_type: user visible type of the encoder + * + * Initialises a preallocated encoder that has no further functionality. + * Settings for possible CRTC and clones are left to their initial values. + * The encoder will be cleaned up automatically as part of the mode-setting + * cleanup. + * + * The caller of drm_simple_encoder_init() is responsible for freeing + * the encoder's memory after the encoder has been cleaned up. At the + * moment this only works reliably if the encoder data structure is + * stored in the device structure. Free the encoder's memory as part of + * the device release function. + * + * FIXME: Later improvements to DRM's resource management may allow for + *        an automated kfree() of the encoder's memory. + * + * Returns: + * Zero on success, error code on failure. + */ +int drm_simple_encoder_init(struct drm_device *dev, +			    struct drm_encoder *encoder, +			    int encoder_type) +{ +	return drm_encoder_init(dev, encoder, +				&drm_simple_encoder_funcs_cleanup, +				encoder_type, NULL); +} +EXPORT_SYMBOL(drm_simple_encoder_init); +  static enum drm_mode_status  drm_simple_kms_crtc_mode_valid(struct drm_crtc *crtc,  			       const struct drm_display_mode *mode) @@ -229,7 +268,7 @@ static const struct drm_plane_funcs drm_simple_kms_plane_funcs = {  int drm_simple_display_pipe_attach_bridge(struct drm_simple_display_pipe *pipe,  					  struct drm_bridge *bridge)  { -	return drm_bridge_attach(&pipe->encoder, bridge, NULL); +	return drm_bridge_attach(&pipe->encoder, bridge, NULL, 0);  }  EXPORT_SYMBOL(drm_simple_display_pipe_attach_bridge); @@ -288,8 +327,7 @@ int drm_simple_display_pipe_init(struct drm_device *dev,  		return ret;  	encoder->possible_crtcs = drm_crtc_mask(crtc); -	ret = drm_encoder_init(dev, encoder, &drm_simple_kms_encoder_funcs, -			       DRM_MODE_ENCODER_NONE, NULL); +	ret = drm_simple_encoder_init(dev, encoder, DRM_MODE_ENCODER_NONE);  	if (ret || !connector)  		return ret;  |