diff options
Diffstat (limited to 'drivers/gpu/drm/msm/msm_drv.c')
| -rw-r--r-- | drivers/gpu/drm/msm/msm_drv.c | 36 | 
1 files changed, 30 insertions, 6 deletions
| diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c index 94525ac76d4e..e1104d2454e2 100644 --- a/drivers/gpu/drm/msm/msm_drv.c +++ b/drivers/gpu/drm/msm/msm_drv.c @@ -39,6 +39,7 @@   *           GEM object's debug name   * - 1.5.0 - Add SUBMITQUERY_QUERY ioctl   * - 1.6.0 - Syncobj support + * - 1.7.0 - Add MSM_PARAM_SUSPENDS to access suspend count   */  #define MSM_VERSION_MAJOR	1  #define MSM_VERSION_MINOR	6 @@ -446,8 +447,12 @@ static int msm_drm_init(struct device *dev, const struct drm_driver *drv)  	priv->wq = alloc_ordered_workqueue("msm", 0); +	INIT_LIST_HEAD(&priv->objects); +	mutex_init(&priv->obj_lock); +  	INIT_LIST_HEAD(&priv->inactive_willneed);  	INIT_LIST_HEAD(&priv->inactive_dontneed); +	INIT_LIST_HEAD(&priv->inactive_unpinned);  	mutex_init(&priv->mm_lock);  	/* Teach lockdep about lock ordering wrt. shrinker: */ @@ -570,6 +575,7 @@ err_free_priv:  	kfree(priv);  err_put_drm_dev:  	drm_dev_put(ddev); +	platform_set_drvdata(pdev, NULL);  	return ret;  } @@ -1072,6 +1078,10 @@ static int __maybe_unused msm_pm_resume(struct device *dev)  static int __maybe_unused msm_pm_prepare(struct device *dev)  {  	struct drm_device *ddev = dev_get_drvdata(dev); +	struct msm_drm_private *priv = ddev ? ddev->dev_private : NULL; + +	if (!priv || !priv->kms) +		return 0;  	return drm_mode_config_helper_suspend(ddev);  } @@ -1079,6 +1089,10 @@ static int __maybe_unused msm_pm_prepare(struct device *dev)  static void __maybe_unused msm_pm_complete(struct device *dev)  {  	struct drm_device *ddev = dev_get_drvdata(dev); +	struct msm_drm_private *priv = ddev ? ddev->dev_private : NULL; + +	if (!priv || !priv->kms) +		return;  	drm_mode_config_helper_resume(ddev);  } @@ -1173,10 +1187,11 @@ static int compare_name_mdp(struct device *dev, void *data)  	return (strstr(dev_name(dev), "mdp") != NULL);  } -static int add_display_components(struct device *dev, +static int add_display_components(struct platform_device *pdev,  				  struct component_match **matchptr)  {  	struct device *mdp_dev; +	struct device *dev = &pdev->dev;  	int ret;  	/* @@ -1185,9 +1200,9 @@ static int add_display_components(struct device *dev,  	 * Populate the children devices, find the MDP5/DPU node, and then add  	 * the interfaces to our components list.  	 */ -	if (of_device_is_compatible(dev->of_node, "qcom,mdss") || -	    of_device_is_compatible(dev->of_node, "qcom,sdm845-mdss") || -	    of_device_is_compatible(dev->of_node, "qcom,sc7180-mdss")) { +	switch (get_mdp_ver(pdev)) { +	case KMS_MDP5: +	case KMS_DPU:  		ret = of_platform_populate(dev->of_node, NULL, NULL, dev);  		if (ret) {  			DRM_DEV_ERROR(dev, "failed to populate children devices\n"); @@ -1206,9 +1221,11 @@ static int add_display_components(struct device *dev,  		/* add the MDP component itself */  		drm_of_component_match_add(dev, matchptr, compare_of,  					   mdp_dev->of_node); -	} else { +		break; +	case KMS_MDP4:  		/* MDP4 */  		mdp_dev = dev; +		break;  	}  	ret = add_components_mdp(mdp_dev, matchptr); @@ -1273,7 +1290,7 @@ static int msm_pdev_probe(struct platform_device *pdev)  	int ret;  	if (get_mdp_ver(pdev)) { -		ret = add_display_components(&pdev->dev, &match); +		ret = add_display_components(pdev, &match);  		if (ret)  			return ret;  	} @@ -1311,6 +1328,10 @@ static int msm_pdev_remove(struct platform_device *pdev)  static void msm_pdev_shutdown(struct platform_device *pdev)  {  	struct drm_device *drm = platform_get_drvdata(pdev); +	struct msm_drm_private *priv = drm ? drm->dev_private : NULL; + +	if (!priv || !priv->kms) +		return;  	drm_atomic_helper_shutdown(drm);  } @@ -1320,6 +1341,9 @@ static const struct of_device_id dt_match[] = {  	{ .compatible = "qcom,mdss", .data = (void *)KMS_MDP5 },  	{ .compatible = "qcom,sdm845-mdss", .data = (void *)KMS_DPU },  	{ .compatible = "qcom,sc7180-mdss", .data = (void *)KMS_DPU }, +	{ .compatible = "qcom,sc7280-mdss", .data = (void *)KMS_DPU }, +	{ .compatible = "qcom,sm8150-mdss", .data = (void *)KMS_DPU }, +	{ .compatible = "qcom,sm8250-mdss", .data = (void *)KMS_DPU },  	{}  };  MODULE_DEVICE_TABLE(of, dt_match); | 
