drm/bridge: switch to struct drm_edid
Subsystems (15)
v2 cover drm/bridge: switch to struct drm_edid
Convert all of drm/bridge to the new struct drm_edid infrastructure. It's safer than struct edid, because it contains meta information about the allocated size of the EDID, instead of relying on the size (number of extensions) originating from outside of the kernel.
Among all of drm, I think bridge has the most uses of struct edid that do not originate from the drm_get_edid() family of functions, which means the validity checks are somewhat inconsistent, and having the meta information is more crucial.
Only build tested. I'm sure there should be more Cc's especially in the patches towards the end of the series, but I just wanted to get the series out the door now.
BR,
Jani.
Jani Nikula (39):
drm/bridge: add ->edid_read hook and drm_bridge_edid_read() drm/bridge: switch to drm_bridge_read_edid() drm/bridge: chrontel-ch7033: switch to drm_bridge_read_edid() drm/bridge: lt8912b: use drm_bridge_read_edid() drm/bridge: lt8912b: clear the EDID property on failures drm/bridge: lt8912b: use ->edid_read callback drm/bridge: lt9611uxc: use drm_bridge_read_edid()
drm: bridge: simple-bridge: use drm_bridge_edid_read()
drm: bridge: simple-bridge: clear the EDID property on failures drm/bridge: tfp410: use drm_bridge_edid_read() drm/bridge: tfp410: clear the EDID property on failures drm/meson: switch to drm_bridge_edid_read() drm/bridge: remove drm_bridge_get_edid() in favour of
drm_bridge_edid_read()
drm/bridge: anx7625: switch to ->edid_read callback drm/bridge: cdns-mhdp8546: switch to ->edid_read callback drm/bridge: cdns-mhdp8546: clear the EDID property on failures drm/bridge: display-connector: switch to ->edid_read callback drm/bridge: it6505: switch to ->edid_read callback
drm: bridge: it66121: switch to ->edid_read callback drm/bridge: lt9611: switch to ->edid_read callback drm/bridge: lt9611uxc: switch to ->edid_read callback drm/bridge: megachips: switch to ->edid_read callback drm/bridge: nxp-ptn3460: switch to ->edid_read callback drm/bridge: sii902x: use display info is_hdmi drm/bridge: sii902x: switch to ->edid_read callback drm/mediatek/dp: switch to ->edid_read callback drm/mediatek/hdmi: switch to ->edid_read callback drm/msm/hdmi: fix indent
drm/msm/hdmi: switch to ->edid_read callback drm/omap/hdmi4: switch to ->edid_read callback drm/omap/hdmi5: switch to ->edid_read callback
drm: xlnx: zynqmp_dpsub: switch to ->edid_read callback
drm: adv7511: switch to ->edid_read callback
drm: bridge: dw_hdmi: switch to ->edid_read callback
drm: bridge: dw_hdmi: clear the EDID property and CEC address on
failures
drm/bridge: tc358767: update the EDID property drm/bridge: tc358767: switch to ->edid_read callback drm/bridge: ti-sn65dsi86: switch to ->edid_read callback drm/bridge: remove ->get_edid callback
drivers/gpu/drm/bridge/adv7511/adv7511_drv.c | 47 ++++++++++++------- drivers/gpu/drm/bridge/analogix/anx7625.c | 30 ++++-------- .../drm/bridge/cadence/cdns-mhdp8546-core.c | 28 ++++++----- drivers/gpu/drm/bridge/chrontel-ch7033.c | 12 ++--- drivers/gpu/drm/bridge/display-connector.c | 8 ++-- drivers/gpu/drm/bridge/ite-it6505.c | 17 +++---- drivers/gpu/drm/bridge/ite-it66121.c | 16 +++---- drivers/gpu/drm/bridge/lontium-lt8912b.c | 20 ++++---- drivers/gpu/drm/bridge/lontium-lt9611.c | 8 ++-- drivers/gpu/drm/bridge/lontium-lt9611uxc.c | 18 +++---- .../bridge/megachips-stdpxxxx-ge-b850v3-fw.c | 18 +++---- drivers/gpu/drm/bridge/nxp-ptn3460.c | 23 +++++---- drivers/gpu/drm/bridge/sii902x.c | 38 +++++++-------- drivers/gpu/drm/bridge/simple-bridge.c | 17 +++---- drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 43 ++++++++++------- drivers/gpu/drm/bridge/tc358767.c | 17 +++---- drivers/gpu/drm/bridge/ti-sn65dsi86.c | 8 ++-- drivers/gpu/drm/bridge/ti-tfp410.c | 18 +++---- drivers/gpu/drm/drm_bridge.c | 17 +++---- drivers/gpu/drm/drm_bridge_connector.c | 16 +++---- drivers/gpu/drm/mediatek/mtk_dp.c | 31 +++++++----- drivers/gpu/drm/mediatek/mtk_hdmi.c | 26 ++++++---- drivers/gpu/drm/meson/meson_encoder_hdmi.c | 20 ++++++-- drivers/gpu/drm/msm/hdmi/hdmi_bridge.c | 33 ++++++++----- drivers/gpu/drm/omapdrm/dss/hdmi4.c | 22 ++++++--- drivers/gpu/drm/omapdrm/dss/hdmi5.c | 12 ++--- drivers/gpu/drm/xlnx/zynqmp_dp.c | 8 ++-- include/drm/drm_bridge.h | 25 +++++----- 28 files changed, 329 insertions(+), 267 deletions(-)
Signature · 1 line
2.39.2
PATCH v2 1/39 drm/bridge: add ->edid_read hook and drm_bridge_edid_read()
Add new struct drm_edid based ->edid_read hook and drm_bridge_edid_read() function to call the hook.
v2: Include drm/drm_edid.h
--- drivers/gpu/drm/drm_bridge.c | 46 +++++++++++++++++++++++++++++++++++- include/drm/drm_bridge.h | 33 ++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 1 deletion(-)
drivers/gpu/drm/drm_bridge.c +45 -1
@@ -27,8 +27,9 @@#include <linux/mutex.h> #include <drm/drm_atomic_state_helper.h> -#include <drm/drm_debugfs.h> #include <drm/drm_bridge.h> +#include <drm/drm_debugfs.h> +#include <drm/drm_edid.h> #include <drm/drm_encoder.h> #include <drm/drm_file.h> #include <drm/drm_of.h>
@@ -1206,6 +1207,47 @@ int drm_bridge_get_modes(struct drm_bridge *bridge, }EXPORT_SYMBOL_GPL (drm_bridge_get_modes); +/** +* drm_bridge_edid_read - read the EDID data of the connected display +* @bridge: bridge control structure +* @connector: the connector to read EDID for +* +* If the bridge supports output EDID retrieval, as reported by the +* DRM_BRIDGE_OP_EDID bridge ops flag, call &drm_bridge_funcs.edid_read to get +* the EDID and return it. Otherwise return NULL. +* +* If &drm_bridge_funcs.edid_read is not set, fall back to using +* drm_bridge_get_edid() and wrapping it in struct drm_edid. +* +* RETURNS: +* The retrieved EDID on success, or NULL otherwise. +*/ +const struct drm_edid *drm_bridge_edid_read (struct drm_bridge *bridge, +struct drm_connector *connector) +{ +if (!(bridge->ops &DRM_BRIDGE_OP_EDID )) +return NULL ; + +/* Transitional: Fall back to ->get_edid. */ +if (!bridge->funcs->edid_read) { +const struct drm_edid *drm_edid; +struct edid *edid; + + edid =drm_bridge_get_edid (bridge, connector); +if (!edid) +return NULL ; + + drm_edid =drm_edid_alloc (edid, (edid->extensions +1 ) *EDID_LENGTH ); + +kfree (edid); + +return drm_edid; + } + +return bridge->funcs->edid_read (bridge, connector); +} +EXPORT_SYMBOL_GPL (drm_bridge_edid_read); +/** * drm_bridge_get_edid - get the EDID data of the connected display * @bridge: bridge control structure
@@ -1215,6 +1257,8 @@ EXPORT_SYMBOL_GPL(drm_bridge_get_modes);* DRM_BRIDGE_OP_EDID bridge ops flag, call &drm_bridge_funcs.get_edid to * get the EDID and return it. Otherwise return NULL. * +* Deprecated. Prefer using drm_bridge_edid_read(). +* * RETURNS: * The retrieved EDID on success, or NULL otherwise. */
include/drm/drm_bridge.h +33 -0
@@ -557,6 +557,37 @@ struct drm_bridge_funcs {int (*get_modes)(struct drm_bridge *bridge,struct drm_connector *connector); +/** +* @edid_read: +* +* Read the EDID data of the connected display. +* +* The @edid_read callback is the preferred way of reporting mode +* information for a display connected to the bridge output. Bridges +* that support reading EDID shall implement this callback and leave +* the @get_modes callback unimplemented. +* +* The caller of this operation shall first verify the output +* connection status and refrain from reading EDID from a disconnected +* output. +* +* This callback is optional. Bridges that implement it shall set the +* DRM_BRIDGE_OP_EDID flag in their &drm_bridge->ops. +* +* The connector parameter shall be used for the sole purpose of EDID +* retrieval, and shall not be stored internally by bridge drivers for +* future usage. +* +* RETURNS: +* +* An edid structure newly allocated with drm_edid_alloc() or returned +* from drm_edid_read() family of functions on success, or NULL +* otherwise. The caller is responsible for freeing the returned edid +* structure with drm_edid_free(). +*/ +const struct drm_edid *(*edid_read)(struct drm_bridge *bridge, +struct drm_connector *connector); +/** * @get_edid: *
@@ -888,6 +919,8 @@ drm_atomic_helper_bridge_propagate_bus_fmt(struct drm_bridge *bridge,enum drm_connector_status drm_bridge_detect (struct drm_bridge *bridge);int drm_bridge_get_modes (struct drm_bridge *bridge,struct drm_connector *connector); +const struct drm_edid *drm_bridge_edid_read (struct drm_bridge *bridge, +struct drm_connector *connector);struct edid *drm_bridge_get_edid (struct drm_bridge *bridge,struct drm_connector *connector); void drm_bridge_hpd_enable(struct drm_bridge *bridge,
Signature · 1 line
2.39.2
PATCH v2 2/39 drm/bridge: switch to drm_bridge_read_edid()
In reply to Jani NikulaPrefer using the struct drm_edid based functions.
--- drivers/gpu/drm/drm_bridge_connector.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
drivers/gpu/drm/drm_bridge_connector.c +8 -8
@@ -239,27 +239,27 @@ static int drm_bridge_connector_get_modes_edid(struct drm_connector *connector, struct drm_bridge *bridge) {enum drm_connector_status status; -struct edid *edid; +const struct drm_edid *drm_edid;int n; status =drm_bridge_connector_detect (connector, false);if (status != connector_status_connected) goto no_edid; - edid =drm_bridge_get_edid (bridge, connector); -if (!drm_edid_is_valid (edid)) { -kfree (edid); + drm_edid =drm_bridge_edid_read (bridge, connector); +if (!drm_edid_valid (drm_edid)) { +drm_edid_free (drm_edid); goto no_edid; } -drm_connector_update_edid_property (connector, edid); - n =drm_add_edid_modes (connector, edid); +drm_edid_connector_update (connector, drm_edid); + n =drm_edid_connector_add_modes (connector); -kfree (edid); +drm_edid_free (drm_edid);return n; no_edid: -drm_connector_update_edid_property (connector,NULL ); +drm_edid_connector_update (connector,NULL );return 0 ; }
Signature · 1 line
2.39.2
Thomas Zimmermann
maintainerRe: [PATCH v2 02/39] drm/bridge: switch to drm_bridge_read_edid()
Hi Jani
Quoted 1 line
drm/bridge: switch to
drm_bridge_read_edid()
Did you mean drm_bridge_edid_read(), here and in the other patches?
(Personally, I'd prefer read_edid over edid_read. The former is common style and easier to read.)
Best regards
Thomas
Am 03.01.24 um 11:08 schrieb Jani Nikula:
Quoted 47 lines
Prefer using the struct
drm_edidbased functions.Signed-off-by Jani Nikula <[email protected]>--- drivers/gpu/drm/drm_bridge_connector.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)drivers/gpu/drm/drm_bridge_connector.c +8
-8@@ -239,27 +239,27 @@ static int drm_bridge_connector_get_modes_edid(struct drm_connector *connector, struct drm_bridge *bridge) {enum drm_connector_status status; -struct edid *edid; +const struct drm_edid *drm_edid;int n; status =drm_bridge_connector_detect (connector, false);if (status != connector_status_connected) goto no_edid; - edid =drm_bridge_get_edid (bridge, connector); -if (!drm_edid_is_valid (edid)) { -kfree (edid); + drm_edid =drm_bridge_edid_read (bridge, connector); +if (!drm_edid_valid (drm_edid)) { +drm_edid_free (drm_edid); goto no_edid; } -drm_connector_update_edid_property (connector, edid); - n =drm_add_edid_modes (connector, edid); +drm_edid_connector_update (connector, drm_edid); + n =drm_edid_connector_add_modes (connector); -kfree (edid); +drm_edid_free (drm_edid);return n; no_edid: -drm_connector_update_edid_property (connector,NULL ); +drm_edid_connector_update (connector,NULL );return 0 ; }
Signature · 6 lines
Thomas Zimmermann Graphics Driver Developer SUSE Software Solutions Germany GmbH Frankenstrasse 146, 90461 Nuernberg, Germany GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman HRB 36809 (AG Nuernberg)
Re: [PATCH v2 02/39] drm/bridge: switch to drm_bridge_read_edid()
Quoted 5 lines · Thomas Zimmermann
Hi Jani
Quoted 1 line
drm/bridge: switch to
drm_bridge_read_edid()Did you mean
drm_bridge_edid_read(), here and in the other patches?
Ah, yeah, I did.
Quoted 2 lines
(Personally, I'd prefer
read_edidoveredid_read. The former is common style and easier to read.)
The name comes from drm_edid_read() family of functions, which are so named because they reside in drm_edid.[ch].
BR,
Jani.
Quoted 52 lines
Best regards
ThomasAm 03.01.24 um 11:08 schrieb Jani Nikula:
Quoted 47 lines
Prefer using the struct
drm_edidbased functions.Signed-off-by Jani Nikula <[email protected]>--- drivers/gpu/drm/drm_bridge_connector.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)drivers/gpu/drm/drm_bridge_connector.c +8
-8@@ -239,27 +239,27 @@ static int drm_bridge_connector_get_modes_edid(struct drm_connector *connector, struct drm_bridge *bridge) {enum drm_connector_status status; -struct edid *edid; +const struct drm_edid *drm_edid;int n; status =drm_bridge_connector_detect (connector, false);if (status != connector_status_connected) goto no_edid; - edid =drm_bridge_get_edid (bridge, connector); -if (!drm_edid_is_valid (edid)) { -kfree (edid); + drm_edid =drm_bridge_edid_read (bridge, connector); +if (!drm_edid_valid (drm_edid)) { +drm_edid_free (drm_edid); goto no_edid; } -drm_connector_update_edid_property (connector, edid); - n =drm_add_edid_modes (connector, edid); +drm_edid_connector_update (connector, drm_edid); + n =drm_edid_connector_add_modes (connector); -kfree (edid); +drm_edid_free (drm_edid);return n; no_edid: -drm_connector_update_edid_property (connector,NULL ); +drm_edid_connector_update (connector,NULL );return 0 ; }
Signature · 1 line
Jani Nikula, Intel
PATCH v2 3/39 drm/bridge: chrontel-ch7033: switch to drm_bridge_read_edid()
In reply to Jani NikulaPrefer using the struct drm_edid based functions.
--- drivers/gpu/drm/bridge/chrontel-ch7033.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/gpu/drm/bridge/chrontel-ch7033.c +6 -6
@@ -230,14 +230,14 @@ static const struct drm_connector_funcs ch7033_connector_funcs = {static int ch7033_connector_get_modes (struct drm_connector *connector) {struct ch7033_priv *priv =conn_to_ch7033_priv (connector); -struct edid *edid; +const struct drm_edid *drm_edid;int ret; - edid =drm_bridge_get_edid (priv->next_bridge, connector); -drm_connector_update_edid_property (connector, edid); -if (edid) { - ret =drm_add_edid_modes (connector, edid); -kfree (edid); + drm_edid =drm_bridge_edid_read (priv->next_bridge, connector); +drm_edid_connector_update (connector, drm_edid); +if (drm_edid) { + ret =drm_edid_connector_add_modes (connector); +drm_edid_free (drm_edid); }else { ret =drm_add_modes_noedid (connector,1920 ,1080 );drm_set_preferred_mode (connector,1024 ,768 );
Signature · 1 line
2.39.2
PATCH v2 4/39 drm/bridge: lt8912b: use drm_bridge_read_edid()
In reply to Jani NikulaPrefer using the struct drm_edid based functions.
--- drivers/gpu/drm/bridge/lontium-lt8912b.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/gpu/drm/bridge/lontium-lt8912b.c +6 -6
@@ -440,16 +440,16 @@ lt8912_connector_mode_valid(struct drm_connector *connector,static int lt8912_connector_get_modes (struct drm_connector *connector) { -struct edid *edid; +const struct drm_edid *drm_edid;int ret =-1 ;int num =0 ;struct lt8912 *lt =connector_to_lt8912 (connector);u32 bus_format =MEDIA_BUS_FMT_RGB888_1X24 ; - edid =drm_bridge_get_edid (lt->hdmi_port, connector); -if (edid) { -drm_connector_update_edid_property (connector, edid); - num =drm_add_edid_modes (connector, edid); + drm_edid =drm_bridge_edid_read (lt->hdmi_port, connector); +if (drm_edid) { +drm_edid_connector_update (connector, drm_edid); + num =drm_edid_connector_add_modes (connector); }else {return ret; }
@@ -459,7 +459,7 @@ static int lt8912_connector_get_modes(struct drm_connector *connector)if (ret) num = ret; -kfree (edid); +drm_edid_free (drm_edid);return num; }
Signature · 1 line
2.39.2
PATCH v2 5/39 drm/bridge: lt8912b: clear the EDID property on failures
In reply to Jani NikulaIf EDID read fails, clear the EDID property.
--- drivers/gpu/drm/bridge/lontium-lt8912b.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/bridge/lontium-lt8912b.c +1 -1
@@ -447,8 +447,8 @@ static int lt8912_connector_get_modes(struct drm_connector *connector)u32 bus_format =MEDIA_BUS_FMT_RGB888_1X24 ; drm_edid =drm_bridge_edid_read (lt->hdmi_port, connector); +drm_edid_connector_update (connector, drm_edid);if (drm_edid) { -drm_edid_connector_update (connector, drm_edid); num =drm_edid_connector_add_modes (connector); }else {return ret;
Signature · 1 line
2.39.2
PATCH v2 6/39 drm/bridge: lt8912b: use ->edid_read callback
In reply to Jani NikulaPrefer using the struct drm_edid based functions.
--- drivers/gpu/drm/bridge/lontium-lt8912b.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/gpu/drm/bridge/lontium-lt8912b.c +4 -4
@@ -620,8 +620,8 @@ lt8912_bridge_detect(struct drm_bridge *bridge)return lt8912_check_cable_status (lt); } -static struct edid *lt8912_bridge_get_edid (struct drm_bridge *bridge, -struct drm_connector *connector) +static const struct drm_edid *lt8912_bridge_edid_read (struct drm_bridge *bridge, +struct drm_connector *connector) {struct lt8912 *lt =bridge_to_lt8912 (bridge);
@@ -630,7 +630,7 @@ static struct edid *lt8912_bridge_get_edid(struct drm_bridge *bridge,* given to the hdmi connector node. */ if (lt->hdmi_port->ops &DRM_BRIDGE_OP_EDID ) -return drm_bridge_get_edid (lt->hdmi_port, connector); +return drm_bridge_edid_read (lt->hdmi_port, connector);dev_warn (lt->dev,"The connected bridge does not supports DRM_BRIDGE_OP_EDID\n" );return NULL ;
@@ -642,7 +642,7 @@ static const struct drm_bridge_funcs lt8912_bridge_funcs = { .mode_set = lt8912_bridge_mode_set, .enable = lt8912_bridge_enable, .detect = lt8912_bridge_detect, - .get_edid = lt8912_bridge_get_edid, + .edid_read = lt8912_bridge_edid_read, };static int lt8912_bridge_resume (struct device *dev)
Signature · 1 line
2.39.2
PATCH v2 7/39 drm/bridge: lt9611uxc: use drm_bridge_read_edid()
In reply to Jani NikulaPrefer using the struct drm_edid based functions.
--- drivers/gpu/drm/bridge/lontium-lt9611uxc.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/gpu/drm/bridge/lontium-lt9611uxc.c +5 -5
@@ -294,12 +294,12 @@ static int lt9611uxc_connector_get_modes(struct drm_connector *connector) {struct lt9611uxc *lt9611uxc =connector_to_lt9611uxc (connector);unsigned int count; -struct edid *edid; +const struct drm_edid *drm_edid; - edid =drm_bridge_get_edid (<9611uxc->bridge, connector); -drm_connector_update_edid_property (connector, edid); - count =drm_add_edid_modes (connector, edid); -kfree (edid); + drm_edid =drm_bridge_edid_read (<9611uxc->bridge, connector); +drm_edid_connector_update (connector, drm_edid); + count =drm_edid_connector_add_modes (connector); +drm_edid_free (drm_edid);return count; }
Signature · 1 line
2.39.2
PATCH v2 8/39 drm: bridge: simple-bridge: use drm_bridge_edid_read()
In reply to Jani NikulaPrefer using the struct drm_edid based functions.
--- drivers/gpu/drm/bridge/simple-bridge.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
drivers/gpu/drm/bridge/simple-bridge.c +8 -8
@@ -51,18 +51,18 @@ drm_connector_to_simple_bridge(struct drm_connector *connector)static int simple_bridge_get_modes (struct drm_connector *connector) {struct simple_bridge *sbridge =drm_connector_to_simple_bridge (connector); -struct edid *edid; +const struct drm_edid *drm_edid;int ret;if (sbridge->next_bridge->ops &DRM_BRIDGE_OP_EDID ) { - edid =drm_bridge_get_edid (sbridge->next_bridge, connector); -if (!edid) + drm_edid =drm_bridge_edid_read (sbridge->next_bridge, connector); +if (!drm_edid)DRM_INFO ("EDID read failed. Fallback to standard modes\n" ); }else { - edid =NULL ; + drm_edid =NULL ; } -if (!edid) { +if (!drm_edid) {/* * In case we cannot retrieve the EDIDs (missing or broken DDC * bus from the next bridge), fallback on the XGA standards and
@@ -73,9 +73,9 @@ static int simple_bridge_get_modes(struct drm_connector *connector)return ret; } -drm_connector_update_edid_property (connector, edid); - ret =drm_add_edid_modes (connector, edid); -kfree (edid); +drm_edid_connector_update (connector, drm_edid); + ret =drm_edid_connector_add_modes (connector); +drm_edid_free (drm_edid);return ret; }
Signature · 1 line
2.39.2
PATCH v2 9/39 drm: bridge: simple-bridge: clear the EDID property on failures
In reply to Jani NikulaIf EDID read fails, clear the EDID property.
--- drivers/gpu/drm/bridge/simple-bridge.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/bridge/simple-bridge.c +2 -1
@@ -62,6 +62,8 @@ static int simple_bridge_get_modes(struct drm_connector *connector) drm_edid =NULL ; } +drm_edid_connector_update (connector, drm_edid); +if (!drm_edid) {/* * In case we cannot retrieve the EDIDs (missing or broken DDC
@@ -73,7 +75,6 @@ static int simple_bridge_get_modes(struct drm_connector *connector)return ret; } -drm_edid_connector_update (connector, drm_edid); ret =drm_edid_connector_add_modes (connector);drm_edid_free (drm_edid);
Signature · 1 line
2.39.2
PATCH v2 10/39 drm/bridge: tfp410: use drm_bridge_edid_read()
In reply to Jani NikulaPrefer using the struct drm_edid based functions.
--- drivers/gpu/drm/bridge/ti-tfp410.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
drivers/gpu/drm/bridge/ti-tfp410.c +8 -8
@@ -50,18 +50,18 @@ drm_connector_to_tfp410(struct drm_connector *connector)static int tfp410_get_modes (struct drm_connector *connector) {struct tfp410 *dvi =drm_connector_to_tfp410 (connector); -struct edid *edid; +const struct drm_edid *drm_edid;int ret;if (dvi->next_bridge->ops &DRM_BRIDGE_OP_EDID ) { - edid =drm_bridge_get_edid (dvi->next_bridge, connector); -if (!edid) + drm_edid =drm_bridge_edid_read (dvi->next_bridge, connector); +if (!drm_edid)DRM_INFO ("EDID read failed. Fallback to standard modes\n" ); }else { - edid =NULL ; + drm_edid =NULL ; } -if (!edid) { +if (!drm_edid) {/* * No EDID, fallback on the XGA standard modes and prefer a mode * pretty much anything can handle.
@@ -71,11 +71,11 @@ static int tfp410_get_modes(struct drm_connector *connector)return ret; } -drm_connector_update_edid_property (connector, edid); +drm_edid_connector_update (connector, drm_edid); - ret =drm_add_edid_modes (connector, edid); + ret =drm_edid_connector_add_modes (connector); -kfree (edid); +drm_edid_free (drm_edid);return ret; }
Signature · 1 line
2.39.2
PATCH v2 11/39 drm/bridge: tfp410: clear the EDID property on failures
In reply to Jani NikulaIf EDID read fails, clear the EDID property.
--- drivers/gpu/drm/bridge/ti-tfp410.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/drm/bridge/ti-tfp410.c +2 -2
@@ -61,6 +61,8 @@ static int tfp410_get_modes(struct drm_connector *connector) drm_edid =NULL ; } +drm_edid_connector_update (connector, drm_edid); +if (!drm_edid) {/* * No EDID, fallback on the XGA standard modes and prefer a mode
@@ -71,8 +73,6 @@ static int tfp410_get_modes(struct drm_connector *connector)return ret; } -drm_edid_connector_update (connector, drm_edid); - ret =drm_edid_connector_add_modes (connector);drm_edid_free (drm_edid);
Signature · 1 line
2.39.2
PATCH v2 12/39 drm/meson: switch to drm_bridge_edid_read()
In reply to Jani NikulaPrefer using the struct drm_edid based functions.
Not ideal, should use source physical address from connector info.
--- drivers/gpu/drm/meson/meson_encoder_hdmi.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-)
drivers/gpu/drm/meson/meson_encoder_hdmi.c +16 -4
@@ -323,19 +323,31 @@ static void meson_encoder_hdmi_hpd_notify(struct drm_bridge *bridge, enum drm_connector_status status) {struct meson_encoder_hdmi *encoder_hdmi =bridge_to_meson_encoder_hdmi (bridge); -struct edid *edid;if (!encoder_hdmi->cec_notifier)return ;if (status == connector_status_connected) { - edid =drm_bridge_get_edid (encoder_hdmi->next_bridge, encoder_hdmi->connector); -if (!edid) +const struct drm_edid *drm_edid; +const struct edid *edid; + + drm_edid =drm_bridge_edid_read (encoder_hdmi->next_bridge, + encoder_hdmi->connector); +if (!drm_edid)return ; +/* +* FIXME: The CEC physical address should be set using +* cec_notifier_set_phys_addr(encoder_hdmi->cec_notifier, +* connector->display_info.source_physical_address) from a path +* that has read the EDID and called +* drm_edid_connector_update(). +*/ + edid =drm_edid_raw (drm_edid); +cec_notifier_set_phys_addr_from_edid (encoder_hdmi->cec_notifier, edid); -kfree (edid); +drm_edid_free (drm_edid); }else cec_notifier_phys_addr_invalidate (encoder_hdmi->cec_notifier); }
Signature · 1 line
2.39.2
PATCH v2 13/39 drm/bridge: remove drm_bridge_get_edid() in favour of drm_bridge_edid_read()
In reply to Jani NikulaAll users of drm_bridge_get_edid() have been converted to use drm_bridge_edid_read(). Remove drm_bridge_get_edid().
--- drivers/gpu/drm/drm_bridge.c | 28 ++-------------------------- include/drm/drm_bridge.h | 2 -- 2 files changed, 2 insertions(+), 28 deletions(-)
drivers/gpu/drm/drm_bridge.c +2 -26
@@ -1217,7 +1217,7 @@ EXPORT_SYMBOL_GPL(drm_bridge_get_modes);* the EDID and return it. Otherwise return NULL. * * If &drm_bridge_funcs.edid_read is not set, fall back to using -* drm_bridge_get_edid() and wrapping it in struct drm_edid. +* &drm_bridge_funcs.get_edid and wrapping it in struct drm_edid. * * RETURNS: * The retrieved EDID on success, or NULL otherwise.
@@ -1233,7 +1233,7 @@ const struct drm_edid *drm_bridge_edid_read(struct drm_bridge *bridge,const struct drm_edid *drm_edid;struct edid *edid; - edid =drm_bridge_get_edid (bridge, connector); + edid = bridge->funcs->get_edid (bridge, connector);if (!edid)return NULL ;
@@ -1248,30 +1248,6 @@ const struct drm_edid *drm_bridge_edid_read(struct drm_bridge *bridge, }EXPORT_SYMBOL_GPL (drm_bridge_edid_read); -/** -* drm_bridge_get_edid - get the EDID data of the connected display -* @bridge: bridge control structure -* @connector: the connector to read EDID for -* -* If the bridge supports output EDID retrieval, as reported by the -* DRM_BRIDGE_OP_EDID bridge ops flag, call &drm_bridge_funcs.get_edid to -* get the EDID and return it. Otherwise return NULL. -* -* Deprecated. Prefer using drm_bridge_edid_read(). -* -* RETURNS: -* The retrieved EDID on success, or NULL otherwise. -*/ -struct edid *drm_bridge_get_edid (struct drm_bridge *bridge, -struct drm_connector *connector) -{ -if (!(bridge->ops &DRM_BRIDGE_OP_EDID )) -return NULL ; - -return bridge->funcs->get_edid (bridge, connector); -} -EXPORT_SYMBOL_GPL (drm_bridge_get_edid); -/** * drm_bridge_hpd_enable - enable hot plug detection for the bridge * @bridge: bridge control structure
include/drm/drm_bridge.h +0 -2
@@ -921,8 +921,6 @@ int drm_bridge_get_modes(struct drm_bridge *bridge, struct drm_connector *connector);const struct drm_edid *drm_bridge_edid_read (struct drm_bridge *bridge,struct drm_connector *connector); -struct edid *drm_bridge_get_edid (struct drm_bridge *bridge, -struct drm_connector *connector); void drm_bridge_hpd_enable(struct drm_bridge *bridge, void (*cb)(void *data, enum drm_connector_status status),
Signature · 1 line
2.39.2
PATCH v2 14/39 drm/bridge: anx7625: switch to ->edid_read callback
In reply to Jani NikulaPrefer using the struct drm_edid based callback.
v2: Fix build (goto out;)
--- drivers/gpu/drm/bridge/analogix/anx7625.c | 30 ++++++++--------------- 1 file changed, 10 insertions(+), 20 deletions(-)
drivers/gpu/drm/bridge/analogix/anx7625.c +10 -20
@@ -1782,24 +1782,14 @@ static ssize_t anx7625_aux_transfer(struct drm_dp_aux *aux,return ret; } -static struct edid *anx7625_get_edid (struct anx7625_data *ctx) +static const struct drm_edid *anx7625_edid_read (struct anx7625_data *ctx) {struct device *dev = ctx->dev;struct s_edid_data *p_edid = &ctx->slimport_edid_p;int edid_num; -u8 *edid; - edid =kmalloc (FOUR_BLOCK_SIZE ,GFP_KERNEL ); -if (!edid) { -DRM_DEV_ERROR (dev,"Fail to allocate buffer\n" ); -return NULL ; - } - -if (ctx->slimport_edid_p.edid_block_num >0 ) { -memcpy (edid, ctx->slimport_edid_p.edid_raw_data, -FOUR_BLOCK_SIZE ); -return (struct edid *)edid; - } +if (ctx->slimport_edid_p.edid_block_num >0 ) + goto out;pm_runtime_get_sync (dev);_anx7625_hpd_polling (ctx,5000 *100 );
@@ -1808,14 +1798,14 @@ static struct edid *anx7625_get_edid(struct anx7625_data *ctx)if (edid_num <1 ) {DRM_DEV_ERROR (dev,"Fail to read EDID: %d\n" , edid_num); -kfree (edid);return NULL ; } p_edid->edid_block_num = edid_num; -memcpy (edid, ctx->slimport_edid_p.edid_raw_data,FOUR_BLOCK_SIZE ); -return (struct edid *)edid; +out: +return drm_edid_alloc (ctx->slimport_edid_p.edid_raw_data, +FOUR_BLOCK_SIZE ); }static enum drm_connector_status anx7625_sink_detect (struct anx7625_data *ctx)
@@ -2488,15 +2478,15 @@ anx7625_bridge_detect(struct drm_bridge *bridge)return anx7625_sink_detect (ctx); } -static struct edid *anx7625_bridge_get_edid (struct drm_bridge *bridge, -struct drm_connector *connector) +static const struct drm_edid *anx7625_bridge_edid_read (struct drm_bridge *bridge, +struct drm_connector *connector) {struct anx7625_data *ctx =bridge_to_anx7625 (bridge);struct device *dev = ctx->dev;DRM_DEV_DEBUG_DRIVER (dev,"drm bridge get edid\n" ); -return anx7625_get_edid (ctx); +return anx7625_edid_read (ctx); }static const struct drm_bridge_funcs anx7625_bridge_funcs = {
@@ -2511,7 +2501,7 @@ static const struct drm_bridge_funcs anx7625_bridge_funcs = { .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state, .atomic_reset = drm_atomic_helper_bridge_reset, .detect = anx7625_bridge_detect, - .get_edid = anx7625_bridge_get_edid, + .edid_read = anx7625_bridge_edid_read, }; static int anx7625_register_i2c_dummy_clients(struct anx7625_data *ctx,
Signature · 1 line
2.39.2
PATCH v2 15/39 drm/bridge: cdns-mhdp8546: switch to ->edid_read callback
In reply to Jani NikulaPrefer using the struct drm_edid based callback and functions.
--- .../drm/bridge/cadence/cdns-mhdp8546-core.c | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-)
drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c +13 -13
@@ -1505,33 +1505,33 @@ static void cdns_mhdp_link_down(struct cdns_mhdp_device *mhdp) mhdp->link_up = false; } -static struct edid *cdns_mhdp_get_edid (struct cdns_mhdp_device *mhdp, -struct drm_connector *connector) +static const struct drm_edid *cdns_mhdp_edid_read (struct cdns_mhdp_device *mhdp, +struct drm_connector *connector) {if (!mhdp->plugged)return NULL ; -return drm_do_get_edid (connector, cdns_mhdp_get_edid_block, mhdp); +return drm_edid_read_custom (connector, cdns_mhdp_get_edid_block, mhdp); }static int cdns_mhdp_get_modes (struct drm_connector *connector) {struct cdns_mhdp_device *mhdp =connector_to_mhdp (connector); -struct edid *edid; +const struct drm_edid *drm_edid;int num_modes;if (!mhdp->plugged)return 0 ; - edid =cdns_mhdp_get_edid (mhdp, connector); -if (!edid) { + drm_edid =cdns_mhdp_edid_read (mhdp, connector); +if (!drm_edid) {dev_err (mhdp->dev,"Failed to read EDID\n" );return 0 ; } -drm_connector_update_edid_property (connector, edid); - num_modes =drm_add_edid_modes (connector, edid); -kfree (edid); +drm_edid_connector_update (connector, drm_edid); + num_modes =drm_edid_connector_add_modes (connector); +drm_edid_free (drm_edid);/* * HACK: Warn about unsupported display formats until we deal
@@ -2220,12 +2220,12 @@ static enum drm_connector_status cdns_mhdp_bridge_detect(struct drm_bridge *bridreturn cdns_mhdp_detect (mhdp); } -static struct edid *cdns_mhdp_bridge_get_edid (struct drm_bridge *bridge, -struct drm_connector *connector) +static const struct drm_edid *cdns_mhdp_bridge_edid_read (struct drm_bridge *bridge, +struct drm_connector *connector) {struct cdns_mhdp_device *mhdp =bridge_to_mhdp (bridge); -return cdns_mhdp_get_edid (mhdp, connector); +return cdns_mhdp_edid_read (mhdp, connector); }static const struct drm_bridge_funcs cdns_mhdp_bridge_funcs = {
@@ -2239,7 +2239,7 @@ static const struct drm_bridge_funcs cdns_mhdp_bridge_funcs = { .atomic_reset = cdns_mhdp_bridge_atomic_reset, .atomic_get_input_bus_fmts = cdns_mhdp_get_input_bus_fmts, .detect = cdns_mhdp_bridge_detect, - .get_edid = cdns_mhdp_bridge_get_edid, + .edid_read = cdns_mhdp_bridge_edid_read, .hpd_enable = cdns_mhdp_bridge_hpd_enable, .hpd_disable = cdns_mhdp_bridge_hpd_disable, };
Signature · 1 line
2.39.2
PATCH v2 16/39 drm/bridge: cdns-mhdp8546: clear the EDID property on failures
In reply to Jani NikulaIf EDID read fails, clear the EDID property.
--- drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c +3 -1
@@ -1524,12 +1524,14 @@ static int cdns_mhdp_get_modes(struct drm_connector *connector)return 0 ; drm_edid =cdns_mhdp_edid_read (mhdp, connector); + +drm_edid_connector_update (connector, drm_edid); +if (!drm_edid) {dev_err (mhdp->dev,"Failed to read EDID\n" );return 0 ; } -drm_edid_connector_update (connector, drm_edid); num_modes =drm_edid_connector_add_modes (connector);drm_edid_free (drm_edid);
Signature · 1 line
2.39.2
PATCH v2 17/39 drm/bridge: display-connector: switch to ->edid_read callback
In reply to Jani NikulaPrefer using the struct drm_edid based callback and functions.
--- drivers/gpu/drm/bridge/display-connector.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/gpu/drm/bridge/display-connector.c +4 -4
@@ -81,12 +81,12 @@ display_connector_detect(struct drm_bridge *bridge) } } -static struct edid *display_connector_get_edid (struct drm_bridge *bridge, -struct drm_connector *connector) +static const struct drm_edid *display_connector_edid_read (struct drm_bridge *bridge, +struct drm_connector *connector) {struct display_connector *conn =to_display_connector (bridge); -return drm_get_edid (connector, conn->bridge.ddc); +return drm_edid_read_ddc (connector, conn->bridge.ddc); }/*
@@ -172,7 +172,7 @@ static u32 *display_connector_get_input_bus_fmts(struct drm_bridge *bridge,static const struct drm_bridge_funcs display_connector_bridge_funcs = { .attach = display_connector_attach, .detect = display_connector_detect, - .get_edid = display_connector_get_edid, + .edid_read = display_connector_edid_read, .atomic_get_output_bus_fmts = display_connector_get_output_bus_fmts, .atomic_get_input_bus_fmts = display_connector_get_input_bus_fmts, .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,
Signature · 1 line
2.39.2
PATCH v2 18/39 drm/bridge: it6505: switch to ->edid_read callback
In reply to Jani NikulaPrefer using the struct drm_edid based callback and functions.
--- drivers/gpu/drm/bridge/ite-it6505.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-)
drivers/gpu/drm/bridge/ite-it6505.c +9 -8
@@ -458,7 +458,7 @@ struct it6505 {/* it6505 driver hold option */ bool enable_drv_hold; -struct edid *cached_edid; +const struct drm_edid *cached_edid; };struct it6505_step_train_para {
@@ -2261,7 +2261,7 @@ static void it6505_plugged_status_to_codec(struct it6505 *it6505)static void it6505_remove_edid (struct it6505 *it6505) { -kfree (it6505->cached_edid); +drm_edid_free (it6505->cached_edid); it6505->cached_edid =NULL ; }
@@ -3032,15 +3032,16 @@ it6505_bridge_detect(struct drm_bridge *bridge)return it6505_detect (it6505); } -static struct edid *it6505_bridge_get_edid (struct drm_bridge *bridge, -struct drm_connector *connector) +static const struct drm_edid *it6505_bridge_edid_read (struct drm_bridge *bridge, +struct drm_connector *connector) {struct it6505 *it6505 =bridge_to_it6505 (bridge);struct device *dev = it6505->dev;if (!it6505->cached_edid) { - it6505->cached_edid =drm_do_get_edid (connector, it6505_get_edid_block, - it6505); + it6505->cached_edid =drm_edid_read_custom (connector, + it6505_get_edid_block, + it6505);if (!it6505->cached_edid) {DRM_DEV_DEBUG_DRIVER (dev,"failed to get edid!" );
@@ -3048,7 +3049,7 @@ static struct edid *it6505_bridge_get_edid(struct drm_bridge *bridge, } } -return drm_edid_duplicate (it6505->cached_edid); +return drm_edid_dup (it6505->cached_edid); }static const struct drm_bridge_funcs it6505_bridge_funcs = {
@@ -3063,7 +3064,7 @@ static const struct drm_bridge_funcs it6505_bridge_funcs = { .atomic_pre_enable = it6505_bridge_atomic_pre_enable, .atomic_post_disable = it6505_bridge_atomic_post_disable, .detect = it6505_bridge_detect, - .get_edid = it6505_bridge_get_edid, + .edid_read = it6505_bridge_edid_read, };static __maybe_unused int it6505_bridge_resume (struct device *dev)
Signature · 1 line
2.39.2
PATCH v2 19/39 drm: bridge: it66121: switch to ->edid_read callback
In reply to Jani NikulaPrefer using the struct drm_edid based callback and functions.
--- drivers/gpu/drm/bridge/ite-it66121.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
drivers/gpu/drm/bridge/ite-it66121.c +8 -8
@@ -874,33 +874,33 @@ static void it66121_bridge_hpd_disable(struct drm_bridge *bridge)dev_err (ctx->dev,"failed to disable HPD IRQ\n" ); } -static struct edid *it66121_bridge_get_edid (struct drm_bridge *bridge, -struct drm_connector *connector) +static const struct drm_edid *it66121_bridge_edid_read (struct drm_bridge *bridge, +struct drm_connector *connector) { struct it66121_ctx *ctx = container_of(bridge, struct it66121_ctx, bridge); -struct edid *edid; +const struct drm_edid *drm_edid;int ret;mutex_lock (&ctx->lock); ret =it66121_preamble_ddc (ctx);if (ret) { - edid =NULL ; + drm_edid =NULL ; goto out_unlock; } ret =regmap_write (ctx->regmap,IT66121_DDC_HEADER_REG ,IT66121_DDC_HEADER_EDID );if (ret) { - edid =NULL ; + drm_edid =NULL ; goto out_unlock; } - edid =drm_do_get_edid (connector, it66121_get_edid_block, ctx); + drm_edid =drm_edid_read_custom (connector, it66121_get_edid_block, ctx); out_unlock:mutex_unlock (&ctx->lock); -return edid; +return drm_edid; }static const struct drm_bridge_funcs it66121_bridge_funcs = {
@@ -916,7 +916,7 @@ static const struct drm_bridge_funcs it66121_bridge_funcs = { .mode_set = it66121_bridge_mode_set, .mode_valid = it66121_bridge_mode_valid, .detect = it66121_bridge_detect, - .get_edid = it66121_bridge_get_edid, + .edid_read = it66121_bridge_edid_read, .hpd_enable = it66121_bridge_hpd_enable, .hpd_disable = it66121_bridge_hpd_disable, };
Signature · 1 line
2.39.2
PATCH v2 20/39 drm/bridge: lt9611: switch to ->edid_read callback
In reply to Jani NikulaPrefer using the struct drm_edid based callback and functions.
--- drivers/gpu/drm/bridge/lontium-lt9611.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/gpu/drm/bridge/lontium-lt9611.c +4 -4
@@ -846,13 +846,13 @@ lt9611_bridge_atomic_post_disable(struct drm_bridge *bridge,lt9611_sleep_setup (lt9611); } -static struct edid *lt9611_bridge_get_edid (struct drm_bridge *bridge, -struct drm_connector *connector) +static const struct drm_edid *lt9611_bridge_edid_read (struct drm_bridge *bridge, +struct drm_connector *connector) {struct lt9611 *lt9611 =bridge_to_lt9611 (bridge);lt9611_power_on (lt9611); -return drm_do_get_edid (connector, lt9611_get_edid_block, lt9611); +return drm_edid_read_custom (connector, lt9611_get_edid_block, lt9611); }static void lt9611_bridge_hpd_enable (struct drm_bridge *bridge)
@@ -892,7 +892,7 @@ static const struct drm_bridge_funcs lt9611_bridge_funcs = { .attach = lt9611_bridge_attach, .mode_valid = lt9611_bridge_mode_valid, .detect = lt9611_bridge_detect, - .get_edid = lt9611_bridge_get_edid, + .edid_read = lt9611_bridge_edid_read, .hpd_enable = lt9611_bridge_hpd_enable, .atomic_pre_enable = lt9611_bridge_atomic_pre_enable,
Signature · 1 line
2.39.2
PATCH v2 21/39 drm/bridge: lt9611uxc: switch to ->edid_read callback
In reply to Jani NikulaPrefer using the struct drm_edid based callback and functions.
--- drivers/gpu/drm/bridge/lontium-lt9611uxc.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/gpu/drm/bridge/lontium-lt9611uxc.c +4 -4
@@ -494,8 +494,8 @@ static int lt9611uxc_get_edid_block(void *data, u8 *buf, unsigned int block, sizreturn 0 ; }; -static struct edid *lt9611uxc_bridge_get_edid (struct drm_bridge *bridge, -struct drm_connector *connector) +static const struct drm_edid *lt9611uxc_bridge_edid_read (struct drm_bridge *bridge, +struct drm_connector *connector) {struct lt9611uxc *lt9611uxc =bridge_to_lt9611uxc (bridge);int ret;
@@ -509,7 +509,7 @@ static struct edid *lt9611uxc_bridge_get_edid(struct drm_bridge *bridge,return NULL ; } -return drm_do_get_edid (connector, lt9611uxc_get_edid_block, lt9611uxc); +return drm_edid_read_custom (connector, lt9611uxc_get_edid_block, lt9611uxc); }static const struct drm_bridge_funcs lt9611uxc_bridge_funcs = {
@@ -517,7 +517,7 @@ static const struct drm_bridge_funcs lt9611uxc_bridge_funcs = { .mode_valid = lt9611uxc_bridge_mode_valid, .mode_set = lt9611uxc_bridge_mode_set, .detect = lt9611uxc_bridge_detect, - .get_edid = lt9611uxc_bridge_get_edid, + .edid_read = lt9611uxc_bridge_edid_read, }; static int lt9611uxc_parse_dt(struct device *dev,
Signature · 1 line
2.39.2
PATCH v2 22/39 drm/bridge: megachips: switch to ->edid_read callback
In reply to Jani NikulaPrefer using the struct drm_edid based callback and functions.
--- .../bridge/megachips-stdpxxxx-ge-b850v3-fw.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-)
drivers/gpu/drm/bridge/megachips-stdpxxxx-ge-b850v3-fw.c +9 -9
@@ -91,26 +91,26 @@ static int stdp2690_read_block(void *context, u8 *buf, unsigned int block, size_return 0 ; } -static struct edid *ge_b850v3_lvds_get_edid (struct drm_bridge *bridge, -struct drm_connector *connector) +static const struct drm_edid *ge_b850v3_lvds_edid_read (struct drm_bridge *bridge, +struct drm_connector *connector) {struct i2c_client *client; client = ge_b850v3_lvds_ptr->stdp2690_i2c; -return drm_do_get_edid (connector, stdp2690_read_block, client); +return drm_edid_read_custom (connector, stdp2690_read_block, client); }static int ge_b850v3_lvds_get_modes (struct drm_connector *connector) { -struct edid *edid; +const struct drm_edid *drm_edid;int num_modes; - edid =ge_b850v3_lvds_get_edid (&ge_b850v3_lvds_ptr->bridge, connector); + drm_edid =ge_b850v3_lvds_edid_read (&ge_b850v3_lvds_ptr->bridge, connector); -drm_connector_update_edid_property (connector, edid); - num_modes =drm_add_edid_modes (connector, edid); -kfree (edid); +drm_edid_connector_update (connector, drm_edid); + num_modes =drm_edid_connector_add_modes (connector); +drm_edid_free (drm_edid);return num_modes; }
@@ -226,7 +226,7 @@ static int ge_b850v3_lvds_attach(struct drm_bridge *bridge,static const struct drm_bridge_funcs ge_b850v3_lvds_funcs = { .attach = ge_b850v3_lvds_attach, .detect = ge_b850v3_lvds_bridge_detect, - .get_edid = ge_b850v3_lvds_get_edid, + .edid_read = ge_b850v3_lvds_edid_read, };static int ge_b850v3_lvds_init (struct device *dev)
Signature · 1 line
2.39.2
PATCH v2 23/39 drm/bridge: nxp-ptn3460: switch to ->edid_read callback
In reply to Jani NikulaPrefer using the struct drm_edid based callback and functions.
--- drivers/gpu/drm/bridge/nxp-ptn3460.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-)
drivers/gpu/drm/bridge/nxp-ptn3460.c +13 -10
@@ -154,10 +154,11 @@ static void ptn3460_disable(struct drm_bridge *bridge) } -static struct edid *ptn3460_get_edid (struct drm_bridge *bridge, -struct drm_connector *connector) +static const struct drm_edid *ptn3460_edid_read (struct drm_bridge *bridge, +struct drm_connector *connector) {struct ptn3460_bridge *ptn_bridge =bridge_to_ptn3460 (bridge); +const struct drm_edid *drm_edid;bool power_off;u8 *edid;int ret;
@@ -175,27 +176,29 @@ static struct edid *ptn3460_get_edid(struct drm_bridge *bridge, EDID_LENGTH);if (ret) {kfree (edid); - edid =NULL ; + drm_edid =NULL ; goto out; } + drm_edid =drm_edid_alloc (edid,EDID_LENGTH ); + out:if (power_off)ptn3460_disable (&ptn_bridge->bridge); -return (struct edid *)edid; +return drm_edid; }static int ptn3460_connector_get_modes (struct drm_connector *connector) {struct ptn3460_bridge *ptn_bridge =connector_to_ptn3460 (connector); -struct edid *edid; +const struct drm_edid *drm_edid;int num_modes; - edid =ptn3460_get_edid (&ptn_bridge->bridge, connector); -drm_connector_update_edid_property (connector, edid); - num_modes =drm_add_edid_modes (connector, edid); -kfree (edid); + drm_edid =ptn3460_edid_read (&ptn_bridge->bridge, connector); +drm_edid_connector_update (connector, drm_edid); + num_modes =drm_edid_connector_add_modes (connector); +drm_edid_free (drm_edid);return num_modes; }
@@ -254,7 +257,7 @@ static const struct drm_bridge_funcs ptn3460_bridge_funcs = { .pre_enable = ptn3460_pre_enable, .disable = ptn3460_disable, .attach = ptn3460_bridge_attach, - .get_edid = ptn3460_get_edid, + .edid_read = ptn3460_edid_read, };static int ptn3460_probe (struct i2c_client *client)
Signature · 1 line
2.39.2
kernel test robot
build botRe: [PATCH v2 23/39] drm/bridge: nxp-ptn3460: switch to ->edid_read callback
kernel test robot noticed the following build warnings:
Hi Jani,
kernel test robot noticed the following build warnings:
[auto build test WARNING on drm-misc/drm-misc-next]
[also build test WARNING on drm/drm-next drm-exynos/exynos-drm-next drm-intel/for-linux-next-fixes drm-tip/drm-tip linus/master v6.7-rc8 next-20240103] [cannot apply to drm-intel/for-linux-next]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Jani-Nikula/drm-bridge-add-edid_read-hook-and-drm_bridge_edid_read/20240103-181513 base: git://anongit.freedesktop.org/drm/drm-misc drm-misc-next patch link: https://lore.kernel.org/r/87fb7fd52d087dd9a15b7194f3915b6b1c4146d6.1704276309.git.jani.nikula%40intel.com patch subject: [PATCH v2 23/39] drm/bridge: nxp-ptn3460: switch to ->edid_read callback config: arm-randconfig-001-20240103 (https://download.01.org/0day-ci/archive/20240104/[email protected]/config) compiler: clang version 18.0.0git (https://github.com/llvm/llvm-project 7e186d366d6c7def0543acc255931f617e76dff0) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240104/[email protected]/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/
All warnings (new ones prefixed by >>):
>> drivers/gpu/drm/bridge/nxp-ptn3460.c:170:6: warning: variable 'drm_edid' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
170 | if (!edid) {
| ^~~~~
drivers/gpu/drm/bridge/nxp-ptn3460.c:189:9: note: uninitialized use occurs here
189 | return drm_edid;
| ^~~~~~~~
drivers/gpu/drm/bridge/nxp-ptn3460.c:170:2: note: remove the 'if' if its condition is always false
170 | if (!edid) {
| ^~~~~~~~~~~~
171 | DRM_ERROR("Failed to allocate EDID\n");
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
172 | goto out;
| ~~~~~~~~~
173 | }
| ~
drivers/gpu/drm/bridge/nxp-ptn3460.c:161:33: note: initialize the variable 'drm_edid' to silence this warning
161 | const struct drm_edid *drm_edid;
| ^
| = NULL1 warning generated.
vim +170 drivers/gpu/drm/bridge/nxp-ptn3460.c
a9fe713d7d45c6 drivers/gpu/drm/bridge/ptn3460.c Sean Paul 2014-02-24 155
a9fe713d7d45c6 drivers/gpu/drm/bridge/ptn3460.c Sean Paul 2014-02-24 156
dd6c2ed9dace84 drivers/gpu/drm/bridge/nxp-ptn3460.c Jani Nikula 2024-01-03 157 static const struct drm_edid *ptn3460_edid_read(struct drm_bridge *bridge,
4151c14cdda689 drivers/gpu/drm/bridge/nxp-ptn3460.c Sam Ravnborg 2020-07-27 158 struct drm_connector *connector)
a9fe713d7d45c6 drivers/gpu/drm/bridge/ptn3460.c Sean Paul 2014-02-24 159 {
4151c14cdda689 drivers/gpu/drm/bridge/nxp-ptn3460.c Sam Ravnborg 2020-07-27 160 struct ptn3460_bridge *ptn_bridge = bridge_to_ptn3460(bridge);
dd6c2ed9dace84 drivers/gpu/drm/bridge/nxp-ptn3460.c Jani Nikula 2024-01-03 161 const struct drm_edid *drm_edid;
a9fe713d7d45c6 drivers/gpu/drm/bridge/ptn3460.c Sean Paul 2014-02-24 162 bool power_off;
4151c14cdda689 drivers/gpu/drm/bridge/nxp-ptn3460.c Sam Ravnborg 2020-07-27 163 u8 *edid;
4151c14cdda689 drivers/gpu/drm/bridge/nxp-ptn3460.c Sam Ravnborg 2020-07-27 164 int ret;
a9fe713d7d45c6 drivers/gpu/drm/bridge/ptn3460.c Sean Paul 2014-02-24 165
a9fe713d7d45c6 drivers/gpu/drm/bridge/ptn3460.c Sean Paul 2014-02-24 166 power_off = !ptn_bridge->enabled;
94d50d57c4403a drivers/gpu/drm/bridge/ptn3460.c Ajay Kumar 2015-01-20 167 ptn3460_pre_enable(&ptn_bridge->bridge);
a9fe713d7d45c6 drivers/gpu/drm/bridge/ptn3460.c Sean Paul 2014-02-24 168
a9fe713d7d45c6 drivers/gpu/drm/bridge/ptn3460.c Sean Paul 2014-02-24 169 edid = kmalloc(EDID_LENGTH, GFP_KERNEL);
a9fe713d7d45c6 drivers/gpu/drm/bridge/ptn3460.c Sean Paul 2014-02-24 @170 if (!edid) {
94d50d57c4403a drivers/gpu/drm/bridge/ptn3460.c Ajay Kumar 2015-01-20 171 DRM_ERROR("Failed to allocate EDID\n");
4151c14cdda689 drivers/gpu/drm/bridge/nxp-ptn3460.c Sam Ravnborg 2020-07-27 172 goto out;
a9fe713d7d45c6 drivers/gpu/drm/bridge/ptn3460.c Sean Paul 2014-02-24 173 }
a9fe713d7d45c6 drivers/gpu/drm/bridge/ptn3460.c Sean Paul 2014-02-24 174
a9fe713d7d45c6 drivers/gpu/drm/bridge/ptn3460.c Sean Paul 2014-02-24 175 ret = ptn3460_read_bytes(ptn_bridge, PTN3460_EDID_ADDR, edid,
a9fe713d7d45c6 drivers/gpu/drm/bridge/ptn3460.c Sean Paul 2014-02-24 176 EDID_LENGTH);
a9fe713d7d45c6 drivers/gpu/drm/bridge/ptn3460.c Sean Paul 2014-02-24 177 if (ret) {
a9fe713d7d45c6 drivers/gpu/drm/bridge/ptn3460.c Sean Paul 2014-02-24 178 kfree(edid);
dd6c2ed9dace84 drivers/gpu/drm/bridge/nxp-ptn3460.c Jani Nikula 2024-01-03 179 drm_edid = NULL;
a9fe713d7d45c6 drivers/gpu/drm/bridge/ptn3460.c Sean Paul 2014-02-24 180 goto out;
a9fe713d7d45c6 drivers/gpu/drm/bridge/ptn3460.c Sean Paul 2014-02-24 181 }
a9fe713d7d45c6 drivers/gpu/drm/bridge/ptn3460.c Sean Paul 2014-02-24 182
dd6c2ed9dace84 drivers/gpu/drm/bridge/nxp-ptn3460.c Jani Nikula 2024-01-03 183 drm_edid = drm_edid_alloc(edid, EDID_LENGTH);
dd6c2ed9dace84 drivers/gpu/drm/bridge/nxp-ptn3460.c Jani Nikula 2024-01-03 184
a9fe713d7d45c6 drivers/gpu/drm/bridge/ptn3460.c Sean Paul 2014-02-24 185 out:
a9fe713d7d45c6 drivers/gpu/drm/bridge/ptn3460.c Sean Paul 2014-02-24 186 if (power_off)
94d50d57c4403a drivers/gpu/drm/bridge/ptn3460.c Ajay Kumar 2015-01-20 187 ptn3460_disable(&ptn_bridge->bridge);
a9fe713d7d45c6 drivers/gpu/drm/bridge/ptn3460.c Sean Paul 2014-02-24 188
dd6c2ed9dace84 drivers/gpu/drm/bridge/nxp-ptn3460.c Jani Nikula 2024-01-03 189 return drm_edid;
4151c14cdda689 drivers/gpu/drm/bridge/nxp-ptn3460.c Sam Ravnborg 2020-07-27 190 }
4151c14cdda689 drivers/gpu/drm/bridge/nxp-ptn3460.c Sam Ravnborg 2020-07-27 191 Signature · 2 lines
0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
Re: [PATCH v2 23/39] drm/bridge: nxp-ptn3460: switch to ->edid_read callback
Quoted 45 lines · kernel test robot
Hi Jani,
kernel test robot noticed the following build warnings:
[auto build test WARNING on drm-misc/drm-misc-next]
[also build test WARNING on drm/drm-next drm-exynos/exynos-drm-next drm-intel/for-linux-next-fixes drm-tip/drm-tip linus/master v6.7-rc8 next-20240103] [cannot apply to drm-intel/for-linux-next]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]url: https://github.com/intel-lab-lkp/linux/commits/Jani-Nikula/drm-bridge-add-edid_read-hook-and-drm_bridge_edid_read/20240103-181513 base: git://anongit.freedesktop.org/drm/drm-misc drm-misc-next patch link: https://lore.kernel.org/r/87fb7fd52d087dd9a15b7194f3915b6b1c4146d6.1704276309.git.jani.nikula%40intel.com patch subject: [PATCH v2 23/39] drm/bridge: nxp-ptn3460: switch to ->edid_read callback config: arm-randconfig-001-20240103 (https://download.01.org/0day-ci/archive/20240104/[email protected]/config) compiler: clang version 18.0.0git (https://github.com/llvm/llvm-project 7e186d366d6c7def0543acc255931f617e76dff0) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240104/[email protected]/reproduce)If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/All warnings (new ones prefixed by >>):
Quoted 1 line
Quoted 1 line
drivers/gpu/drm/bridge/nxp-ptn3460.c:170:6: warning: variable 'drm_edid' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]170 | if (!edid) { | ^~~~~ drivers/gpu/drm/bridge/nxp-ptn3460.c:189:9: note: uninitialized use occurs here 189 | return drm_edid; | ^~~~~~~~ drivers/gpu/drm/bridge/nxp-ptn3460.c:170:2: note: remove the 'if' if its condition is always false 170 | if (!edid) { | ^~~~~~~~~~~~ 171 | DRM_ERROR("Failed to allocate EDID\n"); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 172 | goto out; | ~~~~~~~~~ 173 | } | ~ drivers/gpu/drm/bridge/nxp-ptn3460.c:161:33: note: initialize the variable 'drm_edid' to silence this warning 161 | const struct drm_edid *drm_edid; | ^ | = NULL
Quoted 1 line
1 warning generated.
This is a valid report, fixed locally.
BR,
Jani.
Signature · 1 line
Jani Nikula, Intel
PATCH v2 1/1 drm/bridge: nxp-ptn3460: switch to ->edid_read callback
In reply to Jani NikulaPrefer using the struct drm_edid based callback and functions.
v2: Fix -Wsometimes-uninitialized (kernel test robot)
--- drivers/gpu/drm/bridge/nxp-ptn3460.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-)
drivers/gpu/drm/bridge/nxp-ptn3460.c +12 -10
@@ -154,10 +154,11 @@ static void ptn3460_disable(struct drm_bridge *bridge) } -static struct edid *ptn3460_get_edid (struct drm_bridge *bridge, -struct drm_connector *connector) +static const struct drm_edid *ptn3460_edid_read (struct drm_bridge *bridge, +struct drm_connector *connector) {struct ptn3460_bridge *ptn_bridge =bridge_to_ptn3460 (bridge); +const struct drm_edid *drm_edid =NULL ;bool power_off;u8 *edid;int ret;
@@ -175,27 +176,28 @@ static struct edid *ptn3460_get_edid(struct drm_bridge *bridge, EDID_LENGTH);if (ret) {kfree (edid); - edid =NULL ; goto out; } + drm_edid =drm_edid_alloc (edid,EDID_LENGTH ); + out:if (power_off)ptn3460_disable (&ptn_bridge->bridge); -return (struct edid *)edid; +return drm_edid; }static int ptn3460_connector_get_modes (struct drm_connector *connector) {struct ptn3460_bridge *ptn_bridge =connector_to_ptn3460 (connector); -struct edid *edid; +const struct drm_edid *drm_edid;int num_modes; - edid =ptn3460_get_edid (&ptn_bridge->bridge, connector); -drm_connector_update_edid_property (connector, edid); - num_modes =drm_add_edid_modes (connector, edid); -kfree (edid); + drm_edid =ptn3460_edid_read (&ptn_bridge->bridge, connector); +drm_edid_connector_update (connector, drm_edid); + num_modes =drm_edid_connector_add_modes (connector); +drm_edid_free (drm_edid);return num_modes; }
@@ -254,7 +256,7 @@ static const struct drm_bridge_funcs ptn3460_bridge_funcs = { .pre_enable = ptn3460_pre_enable, .disable = ptn3460_disable, .attach = ptn3460_bridge_attach, - .get_edid = ptn3460_get_edid, + .edid_read = ptn3460_edid_read, };static int ptn3460_probe (struct i2c_client *client)
Signature · 1 line
2.39.2
PATCH v2 24/39 drm/bridge: sii902x: use display info is_hdmi
In reply to Jani NikulaUse the pre-parsed information instead of parsing EDID again.
--- drivers/gpu/drm/bridge/sii902x.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-)
drivers/gpu/drm/bridge/sii902x.c +2 -6
@@ -286,12 +286,6 @@ static struct edid *sii902x_get_edid(struct sii902x *sii902x,mutex_lock (&sii902x->mutex); edid =drm_get_edid (connector, sii902x->i2cmux->adapter[0 ]); -if (edid) { -if (drm_detect_hdmi_monitor (edid)) - sii902x->sink_is_hdmi = true; -else - sii902x->sink_is_hdmi = false; - }mutex_unlock (&sii902x->mutex);
@@ -311,6 +305,8 @@ static int sii902x_get_modes(struct drm_connector *connector)kfree (edid); } + sii902x->sink_is_hdmi = connector->display_info.is_hdmi; +return num; }
Signature · 1 line
2.39.2
PATCH v2 25/39 drm/bridge: sii902x: switch to ->edid_read callback
In reply to Jani NikulaPrefer using the struct drm_edid based callback and functions.
--- drivers/gpu/drm/bridge/sii902x.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-)
drivers/gpu/drm/bridge/sii902x.c +15 -15
@@ -278,31 +278,31 @@ static const struct drm_connector_funcs sii902x_connector_funcs = { .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, }; -static struct edid *sii902x_get_edid (struct sii902x *sii902x, -struct drm_connector *connector) +static const struct drm_edid *sii902x_edid_read (struct sii902x *sii902x, +struct drm_connector *connector) { -struct edid *edid; +const struct drm_edid *drm_edid;mutex_lock (&sii902x->mutex); - edid =drm_get_edid (connector, sii902x->i2cmux->adapter[0 ]); + drm_edid =drm_edid_read_ddc (connector, sii902x->i2cmux->adapter[0 ]);mutex_unlock (&sii902x->mutex); -return edid; +return drm_edid; }static int sii902x_get_modes (struct drm_connector *connector) {struct sii902x *sii902x =connector_to_sii902x (connector); -struct edid *edid; +const struct drm_edid *drm_edid;int num =0 ; - edid =sii902x_get_edid (sii902x, connector); -drm_connector_update_edid_property (connector, edid); -if (edid) { - num =drm_add_edid_modes (connector, edid); -kfree (edid); + drm_edid =sii902x_edid_read (sii902x, connector); +drm_edid_connector_update (connector, drm_edid); +if (drm_edid) { + num =drm_edid_connector_add_modes (connector); +drm_edid_free (drm_edid); } sii902x->sink_is_hdmi = connector->display_info.is_hdmi;
@@ -461,12 +461,12 @@ static enum drm_connector_status sii902x_bridge_detect(struct drm_bridge *bridgereturn sii902x_detect (sii902x); } -static struct edid *sii902x_bridge_get_edid (struct drm_bridge *bridge, -struct drm_connector *connector) +static const struct drm_edid *sii902x_bridge_edid_read (struct drm_bridge *bridge, +struct drm_connector *connector) {struct sii902x *sii902x =bridge_to_sii902x (bridge); -return sii902x_get_edid (sii902x, connector); +return sii902x_edid_read (sii902x, connector); } static u32 *sii902x_bridge_atomic_get_input_bus_fmts(struct drm_bridge *bridge,
@@ -510,7 +510,7 @@ static const struct drm_bridge_funcs sii902x_bridge_funcs = { .disable = sii902x_bridge_disable, .enable = sii902x_bridge_enable, .detect = sii902x_bridge_detect, - .get_edid = sii902x_bridge_get_edid, + .edid_read = sii902x_bridge_edid_read, .atomic_reset = drm_atomic_helper_bridge_reset, .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state, .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state,
Signature · 1 line
2.39.2
PATCH v2 26/39 drm/mediatek/dp: switch to ->edid_read callback
In reply to Jani NikulaPrefer using the struct drm_edid based callback and functions.
--- drivers/gpu/drm/mediatek/mtk_dp.c | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-)
drivers/gpu/drm/mediatek/mtk_dp.c +20 -11
@@ -2042,12 +2042,12 @@ static enum drm_connector_status mtk_dp_bdg_detect(struct drm_bridge *bridge)return ret; } -static struct edid *mtk_dp_get_edid (struct drm_bridge *bridge, -struct drm_connector *connector) +static const struct drm_edid *mtk_dp_edid_read (struct drm_bridge *bridge, +struct drm_connector *connector) {struct mtk_dp *mtk_dp =mtk_dp_from_bridge (bridge);bool enabled = mtk_dp->enabled; -struct edid *new_edid =NULL ; +const struct drm_edid *drm_edid;struct mtk_dp_audio_cfg *audio_caps = &mtk_dp->info.audio_cur_cfg;if (!enabled) {
@@ -2055,7 +2055,7 @@ static struct edid *mtk_dp_get_edid(struct drm_bridge *bridge,mtk_dp_aux_panel_poweron (mtk_dp, true); } - new_edid =drm_get_edid (connector, &mtk_dp->aux.ddc); + drm_edid =drm_edid_read_ddc (connector, &mtk_dp->aux.ddc);/* * Parse capability here to let atomic_get_input_bus_fmts and
@@ -2063,17 +2063,26 @@ static struct edid *mtk_dp_get_edid(struct drm_bridge *bridge,*/ if (mtk_dp_parse_capabilities (mtk_dp)) {drm_err (mtk_dp->drm_dev,"Can't parse capabilities\n" ); -kfree (new_edid); - new_edid =NULL ; +drm_edid_free (drm_edid); + drm_edid =NULL ; } -if (new_edid) { +if (drm_edid) { +/* +* FIXME: get rid of drm_edid_raw() +*/ +const struct edid *edid =drm_edid_raw (drm_edid);struct cea_sad *sads; - audio_caps->sad_count =drm_edid_to_sad (new_edid, &sads); + audio_caps->sad_count =drm_edid_to_sad (edid, &sads);kfree (sads); - audio_caps->detect_monitor =drm_detect_monitor_audio (new_edid); +/* +* FIXME: This should use connector->display_info.has_audio from +* a path that has read the EDID and called +* drm_edid_connector_update(). +*/ + audio_caps->detect_monitor =drm_detect_monitor_audio (edid); }if (!enabled) {
@@ -2081,7 +2090,7 @@ static struct edid *mtk_dp_get_edid(struct drm_bridge *bridge,drm_atomic_bridge_chain_post_disable (bridge, connector->state->state); } -return new_edid; +return drm_edid; } static ssize_t mtk_dp_aux_transfer(struct drm_dp_aux *mtk_aux,
@@ -2433,7 +2442,7 @@ static const struct drm_bridge_funcs mtk_dp_bridge_funcs = { .atomic_enable = mtk_dp_bridge_atomic_enable, .atomic_disable = mtk_dp_bridge_atomic_disable, .mode_valid = mtk_dp_bridge_mode_valid, - .get_edid = mtk_dp_get_edid, + .edid_read = mtk_dp_edid_read, .detect = mtk_dp_bdg_detect, };
Signature · 1 line
2.39.2
PATCH v2 27/39 drm/mediatek/hdmi: switch to ->edid_read callback
In reply to Jani NikulaPrefer using the struct drm_edid based callback and functions.
--- drivers/gpu/drm/mediatek/mtk_hdmi.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-)
drivers/gpu/drm/mediatek/mtk_hdmi.c +17 -9
@@ -1265,19 +1265,27 @@ static enum drm_connector_status mtk_hdmi_bridge_detect(struct drm_bridge *bridgreturn mtk_hdmi_detect (hdmi); } -static struct edid *mtk_hdmi_bridge_get_edid (struct drm_bridge *bridge, -struct drm_connector *connector) +static const struct drm_edid *mtk_hdmi_bridge_edid_read (struct drm_bridge *bridge, +struct drm_connector *connector) {struct mtk_hdmi *hdmi =hdmi_ctx_from_bridge (bridge); -struct edid *edid; +const struct drm_edid *drm_edid;if (!hdmi->ddc_adpt)return NULL ; - edid =drm_get_edid (connector, hdmi->ddc_adpt); -if (!edid) -return NULL ; - hdmi->dvi_mode = !drm_detect_monitor_audio (edid); -return edid; + drm_edid =drm_edid_read_ddc (connector, hdmi->ddc_adpt); +if (drm_edid) { +/* +* FIXME: This should use !connector->display_info.has_audio (or +* !connector->display_info.is_hdmi) from a path that has read +* the EDID and called drm_edid_connector_update(). +*/ +const struct edid *edid =drm_edid_raw (drm_edid); + + hdmi->dvi_mode = !drm_detect_monitor_audio (edid); + } + +return drm_edid; } static int mtk_hdmi_bridge_attach(struct drm_bridge *bridge,
@@ -1417,7 +1425,7 @@ static const struct drm_bridge_funcs mtk_hdmi_bridge_funcs = { .atomic_pre_enable = mtk_hdmi_bridge_atomic_pre_enable, .atomic_enable = mtk_hdmi_bridge_atomic_enable, .detect = mtk_hdmi_bridge_detect, - .get_edid = mtk_hdmi_bridge_get_edid, + .edid_read = mtk_hdmi_bridge_edid_read, }; static int mtk_hdmi_dt_parse_pdata(struct mtk_hdmi *hdmi,
Signature · 1 line
2.39.2
PATCH v2 28/39 drm/msm/hdmi: fix indent
In reply to Jani NikulaRemove the excess leading tabs.
--- drivers/gpu/drm/msm/hdmi/hdmi_bridge.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/gpu/drm/msm/hdmi/hdmi_bridge.c +6 -6
@@ -290,12 +290,12 @@ static enum drm_mode_status msm_hdmi_bridge_mode_valid(struct drm_bridge *bridge }static const struct drm_bridge_funcs msm_hdmi_bridge_funcs = { - .pre_enable = msm_hdmi_bridge_pre_enable, - .post_disable = msm_hdmi_bridge_post_disable, - .mode_set = msm_hdmi_bridge_mode_set, - .mode_valid = msm_hdmi_bridge_mode_valid, - .get_edid = msm_hdmi_bridge_get_edid, - .detect = msm_hdmi_bridge_detect, + .pre_enable = msm_hdmi_bridge_pre_enable, + .post_disable = msm_hdmi_bridge_post_disable, + .mode_set = msm_hdmi_bridge_mode_set, + .mode_valid = msm_hdmi_bridge_mode_valid, + .get_edid = msm_hdmi_bridge_get_edid, + .detect = msm_hdmi_bridge_detect, }; static void
Signature · 1 line
2.39.2
Quoted 5 lines · Jani Nikula
Convert all of drm/bridge to the new struct
drm_edidinfrastructure. It's safer than struct edid, because it contains meta information about the allocated size of the EDID, instead of relying on the size (number of extensions) originating from outside of the kernel.
Quoted 8 lines
Among all of drm, I think bridge has the most uses of struct edid that do not originate from the
drm_get_edid()family of functions, which means the validity checks are somewhat inconsistent, and having the meta information is more crucial.Only build tested. I'm sure there should be more Cc's especially in the patches towards the end of the series, but I just wanted to get the series out the door now.
PS. It's also available at
https://gitlab.freedesktop.org/jani/linux/-/commits/drm-edid-bridge
Signature · 1 line
Jani Nikula, Intel
PATCH v2 29/39 drm/msm/hdmi: switch to ->edid_read callback
In reply to Jani NikulaPrefer using the struct drm_edid based callback and functions.
--- drivers/gpu/drm/msm/hdmi/hdmi_bridge.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-)
drivers/gpu/drm/msm/hdmi/hdmi_bridge.c +16 -7
@@ -236,24 +236,33 @@ static void msm_hdmi_bridge_mode_set(struct drm_bridge *bridge,msm_hdmi_audio_update (hdmi); } -static struct edid *msm_hdmi_bridge_get_edid (struct drm_bridge *bridge, -struct drm_connector *connector) +static const struct drm_edid *msm_hdmi_bridge_edid_read (struct drm_bridge *bridge, +struct drm_connector *connector) {struct hdmi_bridge *hdmi_bridge =to_hdmi_bridge (bridge);struct hdmi *hdmi = hdmi_bridge->hdmi; -struct edid *edid; +const struct drm_edid *drm_edid;uint32_t hdmi_ctrl; hdmi_ctrl =hdmi_read (hdmi,REG_HDMI_CTRL );hdmi_write (hdmi,REG_HDMI_CTRL , hdmi_ctrl |HDMI_CTRL_ENABLE ); - edid =drm_get_edid (connector, hdmi->i2c); + drm_edid =drm_edid_read_ddc (connector, hdmi->i2c);hdmi_write (hdmi,REG_HDMI_CTRL , hdmi_ctrl); - hdmi->hdmi_mode =drm_detect_hdmi_monitor (edid); +if (drm_edid) { +/* +* FIXME: This should use connector->display_info.is_hdmi from a +* path that has read the EDID and called +* drm_edid_connector_update(). +*/ +const struct edid *edid =drm_edid_raw (drm_edid); -return edid; + hdmi->hdmi_mode =drm_detect_hdmi_monitor (edid); + } + +return drm_edid; } static enum drm_mode_status msm_hdmi_bridge_mode_valid(struct drm_bridge *bridge,
@@ -294,7 +303,7 @@ static const struct drm_bridge_funcs msm_hdmi_bridge_funcs = { .post_disable = msm_hdmi_bridge_post_disable, .mode_set = msm_hdmi_bridge_mode_set, .mode_valid = msm_hdmi_bridge_mode_valid, - .get_edid = msm_hdmi_bridge_get_edid, + .edid_read = msm_hdmi_bridge_edid_read, .detect = msm_hdmi_bridge_detect, };
Signature · 1 line
2.39.2
PATCH v2 30/39 drm/omap/hdmi4: switch to ->edid_read callback
In reply to Jani NikulaPrefer using the struct drm_edid based callback and functions.
--- drivers/gpu/drm/omapdrm/dss/hdmi4.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-)
drivers/gpu/drm/omapdrm/dss/hdmi4.c +15 -7
@@ -436,11 +436,11 @@ static void hdmi4_bridge_hpd_notify(struct drm_bridge *bridge,hdmi4_cec_set_phys_addr (&hdmi->core,CEC_PHYS_ADDR_INVALID ); } -static struct edid *hdmi4_bridge_get_edid (struct drm_bridge *bridge, -struct drm_connector *connector) +static const struct drm_edid *hdmi4_bridge_edid_read (struct drm_bridge *bridge, +struct drm_connector *connector) {struct omap_hdmi *hdmi =drm_bridge_to_hdmi (bridge); -struct edid *edid =NULL ; +const struct drm_edid *drm_edid =NULL ;unsigned int cec_addr;bool need_enable;int r;
@@ -461,13 +461,21 @@ static struct edid *hdmi4_bridge_get_edid(struct drm_bridge *bridge,if (r) goto done; - edid =drm_do_get_edid (connector, hdmi4_core_ddc_read, &hdmi->core); + drm_edid =drm_edid_read_custom (connector, hdmi4_core_ddc_read, &hdmi->core); done:hdmi_runtime_put (hdmi);mutex_unlock (&hdmi->lock); -if (edid && edid->extensions) { +if (drm_edid) { +/* +* FIXME: The CEC physical address should be set using +* hdmi4_cec_set_phys_addr(&hdmi->core, +* connector->display_info.source_physical_address) from a path +* that has read the EDID and called +* drm_edid_connector_update(). +*/ +const struct edid *edid =drm_edid_raw (drm_edid);unsigned int len = (edid->extensions +1 ) *EDID_LENGTH ; cec_addr =cec_get_edid_phys_addr ((u8 *)edid, len,NULL );
@@ -480,7 +488,7 @@ static struct edid *hdmi4_bridge_get_edid(struct drm_bridge *bridge,if (need_enable)hdmi4_core_disable (&hdmi->core); -return edid; +return drm_edid; }static const struct drm_bridge_funcs hdmi4_bridge_funcs = {
@@ -492,7 +500,7 @@ static const struct drm_bridge_funcs hdmi4_bridge_funcs = { .atomic_enable = hdmi4_bridge_enable, .atomic_disable = hdmi4_bridge_disable, .hpd_notify = hdmi4_bridge_hpd_notify, - .get_edid = hdmi4_bridge_get_edid, + .edid_read = hdmi4_bridge_edid_read, };static void hdmi4_bridge_init (struct omap_hdmi *hdmi)
Signature · 1 line
2.39.2
PATCH v2 31/39 drm/omap/hdmi5: switch to ->edid_read callback
In reply to Jani NikulaPrefer using the struct drm_edid based callback and functions.
--- drivers/gpu/drm/omapdrm/dss/hdmi5.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/gpu/drm/omapdrm/dss/hdmi5.c +6 -6
@@ -425,11 +425,11 @@ static void hdmi5_bridge_disable(struct drm_bridge *bridge,mutex_unlock (&hdmi->lock); } -static struct edid *hdmi5_bridge_get_edid (struct drm_bridge *bridge, -struct drm_connector *connector) +static const struct drm_edid *hdmi5_bridge_edid_read (struct drm_bridge *bridge, +struct drm_connector *connector) {struct omap_hdmi *hdmi =drm_bridge_to_hdmi (bridge); -struct edid *edid; +const struct drm_edid *drm_edid;bool need_enable;int idlemode;int r;
@@ -452,7 +452,7 @@ static struct edid *hdmi5_bridge_get_edid(struct drm_bridge *bridge,hdmi5_core_ddc_init (&hdmi->core); - edid =drm_do_get_edid (connector, hdmi5_core_ddc_read, &hdmi->core); + drm_edid =drm_edid_read_custom (connector, hdmi5_core_ddc_read, &hdmi->core);hdmi5_core_ddc_uninit (&hdmi->core);
@@ -464,7 +464,7 @@ static struct edid *hdmi5_bridge_get_edid(struct drm_bridge *bridge,if (need_enable)hdmi_core_disable (hdmi); -return (struct edid *)edid; +return drm_edid; }static const struct drm_bridge_funcs hdmi5_bridge_funcs = {
@@ -475,7 +475,7 @@ static const struct drm_bridge_funcs hdmi5_bridge_funcs = { .atomic_reset = drm_atomic_helper_bridge_reset, .atomic_enable = hdmi5_bridge_enable, .atomic_disable = hdmi5_bridge_disable, - .get_edid = hdmi5_bridge_get_edid, + .edid_read = hdmi5_bridge_edid_read, };static void hdmi5_bridge_init (struct omap_hdmi *hdmi)
Signature · 1 line
2.39.2
PATCH v2 32/39 drm: xlnx: zynqmp_dpsub: switch to ->edid_read callback
In reply to Jani NikulaPrefer using the struct drm_edid based callback and functions.
--- drivers/gpu/drm/xlnx/zynqmp_dp.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/gpu/drm/xlnx/zynqmp_dp.c +4 -4
@@ -1560,12 +1560,12 @@ static enum drm_connector_status zynqmp_dp_bridge_detect(struct drm_bridge *bridreturn connector_status_disconnected; } -static struct edid *zynqmp_dp_bridge_get_edid (struct drm_bridge *bridge, -struct drm_connector *connector) +static const struct drm_edid *zynqmp_dp_bridge_edid_read (struct drm_bridge *bridge, +struct drm_connector *connector) {struct zynqmp_dp *dp =bridge_to_dp (bridge); -return drm_get_edid (connector, &dp->aux.ddc); +return drm_edid_read_ddc (connector, &dp->aux.ddc); }static const struct drm_bridge_funcs zynqmp_dp_bridge_funcs = {
@@ -1579,7 +1579,7 @@ static const struct drm_bridge_funcs zynqmp_dp_bridge_funcs = { .atomic_reset = drm_atomic_helper_bridge_reset, .atomic_check = zynqmp_dp_bridge_atomic_check, .detect = zynqmp_dp_bridge_detect, - .get_edid = zynqmp_dp_bridge_get_edid, + .edid_read = zynqmp_dp_bridge_edid_read, };/* -----------------------------------------------------------------------------
Signature · 1 line
2.39.2
PATCH v2 33/39 drm: adv7511: switch to ->edid_read callback
In reply to Jani NikulaPrefer using the struct drm_edid based callback and functions.
--- drivers/gpu/drm/bridge/adv7511/adv7511_drv.c | 47 +++++++++++++------- 1 file changed, 30 insertions(+), 17 deletions(-)
drivers/gpu/drm/bridge/adv7511/adv7511_drv.c +30 -17
@@ -604,10 +604,10 @@ static int adv7511_get_edid_block(void *data, u8 *buf, unsigned int block,* ADV75xx helpers */ -static struct edid *adv7511_get_edid (struct adv7511 *adv7511, -struct drm_connector *connector) +static const struct drm_edid *adv7511_edid_read (struct adv7511 *adv7511, +struct drm_connector *connector) { -struct edid *edid; +const struct drm_edid *drm_edid;/* Reading the EDID only works if the device is powered */ if (!adv7511->powered) {
@@ -621,31 +621,44 @@ static struct edid *adv7511_get_edid(struct adv7511 *adv7511, edid_i2c_addr); } - edid =drm_do_get_edid (connector, adv7511_get_edid_block, adv7511); + drm_edid =drm_edid_read_custom (connector, adv7511_get_edid_block, adv7511);if (!adv7511->powered)__adv7511_power_off (adv7511); -adv7511_set_config_csc (adv7511, connector, adv7511->rgb, -drm_detect_hdmi_monitor (edid)); +if (drm_edid) { +/* +* FIXME: The CEC physical address should be set using +* cec_s_phys_addr(adap, +* connector->display_info.source_physical_address, false) from +* a path that has read the EDID and called +* drm_edid_connector_update(). +*/ +const struct edid *edid =drm_edid_raw (drm_edid); + +adv7511_set_config_csc (adv7511, connector, adv7511->rgb, +drm_detect_hdmi_monitor (edid)); -cec_s_phys_addr_from_edid (adv7511->cec_adap, edid); +cec_s_phys_addr_from_edid (adv7511->cec_adap, edid); + }else { +cec_s_phys_addr_from_edid (adv7511->cec_adap,NULL ); + } -return edid; +return drm_edid; }static int adv7511_get_modes (struct adv7511 *adv7511,struct drm_connector *connector) { -struct edid *edid; +const struct drm_edid *drm_edid;unsigned int count; - edid =adv7511_get_edid (adv7511, connector); + drm_edid =adv7511_edid_read (adv7511, connector); -drm_connector_update_edid_property (connector, edid); - count =drm_add_edid_modes (connector, edid); +drm_edid_connector_update (connector, drm_edid); + count =drm_edid_connector_add_modes (connector); -kfree (edid); +drm_edid_free (drm_edid);return count; }
@@ -953,12 +966,12 @@ static enum drm_connector_status adv7511_bridge_detect(struct drm_bridge *bridgereturn adv7511_detect (adv,NULL ); } -static struct edid *adv7511_bridge_get_edid (struct drm_bridge *bridge, -struct drm_connector *connector) +static const struct drm_edid *adv7511_bridge_edid_read (struct drm_bridge *bridge, +struct drm_connector *connector) {struct adv7511 *adv =bridge_to_adv7511 (bridge); -return adv7511_get_edid (adv, connector); +return adv7511_edid_read (adv, connector); } static void adv7511_bridge_hpd_notify(struct drm_bridge *bridge,
@@ -977,7 +990,7 @@ static const struct drm_bridge_funcs adv7511_bridge_funcs = { .mode_valid = adv7511_bridge_mode_valid, .attach = adv7511_bridge_attach, .detect = adv7511_bridge_detect, - .get_edid = adv7511_bridge_get_edid, + .edid_read = adv7511_bridge_edid_read, .hpd_notify = adv7511_bridge_hpd_notify, };
Signature · 1 line
2.39.2
PATCH v2 34/39 drm: bridge: dw_hdmi: switch to ->edid_read callback
In reply to Jani NikulaPrefer using the struct drm_edid based callback and functions.
--- drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 43 ++++++++++++++--------- 1 file changed, 26 insertions(+), 17 deletions(-)
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c +26 -17
@@ -2454,16 +2454,17 @@ static enum drm_connector_status dw_hdmi_detect(struct dw_hdmi *hdmi)return result; } -static struct edid *dw_hdmi_get_edid (struct dw_hdmi *hdmi, -struct drm_connector *connector) +static const struct drm_edid *dw_hdmi_edid_read (struct dw_hdmi *hdmi, +struct drm_connector *connector) { -struct edid *edid; +const struct drm_edid *drm_edid; +const struct edid *edid;if (!hdmi->ddc)return NULL ; - edid =drm_get_edid (connector, hdmi->ddc); -if (!edid) { + drm_edid =drm_edid_read_ddc (connector, hdmi->ddc); +if (!drm_edid) {dev_dbg (hdmi->dev,"failed to get edid\n" );return NULL ; }
@@ -2471,10 +2472,17 @@ static struct edid *dw_hdmi_get_edid(struct dw_hdmi *hdmi,dev_dbg (hdmi->dev,"got edid: width[%d] x height[%d]\n" , edid->width_cm, edid->height_cm); +/* +* FIXME: This should use connector->display_info.is_hdmi and +* connector->display_info.has_audio from a path that has read the EDID +* and called drm_edid_connector_update(). +*/ + edid =drm_edid_raw (drm_edid); + hdmi->sink_is_hdmi =drm_detect_hdmi_monitor (edid); hdmi->sink_has_audio =drm_detect_monitor_audio (edid); -return edid; +return drm_edid; }/* -----------------------------------------------------------------------------
@@ -2493,17 +2501,18 @@ static int dw_hdmi_connector_get_modes(struct drm_connector *connector) { struct dw_hdmi *hdmi = container_of(connector, struct dw_hdmi, connector); -struct edid *edid; +const struct drm_edid *drm_edid;int ret; - edid =dw_hdmi_get_edid (hdmi, connector); -if (!edid) + drm_edid =dw_hdmi_edid_read (hdmi, connector); +if (!drm_edid)return 0 ; -drm_connector_update_edid_property (connector, edid); -cec_notifier_set_phys_addr_from_edid (hdmi->cec_notifier, edid); - ret =drm_add_edid_modes (connector, edid); -kfree (edid); +drm_edid_connector_update (connector, drm_edid); +cec_notifier_set_phys_addr (hdmi->cec_notifier, + connector->display_info.source_physical_address); + ret =drm_edid_connector_add_modes (connector); +drm_edid_free (drm_edid);return ret; }
@@ -2980,12 +2989,12 @@ static enum drm_connector_status dw_hdmi_bridge_detect(struct drm_bridge *bridgereturn dw_hdmi_detect (hdmi); } -static struct edid *dw_hdmi_bridge_get_edid (struct drm_bridge *bridge, -struct drm_connector *connector) +static const struct drm_edid *dw_hdmi_bridge_edid_read (struct drm_bridge *bridge, +struct drm_connector *connector) {struct dw_hdmi *hdmi = bridge->driver_private; -return dw_hdmi_get_edid (hdmi, connector); +return dw_hdmi_edid_read (hdmi, connector); }static const struct drm_bridge_funcs dw_hdmi_bridge_funcs = {
@@ -3002,7 +3011,7 @@ static const struct drm_bridge_funcs dw_hdmi_bridge_funcs = { .mode_set = dw_hdmi_bridge_mode_set, .mode_valid = dw_hdmi_bridge_mode_valid, .detect = dw_hdmi_bridge_detect, - .get_edid = dw_hdmi_bridge_get_edid, + .edid_read = dw_hdmi_bridge_edid_read, };/* -----------------------------------------------------------------------------
Signature · 1 line
2.39.2
kernel test robot
build botRe: [PATCH v2 34/39] drm: bridge: dw_hdmi: switch to ->edid_read callback
kernel test robot noticed the following build warnings:
Hi Jani,
kernel test robot noticed the following build warnings:
[auto build test WARNING on drm-misc/drm-misc-next]
[also build test WARNING on drm/drm-next drm-exynos/exynos-drm-next drm-intel/for-linux-next-fixes drm-tip/drm-tip linus/master v6.7-rc8 next-20240103] [cannot apply to drm-intel/for-linux-next]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Jani-Nikula/drm-bridge-add-edid_read-hook-and-drm_bridge_edid_read/20240103-181513 base: git://anongit.freedesktop.org/drm/drm-misc drm-misc-next patch link: https://lore.kernel.org/r/a8f71940221fb085b8767f8123f496c9b36b22cc.1704276309.git.jani.nikula%40intel.com patch subject: [PATCH v2 34/39] drm: bridge: dw_hdmi: switch to ->edid_read callback config: powerpc-allmodconfig (https://download.01.org/0day-ci/archive/20240104/[email protected]/config) compiler: clang version 18.0.0git (https://github.com/llvm/llvm-project 7e186d366d6c7def0543acc255931f617e76dff0) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240104/[email protected]/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/
All warnings (new ones prefixed by >>):
>> drivers/gpu/drm/bridge/synopsys/dw-hdmi.c:2473:3: warning: variable 'edid' is uninitialized when used here [-Wuninitialized]
2473 | edid->width_cm, edid->height_cm);
| ^~~~
include/linux/dev_printk.h:155:39: note: expanded from macro 'dev_dbg'
155 | dynamic_dev_dbg(dev, dev_fmt(fmt), ##__VA_ARGS__)
| ^~~~~~~~~~~
include/linux/dynamic_debug.h:274:19: note: expanded from macro 'dynamic_dev_dbg'
274 | dev, fmt, ##__VA_ARGS__)
| ^~~~~~~~~~~
include/linux/dynamic_debug.h:250:59: note: expanded from macro '_dynamic_func_call'
250 | _dynamic_func_call_cls(_DPRINTK_CLASS_DFLT, fmt, func, ##__VA_ARGS__)
| ^~~~~~~~~~~
include/linux/dynamic_debug.h:248:65: note: expanded from macro '_dynamic_func_call_cls'
248 | __dynamic_func_call_cls(__UNIQUE_ID(ddebug), cls, fmt, func, ##__VA_ARGS__)
| ^~~~~~~~~~~
include/linux/dynamic_debug.h:224:15: note: expanded from macro '__dynamic_func_call_cls'
224 | func(&id, ##__VA_ARGS__); \
| ^~~~~~~~~~~
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c:2461:25: note: initialize the variable 'edid' to silence this warning
2461 | const struct edid *edid;
| ^
| = NULL1 warning generated.
vim +/edid +2473 drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
9aaf880ed4ee3c drivers/staging/imx-drm/imx-hdmi.c Fabio Estevam 2013-11-29 2456
fcb55de55cf341 drivers/gpu/drm/bridge/synopsys/dw-hdmi.c Jani Nikula 2024-01-03 2457 static const struct drm_edid *dw_hdmi_edid_read(struct dw_hdmi *hdmi,
ec971aaa6775cf drivers/gpu/drm/bridge/synopsys/dw-hdmi.c Laurent Pinchart 2020-05-26 2458 struct drm_connector *connector)
9aaf880ed4ee3c drivers/staging/imx-drm/imx-hdmi.c Fabio Estevam 2013-11-29 2459 {
fcb55de55cf341 drivers/gpu/drm/bridge/synopsys/dw-hdmi.c Jani Nikula 2024-01-03 2460 const struct drm_edid *drm_edid;
fcb55de55cf341 drivers/gpu/drm/bridge/synopsys/dw-hdmi.c Jani Nikula 2024-01-03 2461 const struct edid *edid;
9aaf880ed4ee3c drivers/staging/imx-drm/imx-hdmi.c Fabio Estevam 2013-11-29 2462
9aaf880ed4ee3c drivers/staging/imx-drm/imx-hdmi.c Fabio Estevam 2013-11-29 2463 if (!hdmi->ddc)
ec971aaa6775cf drivers/gpu/drm/bridge/synopsys/dw-hdmi.c Laurent Pinchart 2020-05-26 2464 return NULL;
9aaf880ed4ee3c drivers/staging/imx-drm/imx-hdmi.c Fabio Estevam 2013-11-29 2465
fcb55de55cf341 drivers/gpu/drm/bridge/synopsys/dw-hdmi.c Jani Nikula 2024-01-03 2466 drm_edid = drm_edid_read_ddc(connector, hdmi->ddc);
fcb55de55cf341 drivers/gpu/drm/bridge/synopsys/dw-hdmi.c Jani Nikula 2024-01-03 2467 if (!drm_edid) {
ec971aaa6775cf drivers/gpu/drm/bridge/synopsys/dw-hdmi.c Laurent Pinchart 2020-05-26 2468 dev_dbg(hdmi->dev, "failed to get edid\n");
ec971aaa6775cf drivers/gpu/drm/bridge/synopsys/dw-hdmi.c Laurent Pinchart 2020-05-26 2469 return NULL;
ec971aaa6775cf drivers/gpu/drm/bridge/synopsys/dw-hdmi.c Laurent Pinchart 2020-05-26 2470 }
ec971aaa6775cf drivers/gpu/drm/bridge/synopsys/dw-hdmi.c Laurent Pinchart 2020-05-26 2471
9aaf880ed4ee3c drivers/staging/imx-drm/imx-hdmi.c Fabio Estevam 2013-11-29 2472 dev_dbg(hdmi->dev, "got edid: width[%d] x height[%d]\n",
9aaf880ed4ee3c drivers/staging/imx-drm/imx-hdmi.c Fabio Estevam 2013-11-29 @2473 edid->width_cm, edid->height_cm);
9aaf880ed4ee3c drivers/staging/imx-drm/imx-hdmi.c Fabio Estevam 2013-11-29 2474
fcb55de55cf341 drivers/gpu/drm/bridge/synopsys/dw-hdmi.c Jani Nikula 2024-01-03 2475 /*
fcb55de55cf341 drivers/gpu/drm/bridge/synopsys/dw-hdmi.c Jani Nikula 2024-01-03 2476 * FIXME: This should use connector->display_info.is_hdmi and
fcb55de55cf341 drivers/gpu/drm/bridge/synopsys/dw-hdmi.c Jani Nikula 2024-01-03 2477 * connector->display_info.has_audio from a path that has read the EDID
fcb55de55cf341 drivers/gpu/drm/bridge/synopsys/dw-hdmi.c Jani Nikula 2024-01-03 2478 * and called drm_edid_connector_update().
fcb55de55cf341 drivers/gpu/drm/bridge/synopsys/dw-hdmi.c Jani Nikula 2024-01-03 2479 */
fcb55de55cf341 drivers/gpu/drm/bridge/synopsys/dw-hdmi.c Jani Nikula 2024-01-03 2480 edid = drm_edid_raw(drm_edid);
fcb55de55cf341 drivers/gpu/drm/bridge/synopsys/dw-hdmi.c Jani Nikula 2024-01-03 2481
05b1342f5014b7 drivers/gpu/drm/bridge/dw_hdmi.c Russell King 2015-07-21 2482 hdmi->sink_is_hdmi = drm_detect_hdmi_monitor(edid);
f709ec07e38a71 drivers/gpu/drm/bridge/dw_hdmi.c Russell King 2015-07-21 2483 hdmi->sink_has_audio = drm_detect_monitor_audio(edid);
ec971aaa6775cf drivers/gpu/drm/bridge/synopsys/dw-hdmi.c Laurent Pinchart 2020-05-26 2484
fcb55de55cf341 drivers/gpu/drm/bridge/synopsys/dw-hdmi.c Jani Nikula 2024-01-03 2485 return drm_edid;
ec971aaa6775cf drivers/gpu/drm/bridge/synopsys/dw-hdmi.c Laurent Pinchart 2020-05-26 2486 }
ec971aaa6775cf drivers/gpu/drm/bridge/synopsys/dw-hdmi.c Laurent Pinchart 2020-05-26 2487 Signature · 2 lines
0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
Re: [PATCH v2 34/39] drm: bridge: dw_hdmi: switch to ->edid_read callback
Quoted 48 lines · kernel test robot
Hi Jani,
kernel test robot noticed the following build warnings:
[auto build test WARNING on drm-misc/drm-misc-next]
[also build test WARNING on drm/drm-next drm-exynos/exynos-drm-next drm-intel/for-linux-next-fixes drm-tip/drm-tip linus/master v6.7-rc8 next-20240103] [cannot apply to drm-intel/for-linux-next]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]url: https://github.com/intel-lab-lkp/linux/commits/Jani-Nikula/drm-bridge-add-edid_read-hook-and-drm_bridge_edid_read/20240103-181513 base: git://anongit.freedesktop.org/drm/drm-misc drm-misc-next patch link: https://lore.kernel.org/r/a8f71940221fb085b8767f8123f496c9b36b22cc.1704276309.git.jani.nikula%40intel.com patch subject: [PATCH v2 34/39] drm: bridge: dw_hdmi: switch to ->edid_read callback config: powerpc-allmodconfig (https://download.01.org/0day-ci/archive/20240104/[email protected]/config) compiler: clang version 18.0.0git (https://github.com/llvm/llvm-project 7e186d366d6c7def0543acc255931f617e76dff0) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240104/[email protected]/reproduce)If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/All warnings (new ones prefixed by >>):
Quoted 1 line
Quoted 1 line
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c:2473:3: warning: variable 'edid' is uninitialized when used here [-Wuninitialized]2473 | edid->width_cm, edid->height_cm); | ^~~~ include/linux/dev_printk.h:155:39: note: expanded from macro 'dev_dbg' 155 | dynamic_dev_dbg(dev, dev_fmt(fmt), ##__VA_ARGS__) | ^~~~~~~~~~~ include/linux/dynamic_debug.h:274:19: note: expanded from macro 'dynamic_dev_dbg' 274 | dev, fmt, ##__VA_ARGS__) | ^~~~~~~~~~~ include/linux/dynamic_debug.h:250:59: note: expanded from macro '_dynamic_func_call' 250 | _dynamic_func_call_cls(_DPRINTK_CLASS_DFLT, fmt, func, ##__VA_ARGS__) | ^~~~~~~~~~~ include/linux/dynamic_debug.h:248:65: note: expanded from macro '_dynamic_func_call_cls' 248 | __dynamic_func_call_cls(__UNIQUE_ID(ddebug), cls, fmt, func, ##__VA_ARGS__) | ^~~~~~~~~~~ include/linux/dynamic_debug.h:224:15: note: expanded from macro '__dynamic_func_call_cls' 224 | func(&id, ##__VA_ARGS__); \ | ^~~~~~~~~~~ drivers/gpu/drm/bridge/synopsys/dw-hdmi.c:2461:25: note: initialize the variable 'edid' to silence this warning 2461 | const struct edid *edid; | ^ | = NULL
Quoted 1 line
1 warning generated.
This is a valid report, fixed locally.
BR,
Jani.
Signature · 1 line
Jani Nikula, Intel
PATCH v2 1/1 drm/bridge: nxp-ptn3460: switch to ->edid_read callback
In reply to Jani NikulaPrefer using the struct drm_edid based callback and functions.
v2: Fix -Wsometimes-uninitialized (kernel test robot)
--- drivers/gpu/drm/bridge/nxp-ptn3460.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-)
drivers/gpu/drm/bridge/nxp-ptn3460.c +12 -10
@@ -154,10 +154,11 @@ static void ptn3460_disable(struct drm_bridge *bridge) } -static struct edid *ptn3460_get_edid (struct drm_bridge *bridge, -struct drm_connector *connector) +static const struct drm_edid *ptn3460_edid_read (struct drm_bridge *bridge, +struct drm_connector *connector) {struct ptn3460_bridge *ptn_bridge =bridge_to_ptn3460 (bridge); +const struct drm_edid *drm_edid =NULL ;bool power_off;u8 *edid;int ret;
@@ -175,27 +176,28 @@ static struct edid *ptn3460_get_edid(struct drm_bridge *bridge, EDID_LENGTH);if (ret) {kfree (edid); - edid =NULL ; goto out; } + drm_edid =drm_edid_alloc (edid,EDID_LENGTH ); + out:if (power_off)ptn3460_disable (&ptn_bridge->bridge); -return (struct edid *)edid; +return drm_edid; }static int ptn3460_connector_get_modes (struct drm_connector *connector) {struct ptn3460_bridge *ptn_bridge =connector_to_ptn3460 (connector); -struct edid *edid; +const struct drm_edid *drm_edid;int num_modes; - edid =ptn3460_get_edid (&ptn_bridge->bridge, connector); -drm_connector_update_edid_property (connector, edid); - num_modes =drm_add_edid_modes (connector, edid); -kfree (edid); + drm_edid =ptn3460_edid_read (&ptn_bridge->bridge, connector); +drm_edid_connector_update (connector, drm_edid); + num_modes =drm_edid_connector_add_modes (connector); +drm_edid_free (drm_edid);return num_modes; }
@@ -254,7 +256,7 @@ static const struct drm_bridge_funcs ptn3460_bridge_funcs = { .pre_enable = ptn3460_pre_enable, .disable = ptn3460_disable, .attach = ptn3460_bridge_attach, - .get_edid = ptn3460_get_edid, + .edid_read = ptn3460_edid_read, };static int ptn3460_probe (struct i2c_client *client)
Signature · 1 line
2.39.2
Re: [PATCH v2] drm/bridge: nxp-ptn3460: switch to ->edid_read callback
Quoted 5 lines · Jani Nikula
Prefer using the struct
drm_edidbased callback and functions.v2: Fix -Wsometimes-uninitialized (kernel test robot)
Signed-off-by Jani Nikula <[email protected]>
I fumbled and sent the v2 in reply to the wrong patch, and it'll probably confuse all the build bots out there.
Anyway, I'd prefer not resending the entire series until there's been at least some meaningful review.
BR,
Jani.
Signature · 1 line
Jani Nikula, Intel
PATCH v2 1/1 drm: bridge: dw_hdmi: switch to ->edid_read callback
In reply to Jani NikulaPrefer using the struct drm_edid based callback and functions.
v2: Fix -Wuninitialized (kernel test robot)
--- drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 43 ++++++++++++++--------- 1 file changed, 26 insertions(+), 17 deletions(-)
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c +26 -17
@@ -2454,27 +2454,35 @@ static enum drm_connector_status dw_hdmi_detect(struct dw_hdmi *hdmi)return result; } -static struct edid *dw_hdmi_get_edid (struct dw_hdmi *hdmi, -struct drm_connector *connector) +static const struct drm_edid *dw_hdmi_edid_read (struct dw_hdmi *hdmi, +struct drm_connector *connector) { -struct edid *edid; +const struct drm_edid *drm_edid; +const struct edid *edid;if (!hdmi->ddc)return NULL ; - edid =drm_get_edid (connector, hdmi->ddc); -if (!edid) { + drm_edid =drm_edid_read_ddc (connector, hdmi->ddc); +if (!drm_edid) {dev_dbg (hdmi->dev,"failed to get edid\n" );return NULL ; } +/* +* FIXME: This should use connector->display_info.is_hdmi and +* connector->display_info.has_audio from a path that has read the EDID +* and called drm_edid_connector_update(). +*/ + edid =drm_edid_raw (drm_edid); +dev_dbg (hdmi->dev,"got edid: width[%d] x height[%d]\n" , edid->width_cm, edid->height_cm); hdmi->sink_is_hdmi =drm_detect_hdmi_monitor (edid); hdmi->sink_has_audio =drm_detect_monitor_audio (edid); -return edid; +return drm_edid; }/* -----------------------------------------------------------------------------
@@ -2493,17 +2501,18 @@ static int dw_hdmi_connector_get_modes(struct drm_connector *connector) { struct dw_hdmi *hdmi = container_of(connector, struct dw_hdmi, connector); -struct edid *edid; +const struct drm_edid *drm_edid;int ret; - edid =dw_hdmi_get_edid (hdmi, connector); -if (!edid) + drm_edid =dw_hdmi_edid_read (hdmi, connector); +if (!drm_edid)return 0 ; -drm_connector_update_edid_property (connector, edid); -cec_notifier_set_phys_addr_from_edid (hdmi->cec_notifier, edid); - ret =drm_add_edid_modes (connector, edid); -kfree (edid); +drm_edid_connector_update (connector, drm_edid); +cec_notifier_set_phys_addr (hdmi->cec_notifier, + connector->display_info.source_physical_address); + ret =drm_edid_connector_add_modes (connector); +drm_edid_free (drm_edid);return ret; }
@@ -2980,12 +2989,12 @@ static enum drm_connector_status dw_hdmi_bridge_detect(struct drm_bridge *bridgereturn dw_hdmi_detect (hdmi); } -static struct edid *dw_hdmi_bridge_get_edid (struct drm_bridge *bridge, -struct drm_connector *connector) +static const struct drm_edid *dw_hdmi_bridge_edid_read (struct drm_bridge *bridge, +struct drm_connector *connector) {struct dw_hdmi *hdmi = bridge->driver_private; -return dw_hdmi_get_edid (hdmi, connector); +return dw_hdmi_edid_read (hdmi, connector); }static const struct drm_bridge_funcs dw_hdmi_bridge_funcs = {
@@ -3002,7 +3011,7 @@ static const struct drm_bridge_funcs dw_hdmi_bridge_funcs = { .mode_set = dw_hdmi_bridge_mode_set, .mode_valid = dw_hdmi_bridge_mode_valid, .detect = dw_hdmi_bridge_detect, - .get_edid = dw_hdmi_bridge_get_edid, + .edid_read = dw_hdmi_bridge_edid_read, };/* -----------------------------------------------------------------------------
Signature · 1 line
2.39.2
PATCH v2 35/39 drm: bridge: dw_hdmi: clear the EDID property and CEC address on failures
In reply to Jani NikulaIf EDID read fails, clear the EDID property and CEC address.
--- drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 2 -- 1 file changed, 2 deletions(-)
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c +0 -2
@@ -2505,8 +2505,6 @@ static int dw_hdmi_connector_get_modes(struct drm_connector *connector)int ret; drm_edid =dw_hdmi_edid_read (hdmi, connector); -if (!drm_edid) -return 0 ;drm_edid_connector_update (connector, drm_edid); cec_notifier_set_phys_addr(hdmi->cec_notifier,
Signature · 1 line
2.39.2
PATCH v2 36/39 drm/bridge: tc358767: update the EDID property
In reply to Jani NikulaThe EDID property should be updated between reading the EDID and adding the modes.
--- drivers/gpu/drm/bridge/tc358767.c | 1 + 1 file changed, 1 insertion(+)
drivers/gpu/drm/bridge/tc358767.c +1 -0
@@ -1674,6 +1674,7 @@ static int tc_connector_get_modes(struct drm_connector *connector) } edid =tc_get_edid (&tc->bridge, connector); +drm_connector_update_edid_property (connector, edid); num_modes =drm_add_edid_modes (connector, edid);kfree (edid);
Signature · 1 line
2.39.2
PATCH v2 37/39 drm/bridge: tc358767: switch to ->edid_read callback
In reply to Jani NikulaPrefer using the struct drm_edid based callback and functions.
--- drivers/gpu/drm/bridge/tc358767.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-)
drivers/gpu/drm/bridge/tc358767.c +9 -9
@@ -1646,19 +1646,19 @@ static void tc_bridge_mode_set(struct drm_bridge *bridge,drm_mode_copy (&tc->mode, mode); } -static struct edid *tc_get_edid (struct drm_bridge *bridge, -struct drm_connector *connector) +static const struct drm_edid *tc_edid_read (struct drm_bridge *bridge, +struct drm_connector *connector) {struct tc_data *tc =bridge_to_tc (bridge); -return drm_get_edid (connector, &tc->aux.ddc); +return drm_edid_read_ddc (connector, &tc->aux.ddc); }static int tc_connector_get_modes (struct drm_connector *connector) {struct tc_data *tc =connector_to_tc (connector);int num_modes; -struct edid *edid; +const struct drm_edid *drm_edid;int ret; ret =tc_get_display_props (tc);
@@ -1673,10 +1673,10 @@ static int tc_connector_get_modes(struct drm_connector *connector)return num_modes; } - edid =tc_get_edid (&tc->bridge, connector); -drm_connector_update_edid_property (connector, edid); - num_modes =drm_add_edid_modes (connector, edid); -kfree (edid); + drm_edid =tc_edid_read (&tc->bridge, connector); +drm_edid_connector_update (connector, drm_edid); + num_modes =drm_edid_connector_add_modes (connector); +drm_edid_free (drm_edid);return num_modes; }
@@ -1845,7 +1845,7 @@ static const struct drm_bridge_funcs tc_edp_bridge_funcs = { .atomic_enable = tc_edp_bridge_atomic_enable, .atomic_disable = tc_edp_bridge_atomic_disable, .detect = tc_bridge_detect, - .get_edid = tc_get_edid, + .edid_read = tc_edid_read, .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state, .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state, .atomic_reset = drm_atomic_helper_bridge_reset,
Signature · 1 line
2.39.2
PATCH v2 38/39 drm/bridge: ti-sn65dsi86: switch to ->edid_read callback
In reply to Jani NikulaPrefer using the struct drm_edid based callback and functions.
--- drivers/gpu/drm/bridge/ti-sn65dsi86.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/gpu/drm/bridge/ti-sn65dsi86.c +4 -4
@@ -1207,19 +1207,19 @@ static enum drm_connector_status ti_sn_bridge_detect(struct drm_bridge *bridge) : connector_status_disconnected; } -static struct edid *ti_sn_bridge_get_edid (struct drm_bridge *bridge, -struct drm_connector *connector) +static const struct drm_edid *ti_sn_bridge_edid_read (struct drm_bridge *bridge, +struct drm_connector *connector) {struct ti_sn65dsi86 *pdata =bridge_to_ti_sn65dsi86 (bridge); -return drm_get_edid (connector, &pdata->aux.ddc); +return drm_edid_read_ddc (connector, &pdata->aux.ddc); }static const struct drm_bridge_funcs ti_sn_bridge_funcs = { .attach = ti_sn_bridge_attach, .detach = ti_sn_bridge_detach, .mode_valid = ti_sn_bridge_mode_valid, - .get_edid = ti_sn_bridge_get_edid, + .edid_read = ti_sn_bridge_edid_read, .detect = ti_sn_bridge_detect, .atomic_pre_enable = ti_sn_bridge_atomic_pre_enable, .atomic_enable = ti_sn_bridge_atomic_enable,
Signature · 1 line
2.39.2
PATCH v2 39/39 drm/bridge: remove ->get_edid callback
In reply to Jani NikulaThere are no more users of the ->get_edid callback left. They've all been converted to ->edid_read. Remove the callback, and the fallback in drm_bridge_edid_read().
--- drivers/gpu/drm/drm_bridge.c | 19 ------------------- include/drm/drm_bridge.h | 30 ------------------------------ 2 files changed, 49 deletions(-)
drivers/gpu/drm/drm_bridge.c +0 -19
@@ -1216,9 +1216,6 @@ EXPORT_SYMBOL_GPL(drm_bridge_get_modes);* DRM_BRIDGE_OP_EDID bridge ops flag, call &drm_bridge_funcs.edid_read to get * the EDID and return it. Otherwise return NULL. * -* If &drm_bridge_funcs.edid_read is not set, fall back to using -* &drm_bridge_funcs.get_edid and wrapping it in struct drm_edid. -* * RETURNS: * The retrieved EDID on success, or NULL otherwise. */
@@ -1228,22 +1225,6 @@ const struct drm_edid *drm_bridge_edid_read(struct drm_bridge *bridge,if (!(bridge->ops &DRM_BRIDGE_OP_EDID ))return NULL ; -/* Transitional: Fall back to ->get_edid. */ -if (!bridge->funcs->edid_read) { -const struct drm_edid *drm_edid; -struct edid *edid; - - edid = bridge->funcs->get_edid (bridge, connector); -if (!edid) -return NULL ; - - drm_edid =drm_edid_alloc (edid, (edid->extensions +1 ) *EDID_LENGTH ); - -kfree (edid); - -return drm_edid; - } -return bridge->funcs->edid_read (bridge, connector); }EXPORT_SYMBOL_GPL (drm_bridge_edid_read);
include/drm/drm_bridge.h +0 -30
@@ -588,36 +588,6 @@ struct drm_bridge_funcs {const struct drm_edid *(*edid_read)(struct drm_bridge *bridge,struct drm_connector *connector); -/** -* @get_edid: -* -* Read and parse the EDID data of the connected display. -* -* The @get_edid callback is the preferred way of reporting mode -* information for a display connected to the bridge output. Bridges -* that support reading EDID shall implement this callback and leave -* the @get_modes callback unimplemented. -* -* The caller of this operation shall first verify the output -* connection status and refrain from reading EDID from a disconnected -* output. -* -* This callback is optional. Bridges that implement it shall set the -* DRM_BRIDGE_OP_EDID flag in their &drm_bridge->ops. -* -* The connector parameter shall be used for the sole purpose of EDID -* retrieval and parsing, and shall not be stored internally by bridge -* drivers for future usage. -* -* RETURNS: -* -* An edid structure newly allocated with kmalloc() (or similar) on -* success, or NULL otherwise. The caller is responsible for freeing -* the returned edid structure with kfree(). -*/ -struct edid *(*get_edid)(struct drm_bridge *bridge, -struct drm_connector *connector); -/** * @hpd_notify: *
Signature · 1 line
2.39.2