diff options
Diffstat (limited to 'drivers/media/video/s5p-mfc/s5p_mfc_intr.c')
-rw-r--r-- | drivers/media/video/s5p-mfc/s5p_mfc_intr.c | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/drivers/media/video/s5p-mfc/s5p_mfc_intr.c b/drivers/media/video/s5p-mfc/s5p_mfc_intr.c new file mode 100644 index 00000000000..8f2f8bf4da7 --- /dev/null +++ b/drivers/media/video/s5p-mfc/s5p_mfc_intr.c | |||
@@ -0,0 +1,92 @@ | |||
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 | |||