1/* 2 * drivers/media/platform/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 "s5p_mfc_common.h" 21#include "s5p_mfc_debug.h" 22#include "s5p_mfc_intr.h" 23 24int s5p_mfc_wait_for_done_dev(struct s5p_mfc_dev *dev, int command) 25{ 26 int ret; 27 28 ret = wait_event_interruptible_timeout(dev->queue, 29 (dev->int_cond && (dev->int_type == command 30 || dev->int_type == S5P_MFC_R2H_CMD_ERR_RET)), 31 msecs_to_jiffies(MFC_INT_TIMEOUT)); 32 if (ret == 0) { 33 mfc_err("Interrupt (dev->int_type:%d, command:%d) timed out\n", 34 dev->int_type, command); 35 return 1; 36 } else if (ret == -ERESTARTSYS) { 37 mfc_err("Interrupted by a signal\n"); 38 return 1; 39 } 40 mfc_debug(1, "Finished waiting (dev->int_type:%d, command: %d)\n", 41 dev->int_type, command); 42 if (dev->int_type == S5P_MFC_R2H_CMD_ERR_RET) 43 return 1; 44 return 0; 45} 46 47void s5p_mfc_clean_dev_int_flags(struct s5p_mfc_dev *dev) 48{ 49 dev->int_cond = 0; 50 dev->int_type = 0; 51 dev->int_err = 0; 52} 53 54int s5p_mfc_wait_for_done_ctx(struct s5p_mfc_ctx *ctx, 55 int command, int interrupt) 56{ 57 int ret; 58 59 if (interrupt) { 60 ret = wait_event_interruptible_timeout(ctx->queue, 61 (ctx->int_cond && (ctx->int_type == command 62 || ctx->int_type == S5P_MFC_R2H_CMD_ERR_RET)), 63 msecs_to_jiffies(MFC_INT_TIMEOUT)); 64 } else { 65 ret = wait_event_timeout(ctx->queue, 66 (ctx->int_cond && (ctx->int_type == command 67 || ctx->int_type == S5P_MFC_R2H_CMD_ERR_RET)), 68 msecs_to_jiffies(MFC_INT_TIMEOUT)); 69 } 70 if (ret == 0) { 71 mfc_err("Interrupt (ctx->int_type:%d, command:%d) timed out\n", 72 ctx->int_type, command); 73 return 1; 74 } else if (ret == -ERESTARTSYS) { 75 mfc_err("Interrupted by a signal\n"); 76 return 1; 77 } 78 mfc_debug(1, "Finished waiting (ctx->int_type:%d, command: %d)\n", 79 ctx->int_type, command); 80 if (ctx->int_type == S5P_MFC_R2H_CMD_ERR_RET) 81 return 1; 82 return 0; 83} 84 85void s5p_mfc_clean_ctx_int_flags(struct s5p_mfc_ctx *ctx) 86{ 87 ctx->int_cond = 0; 88 ctx->int_type = 0; 89 ctx->int_err = 0; 90} 91 92