drm/simple-kms: Add drm_simple_encoder_{init,create}()
authorThomas Zimmermann <tzimmermann@suse.de>
Fri, 28 Feb 2020 08:18:25 +0000 (09:18 +0100)
committerThomas Zimmermann <tzimmermann@suse.de>
Mon, 2 Mar 2020 08:22:35 +0000 (09:22 +0100)
This patch makes the internal encoder implementation of the simple
KMS helpers available to drivers.

These simple-encoder helpers initialize an encoder with an empty
implementation. This covers the requirements of most of the existing
DRM drivers. A call to drm_simple_encoder_create() allocates and
initializes an encoder instance, a call to drm_simple_encoder_init()
initializes a pre-allocated instance.

v3:
* remove drm_simple_encoder_create(); not required yet
* provide more precise documentation
v2:
* move simple encoder to KMS helpers
* remove name argument; simplifies implementation
* don't allocate with devm_ interfaces; unsafe with DRM

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Sam Ravnborg <sam@ravnborg.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20200228081828.18463-2-tzimmermann@suse.de
drivers/gpu/drm/drm_simple_kms_helper.c
include/drm/drm_simple_kms_helper.h

index 8ff4504..5a2abe2 100644 (file)
  * 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
+ * @dev: drm device
+ * @funcs: callbacks for this encoder
+ * @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.
+ *
+ * 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)
@@ -288,8 +317,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;
 
index e253ba7..a026375 100644 (file)
@@ -181,4 +181,8 @@ int drm_simple_display_pipe_init(struct drm_device *dev,
                        const uint64_t *format_modifiers,
                        struct drm_connector *connector);
 
+int drm_simple_encoder_init(struct drm_device *dev,
+                           struct drm_encoder *encoder,
+                           int encoder_type);
+
 #endif /* __LINUX_DRM_SIMPLE_KMS_HELPER_H */