[PATCHv8 02/13] cec: add struct cec_connector_info support
Hans Verkuil
hverkuil-cisco at xs4all.nl
Tue Jun 25 06:28:01 UTC 2019
On 6/24/19 6:03 PM, Hans Verkuil wrote:
> From: Dariusz Marcinkiewicz <darekm at google.com>
>
> Define struct cec_connector_info in media/cec.h and define
> CEC_CAP_CONNECTOR_INFO. In a later patch this will be moved to
> uapi/linux/cec.h.
>
> For now just define this together with the cec_fill_conn_info_from_drm
> and cec_s_conn_info functions: this allows both drm and media to make
> use of this without requiring cross-subsystem changes.
>
> Signed-off-by: Dariusz Marcinkiewicz <darekm at google.com>
> Co-developed-by: Hans Verkuil <hverkuil-cisco at xs4all.nl>
> Signed-off-by: Hans Verkuil <hverkuil-cisco at xs4all.nl>
> ---
> drivers/media/cec/cec-adap.c | 29 +++++++++++++++++++++++
> drivers/media/cec/cec-core.c | 5 ++++
> include/media/cec.h | 45 +++++++++++++++++++++++++++++++++++-
> 3 files changed, 78 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/media/cec/cec-adap.c b/drivers/media/cec/cec-adap.c
> index ac3683a7b2ab..451c61bde4d4 100644
> --- a/drivers/media/cec/cec-adap.c
> +++ b/drivers/media/cec/cec-adap.c
> @@ -16,7 +16,10 @@
> #include <linux/string.h>
> #include <linux/types.h>
>
> +#include <drm/drm_connector.h>
> +#include <drm/drm_device.h>
> #include <drm/drm_edid.h>
> +#include <drm/drm_file.h>
>
> #include "cec-priv.h"
>
> @@ -75,6 +78,16 @@ u16 cec_get_edid_phys_addr(const u8 *edid, unsigned int size,
> }
> EXPORT_SYMBOL_GPL(cec_get_edid_phys_addr);
>
> +void cec_fill_conn_info_from_drm(struct cec_connector_info *conn_info,
> + const struct drm_connector *connector)
> +{
> + memset(conn_info, 0, sizeof(*conn_info));
> + conn_info->type = CEC_CONNECTOR_TYPE_DRM;
> + conn_info->drm.card_no = connector->dev->primary->index;
> + conn_info->drm.connector_id = connector->base.id;
> +}
> +EXPORT_SYMBOL_GPL(cec_fill_conn_info_from_drm);
> +
> /*
> * Queue a new event for this filehandle. If ts == 0, then set it
> * to the current time.
> @@ -1598,6 +1611,22 @@ void cec_s_phys_addr_from_edid(struct cec_adapter *adap,
> }
> EXPORT_SYMBOL_GPL(cec_s_phys_addr_from_edid);
>
> +void cec_s_conn_info(struct cec_adapter *adap,
> + const struct cec_connector_info *conn_info)
> +{
> + if (!(adap->capabilities & CEC_CAP_CONNECTOR_INFO))
> + return;
> +
> + mutex_lock(&adap->lock);
> + if (conn_info)
> + adap->conn_info = *conn_info;
> + else
> + memset(&adap->conn_info, 0, sizeof(adap->conn_info));
> + cec_post_state_event(adap);
> + mutex_unlock(&adap->lock);
> +}
> +EXPORT_SYMBOL_GPL(cec_s_conn_info);
> +
> /*
> * Called from either the ioctl or a driver to set the logical addresses.
> *
> diff --git a/drivers/media/cec/cec-core.c b/drivers/media/cec/cec-core.c
> index db7adffcdc76..e45b792d26fb 100644
> --- a/drivers/media/cec/cec-core.c
> +++ b/drivers/media/cec/cec-core.c
> @@ -189,6 +189,11 @@ static void cec_cec_notify(struct cec_adapter *adap, u16 pa)
> cec_s_phys_addr(adap, pa, false);
> }
>
> +void cec_notifier_register(struct cec_notifier *n,
> + struct cec_adapter *adap,
> + void (*callback)(struct cec_adapter *adap, u16 pa));
> +void cec_notifier_unregister(struct cec_notifier *n);
> +
> void cec_register_cec_notifier(struct cec_adapter *adap,
> struct cec_notifier *notifier)
> {
> diff --git a/include/media/cec.h b/include/media/cec.h
> index 707411ef8ba2..45f2c98ed75b 100644
> --- a/include/media/cec.h
> +++ b/include/media/cec.h
> @@ -17,7 +17,9 @@
> #include <linux/timer.h>
> #include <linux/cec-funcs.h>
> #include <media/rc-core.h>
> -#include <media/cec-notifier.h>
> +
> +/* CEC_ADAP_G_CONNECTOR_INFO is available */
> +#define CEC_CAP_CONNECTOR_INFO 0
>
> #define CEC_CAP_DEFAULTS (CEC_CAP_LOG_ADDRS | CEC_CAP_TRANSMIT | \
> CEC_CAP_PASSTHROUGH | CEC_CAP_RC)
> @@ -53,6 +55,7 @@ struct cec_devnode {
> struct cec_adapter;
> struct cec_data;
> struct cec_pin;
> +struct cec_notifier;
>
> struct cec_data {
> struct list_head list;
> @@ -144,6 +147,27 @@ struct cec_adap_ops {
> */
> #define CEC_MAX_MSG_TX_QUEUE_SZ (18 * 1)
>
> +/**
> + * struct cec_event_connector - tells if and which connector is associated
> + * with the CEC adapter.
> + * @card_no: drm card number
> + * @connector_id: drm connector ID
> + */
> +struct cec_drm_connector_info {
> + __u32 card_no;
> + __u32 connector_id;
> +};
> +
> +#define CEC_CONNECTOR_TYPE_NO_CONNECTOR 0
> +#define CEC_CONNECTOR_TYPE_DRM 1
> +struct cec_connector_info {
> + __u32 type;
> + union {
> + struct cec_drm_connector_info drm;
> + __u32 raw[16];
> + };
> +};
> +
> struct cec_adapter {
> struct module *owner;
> char name[32];
> @@ -182,6 +206,7 @@ struct cec_adapter {
> struct cec_fh *cec_initiator;
> bool passthrough;
> struct cec_log_addrs log_addrs;
> + struct cec_connector_info conn_info;
>
> u32 tx_timeouts;
>
> @@ -233,6 +258,7 @@ static inline bool cec_is_registered(const struct cec_adapter *adap)
> ((pa) >> 12), ((pa) >> 8) & 0xf, ((pa) >> 4) & 0xf, (pa) & 0xf
>
> struct edid;
> +struct drm_connector;
>
> #if IS_REACHABLE(CONFIG_CEC_CORE)
> struct cec_adapter *cec_allocate_adapter(const struct cec_adap_ops *ops,
> @@ -247,6 +273,8 @@ void cec_s_phys_addr(struct cec_adapter *adap, u16 phys_addr,
> bool block);
> void cec_s_phys_addr_from_edid(struct cec_adapter *adap,
> const struct edid *edid);
> +void cec_s_conn_info(struct cec_adapter *adap,
> + const struct cec_connector_info *conn_info);
> int cec_transmit_msg(struct cec_adapter *adap, struct cec_msg *msg,
> bool block);
>
> @@ -331,6 +359,9 @@ void cec_queue_pin_5v_event(struct cec_adapter *adap, bool is_high, ktime_t ts);
> u16 cec_get_edid_phys_addr(const u8 *edid, unsigned int size,
> unsigned int *offset);
>
> +void cec_fill_conn_info_from_drm(struct cec_connector_info *conn_info,
> + const struct drm_connector *connector);
> +
> #else
>
> static inline int cec_register_adapter(struct cec_adapter *adap,
> @@ -365,6 +396,18 @@ static inline u16 cec_get_edid_phys_addr(const u8 *edid, unsigned int size,
> return CEC_PHYS_ADDR_INVALID;
> }
>
> +static inline void cec_s_conn_info(struct cec_adapter *adap,
> + const struct cec_connector_info *conn_info)
> +{
> +}
> +
> +static inline void
> +cec_fill_conn_info_from_drm(const struct drm_connector *connector,
> + struct cec_connector_info *conn_info)
Oops, these arguments are the wrong way around. conn_info comes first.
This is already fixed in my branch:
https://git.linuxtv.org/hverkuil/media_tree.git/log/?h=cec-conn
Regards,
Hans
> +{
> + memset(conn_info, 0, sizeof(*conn_info));
> +}
> +
> #endif
>
> /**
>
More information about the dri-devel
mailing list