Message ID | 20210525015520.8327-1-ainux.wang@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drm/ast: Add detect function support | expand |
Hi, thanks for the patch. Am 25.05.21 um 03:55 schrieb ainux.wang@gmail.com: > From: Ainux <ainux.wang@gmail.com> > > The existence of the connector cannot be detected, > so add the detect function to support. > > Signed-off-by: Ainux <ainux.wang@gmail.com> > --- > drivers/gpu/drm/ast/ast_drv.c | 2 ++ > drivers/gpu/drm/ast/ast_mode.c | 19 ++++++++++++++++++- > 2 files changed, 20 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/ast/ast_drv.c b/drivers/gpu/drm/ast/ast_drv.c > index 5aa452b4efe6..6698bbc405e3 100644 > --- a/drivers/gpu/drm/ast/ast_drv.c > +++ b/drivers/gpu/drm/ast/ast_drv.c > @@ -128,6 +128,8 @@ static int ast_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) > > drm_fbdev_generic_setup(dev, 32); > > + drm_kms_helper_poll_init(dev); > + I think this is too late. Rather put it at the end of ast_mode_config_init(). [1] > return 0; > } > > diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c > index 36d9575aa27b..b4dd4c29b353 100644 > --- a/drivers/gpu/drm/ast/ast_mode.c > +++ b/drivers/gpu/drm/ast/ast_mode.c > @@ -1293,6 +1293,21 @@ static enum drm_mode_status ast_mode_valid(struct drm_connector *connector, > return flags; > } > > +static enum drm_connector_status ast_connector_detect(struct drm_connector > + *connector, bool force) > +{ > + int r; > + enum drm_connector_status ret = connector_status_connected; > + > + r = ast_get_modes(connector); > + if (r) > + ret = connector_status_connected; > + else > + ret = connector_status_disconnected; > + > + return ret; As a side note: VGA is not hotplug-able, but expected to always be connected. Ideally we could detect this, but it's unreliable AFAIK. Rather use: r = ast_get_modes() if (r < 0) return connector_status_disconnected return connector_status_connected So it's disconnected if there was an error in ast_get_modes(). Best regards Thomas [1] https://elixir.bootlin.com/linux/v5.12/source/drivers/gpu/drm/ast/ast_mode.c#L1171
diff --git a/drivers/gpu/drm/ast/ast_drv.c b/drivers/gpu/drm/ast/ast_drv.c index 5aa452b4efe6..6698bbc405e3 100644 --- a/drivers/gpu/drm/ast/ast_drv.c +++ b/drivers/gpu/drm/ast/ast_drv.c @@ -128,6 +128,8 @@ static int ast_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) drm_fbdev_generic_setup(dev, 32); + drm_kms_helper_poll_init(dev); + return 0; } diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c index 36d9575aa27b..b4dd4c29b353 100644 --- a/drivers/gpu/drm/ast/ast_mode.c +++ b/drivers/gpu/drm/ast/ast_mode.c @@ -1293,6 +1293,21 @@ static enum drm_mode_status ast_mode_valid(struct drm_connector *connector, return flags; } +static enum drm_connector_status ast_connector_detect(struct drm_connector + *connector, bool force) +{ + int r; + enum drm_connector_status ret = connector_status_connected; + + r = ast_get_modes(connector); + if (r) + ret = connector_status_connected; + else + ret = connector_status_disconnected; + + return ret; +} + static void ast_connector_destroy(struct drm_connector *connector) { struct ast_connector *ast_connector = to_ast_connector(connector); @@ -1307,6 +1322,7 @@ static const struct drm_connector_helper_funcs ast_connector_helper_funcs = { static const struct drm_connector_funcs ast_connector_funcs = { .reset = drm_atomic_helper_connector_reset, + .detect = ast_connector_detect, .fill_modes = drm_helper_probe_single_connector_modes, .destroy = ast_connector_destroy, .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, @@ -1334,7 +1350,8 @@ static int ast_connector_init(struct drm_device *dev) connector->interlace_allowed = 0; connector->doublescan_allowed = 0; - connector->polled = DRM_CONNECTOR_POLL_CONNECT; + connector->polled = DRM_CONNECTOR_POLL_CONNECT | + DRM_CONNECTOR_POLL_DISCONNECT; drm_connector_attach_encoder(connector, encoder);