aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
authorKees Cook <keescook@chromium.org>2017-10-16 17:43:17 -0400
committerKees Cook <keescook@chromium.org>2017-11-21 18:57:07 -0500
commite99e88a9d2b067465adaa9c111ada99a041bef9a (patch)
tree6589bfe737740cb005070d92a364a7e042670c81 /drivers/gpu/drm
parentb9eaf18722221ef8b2bd6a67240ebe668622152a (diff)
treewide: setup_timer() -> timer_setup()
This converts all remaining cases of the old setup_timer() API into using timer_setup(), where the callback argument is the structure already holding the struct timer_list. These should have no behavioral changes, since they just change which pointer is passed into the callback with the same available pointers after conversion. It handles the following examples, in addition to some other variations. Casting from unsigned long: void my_callback(unsigned long data) { struct something *ptr = (struct something *)data; ... } ... setup_timer(&ptr->my_timer, my_callback, ptr); and forced object casts: void my_callback(struct something *ptr) { ... } ... setup_timer(&ptr->my_timer, my_callback, (unsigned long)ptr); become: void my_callback(struct timer_list *t) { struct something *ptr = from_timer(ptr, t, my_timer); ... } ... timer_setup(&ptr->my_timer, my_callback, 0); Direct function assignments: void my_callback(unsigned long data) { struct something *ptr = (struct something *)data; ... } ... ptr->my_timer.function = my_callback; have a temporary cast added, along with converting the args: void my_callback(struct timer_list *t) { struct something *ptr = from_timer(ptr, t, my_timer); ... } ... ptr->my_timer.function = (TIMER_FUNC_TYPE)my_callback; And finally, callbacks without a data assignment: void my_callback(unsigned long data) { ... } ... setup_timer(&ptr->my_timer, my_callback, 0); have their argument renamed to verify they're unused during conversion: void my_callback(struct timer_list *unused) { ... } ... timer_setup(&ptr->my_timer, my_callback, 0); The conversion is done with the following Coccinelle script: spatch --very-quiet --all-includes --include-headers \ -I ./arch/x86/include -I ./arch/x86/include/generated \ -I ./include -I ./arch/x86/include/uapi \ -I ./arch/x86/include/generated/uapi -I ./include/uapi \ -I ./include/generated/uapi --include ./include/linux/kconfig.h \ --dir . \ --cocci-file ~/src/data/timer_setup.cocci @fix_address_of@ expression e; @@ setup_timer( -&(e) +&e , ...) // Update any raw setup_timer() usages that have a NULL callback, but // would otherwise match change_timer_function_usage, since the latter // will update all function assignments done in the face of a NULL // function initialization in setup_timer(). @change_timer_function_usage_NULL@ expression _E; identifier _timer; type _cast_data; @@ ( -setup_timer(&_E->_timer, NULL, _E); +timer_setup(&_E->_timer, NULL, 0); | -setup_timer(&_E->_timer, NULL, (_cast_data)_E); +timer_setup(&_E->_timer, NULL, 0); | -setup_timer(&_E._timer, NULL, &_E); +timer_setup(&_E._timer, NULL, 0); | -setup_timer(&_E._timer, NULL, (_cast_data)&_E); +timer_setup(&_E._timer, NULL, 0); ) @change_timer_function_usage@ expression _E; identifier _timer; struct timer_list _stl; identifier _callback; type _cast_func, _cast_data; @@ ( -setup_timer(&_E->_timer, _callback, _E); +timer_setup(&_E->_timer, _callback, 0); | -setup_timer(&_E->_timer, &_callback, _E); +timer_setup(&_E->_timer, _callback, 0); | -setup_timer(&_E->_timer, _callback, (_cast_data)_E); +timer_setup(&_E->_timer, _callback, 0); | -setup_timer(&_E->_timer, &_callback, (_cast_data)_E); +timer_setup(&_E->_timer, _callback, 0); | -setup_timer(&_E->_timer, (_cast_func)_callback, _E); +timer_setup(&_E->_timer, _callback, 0); | -setup_timer(&_E->_timer, (_cast_func)&_callback, _E); +timer_setup(&_E->_timer, _callback, 0); | -setup_timer(&_E->_timer, (_cast_func)_callback, (_cast_data)_E); +timer_setup(&_E->_timer, _callback, 0); | -setup_timer(&_E->_timer, (_cast_func)&_callback, (_cast_data)_E); +timer_setup(&_E->_timer, _callback, 0); | -setup_timer(&_E._timer, _callback, (_cast_data)_E); +timer_setup(&_E._timer, _callback, 0); | -setup_timer(&_E._timer, _callback, (_cast_data)&_E); +timer_setup(&_E._timer, _callback, 0); | -setup_timer(&_E._timer, &_callback, (_cast_data)_E); +timer_setup(&_E._timer, _callback, 0); | -setup_timer(&_E._timer, &_callback, (_cast_data)&_E); +timer_setup(&_E._timer, _callback, 0); | -setup_timer(&_E._timer, (_cast_func)_callback, (_cast_data)_E); +timer_setup(&_E._timer, _callback, 0); | -setup_timer(&_E._timer, (_cast_func)_callback, (_cast_data)&_E); +timer_setup(&_E._timer, _callback, 0); | -setup_timer(&_E._timer, (_cast_func)&_callback, (_cast_data)_E); +timer_setup(&_E._timer, _callback, 0); | -setup_timer(&_E._timer, (_cast_func)&_callback, (_cast_data)&_E); +timer_setup(&_E._timer, _callback, 0); | _E->_timer@_stl.function = _callback; | _E->_timer@_stl.function = &_callback; | _E->_timer@_stl.function = (_cast_func)_callback; | _E->_timer@_stl.function = (_cast_func)&_callback; | _E._timer@_stl.function = _callback; | _E._timer@_stl.function = &_callback; | _E._timer@_stl.function = (_cast_func)_callback; | _E._timer@_stl.function = (_cast_func)&_callback; ) // callback(unsigned long arg) @change_callback_handle_cast depends on change_timer_function_usage@ identifier change_timer_function_usage._callback; identifier change_timer_function_usage._timer; type _origtype; identifier _origarg; type _handletype; identifier _handle; @@ void _callback( -_origtype _origarg +struct timer_list *t ) { ( ... when != _origarg _handletype *_handle = -(_handletype *)_origarg; +from_timer(_handle, t, _timer); ... when != _origarg | ... when != _origarg _handletype *_handle = -(void *)_origarg; +from_timer(_handle, t, _timer); ... when != _origarg | ... when != _origarg _handletype *_handle; ... when != _handle _handle = -(_handletype *)_origarg; +from_timer(_handle, t, _timer); ... when != _origarg | ... when != _origarg _handletype *_handle; ... when != _handle _handle = -(void *)_origarg; +from_timer(_handle, t, _timer); ... when != _origarg ) } // callback(unsigned long arg) without existing variable @change_callback_handle_cast_no_arg depends on change_timer_function_usage && !change_callback_handle_cast@ identifier change_timer_function_usage._callback; identifier change_timer_function_usage._timer; type _origtype; identifier _origarg; type _handletype; @@ void _callback( -_origtype _origarg +struct timer_list *t ) { + _handletype *_origarg = from_timer(_origarg, t, _timer); + ... when != _origarg - (_handletype *)_origarg + _origarg ... when != _origarg } // Avoid already converted callbacks. @match_callback_converted depends on change_timer_function_usage && !change_callback_handle_cast && !change_callback_handle_cast_no_arg@ identifier change_timer_function_usage._callback; identifier t; @@ void _callback(struct timer_list *t) { ... } // callback(struct something *handle) @change_callback_handle_arg depends on change_timer_function_usage && !match_callback_converted && !change_callback_handle_cast && !change_callback_handle_cast_no_arg@ identifier change_timer_function_usage._callback; identifier change_timer_function_usage._timer; type _handletype; identifier _handle; @@ void _callback( -_handletype *_handle +struct timer_list *t ) { + _handletype *_handle = from_timer(_handle, t, _timer); ... } // If change_callback_handle_arg ran on an empty function, remove // the added handler. @unchange_callback_handle_arg depends on change_timer_function_usage && change_callback_handle_arg@ identifier change_timer_function_usage._callback; identifier change_timer_function_usage._timer; type _handletype; identifier _handle; identifier t; @@ void _callback(struct timer_list *t) { - _handletype *_handle = from_timer(_handle, t, _timer); } // We only want to refactor the setup_timer() data argument if we've found // the matching callback. This undoes changes in change_timer_function_usage. @unchange_timer_function_usage depends on change_timer_function_usage && !change_callback_handle_cast && !change_callback_handle_cast_no_arg && !change_callback_handle_arg@ expression change_timer_function_usage._E; identifier change_timer_function_usage._timer; identifier change_timer_function_usage._callback; type change_timer_function_usage._cast_data; @@ ( -timer_setup(&_E->_timer, _callback, 0); +setup_timer(&_E->_timer, _callback, (_cast_data)_E); | -timer_setup(&_E._timer, _callback, 0); +setup_timer(&_E._timer, _callback, (_cast_data)&_E); ) // If we fixed a callback from a .function assignment, fix the // assignment cast now. @change_timer_function_assignment depends on change_timer_function_usage && (change_callback_handle_cast || change_callback_handle_cast_no_arg || change_callback_handle_arg)@ expression change_timer_function_usage._E; identifier change_timer_function_usage._timer; identifier change_timer_function_usage._callback; type _cast_func; typedef TIMER_FUNC_TYPE; @@ ( _E->_timer.function = -_callback +(TIMER_FUNC_TYPE)_callback ; | _E->_timer.function = -&_callback +(TIMER_FUNC_TYPE)_callback ; | _E->_timer.function = -(_cast_func)_callback; +(TIMER_FUNC_TYPE)_callback ; | _E->_timer.function = -(_cast_func)&_callback +(TIMER_FUNC_TYPE)_callback ; | _E._timer.function = -_callback +(TIMER_FUNC_TYPE)_callback ; | _E._timer.function = -&_callback; +(TIMER_FUNC_TYPE)_callback ; | _E._timer.function = -(_cast_func)_callback +(TIMER_FUNC_TYPE)_callback ; | _E._timer.function = -(_cast_func)&_callback +(TIMER_FUNC_TYPE)_callback ; ) // Sometimes timer functions are called directly. Replace matched args. @change_timer_function_calls depends on change_timer_function_usage && (change_callback_handle_cast || change_callback_handle_cast_no_arg || change_callback_handle_arg)@ expression _E; identifier change_timer_function_usage._timer; identifier change_timer_function_usage._callback; type _cast_data; @@ _callback( ( -(_cast_data)_E +&_E->_timer | -(_cast_data)&_E +&_E._timer | -_E +&_E->_timer ) ) // If a timer has been configured without a data argument, it can be // converted without regard to the callback argument, since it is unused. @match_timer_function_unused_data@ expression _E; identifier _timer; identifier _callback; @@ ( -setup_timer(&_E->_timer, _callback, 0); +timer_setup(&_E->_timer, _callback, 0); | -setup_timer(&_E->_timer, _callback, 0L); +timer_setup(&_E->_timer, _callback, 0); | -setup_timer(&_E->_timer, _callback, 0UL); +timer_setup(&_E->_timer, _callback, 0); | -setup_timer(&_E._timer, _callback, 0); +timer_setup(&_E._timer, _callback, 0); | -setup_timer(&_E._timer, _callback, 0L); +timer_setup(&_E._timer, _callback, 0); | -setup_timer(&_E._timer, _callback, 0UL); +timer_setup(&_E._timer, _callback, 0); | -setup_timer(&_timer, _callback, 0); +timer_setup(&_timer, _callback, 0); | -setup_timer(&_timer, _callback, 0L); +timer_setup(&_timer, _callback, 0); | -setup_timer(&_timer, _callback, 0UL); +timer_setup(&_timer, _callback, 0); | -setup_timer(_timer, _callback, 0); +timer_setup(_timer, _callback, 0); | -setup_timer(_timer, _callback, 0L); +timer_setup(_timer, _callback, 0); | -setup_timer(_timer, _callback, 0UL); +timer_setup(_timer, _callback, 0); ) @change_callback_unused_data depends on match_timer_function_unused_data@ identifier match_timer_function_unused_data._callback; type _origtype; identifier _origarg; @@ void _callback( -_origtype _origarg +struct timer_list *unused ) { ... when != _origarg } Signed-off-by: Kees Cook <keescook@chromium.org>
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r--drivers/gpu/drm/drm_vblank.c11
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_vidi.c6
-rw-r--r--drivers/gpu/drm/i2c/tda998x_drv.c7
-rw-r--r--drivers/gpu/drm/msm/adreno/a5xx_preempt.c7
-rw-r--r--drivers/gpu/drm/msm/msm_gpu.c7
-rw-r--r--drivers/gpu/drm/omapdrm/dss/dsi.c4
-rw-r--r--drivers/gpu/drm/rockchip/rockchip_drm_psr.c6
-rw-r--r--drivers/gpu/drm/vgem/vgem_fence.c6
-rw-r--r--drivers/gpu/drm/via/via_dmablit.c7
9 files changed, 28 insertions, 33 deletions
diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c
index 09c1c4ff93ca..3717b3df34a4 100644
--- a/drivers/gpu/drm/drm_vblank.c
+++ b/drivers/gpu/drm/drm_vblank.c
@@ -367,9 +367,9 @@ void drm_vblank_disable_and_save(struct drm_device *dev, unsigned int pipe)
367 spin_unlock_irqrestore(&dev->vblank_time_lock, irqflags); 367 spin_unlock_irqrestore(&dev->vblank_time_lock, irqflags);
368} 368}
369 369
370static void vblank_disable_fn(unsigned long arg) 370static void vblank_disable_fn(struct timer_list *t)
371{ 371{
372 struct drm_vblank_crtc *vblank = (void *)arg; 372 struct drm_vblank_crtc *vblank = from_timer(vblank, t, disable_timer);
373 struct drm_device *dev = vblank->dev; 373 struct drm_device *dev = vblank->dev;
374 unsigned int pipe = vblank->pipe; 374 unsigned int pipe = vblank->pipe;
375 unsigned long irqflags; 375 unsigned long irqflags;
@@ -436,8 +436,7 @@ int drm_vblank_init(struct drm_device *dev, unsigned int num_crtcs)
436 vblank->dev = dev; 436 vblank->dev = dev;
437 vblank->pipe = i; 437 vblank->pipe = i;
438 init_waitqueue_head(&vblank->queue); 438 init_waitqueue_head(&vblank->queue);
439 setup_timer(&vblank->disable_timer, vblank_disable_fn, 439 timer_setup(&vblank->disable_timer, vblank_disable_fn, 0);
440 (unsigned long)vblank);
441 seqlock_init(&vblank->seqlock); 440 seqlock_init(&vblank->seqlock);
442 } 441 }
443 442
@@ -1019,7 +1018,7 @@ static void drm_vblank_put(struct drm_device *dev, unsigned int pipe)
1019 if (drm_vblank_offdelay == 0) 1018 if (drm_vblank_offdelay == 0)
1020 return; 1019 return;
1021 else if (drm_vblank_offdelay < 0) 1020 else if (drm_vblank_offdelay < 0)
1022 vblank_disable_fn((unsigned long)vblank); 1021 vblank_disable_fn(&vblank->disable_timer);
1023 else if (!dev->vblank_disable_immediate) 1022 else if (!dev->vblank_disable_immediate)
1024 mod_timer(&vblank->disable_timer, 1023 mod_timer(&vblank->disable_timer,
1025 jiffies + ((drm_vblank_offdelay * HZ)/1000)); 1024 jiffies + ((drm_vblank_offdelay * HZ)/1000));
@@ -1650,7 +1649,7 @@ bool drm_handle_vblank(struct drm_device *dev, unsigned int pipe)
1650 spin_unlock_irqrestore(&dev->event_lock, irqflags); 1649 spin_unlock_irqrestore(&dev->event_lock, irqflags);
1651 1650
1652 if (disable_irq) 1651 if (disable_irq)
1653 vblank_disable_fn((unsigned long)vblank); 1652 vblank_disable_fn(&vblank->disable_timer);
1654 1653
1655 return true; 1654 return true;
1656} 1655}
diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
index 53e03f8af3d5..e6b0940b1ac2 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
@@ -161,9 +161,9 @@ static const struct exynos_drm_crtc_ops vidi_crtc_ops = {
161 .atomic_flush = exynos_crtc_handle_event, 161 .atomic_flush = exynos_crtc_handle_event,
162}; 162};
163 163
164static void vidi_fake_vblank_timer(unsigned long arg) 164static void vidi_fake_vblank_timer(struct timer_list *t)
165{ 165{
166 struct vidi_context *ctx = (void *)arg; 166 struct vidi_context *ctx = from_timer(ctx, t, timer);
167 167
168 if (drm_crtc_handle_vblank(&ctx->crtc->base)) 168 if (drm_crtc_handle_vblank(&ctx->crtc->base))
169 mod_timer(&ctx->timer, 169 mod_timer(&ctx->timer,
@@ -449,7 +449,7 @@ static int vidi_probe(struct platform_device *pdev)
449 449
450 ctx->pdev = pdev; 450 ctx->pdev = pdev;
451 451
452 setup_timer(&ctx->timer, vidi_fake_vblank_timer, (unsigned long)ctx); 452 timer_setup(&ctx->timer, vidi_fake_vblank_timer, 0);
453 453
454 mutex_init(&ctx->lock); 454 mutex_init(&ctx->lock);
455 455
diff --git a/drivers/gpu/drm/i2c/tda998x_drv.c b/drivers/gpu/drm/i2c/tda998x_drv.c
index 4d1f45acf2cd..127815253a84 100644
--- a/drivers/gpu/drm/i2c/tda998x_drv.c
+++ b/drivers/gpu/drm/i2c/tda998x_drv.c
@@ -601,9 +601,9 @@ tda998x_reset(struct tda998x_priv *priv)
601 * we have seen a HPD inactive->active transition. This code implements 601 * we have seen a HPD inactive->active transition. This code implements
602 * that delay. 602 * that delay.
603 */ 603 */
604static void tda998x_edid_delay_done(unsigned long data) 604static void tda998x_edid_delay_done(struct timer_list *t)
605{ 605{
606 struct tda998x_priv *priv = (struct tda998x_priv *)data; 606 struct tda998x_priv *priv = from_timer(priv, t, edid_delay_timer);
607 607
608 priv->edid_delay_active = false; 608 priv->edid_delay_active = false;
609 wake_up(&priv->edid_delay_waitq); 609 wake_up(&priv->edid_delay_waitq);
@@ -1492,8 +1492,7 @@ static int tda998x_create(struct i2c_client *client, struct tda998x_priv *priv)
1492 1492
1493 mutex_init(&priv->mutex); /* protect the page access */ 1493 mutex_init(&priv->mutex); /* protect the page access */
1494 init_waitqueue_head(&priv->edid_delay_waitq); 1494 init_waitqueue_head(&priv->edid_delay_waitq);
1495 setup_timer(&priv->edid_delay_timer, tda998x_edid_delay_done, 1495 timer_setup(&priv->edid_delay_timer, tda998x_edid_delay_done, 0);
1496 (unsigned long)priv);
1497 INIT_WORK(&priv->detect_work, tda998x_detect_work); 1496 INIT_WORK(&priv->detect_work, tda998x_detect_work);
1498 1497
1499 /* wake up the device: */ 1498 /* wake up the device: */
diff --git a/drivers/gpu/drm/msm/adreno/a5xx_preempt.c b/drivers/gpu/drm/msm/adreno/a5xx_preempt.c
index 40f4840ef98e..970c7963ae29 100644
--- a/drivers/gpu/drm/msm/adreno/a5xx_preempt.c
+++ b/drivers/gpu/drm/msm/adreno/a5xx_preempt.c
@@ -82,9 +82,9 @@ static struct msm_ringbuffer *get_next_ring(struct msm_gpu *gpu)
82 return NULL; 82 return NULL;
83} 83}
84 84
85static void a5xx_preempt_timer(unsigned long data) 85static void a5xx_preempt_timer(struct timer_list *t)
86{ 86{
87 struct a5xx_gpu *a5xx_gpu = (struct a5xx_gpu *) data; 87 struct a5xx_gpu *a5xx_gpu = from_timer(a5xx_gpu, t, preempt_timer);
88 struct msm_gpu *gpu = &a5xx_gpu->base.base; 88 struct msm_gpu *gpu = &a5xx_gpu->base.base;
89 struct drm_device *dev = gpu->dev; 89 struct drm_device *dev = gpu->dev;
90 struct msm_drm_private *priv = dev->dev_private; 90 struct msm_drm_private *priv = dev->dev_private;
@@ -300,6 +300,5 @@ void a5xx_preempt_init(struct msm_gpu *gpu)
300 } 300 }
301 } 301 }
302 302
303 setup_timer(&a5xx_gpu->preempt_timer, a5xx_preempt_timer, 303 timer_setup(&a5xx_gpu->preempt_timer, a5xx_preempt_timer, 0);
304 (unsigned long) a5xx_gpu);
305} 304}
diff --git a/drivers/gpu/drm/msm/msm_gpu.c b/drivers/gpu/drm/msm/msm_gpu.c
index 8d4477818ec2..232201403439 100644
--- a/drivers/gpu/drm/msm/msm_gpu.c
+++ b/drivers/gpu/drm/msm/msm_gpu.c
@@ -353,9 +353,9 @@ static void hangcheck_timer_reset(struct msm_gpu *gpu)
353 round_jiffies_up(jiffies + DRM_MSM_HANGCHECK_JIFFIES)); 353 round_jiffies_up(jiffies + DRM_MSM_HANGCHECK_JIFFIES));
354} 354}
355 355
356static void hangcheck_handler(unsigned long data) 356static void hangcheck_handler(struct timer_list *t)
357{ 357{
358 struct msm_gpu *gpu = (struct msm_gpu *)data; 358 struct msm_gpu *gpu = from_timer(gpu, t, hangcheck_timer);
359 struct drm_device *dev = gpu->dev; 359 struct drm_device *dev = gpu->dev;
360 struct msm_drm_private *priv = dev->dev_private; 360 struct msm_drm_private *priv = dev->dev_private;
361 struct msm_ringbuffer *ring = gpu->funcs->active_ring(gpu); 361 struct msm_ringbuffer *ring = gpu->funcs->active_ring(gpu);
@@ -703,8 +703,7 @@ int msm_gpu_init(struct drm_device *drm, struct platform_device *pdev,
703 INIT_WORK(&gpu->recover_work, recover_worker); 703 INIT_WORK(&gpu->recover_work, recover_worker);
704 704
705 705
706 setup_timer(&gpu->hangcheck_timer, hangcheck_handler, 706 timer_setup(&gpu->hangcheck_timer, hangcheck_handler, 0);
707 (unsigned long)gpu);
708 707
709 spin_lock_init(&gpu->perf_lock); 708 spin_lock_init(&gpu->perf_lock);
710 709
diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
index cea744e4d9bd..c2cf6d98e577 100644
--- a/drivers/gpu/drm/omapdrm/dss/dsi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
@@ -4095,7 +4095,7 @@ static void dsi_update_screen_dispc(struct platform_device *dsidev)
4095} 4095}
4096 4096
4097#ifdef DSI_CATCH_MISSING_TE 4097#ifdef DSI_CATCH_MISSING_TE
4098static void dsi_te_timeout(unsigned long arg) 4098static void dsi_te_timeout(struct timer_list *unused)
4099{ 4099{
4100 DSSERR("TE not received for 250ms!\n"); 4100 DSSERR("TE not received for 250ms!\n");
4101} 4101}
@@ -5449,7 +5449,7 @@ static int dsi_bind(struct device *dev, struct device *master, void *data)
5449 dsi_framedone_timeout_work_callback); 5449 dsi_framedone_timeout_work_callback);
5450 5450
5451#ifdef DSI_CATCH_MISSING_TE 5451#ifdef DSI_CATCH_MISSING_TE
5452 setup_timer(&dsi->te_timer, dsi_te_timeout, 0); 5452 timer_setup(&dsi->te_timer, dsi_te_timeout, 0);
5453#endif 5453#endif
5454 5454
5455 dsi_mem = platform_get_resource_byname(dsidev, IORESOURCE_MEM, "proto"); 5455 dsi_mem = platform_get_resource_byname(dsidev, IORESOURCE_MEM, "proto");
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_psr.c b/drivers/gpu/drm/rockchip/rockchip_drm_psr.c
index a553e182ff53..3acfd576b7df 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_psr.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_psr.c
@@ -101,9 +101,9 @@ static void psr_set_state(struct psr_drv *psr, enum psr_state state)
101 spin_unlock_irqrestore(&psr->lock, flags); 101 spin_unlock_irqrestore(&psr->lock, flags);
102} 102}
103 103
104static void psr_flush_handler(unsigned long data) 104static void psr_flush_handler(struct timer_list *t)
105{ 105{
106 struct psr_drv *psr = (struct psr_drv *)data; 106 struct psr_drv *psr = from_timer(psr, t, flush_timer);
107 unsigned long flags; 107 unsigned long flags;
108 108
109 /* If the state has changed since we initiated the flush, do nothing */ 109 /* If the state has changed since we initiated the flush, do nothing */
@@ -232,7 +232,7 @@ int rockchip_drm_psr_register(struct drm_encoder *encoder,
232 if (!psr) 232 if (!psr)
233 return -ENOMEM; 233 return -ENOMEM;
234 234
235 setup_timer(&psr->flush_timer, psr_flush_handler, (unsigned long)psr); 235 timer_setup(&psr->flush_timer, psr_flush_handler, 0);
236 spin_lock_init(&psr->lock); 236 spin_lock_init(&psr->lock);
237 237
238 psr->active = true; 238 psr->active = true;
diff --git a/drivers/gpu/drm/vgem/vgem_fence.c b/drivers/gpu/drm/vgem/vgem_fence.c
index 8fd52f211e9d..b28876c222b4 100644
--- a/drivers/gpu/drm/vgem/vgem_fence.c
+++ b/drivers/gpu/drm/vgem/vgem_fence.c
@@ -85,9 +85,9 @@ static const struct dma_fence_ops vgem_fence_ops = {
85 .timeline_value_str = vgem_fence_timeline_value_str, 85 .timeline_value_str = vgem_fence_timeline_value_str,
86}; 86};
87 87
88static void vgem_fence_timeout(unsigned long data) 88static void vgem_fence_timeout(struct timer_list *t)
89{ 89{
90 struct vgem_fence *fence = (struct vgem_fence *)data; 90 struct vgem_fence *fence = from_timer(fence, t, timer);
91 91
92 dma_fence_signal(&fence->base); 92 dma_fence_signal(&fence->base);
93} 93}
@@ -105,7 +105,7 @@ static struct dma_fence *vgem_fence_create(struct vgem_file *vfile,
105 dma_fence_init(&fence->base, &vgem_fence_ops, &fence->lock, 105 dma_fence_init(&fence->base, &vgem_fence_ops, &fence->lock,
106 dma_fence_context_alloc(1), 1); 106 dma_fence_context_alloc(1), 1);
107 107
108 setup_timer(&fence->timer, vgem_fence_timeout, (unsigned long)fence); 108 timer_setup(&fence->timer, vgem_fence_timeout, 0);
109 109
110 /* We force the fence to expire within 10s to prevent driver hangs */ 110 /* We force the fence to expire within 10s to prevent driver hangs */
111 mod_timer(&fence->timer, jiffies + VGEM_FENCE_TIMEOUT); 111 mod_timer(&fence->timer, jiffies + VGEM_FENCE_TIMEOUT);
diff --git a/drivers/gpu/drm/via/via_dmablit.c b/drivers/gpu/drm/via/via_dmablit.c
index 32c9938e1e1e..d6e84a589ef1 100644
--- a/drivers/gpu/drm/via/via_dmablit.c
+++ b/drivers/gpu/drm/via/via_dmablit.c
@@ -452,9 +452,9 @@ via_dmablit_sync(struct drm_device *dev, uint32_t handle, int engine)
452 452
453 453
454static void 454static void
455via_dmablit_timer(unsigned long data) 455via_dmablit_timer(struct timer_list *t)
456{ 456{
457 drm_via_blitq_t *blitq = (drm_via_blitq_t *) data; 457 drm_via_blitq_t *blitq = from_timer(blitq, t, poll_timer);
458 struct drm_device *dev = blitq->dev; 458 struct drm_device *dev = blitq->dev;
459 int engine = (int) 459 int engine = (int)
460 (blitq - ((drm_via_private_t *)dev->dev_private)->blit_queues); 460 (blitq - ((drm_via_private_t *)dev->dev_private)->blit_queues);
@@ -559,8 +559,7 @@ via_init_dmablit(struct drm_device *dev)
559 init_waitqueue_head(blitq->blit_queue + j); 559 init_waitqueue_head(blitq->blit_queue + j);
560 init_waitqueue_head(&blitq->busy_queue); 560 init_waitqueue_head(&blitq->busy_queue);
561 INIT_WORK(&blitq->wq, via_dmablit_workqueue); 561 INIT_WORK(&blitq->wq, via_dmablit_workqueue);
562 setup_timer(&blitq->poll_timer, via_dmablit_timer, 562 timer_setup(&blitq->poll_timer, via_dmablit_timer, 0);
563 (unsigned long)blitq);
564 } 563 }
565} 564}
566 565