All of lore.kernel.org
 help / color / mirror / Atom feed
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Cc: linux-media@vger.kernel.org,
	Tomi Valkeinen <tomi.valkeinen@ti.com>,
	dri-devel@lists.freedesktop.org, linux-omap@vger.kernel.org,
	Sekhar Nori <nsekhar@ti.com>, Tony Lindgren <tony@atomide.com>
Subject: Re: [PATCH 1/5] drm: drm_bridge: add cec_init/exit bridge ops
Date: Fri, 19 Feb 2021 14:02:17 +0200	[thread overview]
Message-ID: <YC+oyavcOV0uFJUb@pendragon.ideasonboard.com> (raw)
In-Reply-To: <20210211103703.444625-2-hverkuil-cisco@xs4all.nl>

Hi Hans,

Thank you for the patch.

On Thu, Feb 11, 2021 at 11:36:59AM +0100, Hans Verkuil wrote:
> Add bridge cec_init/exit ops. These ops will be responsible for
> creating and destroying the CEC adapter for the bridge that supports
> CEC.
> 
> Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
> ---
>  drivers/gpu/drm/drm_bridge_connector.c | 23 +++++++++++++++++++
>  include/drm/drm_bridge.h               | 31 ++++++++++++++++++++++++++
>  2 files changed, 54 insertions(+)
> 
> diff --git a/drivers/gpu/drm/drm_bridge_connector.c b/drivers/gpu/drm/drm_bridge_connector.c
> index 791379816837..2ff90f5e468c 100644
> --- a/drivers/gpu/drm/drm_bridge_connector.c
> +++ b/drivers/gpu/drm/drm_bridge_connector.c
> @@ -84,6 +84,13 @@ struct drm_bridge_connector {
>  	 * connector modes detection, if any (see &DRM_BRIDGE_OP_MODES).
>  	 */
>  	struct drm_bridge *bridge_modes;
> +	/**
> +	 * @bridge_cec:
> +	 *
> +	 * The last bridge in the chain (closest to the connector) that provides
> +	 * cec adapter support, if any (see &DRM_BRIDGE_OP_CEC).
> +	 */
> +	struct drm_bridge *bridge_cec;
>  };
>  
>  #define to_drm_bridge_connector(x) \
> @@ -204,6 +211,11 @@ static void drm_bridge_connector_destroy(struct drm_connector *connector)
>  	struct drm_bridge_connector *bridge_connector =
>  		to_drm_bridge_connector(connector);
>  
> +	if (bridge_connector->bridge_cec) {
> +		struct drm_bridge *cec = bridge_connector->bridge_cec;
> +
> +		cec->funcs->cec_exit(cec);
> +	}
>  	if (bridge_connector->bridge_hpd) {
>  		struct drm_bridge *hpd = bridge_connector->bridge_hpd;
>  
> @@ -352,6 +364,8 @@ struct drm_connector *drm_bridge_connector_init(struct drm_device *drm,
>  			bridge_connector->bridge_detect = bridge;
>  		if (bridge->ops & DRM_BRIDGE_OP_MODES)
>  			bridge_connector->bridge_modes = bridge;
> +		if (bridge->ops & DRM_BRIDGE_OP_CEC)
> +			bridge_connector->bridge_cec = bridge;
>  
>  		if (!drm_bridge_get_next_bridge(bridge))
>  			connector_type = bridge->type;
> @@ -374,6 +388,15 @@ struct drm_connector *drm_bridge_connector_init(struct drm_device *drm,
>  	else if (bridge_connector->bridge_detect)
>  		connector->polled = DRM_CONNECTOR_POLL_CONNECT
>  				  | DRM_CONNECTOR_POLL_DISCONNECT;
> +	if (bridge_connector->bridge_cec) {
> +		struct drm_bridge *bridge = bridge_connector->bridge_cec;
> +		int ret = bridge->funcs->cec_init(bridge, connector);
> +
> +		if (ret) {
> +			drm_bridge_connector_destroy(connector);
> +			return ERR_PTR(ret);
> +		}
> +	}
>  
>  	return connector;
>  }
> diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h
> index 2195daa289d2..4c83c2657e87 100644
> --- a/include/drm/drm_bridge.h
> +++ b/include/drm/drm_bridge.h
> @@ -629,6 +629,30 @@ struct drm_bridge_funcs {
>  	 * the DRM_BRIDGE_OP_HPD flag in their &drm_bridge->ops.
>  	 */
>  	void (*hpd_disable)(struct drm_bridge *bridge);
> +
> +	/**
> +	 * @cec_init:
> +	 *
> +	 * Initialize the CEC adapter.
> +	 *
> +	 * This callback is optional and shall only be implemented by bridges
> +	 * that support a CEC adapter. Bridges that implement it shall also
> +	 * implement the @cec_exit callback and set the DRM_BRIDGE_OP_CEC flag
> +	 * in their &drm_bridge->ops.
> +	 */
> +	int (*cec_init)(struct drm_bridge *bridge, struct drm_connector *conn);
> +
> +	/**
> +	 * @cec_exit:
> +	 *
> +	 * Terminate the CEC adapter.
> +	 *
> +	 * This callback is optional and shall only be implemented by bridges
> +	 * that support a CEC adapter. Bridges that implement it shall also
> +	 * implement the @cec_init callback and set the DRM_BRIDGE_OP_CEC flag
> +	 * in their &drm_bridge->ops.
> +	 */
> +	void (*cec_exit)(struct drm_bridge *bridge);

These are very ad-hoc operations. Would it make sense to have something
that could also be reused for other type of intiialization and cleanup
that require access to the drm_connector ?

>  };
>  
>  /**
> @@ -698,6 +722,13 @@ enum drm_bridge_ops {
>  	 * this flag shall implement the &drm_bridge_funcs->get_modes callback.
>  	 */
>  	DRM_BRIDGE_OP_MODES = BIT(3),
> +	/**
> +	 * @DRM_BRIDGE_OP_CEC: The bridge supports a CEC adapter.
> +	 * Bridges that set this flag shall implement the
> +	 * &drm_bridge_funcs->cec_init and &drm_bridge_funcs->cec_exit
> +	 * callbacks.
> +	 */
> +	DRM_BRIDGE_OP_CEC = BIT(4),
>  };
>  
>  /**

-- 
Regards,

Laurent Pinchart

WARNING: multiple messages have this Message-ID (diff)
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Cc: Tony Lindgren <tony@atomide.com>, Sekhar Nori <nsekhar@ti.com>,
	dri-devel@lists.freedesktop.org,
	Tomi Valkeinen <tomi.valkeinen@ti.com>,
	linux-omap@vger.kernel.org, linux-media@vger.kernel.org
Subject: Re: [PATCH 1/5] drm: drm_bridge: add cec_init/exit bridge ops
Date: Fri, 19 Feb 2021 14:02:17 +0200	[thread overview]
Message-ID: <YC+oyavcOV0uFJUb@pendragon.ideasonboard.com> (raw)
In-Reply-To: <20210211103703.444625-2-hverkuil-cisco@xs4all.nl>

Hi Hans,

Thank you for the patch.

On Thu, Feb 11, 2021 at 11:36:59AM +0100, Hans Verkuil wrote:
> Add bridge cec_init/exit ops. These ops will be responsible for
> creating and destroying the CEC adapter for the bridge that supports
> CEC.
> 
> Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
> ---
>  drivers/gpu/drm/drm_bridge_connector.c | 23 +++++++++++++++++++
>  include/drm/drm_bridge.h               | 31 ++++++++++++++++++++++++++
>  2 files changed, 54 insertions(+)
> 
> diff --git a/drivers/gpu/drm/drm_bridge_connector.c b/drivers/gpu/drm/drm_bridge_connector.c
> index 791379816837..2ff90f5e468c 100644
> --- a/drivers/gpu/drm/drm_bridge_connector.c
> +++ b/drivers/gpu/drm/drm_bridge_connector.c
> @@ -84,6 +84,13 @@ struct drm_bridge_connector {
>  	 * connector modes detection, if any (see &DRM_BRIDGE_OP_MODES).
>  	 */
>  	struct drm_bridge *bridge_modes;
> +	/**
> +	 * @bridge_cec:
> +	 *
> +	 * The last bridge in the chain (closest to the connector) that provides
> +	 * cec adapter support, if any (see &DRM_BRIDGE_OP_CEC).
> +	 */
> +	struct drm_bridge *bridge_cec;
>  };
>  
>  #define to_drm_bridge_connector(x) \
> @@ -204,6 +211,11 @@ static void drm_bridge_connector_destroy(struct drm_connector *connector)
>  	struct drm_bridge_connector *bridge_connector =
>  		to_drm_bridge_connector(connector);
>  
> +	if (bridge_connector->bridge_cec) {
> +		struct drm_bridge *cec = bridge_connector->bridge_cec;
> +
> +		cec->funcs->cec_exit(cec);
> +	}
>  	if (bridge_connector->bridge_hpd) {
>  		struct drm_bridge *hpd = bridge_connector->bridge_hpd;
>  
> @@ -352,6 +364,8 @@ struct drm_connector *drm_bridge_connector_init(struct drm_device *drm,
>  			bridge_connector->bridge_detect = bridge;
>  		if (bridge->ops & DRM_BRIDGE_OP_MODES)
>  			bridge_connector->bridge_modes = bridge;
> +		if (bridge->ops & DRM_BRIDGE_OP_CEC)
> +			bridge_connector->bridge_cec = bridge;
>  
>  		if (!drm_bridge_get_next_bridge(bridge))
>  			connector_type = bridge->type;
> @@ -374,6 +388,15 @@ struct drm_connector *drm_bridge_connector_init(struct drm_device *drm,
>  	else if (bridge_connector->bridge_detect)
>  		connector->polled = DRM_CONNECTOR_POLL_CONNECT
>  				  | DRM_CONNECTOR_POLL_DISCONNECT;
> +	if (bridge_connector->bridge_cec) {
> +		struct drm_bridge *bridge = bridge_connector->bridge_cec;
> +		int ret = bridge->funcs->cec_init(bridge, connector);
> +
> +		if (ret) {
> +			drm_bridge_connector_destroy(connector);
> +			return ERR_PTR(ret);
> +		}
> +	}
>  
>  	return connector;
>  }
> diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h
> index 2195daa289d2..4c83c2657e87 100644
> --- a/include/drm/drm_bridge.h
> +++ b/include/drm/drm_bridge.h
> @@ -629,6 +629,30 @@ struct drm_bridge_funcs {
>  	 * the DRM_BRIDGE_OP_HPD flag in their &drm_bridge->ops.
>  	 */
>  	void (*hpd_disable)(struct drm_bridge *bridge);
> +
> +	/**
> +	 * @cec_init:
> +	 *
> +	 * Initialize the CEC adapter.
> +	 *
> +	 * This callback is optional and shall only be implemented by bridges
> +	 * that support a CEC adapter. Bridges that implement it shall also
> +	 * implement the @cec_exit callback and set the DRM_BRIDGE_OP_CEC flag
> +	 * in their &drm_bridge->ops.
> +	 */
> +	int (*cec_init)(struct drm_bridge *bridge, struct drm_connector *conn);
> +
> +	/**
> +	 * @cec_exit:
> +	 *
> +	 * Terminate the CEC adapter.
> +	 *
> +	 * This callback is optional and shall only be implemented by bridges
> +	 * that support a CEC adapter. Bridges that implement it shall also
> +	 * implement the @cec_init callback and set the DRM_BRIDGE_OP_CEC flag
> +	 * in their &drm_bridge->ops.
> +	 */
> +	void (*cec_exit)(struct drm_bridge *bridge);

These are very ad-hoc operations. Would it make sense to have something
that could also be reused for other type of intiialization and cleanup
that require access to the drm_connector ?

>  };
>  
>  /**
> @@ -698,6 +722,13 @@ enum drm_bridge_ops {
>  	 * this flag shall implement the &drm_bridge_funcs->get_modes callback.
>  	 */
>  	DRM_BRIDGE_OP_MODES = BIT(3),
> +	/**
> +	 * @DRM_BRIDGE_OP_CEC: The bridge supports a CEC adapter.
> +	 * Bridges that set this flag shall implement the
> +	 * &drm_bridge_funcs->cec_init and &drm_bridge_funcs->cec_exit
> +	 * callbacks.
> +	 */
> +	DRM_BRIDGE_OP_CEC = BIT(4),
>  };
>  
>  /**

-- 
Regards,

Laurent Pinchart
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

  parent reply	other threads:[~2021-02-19 12:05 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-11 10:36 [PATCH 0/5] drm/omap: hdmi: improve hdmi4 CEC, add CEC for hdmi5 Hans Verkuil
2021-02-11 10:36 ` Hans Verkuil
2021-02-11 10:36 ` [PATCH 1/5] drm: drm_bridge: add cec_init/exit bridge ops Hans Verkuil
2021-02-11 10:36   ` Hans Verkuil
2021-02-19 11:12   ` Tomi Valkeinen
2021-02-19 11:12     ` Tomi Valkeinen
2021-02-19 12:02   ` Laurent Pinchart [this message]
2021-02-19 12:02     ` Laurent Pinchart
2021-03-01 10:56     ` Hans Verkuil
2021-03-01 10:56       ` Hans Verkuil
2021-03-01 16:25       ` Laurent Pinchart
2021-03-01 16:25         ` Laurent Pinchart
2021-02-11 10:37 ` [PATCH 2/5] drm/omap: hdmi4: switch to the cec " Hans Verkuil
2021-02-11 10:37   ` Hans Verkuil
2021-02-19 11:12   ` Tomi Valkeinen
2021-02-19 11:12     ` Tomi Valkeinen
2021-02-19 12:07   ` Laurent Pinchart
2021-02-19 12:07     ` Laurent Pinchart
2021-03-01 11:07     ` Hans Verkuil
2021-03-01 11:07       ` Hans Verkuil
2021-03-01 16:26       ` Laurent Pinchart
2021-03-01 16:26         ` Laurent Pinchart
2021-02-11 10:37 ` [PATCH 3/5] drm/omap: hdmi4: simplify CEC Phys Addr handling Hans Verkuil
2021-02-11 10:37   ` Hans Verkuil
2021-02-19 11:13   ` Tomi Valkeinen
2021-02-19 11:13     ` Tomi Valkeinen
2021-02-11 10:37 ` [PATCH 4/5] drm/omap: hdmi5: add CEC support Hans Verkuil
2021-02-11 10:37   ` Hans Verkuil
2021-02-19 11:09   ` Tomi Valkeinen
2021-02-19 11:09     ` Tomi Valkeinen
2021-03-01 12:00     ` Hans Verkuil
2021-03-01 12:00       ` Hans Verkuil
2021-02-11 10:37 ` [PATCH 5/5] ARM: dts: dra7/omap5: add cec clock Hans Verkuil
2021-02-11 10:37   ` Hans Verkuil
2021-02-15  8:31   ` Tony Lindgren
2021-02-15  8:31     ` Tony Lindgren
2021-02-19 10:33   ` Tomi Valkeinen
2021-02-19 10:33     ` Tomi Valkeinen
2021-02-15 11:11 ` [PATCH 0/5] drm/omap: hdmi: improve hdmi4 CEC, add CEC for hdmi5 H. Nikolaus Schaller
2021-02-19 11:27   ` Tomi Valkeinen
2021-02-19 11:27     ` Tomi Valkeinen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=YC+oyavcOV0uFJUb@pendragon.ideasonboard.com \
    --to=laurent.pinchart@ideasonboard.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=hverkuil-cisco@xs4all.nl \
    --cc=linux-media@vger.kernel.org \
    --cc=linux-omap@vger.kernel.org \
    --cc=nsekhar@ti.com \
    --cc=tomi.valkeinen@ti.com \
    --cc=tony@atomide.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.