mirror of
https://git.proxmox.com/git/mirror_ubuntu-kernels.git
synced 2025-12-08 00:05:24 +00:00
drm/vc4: hdmi: switch to struct drm_edid
Prefer struct drm_edid based functions over struct edid. Acked-by: Maxime Ripard <mripard@kernel.org> Link: https://patchwork.freedesktop.org/patch/msgid/eabece3ca7fae28395dcad0d2c221113cd924180.1713273659.git.jani.nikula@intel.com Signed-off-by: Jani Nikula <jani.nikula@intel.com>
This commit is contained in:
parent
bd730c77fa
commit
f1e4db073f
@ -412,15 +412,14 @@ static void vc4_hdmi_handle_hotplug(struct vc4_hdmi *vc4_hdmi,
|
|||||||
enum drm_connector_status status)
|
enum drm_connector_status status)
|
||||||
{
|
{
|
||||||
struct drm_connector *connector = &vc4_hdmi->connector;
|
struct drm_connector *connector = &vc4_hdmi->connector;
|
||||||
struct edid *edid;
|
const struct drm_edid *drm_edid;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NOTE: This function should really be called with
|
* NOTE: This function should really be called with vc4_hdmi->mutex
|
||||||
* vc4_hdmi->mutex held, but doing so results in reentrancy
|
* held, but doing so results in reentrancy issues since
|
||||||
* issues since cec_s_phys_addr_from_edid might call
|
* cec_s_phys_addr() might call .adap_enable, which leads to that
|
||||||
* .adap_enable, which leads to that funtion being called with
|
* funtion being called with our mutex held.
|
||||||
* our mutex held.
|
|
||||||
*
|
*
|
||||||
* A similar situation occurs with vc4_hdmi_reset_link() that
|
* A similar situation occurs with vc4_hdmi_reset_link() that
|
||||||
* will call into our KMS hooks if the scrambling was enabled.
|
* will call into our KMS hooks if the scrambling was enabled.
|
||||||
@ -435,12 +434,16 @@ static void vc4_hdmi_handle_hotplug(struct vc4_hdmi *vc4_hdmi,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
edid = drm_get_edid(connector, vc4_hdmi->ddc);
|
drm_edid = drm_edid_read_ddc(connector, vc4_hdmi->ddc);
|
||||||
if (!edid)
|
|
||||||
|
drm_edid_connector_update(connector, drm_edid);
|
||||||
|
cec_s_phys_addr(vc4_hdmi->cec_adap,
|
||||||
|
connector->display_info.source_physical_address, false);
|
||||||
|
|
||||||
|
if (!drm_edid)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
cec_s_phys_addr_from_edid(vc4_hdmi->cec_adap, edid);
|
drm_edid_free(drm_edid);
|
||||||
kfree(edid);
|
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
ret = vc4_hdmi_reset_link(connector, ctx);
|
ret = vc4_hdmi_reset_link(connector, ctx);
|
||||||
@ -492,28 +495,29 @@ static int vc4_hdmi_connector_get_modes(struct drm_connector *connector)
|
|||||||
{
|
{
|
||||||
struct vc4_hdmi *vc4_hdmi = connector_to_vc4_hdmi(connector);
|
struct vc4_hdmi *vc4_hdmi = connector_to_vc4_hdmi(connector);
|
||||||
struct vc4_dev *vc4 = to_vc4_dev(connector->dev);
|
struct vc4_dev *vc4 = to_vc4_dev(connector->dev);
|
||||||
|
const struct drm_edid *drm_edid;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
struct edid *edid;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NOTE: This function should really take vc4_hdmi->mutex, but
|
* NOTE: This function should really take vc4_hdmi->mutex, but doing so
|
||||||
* doing so results in reentrancy issues since
|
* results in reentrancy issues since cec_s_phys_addr() might call
|
||||||
* cec_s_phys_addr_from_edid might call .adap_enable, which
|
* .adap_enable, which leads to that funtion being called with our mutex
|
||||||
* leads to that funtion being called with our mutex held.
|
* held.
|
||||||
*
|
*
|
||||||
* Concurrency isn't an issue at the moment since we don't share
|
* Concurrency isn't an issue at the moment since we don't share
|
||||||
* any state with any of the other frameworks so we can ignore
|
* any state with any of the other frameworks so we can ignore
|
||||||
* the lock for now.
|
* the lock for now.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
edid = drm_get_edid(connector, vc4_hdmi->ddc);
|
drm_edid = drm_edid_read_ddc(connector, vc4_hdmi->ddc);
|
||||||
cec_s_phys_addr_from_edid(vc4_hdmi->cec_adap, edid);
|
drm_edid_connector_update(connector, drm_edid);
|
||||||
if (!edid)
|
cec_s_phys_addr(vc4_hdmi->cec_adap,
|
||||||
|
connector->display_info.source_physical_address, false);
|
||||||
|
if (!drm_edid)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
drm_connector_update_edid_property(connector, edid);
|
ret = drm_edid_connector_add_modes(connector);
|
||||||
ret = drm_add_edid_modes(connector, edid);
|
drm_edid_free(drm_edid);
|
||||||
kfree(edid);
|
|
||||||
|
|
||||||
if (!vc4->hvs->vc5_hdmi_enable_hdmi_20) {
|
if (!vc4->hvs->vc5_hdmi_enable_hdmi_20) {
|
||||||
struct drm_device *drm = connector->dev;
|
struct drm_device *drm = connector->dev;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user