diff options
Diffstat (limited to 'drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c')
| -rw-r--r-- | drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c | 107 | 
1 files changed, 2 insertions, 105 deletions
| diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c index 98fb53b75f77..65af56e47129 100644 --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c @@ -557,103 +557,10 @@ static irqreturn_t atmel_hlcdc_dc_irq_handler(int irq, void *data)  	return IRQ_HANDLED;  } -struct atmel_hlcdc_dc_commit { -	struct work_struct work; -	struct drm_device *dev; -	struct drm_atomic_state *state; -}; - -static void -atmel_hlcdc_dc_atomic_complete(struct atmel_hlcdc_dc_commit *commit) -{ -	struct drm_device *dev = commit->dev; -	struct atmel_hlcdc_dc *dc = dev->dev_private; -	struct drm_atomic_state *old_state = commit->state; - -	/* Apply the atomic update. */ -	drm_atomic_helper_commit_modeset_disables(dev, old_state); -	drm_atomic_helper_commit_planes(dev, old_state, 0); -	drm_atomic_helper_commit_modeset_enables(dev, old_state); - -	drm_atomic_helper_wait_for_vblanks(dev, old_state); - -	drm_atomic_helper_cleanup_planes(dev, old_state); - -	drm_atomic_state_put(old_state); - -	/* Complete the commit, wake up any waiter. */ -	spin_lock(&dc->commit.wait.lock); -	dc->commit.pending = false; -	wake_up_all_locked(&dc->commit.wait); -	spin_unlock(&dc->commit.wait.lock); - -	kfree(commit); -} - -static void atmel_hlcdc_dc_atomic_work(struct work_struct *work) -{ -	struct atmel_hlcdc_dc_commit *commit = -		container_of(work, struct atmel_hlcdc_dc_commit, work); - -	atmel_hlcdc_dc_atomic_complete(commit); -} - -static int atmel_hlcdc_dc_atomic_commit(struct drm_device *dev, -					struct drm_atomic_state *state, -					bool async) -{ -	struct atmel_hlcdc_dc *dc = dev->dev_private; -	struct atmel_hlcdc_dc_commit *commit; -	int ret; - -	ret = drm_atomic_helper_prepare_planes(dev, state); -	if (ret) -		return ret; - -	/* Allocate the commit object. */ -	commit = kzalloc(sizeof(*commit), GFP_KERNEL); -	if (!commit) { -		ret = -ENOMEM; -		goto error; -	} - -	INIT_WORK(&commit->work, atmel_hlcdc_dc_atomic_work); -	commit->dev = dev; -	commit->state = state; - -	spin_lock(&dc->commit.wait.lock); -	ret = wait_event_interruptible_locked(dc->commit.wait, -					      !dc->commit.pending); -	if (ret == 0) -		dc->commit.pending = true; -	spin_unlock(&dc->commit.wait.lock); - -	if (ret) -		goto err_free; - -	/* We have our own synchronization through the commit lock. */ -	BUG_ON(drm_atomic_helper_swap_state(state, false) < 0); - -	/* Swap state succeeded, this is the point of no return. */ -	drm_atomic_state_get(state); -	if (async) -		queue_work(dc->wq, &commit->work); -	else -		atmel_hlcdc_dc_atomic_complete(commit); - -	return 0; - -err_free: -	kfree(commit); -error: -	drm_atomic_helper_cleanup_planes(dev, state); -	return ret; -} -  static const struct drm_mode_config_funcs mode_config_funcs = {  	.fb_create = drm_gem_fb_create,  	.atomic_check = drm_atomic_helper_check, -	.atomic_commit = atmel_hlcdc_dc_atomic_commit, +	.atomic_commit = drm_atomic_helper_commit,  };  static int atmel_hlcdc_dc_modeset_init(struct drm_device *dev) @@ -712,11 +619,6 @@ static int atmel_hlcdc_dc_load(struct drm_device *dev)  	if (!dc)  		return -ENOMEM; -	dc->wq = alloc_ordered_workqueue("atmel-hlcdc-dc", 0); -	if (!dc->wq) -		return -ENOMEM; - -	init_waitqueue_head(&dc->commit.wait);  	dc->desc = match->data;  	dc->hlcdc = dev_get_drvdata(dev->dev->parent);  	dev->dev_private = dc; @@ -724,7 +626,7 @@ static int atmel_hlcdc_dc_load(struct drm_device *dev)  	ret = clk_prepare_enable(dc->hlcdc->periph_clk);  	if (ret) {  		dev_err(dev->dev, "failed to enable periph_clk\n"); -		goto err_destroy_wq; +		return ret;  	}  	pm_runtime_enable(dev->dev); @@ -761,9 +663,6 @@ err_periph_clk_disable:  	pm_runtime_disable(dev->dev);  	clk_disable_unprepare(dc->hlcdc->periph_clk); -err_destroy_wq: -	destroy_workqueue(dc->wq); -  	return ret;  } @@ -771,7 +670,6 @@ static void atmel_hlcdc_dc_unload(struct drm_device *dev)  {  	struct atmel_hlcdc_dc *dc = dev->dev_private; -	flush_workqueue(dc->wq);  	drm_kms_helper_poll_fini(dev);  	drm_atomic_helper_shutdown(dev);  	drm_mode_config_cleanup(dev); @@ -784,7 +682,6 @@ static void atmel_hlcdc_dc_unload(struct drm_device *dev)  	pm_runtime_disable(dev->dev);  	clk_disable_unprepare(dc->hlcdc->periph_clk); -	destroy_workqueue(dc->wq);  }  static int atmel_hlcdc_dc_irq_postinstall(struct drm_device *dev) | 
