| /* |
| * Tegra host1x Interrupt Management |
| * |
| * Copyright (c) 2010-2013, NVIDIA Corporation. |
| * |
| * This program is free software; you can redistribute it and/or modify it |
| * under the terms and conditions of the GNU General Public License, |
| * version 2, as published by the Free Software Foundation. |
| * |
| * This program is distributed in the hope it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
| * more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program. If not, see <http://www.gnu.org/licenses/>. |
| */ |
| |
| #ifndef __HOST1X_INTR_H |
| #define __HOST1X_INTR_H |
| |
| #include <linux/interrupt.h> |
| #include <linux/workqueue.h> |
| |
| struct host1x_syncpt; |
| struct host1x; |
| |
| enum host1x_intr_action { |
| /* |
| * Perform cleanup after a submit has completed. |
| * 'data' points to a channel |
| */ |
| HOST1X_INTR_ACTION_SUBMIT_COMPLETE = 0, |
| |
| /* |
| * Wake up a task. |
| * 'data' points to a wait_queue_head_t |
| */ |
| HOST1X_INTR_ACTION_WAKEUP, |
| |
| /* |
| * Wake up a interruptible task. |
| * 'data' points to a wait_queue_head_t |
| */ |
| HOST1X_INTR_ACTION_WAKEUP_INTERRUPTIBLE, |
| |
| HOST1X_INTR_ACTION_COUNT |
| }; |
| |
| struct host1x_syncpt_intr { |
| spinlock_t lock; |
| struct list_head wait_head; |
| char thresh_irq_name[12]; |
| struct work_struct work; |
| }; |
| |
| struct host1x_waitlist { |
| struct list_head list; |
| struct kref refcount; |
| u32 thresh; |
| enum host1x_intr_action action; |
| atomic_t state; |
| void *data; |
| int count; |
| }; |
| |
| /* |
| * Schedule an action to be taken when a sync point reaches the given threshold. |
| * |
| * @id the sync point |
| * @thresh the threshold |
| * @action the action to take |
| * @data a pointer to extra data depending on action, see above |
| * @waiter waiter structure - assumes ownership |
| * @ref must be passed if cancellation is possible, else NULL |
| * |
| * This is a non-blocking api. |
| */ |
| int host1x_intr_add_action(struct host1x *host, struct host1x_syncpt *syncpt, |
| u32 thresh, enum host1x_intr_action action, |
| void *data, struct host1x_waitlist *waiter, |
| void **ref); |
| |
| /* |
| * Unreference an action submitted to host1x_intr_add_action(). |
| * You must call this if you passed non-NULL as ref. |
| * @ref the ref returned from host1x_intr_add_action() |
| */ |
| void host1x_intr_put_ref(struct host1x *host, unsigned int id, void *ref); |
| |
| /* Initialize host1x sync point interrupt */ |
| int host1x_intr_init(struct host1x *host, unsigned int irq_sync); |
| |
| /* Deinitialize host1x sync point interrupt */ |
| void host1x_intr_deinit(struct host1x *host); |
| |
| /* Enable host1x sync point interrupt */ |
| void host1x_intr_start(struct host1x *host); |
| |
| /* Disable host1x sync point interrupt */ |
| void host1x_intr_stop(struct host1x *host); |
| |
| irqreturn_t host1x_syncpt_thresh_fn(void *dev_id); |
| #endif |