[PATCH 18/29] drm/omap: Don't store display pointer in omap_connector structure
Sebastian Reichel
sebastian.reichel at collabora.com
Sun Dec 9 22:04:07 UTC 2018
Hi,
On Wed, Dec 05, 2018 at 05:00:11PM +0200, Laurent Pinchart wrote:
> Display pipelines based on drm_bridge are handled from the bridge
> closest to the CRTC. To move to that model we thus need to transition
> away from walking pipelines in the other direction, and from accessing
> the device at the end of the pipeline when possible.
>
> Remove most accesses to the display device from the omap_connector
> implementation, and don't store it in the omap_connector structure.
>
> - For debug messages we can simply use the connector name instead.
> - For type checks we can use the drm_connector type.
> - For operation lookup we can start at the other end of the pipeline and
> locate the last matching device.
>
> The display device is still passed to the connector init function in
> order to find its type, which requires access to the end of the
> pipeline.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
Reviewed-by: Sebastian Reichel <sebastian.reichel at collabora.com>
-- Sebastian
> drivers/gpu/drm/omapdrm/omap_connector.c | 31 ++++++++++--------------
> 1 file changed, 13 insertions(+), 18 deletions(-)
>
> diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c
> index 0bbbf4d0502d..31b6d6d1def3 100644
> --- a/drivers/gpu/drm/omapdrm/omap_connector.c
> +++ b/drivers/gpu/drm/omapdrm/omap_connector.c
> @@ -30,7 +30,6 @@
> struct omap_connector {
> struct drm_connector base;
> struct omap_dss_device *output;
> - struct omap_dss_device *display;
> struct omap_dss_device *hpd;
> bool hdmi_mode;
> };
> @@ -103,20 +102,20 @@ omap_connector_find_device(struct drm_connector *connector,
> enum omap_dss_device_ops_flag op)
> {
> struct omap_connector *omap_connector = to_omap_connector(connector);
> - struct omap_dss_device *dssdev;
> + struct omap_dss_device *dssdev = NULL;
> + struct omap_dss_device *d;
>
> - for (dssdev = omap_connector->display; dssdev; dssdev = dssdev->src) {
> - if (dssdev->ops_flags & op)
> - return dssdev;
> + for (d = omap_connector->output; d; d = d->next) {
> + if (d->ops_flags & op)
> + dssdev = d;
> }
>
> - return NULL;
> + return dssdev;
> }
>
> static enum drm_connector_status omap_connector_detect(
> struct drm_connector *connector, bool force)
> {
> - struct omap_connector *omap_connector = to_omap_connector(connector);
> struct omap_dss_device *dssdev;
> enum drm_connector_status status;
>
> @@ -130,11 +129,10 @@ static enum drm_connector_status omap_connector_detect(
>
> omap_connector_hpd_notify(connector, dssdev->src, status);
> } else {
> - switch (omap_connector->display->type) {
> - case OMAP_DISPLAY_TYPE_DPI:
> - case OMAP_DISPLAY_TYPE_DBI:
> - case OMAP_DISPLAY_TYPE_SDI:
> - case OMAP_DISPLAY_TYPE_DSI:
> + switch (connector->connector_type) {
> + case DRM_MODE_CONNECTOR_DPI:
> + case DRM_MODE_CONNECTOR_LVDS:
> + case DRM_MODE_CONNECTOR_DSI:
> status = connector_status_connected;
> break;
> default:
> @@ -143,7 +141,7 @@ static enum drm_connector_status omap_connector_detect(
> }
> }
>
> - VERB("%s: %d (force=%d)", omap_connector->display->name, status, force);
> + VERB("%s: %d (force=%d)", connector->name, status, force);
>
> return status;
> }
> @@ -152,7 +150,7 @@ static void omap_connector_destroy(struct drm_connector *connector)
> {
> struct omap_connector *omap_connector = to_omap_connector(connector);
>
> - DBG("%s", omap_connector->display->name);
> + DBG("%s", connector->name);
>
> if (omap_connector->hpd) {
> struct omap_dss_device *hpd = omap_connector->hpd;
> @@ -166,7 +164,6 @@ static void omap_connector_destroy(struct drm_connector *connector)
> drm_connector_cleanup(connector);
>
> omapdss_device_put(omap_connector->output);
> - omapdss_device_put(omap_connector->display);
>
> kfree(omap_connector);
> }
> @@ -210,10 +207,9 @@ static int omap_connector_get_modes_edid(struct drm_connector *connector,
>
> static int omap_connector_get_modes(struct drm_connector *connector)
> {
> - struct omap_connector *omap_connector = to_omap_connector(connector);
> struct omap_dss_device *dssdev;
>
> - DBG("%s", omap_connector->display->name);
> + DBG("%s", connector->name);
>
> /*
> * If display exposes EDID, then we parse that in the normal way to
> @@ -346,7 +342,6 @@ struct drm_connector *omap_connector_init(struct drm_device *dev,
> goto fail;
>
> omap_connector->output = omapdss_device_get(output);
> - omap_connector->display = omapdss_device_get(display);
>
> connector = &omap_connector->base;
> connector->interlace_allowed = 1;
> --
> Regards,
>
> Laurent Pinchart
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/dri-devel/attachments/20181209/9205954f/attachment-0001.sig>
More information about the dri-devel
mailing list