]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
drm/vc4: txp: Introduce structure to deal with revision differences
authorMaxime Ripard <mripard@kernel.org>
Fri, 25 Oct 2024 17:15:44 +0000 (18:15 +0100)
committerDave Stevenson <dave.stevenson@raspberrypi.com>
Wed, 27 Nov 2024 14:37:20 +0000 (14:37 +0000)
The BCM2712 will have several TXP with small differences. Let's add a
structure tied to the compatible to deal with those differences.

Signed-off-by: Maxime Ripard <mripard@kernel.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20241025-drm-vc4-2712-support-v2-13-35efa83c8fc0@raspberrypi.com
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
drivers/gpu/drm/vc4/tests/vc4_mock.c
drivers/gpu/drm/vc4/vc4_drv.h
drivers/gpu/drm/vc4/vc4_txp.c

index 6527fb1db71ef9034a3aaa76ec0b53e550b1ffcc..c7b91c87f1bcbe97da54decd32c921cb72b48bbf 100644 (file)
@@ -51,7 +51,7 @@ struct vc4_mock_desc {
 
 static const struct vc4_mock_desc vc4_mock =
        VC4_MOCK_DESC(
-               VC4_MOCK_CRTC_DESC(&vc4_txp_crtc_data,
+               VC4_MOCK_CRTC_DESC(&vc4_txp_data.base,
                                   VC4_MOCK_OUTPUT_DESC(VC4_ENCODER_TYPE_TXP,
                                                        DRM_MODE_ENCODER_VIRTUAL,
                                                        DRM_MODE_CONNECTOR_WRITEBACK)),
@@ -77,7 +77,7 @@ static const struct vc4_mock_desc vc4_mock =
 
 static const struct vc4_mock_desc vc5_mock =
        VC4_MOCK_DESC(
-               VC4_MOCK_CRTC_DESC(&vc4_txp_crtc_data,
+               VC4_MOCK_CRTC_DESC(&vc4_txp_data.base,
                                   VC4_MOCK_OUTPUT_DESC(VC4_ENCODER_TYPE_TXP,
                                                        DRM_MODE_ENCODER_VIRTUAL,
                                                        DRM_MODE_CONNECTOR_WRITEBACK)),
index a68cea921c119a73c8699c843307318066bb1da0..1ed1fb5aa7e8837ac927ff2777f86e0183e4901b 100644 (file)
@@ -536,7 +536,11 @@ struct vc4_crtc_data {
        int hvs_output;
 };
 
-extern const struct vc4_crtc_data vc4_txp_crtc_data;
+struct vc4_txp_data {
+       struct vc4_crtc_data    base;
+};
+
+extern const struct vc4_txp_data vc4_txp_data;
 
 struct vc4_pv_data {
        struct vc4_crtc_data    base;
index ffe1f7d1b911d35b0b3d50f4ae55634786b8bebd..dcb1b3fd37de1cb6dd02570a366a2c3839a90c5f 100644 (file)
 
 struct vc4_txp {
        struct vc4_crtc base;
+       const struct vc4_txp_data *data;
 
        struct platform_device *pdev;
 
@@ -484,17 +485,20 @@ static irqreturn_t vc4_txp_interrupt(int irq, void *data)
        return IRQ_HANDLED;
 }
 
-const struct vc4_crtc_data vc4_txp_crtc_data = {
-       .name = "txp",
-       .debugfs_name = "txp_regs",
-       .hvs_available_channels = BIT(2),
-       .hvs_output = 2,
+const struct vc4_txp_data vc4_txp_data = {
+       .base = {
+               .name = "txp",
+               .debugfs_name = "txp_regs",
+               .hvs_available_channels = BIT(2),
+               .hvs_output = 2,
+       },
 };
 
 static int vc4_txp_bind(struct device *dev, struct device *master, void *data)
 {
        struct platform_device *pdev = to_platform_device(dev);
        struct drm_device *drm = dev_get_drvdata(master);
+       const struct vc4_txp_data *txp_data;
        struct vc4_encoder *vc4_encoder;
        struct drm_encoder *encoder;
        struct vc4_crtc *vc4_crtc;
@@ -509,6 +513,11 @@ static int vc4_txp_bind(struct device *dev, struct device *master, void *data)
        if (!txp)
                return -ENOMEM;
 
+       txp_data = of_device_get_match_data(dev);
+       if (!txp_data)
+               return -ENODEV;
+
+       txp->data = txp_data;
        txp->pdev = pdev;
        txp->regs = vc4_ioremap_regs(pdev, 0);
        if (IS_ERR(txp->regs))
@@ -519,7 +528,7 @@ static int vc4_txp_bind(struct device *dev, struct device *master, void *data)
        vc4_crtc->regset.regs = txp_regs;
        vc4_crtc->regset.nregs = ARRAY_SIZE(txp_regs);
 
-       ret = vc4_crtc_init(drm, pdev, vc4_crtc, &vc4_txp_crtc_data,
+       ret = vc4_crtc_init(drm, pdev, vc4_crtc, &txp_data->base,
                            &vc4_txp_crtc_funcs, &vc4_txp_crtc_helper_funcs, true);
        if (ret)
                return ret;
@@ -579,7 +588,7 @@ static void vc4_txp_remove(struct platform_device *pdev)
 }
 
 static const struct of_device_id vc4_txp_dt_match[] = {
-       { .compatible = "brcm,bcm2835-txp" },
+       { .compatible = "brcm,bcm2835-txp", .data = &vc4_txp_data },
        { /* sentinel */ },
 };