diff options
Diffstat (limited to 'drivers/gpu/drm/tilcdc')
| -rw-r--r-- | drivers/gpu/drm/tilcdc/tilcdc_crtc.c | 13 | ||||
| -rw-r--r-- | drivers/gpu/drm/tilcdc/tilcdc_drv.c | 60 | ||||
| -rw-r--r-- | drivers/gpu/drm/tilcdc/tilcdc_panel.c | 25 | ||||
| -rw-r--r-- | drivers/gpu/drm/tilcdc/tilcdc_plane.c | 11 | 
4 files changed, 33 insertions, 76 deletions
| diff --git a/drivers/gpu/drm/tilcdc/tilcdc_crtc.c b/drivers/gpu/drm/tilcdc/tilcdc_crtc.c index e9dd5e5cb4e7..1856962411c7 100644 --- a/drivers/gpu/drm/tilcdc/tilcdc_crtc.c +++ b/drivers/gpu/drm/tilcdc/tilcdc_crtc.c @@ -537,6 +537,18 @@ static void tilcdc_crtc_atomic_disable(struct drm_crtc *crtc,  	tilcdc_crtc_disable(crtc);  } +static void tilcdc_crtc_atomic_flush(struct drm_crtc *crtc, +				     struct drm_crtc_state *old_state) +{ +	if (!crtc->state->event) +		return; + +	spin_lock_irq(&crtc->dev->event_lock); +	drm_crtc_send_vblank_event(crtc, crtc->state->event); +	crtc->state->event = NULL; +	spin_unlock_irq(&crtc->dev->event_lock); +} +  void tilcdc_crtc_shutdown(struct drm_crtc *crtc)  {  	tilcdc_crtc_off(crtc, true); @@ -822,6 +834,7 @@ static const struct drm_crtc_helper_funcs tilcdc_crtc_helper_funcs = {  	.atomic_check	= tilcdc_crtc_atomic_check,  	.atomic_enable	= tilcdc_crtc_atomic_enable,  	.atomic_disable	= tilcdc_crtc_atomic_disable, +	.atomic_flush	= tilcdc_crtc_atomic_flush,  };  void tilcdc_crtc_set_panel_info(struct drm_crtc *crtc, diff --git a/drivers/gpu/drm/tilcdc/tilcdc_drv.c b/drivers/gpu/drm/tilcdc/tilcdc_drv.c index a5e9ee4c7fbf..4f5fc3e87383 100644 --- a/drivers/gpu/drm/tilcdc/tilcdc_drv.c +++ b/drivers/gpu/drm/tilcdc/tilcdc_drv.c @@ -87,55 +87,10 @@ static int tilcdc_atomic_check(struct drm_device *dev,  	return ret;  } -static int tilcdc_commit(struct drm_device *dev, -		  struct drm_atomic_state *state, -		  bool async) -{ -	int ret; - -	ret = drm_atomic_helper_prepare_planes(dev, state); -	if (ret) -		return ret; - -	ret = drm_atomic_helper_swap_state(state, true); -	if (ret) { -		drm_atomic_helper_cleanup_planes(dev, state); -		return ret; -	} - -	/* -	 * Everything below can be run asynchronously without the need to grab -	 * any modeset locks at all under one condition: It must be guaranteed -	 * that the asynchronous work has either been cancelled (if the driver -	 * supports it, which at least requires that the framebuffers get -	 * cleaned up with drm_atomic_helper_cleanup_planes()) or completed -	 * before the new state gets committed on the software side with -	 * drm_atomic_helper_swap_state(). -	 * -	 * This scheme allows new atomic state updates to be prepared and -	 * checked in parallel to the asynchronous completion of the previous -	 * update. Which is important since compositors need to figure out the -	 * composition of the next frame right after having submitted the -	 * current layout. -	 */ - -	drm_atomic_helper_commit_modeset_disables(dev, state); - -	drm_atomic_helper_commit_planes(dev, state, 0); - -	drm_atomic_helper_commit_modeset_enables(dev, state); - -	drm_atomic_helper_wait_for_vblanks(dev, state); - -	drm_atomic_helper_cleanup_planes(dev, state); - -	return 0; -} -  static const struct drm_mode_config_funcs mode_config_funcs = {  	.fb_create = drm_gem_fb_create,  	.atomic_check = tilcdc_atomic_check, -	.atomic_commit = tilcdc_commit, +	.atomic_commit = drm_atomic_helper_commit,  };  static void modeset_init(struct drm_device *dev) @@ -496,18 +451,7 @@ DEFINE_DRM_GEM_CMA_FOPS(fops);  static struct drm_driver tilcdc_driver = {  	.driver_features    = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,  	.irq_handler        = tilcdc_irq, -	.gem_free_object_unlocked = drm_gem_cma_free_object, -	.gem_print_info     = drm_gem_cma_print_info, -	.gem_vm_ops         = &drm_gem_cma_vm_ops, -	.dumb_create        = drm_gem_cma_dumb_create, - -	.prime_handle_to_fd	= drm_gem_prime_handle_to_fd, -	.prime_fd_to_handle	= drm_gem_prime_fd_to_handle, -	.gem_prime_get_sg_table	= drm_gem_cma_prime_get_sg_table, -	.gem_prime_import_sg_table = drm_gem_cma_prime_import_sg_table, -	.gem_prime_vmap		= drm_gem_cma_prime_vmap, -	.gem_prime_vunmap	= drm_gem_cma_prime_vunmap, -	.gem_prime_mmap		= drm_gem_cma_prime_mmap, +	DRM_GEM_CMA_DRIVER_OPS,  #ifdef CONFIG_DEBUG_FS  	.debugfs_init       = tilcdc_debugfs_init,  #endif diff --git a/drivers/gpu/drm/tilcdc/tilcdc_panel.c b/drivers/gpu/drm/tilcdc/tilcdc_panel.c index 12823d60c4e8..00efc30b47d8 100644 --- a/drivers/gpu/drm/tilcdc/tilcdc_panel.c +++ b/drivers/gpu/drm/tilcdc/tilcdc_panel.c @@ -139,12 +139,16 @@ static int panel_connector_get_modes(struct drm_connector *connector)  	int i;  	for (i = 0; i < timings->num_timings; i++) { -		struct drm_display_mode *mode = drm_mode_create(dev); +		struct drm_display_mode *mode;  		struct videomode vm;  		if (videomode_from_timings(timings, &vm, i))  			break; +		mode = drm_mode_create(dev); +		if (!mode) +			break; +  		drm_display_mode_from_videomode(&vm, mode);  		mode->type = DRM_MODE_TYPE_DRIVER; @@ -299,7 +303,8 @@ put_node:  static int panel_probe(struct platform_device *pdev)  { -	struct device_node *bl_node, *node = pdev->dev.of_node; +	struct device_node *node = pdev->dev.of_node; +	struct backlight_device *backlight;  	struct panel_module *panel_mod;  	struct tilcdc_module *mod;  	struct pinctrl *pinctrl; @@ -315,16 +320,10 @@ static int panel_probe(struct platform_device *pdev)  	if (!panel_mod)  		return -ENOMEM; -	bl_node = of_parse_phandle(node, "backlight", 0); -	if (bl_node) { -		panel_mod->backlight = of_find_backlight_by_node(bl_node); -		of_node_put(bl_node); - -		if (!panel_mod->backlight) -			return -EPROBE_DEFER; - -		dev_info(&pdev->dev, "found backlight\n"); -	} +	backlight = devm_of_find_backlight(&pdev->dev); +	if (IS_ERR(backlight)) +		return PTR_ERR(backlight); +	panel_mod->backlight = backlight;  	panel_mod->enable_gpio = devm_gpiod_get_optional(&pdev->dev, "enable",  							 GPIOD_OUT_LOW); @@ -396,7 +395,7 @@ static const struct of_device_id panel_of_match[] = {  		{ },  }; -struct platform_driver panel_driver = { +static struct platform_driver panel_driver = {  	.probe = panel_probe,  	.remove = panel_remove,  	.driver = { diff --git a/drivers/gpu/drm/tilcdc/tilcdc_plane.c b/drivers/gpu/drm/tilcdc/tilcdc_plane.c index e2090020b3a0..2f681a713815 100644 --- a/drivers/gpu/drm/tilcdc/tilcdc_plane.c +++ b/drivers/gpu/drm/tilcdc/tilcdc_plane.c @@ -62,8 +62,7 @@ static int tilcdc_plane_atomic_check(struct drm_plane *plane,  		return -EINVAL;  	} -	if (state->fb && old_state->fb && -	    state->fb->format != old_state->fb->format) { +	if (old_state->fb && state->fb->format != old_state->fb->format) {  		dev_dbg(plane->dev->dev,  			"%s(): pixel format change requires mode_change\n",  			__func__); @@ -84,9 +83,11 @@ static void tilcdc_plane_atomic_update(struct drm_plane *plane,  	if (WARN_ON(!state->fb || !state->crtc->state))  		return; -	tilcdc_crtc_update_fb(state->crtc, -			      state->fb, -			      state->crtc->state->event); +	if (tilcdc_crtc_update_fb(state->crtc, +				  state->fb, +				  state->crtc->state->event) == 0) { +		state->crtc->state->event = NULL; +	}  }  static const struct drm_plane_helper_funcs plane_helper_funcs = { | 
