drm/msm: Add hrtimer + kthread_work helper
Before open-coding this a 2nd time, add a helper. Signed-off-by: Rob Clark <robdclark@chromium.org> Link: https://lore.kernel.org/r/20210927230455.1066297-1-robdclark@gmail.com Signed-off-by: Rob Clark <robdclark@chromium.org>
This commit is contained in:
parent
415f36903b
commit
ddb6e37a50
@ -116,20 +116,10 @@ out:
|
||||
trace_msm_atomic_async_commit_finish(crtc_mask);
|
||||
}
|
||||
|
||||
static enum hrtimer_restart msm_atomic_pending_timer(struct hrtimer *t)
|
||||
{
|
||||
struct msm_pending_timer *timer = container_of(t,
|
||||
struct msm_pending_timer, timer);
|
||||
|
||||
kthread_queue_work(timer->worker, &timer->work);
|
||||
|
||||
return HRTIMER_NORESTART;
|
||||
}
|
||||
|
||||
static void msm_atomic_pending_work(struct kthread_work *work)
|
||||
{
|
||||
struct msm_pending_timer *timer = container_of(work,
|
||||
struct msm_pending_timer, work);
|
||||
struct msm_pending_timer, work.work);
|
||||
|
||||
msm_atomic_async_commit(timer->kms, timer->crtc_idx);
|
||||
}
|
||||
@ -139,8 +129,6 @@ int msm_atomic_init_pending_timer(struct msm_pending_timer *timer,
|
||||
{
|
||||
timer->kms = kms;
|
||||
timer->crtc_idx = crtc_idx;
|
||||
hrtimer_init(&timer->timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
|
||||
timer->timer.function = msm_atomic_pending_timer;
|
||||
|
||||
timer->worker = kthread_create_worker(0, "atomic-worker-%d", crtc_idx);
|
||||
if (IS_ERR(timer->worker)) {
|
||||
@ -149,7 +137,10 @@ int msm_atomic_init_pending_timer(struct msm_pending_timer *timer,
|
||||
return ret;
|
||||
}
|
||||
sched_set_fifo(timer->worker->task);
|
||||
kthread_init_work(&timer->work, msm_atomic_pending_work);
|
||||
|
||||
msm_hrtimer_work_init(&timer->work, timer->worker,
|
||||
msm_atomic_pending_work,
|
||||
CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -258,7 +249,7 @@ void msm_atomic_commit_tail(struct drm_atomic_state *state)
|
||||
vsync_time = kms->funcs->vsync_time(kms, async_crtc);
|
||||
wakeup_time = ktime_sub(vsync_time, ms_to_ktime(1));
|
||||
|
||||
hrtimer_start(&timer->timer, wakeup_time,
|
||||
msm_hrtimer_queue_work(&timer->work, wakeup_time,
|
||||
HRTIMER_MODE_ABS);
|
||||
}
|
||||
|
||||
|
@ -200,6 +200,35 @@ void msm_rmw(void __iomem *addr, u32 mask, u32 or)
|
||||
msm_writel(val | or, addr);
|
||||
}
|
||||
|
||||
static enum hrtimer_restart msm_hrtimer_worktimer(struct hrtimer *t)
|
||||
{
|
||||
struct msm_hrtimer_work *work = container_of(t,
|
||||
struct msm_hrtimer_work, timer);
|
||||
|
||||
kthread_queue_work(work->worker, &work->work);
|
||||
|
||||
return HRTIMER_NORESTART;
|
||||
}
|
||||
|
||||
void msm_hrtimer_queue_work(struct msm_hrtimer_work *work,
|
||||
ktime_t wakeup_time,
|
||||
enum hrtimer_mode mode)
|
||||
{
|
||||
hrtimer_start(&work->timer, wakeup_time, mode);
|
||||
}
|
||||
|
||||
void msm_hrtimer_work_init(struct msm_hrtimer_work *work,
|
||||
struct kthread_worker *worker,
|
||||
kthread_work_func_t fn,
|
||||
clockid_t clock_id,
|
||||
enum hrtimer_mode mode)
|
||||
{
|
||||
hrtimer_init(&work->timer, clock_id, mode);
|
||||
work->timer.function = msm_hrtimer_worktimer;
|
||||
work->worker = worker;
|
||||
kthread_init_work(&work->work, fn);
|
||||
}
|
||||
|
||||
static irqreturn_t msm_irq(int irq, void *arg)
|
||||
{
|
||||
struct drm_device *dev = arg;
|
||||
|
@ -480,6 +480,28 @@ void msm_writel(u32 data, void __iomem *addr);
|
||||
u32 msm_readl(const void __iomem *addr);
|
||||
void msm_rmw(void __iomem *addr, u32 mask, u32 or);
|
||||
|
||||
/**
|
||||
* struct msm_hrtimer_work - a helper to combine an hrtimer with kthread_work
|
||||
*
|
||||
* @timer: hrtimer to control when the kthread work is triggered
|
||||
* @work: the kthread work
|
||||
* @worker: the kthread worker the work will be scheduled on
|
||||
*/
|
||||
struct msm_hrtimer_work {
|
||||
struct hrtimer timer;
|
||||
struct kthread_work work;
|
||||
struct kthread_worker *worker;
|
||||
};
|
||||
|
||||
void msm_hrtimer_queue_work(struct msm_hrtimer_work *work,
|
||||
ktime_t wakeup_time,
|
||||
enum hrtimer_mode mode);
|
||||
void msm_hrtimer_work_init(struct msm_hrtimer_work *work,
|
||||
struct kthread_worker *worker,
|
||||
kthread_work_func_t fn,
|
||||
clockid_t clock_id,
|
||||
enum hrtimer_mode mode);
|
||||
|
||||
#define DBG(fmt, ...) DRM_DEBUG_DRIVER(fmt"\n", ##__VA_ARGS__)
|
||||
#define VERB(fmt, ...) if (0) DRM_DEBUG_DRIVER(fmt"\n", ##__VA_ARGS__)
|
||||
|
||||
|
@ -136,8 +136,7 @@ struct msm_kms;
|
||||
* shortly before vblank to flush pending async updates.
|
||||
*/
|
||||
struct msm_pending_timer {
|
||||
struct hrtimer timer;
|
||||
struct kthread_work work;
|
||||
struct msm_hrtimer_work work;
|
||||
struct kthread_worker *worker;
|
||||
struct msm_kms *kms;
|
||||
unsigned crtc_idx;
|
||||
|
Loading…
x
Reference in New Issue
Block a user