aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-5.4/950-0578-drm-vc4-hdmi-Add-container_of-macros-for-encoders-an.patch
diff options
context:
space:
mode:
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.patch151
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)