From: Maxime Ripard <mrip...@kernel.org>

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 <mrip...@kernel.org>
Signed-off-by: Dave Stevenson <dave.steven...@raspberrypi.com>
---
 drivers/gpu/drm/vc4/tests/vc4_mock.c |  4 ++--
 drivers/gpu/drm/vc4/vc4_drv.h        |  6 +++++-
 drivers/gpu/drm/vc4/vc4_txp.c        | 23 ++++++++++++++++-------
 3 files changed, 23 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/vc4/tests/vc4_mock.c 
b/drivers/gpu/drm/vc4/tests/vc4_mock.c
index 6527fb1db71e..c7b91c87f1bc 100644
--- a/drivers/gpu/drm/vc4/tests/vc4_mock.c
+++ b/drivers/gpu/drm/vc4/tests/vc4_mock.c
@@ -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)),
diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h
index a68cea921c11..1ed1fb5aa7e8 100644
--- a/drivers/gpu/drm/vc4/vc4_drv.h
+++ b/drivers/gpu/drm/vc4/vc4_drv.h
@@ -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;
diff --git a/drivers/gpu/drm/vc4/vc4_txp.c b/drivers/gpu/drm/vc4/vc4_txp.c
index ffe1f7d1b911..dcb1b3fd37de 100644
--- a/drivers/gpu/drm/vc4/vc4_txp.c
+++ b/drivers/gpu/drm/vc4/vc4_txp.c
@@ -159,6 +159,7 @@
 
 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 */ },
 };
 

-- 
2.34.1

Reply via email to