diff options
Diffstat (limited to 'target/linux/bcm27xx/patches-5.4/950-0578-drm-vc4-hdmi-Add-container_of-macros-for-encoders-an.patch')
-rw-r--r-- | target/linux/bcm27xx/patches-5.4/950-0578-drm-vc4-hdmi-Add-container_of-macros-for-encoders-an.patch | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-5.4/950-0578-drm-vc4-hdmi-Add-container_of-macros-for-encoders-an.patch b/target/linux/bcm27xx/patches-5.4/950-0578-drm-vc4-hdmi-Add-container_of-macros-for-encoders-an.patch new file mode 100644 index 0000000000..1d70ca851c --- /dev/null +++ b/target/linux/bcm27xx/patches-5.4/950-0578-drm-vc4-hdmi-Add-container_of-macros-for-encoders-an.patch @@ -0,0 +1,151 @@ +From fe19f02dbfd020df9b028cf2c580417c4edc31b3 Mon Sep 17 00:00:00 2001 +From: Maxime Ripard <maxime@cerno.tech> +Date: Mon, 6 Jan 2020 18:45:46 +0100 +Subject: [PATCH] drm/vc4: hdmi: Add container_of macros for encoders + and connectors + +Whenever the code needs to access the vc4_hdmi structure from a DRM +connector or encoder, it first accesses the drm_device associated to the +connector, then retrieve the drm_dev private data which gives it a +pointer to our vc4_dev, and will finally follow the vc4_hdmi pointer in +that structure. + +That will also give us some trouble when having multiple controllers, +but now that we have our encoder and connector structures that are part +of vc4_hdmi, we can simply call container_of on the DRM connector or +encoder and retrieve the vc4_hdmi structure directly. + +Signed-off-by: Maxime Ripard <maxime@cerno.tech> +--- + drivers/gpu/drm/vc4/vc4_hdmi.c | 41 ++++++++++------------------------ + drivers/gpu/drm/vc4/vc4_hdmi.h | 16 +++++++++++++ + 2 files changed, 28 insertions(+), 29 deletions(-) + +--- a/drivers/gpu/drm/vc4/vc4_hdmi.c ++++ b/drivers/gpu/drm/vc4/vc4_hdmi.c +@@ -120,9 +120,7 @@ static int vc4_hdmi_debugfs_regs(struct + static enum drm_connector_status + vc4_hdmi_connector_detect(struct drm_connector *connector, bool force) + { +- struct drm_device *dev = connector->dev; +- struct vc4_dev *vc4 = to_vc4_dev(dev); +- struct vc4_hdmi *vc4_hdmi = vc4->hdmi; ++ struct vc4_hdmi *vc4_hdmi = connector_to_vc4_hdmi(connector); + + if (vc4_hdmi->hpd_gpio) { + if (gpio_get_value_cansleep(vc4_hdmi->hpd_gpio) ^ +@@ -149,17 +147,13 @@ static void vc4_hdmi_connector_destroy(s + + static int vc4_hdmi_connector_get_modes(struct drm_connector *connector) + { +- struct vc4_hdmi_connector *vc4_connector = +- to_vc4_hdmi_connector(connector); +- struct drm_encoder *encoder = vc4_connector->encoder; +- struct vc4_hdmi_encoder *vc4_encoder = to_vc4_hdmi_encoder(encoder); +- struct drm_device *dev = connector->dev; +- struct vc4_dev *vc4 = to_vc4_dev(dev); ++ struct vc4_hdmi *vc4_hdmi = connector_to_vc4_hdmi(connector); ++ struct vc4_hdmi_encoder *vc4_encoder = &vc4_hdmi->encoder; + int ret = 0; + struct edid *edid; + +- edid = drm_get_edid(connector, vc4->hdmi->ddc); +- cec_s_phys_addr_from_edid(vc4->hdmi->cec_adap, edid); ++ edid = drm_get_edid(connector, vc4_hdmi->ddc); ++ cec_s_phys_addr_from_edid(vc4_hdmi->cec_adap, edid); + if (!edid) + return -ENODEV; + +@@ -235,9 +229,7 @@ static const struct drm_encoder_funcs vc + static int vc4_hdmi_stop_packet(struct drm_encoder *encoder, + enum hdmi_infoframe_type type) + { +- struct drm_device *dev = encoder->dev; +- struct vc4_dev *vc4 = to_vc4_dev(dev); +- struct vc4_hdmi *vc4_hdmi = vc4->hdmi; ++ struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); + u32 packet_id = type - 0x80; + + HDMI_WRITE(VC4_HDMI_RAM_PACKET_CONFIG, +@@ -250,9 +242,7 @@ static int vc4_hdmi_stop_packet(struct d + static void vc4_hdmi_write_infoframe(struct drm_encoder *encoder, + union hdmi_infoframe *frame) + { +- struct drm_device *dev = encoder->dev; +- struct vc4_dev *vc4 = to_vc4_dev(dev); +- struct vc4_hdmi *vc4_hdmi = vc4->hdmi; ++ struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); + u32 packet_id = frame->any.type - 0x80; + u32 packet_reg = VC4_HDMI_RAM_PACKET(packet_id); + uint8_t buffer[VC4_HDMI_PACKET_STRIDE]; +@@ -298,9 +288,8 @@ static void vc4_hdmi_write_infoframe(str + + static void vc4_hdmi_set_avi_infoframe(struct drm_encoder *encoder) + { ++ struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); + struct vc4_hdmi_encoder *vc4_encoder = to_vc4_hdmi_encoder(encoder); +- struct vc4_dev *vc4 = encoder->dev->dev_private; +- struct vc4_hdmi *vc4_hdmi = vc4->hdmi; + struct drm_connector *connector = &vc4_hdmi->connector.base; + struct drm_connector_state *cstate = connector->state; + struct drm_crtc *crtc = encoder->crtc; +@@ -347,9 +336,7 @@ static void vc4_hdmi_set_spd_infoframe(s + + static void vc4_hdmi_set_audio_infoframe(struct drm_encoder *encoder) + { +- struct drm_device *drm = encoder->dev; +- struct vc4_dev *vc4 = drm->dev_private; +- struct vc4_hdmi *vc4_hdmi = vc4->hdmi; ++ struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); + union hdmi_infoframe frame; + int ret; + +@@ -371,9 +358,7 @@ static void vc4_hdmi_set_infoframes(stru + + static void vc4_hdmi_encoder_disable(struct drm_encoder *encoder) + { +- struct drm_device *dev = encoder->dev; +- struct vc4_dev *vc4 = to_vc4_dev(dev); +- struct vc4_hdmi *vc4_hdmi = vc4->hdmi; ++ struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); + int ret; + + HDMI_WRITE(VC4_HDMI_RAM_PACKET_CONFIG, 0); +@@ -392,10 +377,8 @@ static void vc4_hdmi_encoder_disable(str + static void vc4_hdmi_encoder_enable(struct drm_encoder *encoder) + { + struct drm_display_mode *mode = &encoder->crtc->state->adjusted_mode; +- struct vc4_hdmi_encoder *vc4_encoder = to_vc4_hdmi_encoder(encoder); +- struct drm_device *dev = encoder->dev; +- struct vc4_dev *vc4 = to_vc4_dev(dev); +- struct vc4_hdmi *vc4_hdmi = vc4->hdmi; ++ struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); ++ struct vc4_hdmi_encoder *vc4_encoder = &vc4_hdmi->encoder; + bool debug_dump_regs = false; + bool hsync_pos = mode->flags & DRM_MODE_FLAG_PHSYNC; + bool vsync_pos = mode->flags & DRM_MODE_FLAG_PVSYNC; +--- a/drivers/gpu/drm/vc4/vc4_hdmi.h ++++ b/drivers/gpu/drm/vc4/vc4_hdmi.h +@@ -78,6 +78,22 @@ struct vc4_hdmi { + struct debugfs_regset32 hd_regset; + }; + ++static inline struct vc4_hdmi * ++connector_to_vc4_hdmi(struct drm_connector *connector) ++{ ++ struct vc4_hdmi_connector *_connector = to_vc4_hdmi_connector(connector); ++ ++ return container_of(_connector, struct vc4_hdmi, connector); ++} ++ ++static inline struct vc4_hdmi * ++encoder_to_vc4_hdmi(struct drm_encoder *encoder) ++{ ++ struct vc4_hdmi_encoder *_encoder = to_vc4_hdmi_encoder(encoder); ++ ++ return container_of(_encoder, struct vc4_hdmi, encoder); ++} ++ + #define HDMI_READ(offset) readl(vc4_hdmi->hdmicore_regs + offset) + #define HDMI_WRITE(offset, val) writel(val, vc4_hdmi->hdmicore_regs + offset) + #define HD_READ(offset) readl(vc4_hdmi->hd_regs + offset) |