@@ -1351,6 +1351,9 @@ static int dpu_kms_init(struct drm_device *ddev)
static int dpu_dev_probe(struct platform_device *pdev)
{
+ if (!msm_disp_drv_should_bind(&pdev->dev, true))
+ return -ENODEV;
+
return msm_drv_probe(&pdev->dev, dpu_kms_init);
}
@@ -935,6 +935,9 @@ static int mdp5_dev_probe(struct platform_device *pdev)
DBG("");
+ if (!msm_disp_drv_should_bind(&pdev->dev, false))
+ return -ENODEV;
+
ret = mdp5_setup_interconnect(pdev);
if (ret)
return ret;
@@ -1186,6 +1186,37 @@ static int add_components_mdp(struct device *master_dev,
return 0;
}
+#if !IS_REACHABLE(CONFIG_DRM_MSM_MDP5) || !IS_REACHABLE(CONFIG_DRM_MSM_DPU)
+bool msm_disp_drv_should_bind(struct device *dev, bool mdp5_driver)
+{
+ /* If just a single driver is enabled, use it no matter what */
+ return true;
+}
+#else
+
+static bool prefer_mdp5 = true;
+MODULE_PARM_DESC(prefer_mdp5, "Select whether MDP5 or DPU driver should be preferred");
+module_param(prefer_mdp5, bool, 0444);
+
+/* list all platforms supported by both mdp5 and dpu drivers */
+static const char *const msm_mdp5_dpu_migration[] = {
+ NULL,
+};
+
+bool msm_disp_drv_should_bind(struct device *dev, bool dpu_driver)
+{
+ /* If it is not an MDP5 device, do not try MDP5 driver */
+ if (!of_device_is_compatible(dev->of_node, "qcom,mdp5"))
+ return dpu_driver;
+
+ /* If it is not in the migration list, use MDP5 */
+ if (!of_device_compatible_match(dev->of_node, msm_mdp5_dpu_migration))
+ return !dpu_driver;
+
+ return prefer_mdp5 ? !dpu_driver : dpu_driver;
+}
+#endif
+
/*
* We don't know what's the best binding to link the gpu with the drm device.
* Fow now, we just hunt for all the possible gpus that we support, and add them
@@ -571,5 +571,6 @@ int msm_drv_probe(struct device *dev,
int (*kms_init)(struct drm_device *dev));
void msm_drv_shutdown(struct platform_device *pdev);
+bool msm_disp_drv_should_bind(struct device *dev, bool dpu_driver);
#endif /* __MSM_DRV_H__ */