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 25int 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 48void 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 55int 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 86void 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 93