MLK-15321 dpu: Register the blit engine(s).
authorMarius Vlad <marius-cristian.vlad@nxp.com>
Tue, 22 Aug 2017 15:38:20 +0000 (18:38 +0300)
committerNitin Garg <nitin.garg@nxp.com>
Mon, 19 Mar 2018 20:36:44 +0000 (15:36 -0500)
Signed-off-by: Marius-Adrian Negreanu <adrian.negreanu@nxp.com>
Signed-off-by: Meng Mingming <mingming.meng@nxp.com>
Signed-off-by: Marius Vlad <marius-cristian.vlad@nxp.com>
---
Changes since v3:

Use a features array for bliteng driver name, as not to polute
dpu_add_client_devices() and simply the register process in the same time.

drivers/gpu/imx/dpu/dpu-common.c

index 15f14ef..4e93467 100644 (file)
@@ -818,6 +818,10 @@ struct dpu_platform_reg {
        const char *name;
 };
 
+struct dpu_feature_reg {
+       const char *name;
+};
+
 static struct dpu_platform_reg client_reg[] = {
        {
                /* placeholder */
@@ -840,6 +844,16 @@ static struct dpu_platform_reg client_reg[] = {
        },
 };
 
+static struct dpu_feature_reg features_reg[] = {
+       {
+               .name = "imx-drm-dpu-bliteng",
+       }
+};
+
+
+static DEFINE_MUTEX(dpu_feature_id_mutex);
+static int dpu_feature_id;
+
 static DEFINE_MUTEX(dpu_client_id_mutex);
 static int dpu_client_id;
 
@@ -1030,6 +1044,46 @@ err_get_plane_res:
        return ret;
 }
 
+static
+int dpu_add_feature_devices(struct dpu_soc *dpu)
+{
+       struct platform_device *pdev;
+       struct device *dev = dpu->dev;
+       int i, id, ret;
+
+       mutex_lock(&dpu_feature_id_mutex);
+       id = dpu_feature_id;
+       dpu_feature_id += ARRAY_SIZE(features_reg);
+       mutex_unlock(&dpu_feature_id_mutex);
+
+       for (i = 0; i < ARRAY_SIZE(features_reg); i++, id++) {
+
+               pdev = platform_device_alloc(features_reg[i].name, id);
+               if (!pdev) {
+                       return -ENOMEM;
+               }
+
+               pdev->dev.parent = dev;
+               ret = platform_device_add_data(pdev, &features_reg[i].name,
+                               strlen(features_reg[i].name));
+               if (!ret)
+                       ret = platform_device_add(pdev);
+               if (ret) {
+                       platform_device_put(pdev);
+                       goto err_register;
+               }
+
+       }
+
+       return 0;
+
+err_register:
+       platform_device_unregister_children(to_platform_device(dev));
+
+       return ret;
+}
+
+
 #define IRQSTEER_CHANnCTL      0x0
 #define IRQSTEER_CHANnCTL_CH(n)        BIT(n)
 #define IRQSTEER_CHANnMASK(n)  ((n) + 4)
@@ -1463,6 +1517,13 @@ static int dpu_probe(struct platform_device *pdev)
                goto failed_add_clients;
        }
 
+       ret = dpu_add_feature_devices(dpu);
+       if (ret) {
+               dev_err(dpu->dev, "adding feature devices failed with %d\n",
+                                       ret);
+               goto failed_add_features;
+       }
+
        dpu_debug_ip_identity(dpu);
 
        if (devtype->pixel_link_quirks)
@@ -1472,6 +1533,7 @@ static int dpu_probe(struct platform_device *pdev)
 
        return 0;
 
+failed_add_features:
 failed_add_clients:
 failed_submodules_init:
        dpu_irq_exit(dpu);