Commit | Line | Data |
---|---|---|
af935746 KD |
1 | /* |
2 | * drivers/media/video/samsung/mfc5/s5p_mfc_intr.c | |
3 | * | |
4 | * C file for Samsung MFC (Multi Function Codec - FIMV) driver | |
5 | * This file contains functions used to wait for command completion. | |
6 | * | |
7 | * Kamil Debski, Copyright (C) 2011 Samsung Electronics Co., Ltd. | |
8 | * http://www.samsung.com/ | |
9 | * | |
10 | * This program is free software; you can redistribute it and/or modify | |
11 | * it under the terms of the GNU General Public License version 2 as | |
12 | * published by the Free Software Foundation. | |
13 | */ | |
14 | ||
15 | #include <linux/delay.h> | |
16 | #include <linux/errno.h> | |
17 | #include <linux/io.h> | |
18 | #include <linux/sched.h> | |
19 | #include <linux/wait.h> | |
20 | #include "regs-mfc.h" | |
21 | #include "s5p_mfc_common.h" | |
22 | #include "s5p_mfc_debug.h" | |
23 | #include "s5p_mfc_intr.h" | |
24 | ||
25 | int s5p_mfc_wait_for_done_dev(struct s5p_mfc_dev *dev, int command) | |
26 | { | |
27 | int ret; | |
28 | ||
29 | ret = wait_event_interruptible_timeout(dev->queue, | |
30 | (dev->int_cond && (dev->int_type == command | |
31 | || dev->int_type == S5P_FIMV_R2H_CMD_ERR_RET)), | |
32 | msecs_to_jiffies(MFC_INT_TIMEOUT)); | |
33 | if (ret == 0) { | |
34 | mfc_err("Interrupt (dev->int_type:%d, command:%d) timed out\n", | |
35 | dev->int_type, command); | |
36 | return 1; | |
37 | } else if (ret == -ERESTARTSYS) { | |
38 | mfc_err("Interrupted by a signal\n"); | |
39 | return 1; | |
40 | } | |
41 | mfc_debug(1, "Finished waiting (dev->int_type:%d, command: %d)\n", | |
42 | dev->int_type, command); | |
43 | if (dev->int_type == S5P_FIMV_R2H_CMD_ERR_RET) | |
44 | return 1; | |
45 | return 0; | |
46 | } | |
47 | ||
48 | void s5p_mfc_clean_dev_int_flags(struct s5p_mfc_dev *dev) | |
49 | { | |
50 | dev->int_cond = 0; | |
51 | dev->int_type = 0; | |
52 | dev->int_err = 0; | |
53 | } | |
54 | ||
55 | int s5p_mfc_wait_for_done_ctx(struct s5p_mfc_ctx *ctx, | |
56 | int command, int interrupt) | |
57 | { | |
58 | int ret; | |
59 | ||
60 | if (interrupt) { | |
61 | ret = wait_event_interruptible_timeout(ctx->queue, | |
62 | (ctx->int_cond && (ctx->int_type == command | |
63 | || ctx->int_type == S5P_FIMV_R2H_CMD_ERR_RET)), | |
64 | msecs_to_jiffies(MFC_INT_TIMEOUT)); | |
65 | } else { | |
66 | ret = wait_event_timeout(ctx->queue, | |
67 | (ctx->int_cond && (ctx->int_type == command | |
68 | || ctx->int_type == S5P_FIMV_R2H_CMD_ERR_RET)), | |
69 | msecs_to_jiffies(MFC_INT_TIMEOUT)); | |
70 | } | |
71 | if (ret == 0) { | |
72 | mfc_err("Interrupt (ctx->int_type:%d, command:%d) timed out\n", | |
73 | ctx->int_type, command); | |
74 | return 1; | |
75 | } else if (ret == -ERESTARTSYS) { | |
76 | mfc_err("Interrupted by a signal\n"); | |
77 | return 1; | |
78 | } | |
79 | mfc_debug(1, "Finished waiting (ctx->int_type:%d, command: %d)\n", | |
80 | ctx->int_type, command); | |
81 | if (ctx->int_type == S5P_FIMV_R2H_CMD_ERR_RET) | |
82 | return 1; | |
83 | return 0; | |
84 | } | |
85 | ||
86 | void s5p_mfc_clean_ctx_int_flags(struct s5p_mfc_ctx *ctx) | |
87 | { | |
88 | ctx->int_cond = 0; | |
89 | ctx->int_type = 0; | |
90 | ctx->int_err = 0; | |
91 | } | |
92 |