162306a36Sopenharmony_ci/* SPDX-License-Identifier: MIT */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright © 2022 Intel Corporation
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#ifndef __I915_TASKLET_H__
762306a36Sopenharmony_ci#define __I915_TASKLET_H__
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/interrupt.h>
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_cistatic inline void tasklet_lock(struct tasklet_struct *t)
1262306a36Sopenharmony_ci{
1362306a36Sopenharmony_ci	while (!tasklet_trylock(t))
1462306a36Sopenharmony_ci		cpu_relax();
1562306a36Sopenharmony_ci}
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_cistatic inline bool tasklet_is_locked(const struct tasklet_struct *t)
1862306a36Sopenharmony_ci{
1962306a36Sopenharmony_ci	return test_bit(TASKLET_STATE_RUN, &t->state);
2062306a36Sopenharmony_ci}
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_cistatic inline void __tasklet_disable_sync_once(struct tasklet_struct *t)
2362306a36Sopenharmony_ci{
2462306a36Sopenharmony_ci	if (!atomic_fetch_inc(&t->count))
2562306a36Sopenharmony_ci		tasklet_unlock_spin_wait(t);
2662306a36Sopenharmony_ci}
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_cistatic inline bool __tasklet_is_enabled(const struct tasklet_struct *t)
2962306a36Sopenharmony_ci{
3062306a36Sopenharmony_ci	return !atomic_read(&t->count);
3162306a36Sopenharmony_ci}
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_cistatic inline bool __tasklet_enable(struct tasklet_struct *t)
3462306a36Sopenharmony_ci{
3562306a36Sopenharmony_ci	return atomic_dec_and_test(&t->count);
3662306a36Sopenharmony_ci}
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_cistatic inline bool __tasklet_is_scheduled(struct tasklet_struct *t)
3962306a36Sopenharmony_ci{
4062306a36Sopenharmony_ci	return test_bit(TASKLET_STATE_SCHED, &t->state);
4162306a36Sopenharmony_ci}
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci#endif /* __I915_TASKLET_H__ */
44