Den 07.02.2020 09.41, skrev Thomas Zimmermann:
The 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.
Signed-off-by: Thomas Zimmermann tzimmermann@suse.de
drivers/gpu/drm/drm_encoder.c | 116 ++++++++++++++++++++++++++++++++++ include/drm/drm_encoder.h | 10 +++ 2 files changed, 126 insertions(+)
diff --git a/drivers/gpu/drm/drm_encoder.c b/drivers/gpu/drm/drm_encoder.c
<snip>
+/**
- drm_simple_encoder_create - Allocate and initialize an encoder
- @dev: drm device
- @encoder_type: user visible type of the encoder
- @name: printf style format string for the encoder name, or NULL for
default name
- Allocates and initialises an encoder that has no further functionality. The
- encoder will be released automatically.
- Returns:
- The encoder on success, a pointer-encoder error code on failure.
- */
+struct drm_encoder *drm_simple_encoder_create(struct drm_device *dev,
int encoder_type,
const char *name, ...)
+{
- char *namestr = NULL;
- struct drm_encoder *encoder;
- int ret;
- encoder = devm_kzalloc(dev->dev, sizeof(*encoder), GFP_KERNEL);
The encoder can outlive the devres if the device is unbound when userspace has open fds, so you can't use devm_ here.
Noralf.
- if (!encoder)
return ERR_PTR(-ENOMEM);
- if (name) {
va_list ap;
va_start(ap, name);
namestr = kvasprintf(GFP_KERNEL, name, ap);
va_end(ap);
if (!namestr) {
ret = -ENOMEM;
goto err_devm_kfree;
}
- }
- ret = __drm_encoder_init(dev, encoder,
&drm_simple_encoder_funcs_destroy,
encoder_type, namestr);
- if (ret)
goto err_kfree;
- return encoder;
+err_kfree:
- if (name)
kfree(namestr);
+err_devm_kfree:
- devm_kfree(dev->dev, encoder);
- return ERR_PTR(ret);
+} +EXPORT_SYMBOL(drm_simple_encoder_create);