Implement the drm_connector_funcs.detect() callback to update the connector status by returning the status stored in the configuration. Signed-off-by: José Expósito <jose.exposito89@xxxxxxxxx> --- drivers/gpu/drm/vkms/vkms_connector.c | 19 ++++++++++++++++++- drivers/gpu/drm/vkms/vkms_connector.h | 12 +++++++++++- drivers/gpu/drm/vkms/vkms_output.c | 2 +- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_connector.c b/drivers/gpu/drm/vkms/vkms_connector.c index 48b10cba322a..b03a00b5803a 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.c +++ b/drivers/gpu/drm/vkms/vkms_connector.c @@ -5,9 +5,23 @@ #include <drm/drm_managed.h> #include <drm/drm_probe_helper.h> +#include "vkms_config.h" #include "vkms_connector.h" +static enum drm_connector_status vkms_connector_detect(struct drm_connector *connector, + bool force) +{ + struct vkms_connector *vkms_connector; + enum drm_connector_status status; + + vkms_connector = drm_connector_to_vkms_connector(connector); + status = vkms_config_connector_get_status(vkms_connector->connector_cfg); + + return status; +} + static const struct drm_connector_funcs vkms_connector_funcs = { + .detect = vkms_connector_detect, .fill_modes = drm_helper_probe_single_connector_modes, .reset = drm_atomic_helper_connector_reset, .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, @@ -40,7 +54,8 @@ static const struct drm_connector_helper_funcs vkms_conn_helper_funcs = { .best_encoder = vkms_conn_best_encoder, }; -struct vkms_connector *vkms_connector_init(struct vkms_device *vkmsdev) +struct vkms_connector *vkms_connector_init(struct vkms_device *vkmsdev, + struct vkms_config_connector *connector_cfg) { struct drm_device *dev = &vkmsdev->drm; struct vkms_connector *connector; @@ -50,6 +65,8 @@ struct vkms_connector *vkms_connector_init(struct vkms_device *vkmsdev) if (!connector) return ERR_PTR(-ENOMEM); + connector->connector_cfg = connector_cfg; + ret = drmm_connector_init(dev, &connector->base, &vkms_connector_funcs, DRM_MODE_CONNECTOR_VIRTUAL, NULL); if (ret) diff --git a/drivers/gpu/drm/vkms/vkms_connector.h b/drivers/gpu/drm/vkms/vkms_connector.h index c9149c1b7af0..5ab8a6d65182 100644 --- a/drivers/gpu/drm/vkms/vkms_connector.h +++ b/drivers/gpu/drm/vkms/vkms_connector.h @@ -5,22 +5,32 @@ #include "vkms_drv.h" +struct vkms_config_connector; + +#define drm_connector_to_vkms_connector(target) \ + container_of(target, struct vkms_connector, base) + /** * struct vkms_connector - VKMS custom type wrapping around the DRM connector * * @drm: Base DRM connector + * @connector_cfg: Connector configuration */ struct vkms_connector { struct drm_connector base; + + struct vkms_config_connector *connector_cfg; }; /** * vkms_connector_init() - Initialize a connector * @vkmsdev: VKMS device containing the connector + * @connector_cfg: Configuration for the connector * * Returns: * The connector or an error on failure. */ -struct vkms_connector *vkms_connector_init(struct vkms_device *vkmsdev); +struct vkms_connector *vkms_connector_init(struct vkms_device *vkmsdev, + struct vkms_config_connector *connector_cfg); #endif /* _VKMS_CONNECTOR_H_ */ diff --git a/drivers/gpu/drm/vkms/vkms_output.c b/drivers/gpu/drm/vkms/vkms_output.c index 8d7ca0cdd79f..3af95983026e 100644 --- a/drivers/gpu/drm/vkms/vkms_output.c +++ b/drivers/gpu/drm/vkms/vkms_output.c @@ -87,7 +87,7 @@ int vkms_output_init(struct vkms_device *vkmsdev) struct vkms_config_encoder *possible_encoder; unsigned long idx = 0; - connector_cfg->connector = vkms_connector_init(vkmsdev); + connector_cfg->connector = vkms_connector_init(vkmsdev, connector_cfg); if (IS_ERR(connector_cfg->connector)) { DRM_ERROR("Failed to init connector\n"); return PTR_ERR(connector_cfg->connector); -- 2.48.1