brintos

brintos / linux-shallow public Read only

0
0
Text · 2.3 KiB · 0a38f6d Raw
89 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * drivers/media/platform/samsung/mfc5/s5p_mfc_intr.c4 *5 * C file for Samsung MFC (Multi Function Codec - FIMV) driver6 * This file contains functions used to wait for command completion.7 *8 * Kamil Debski, Copyright (C) 2011 Samsung Electronics Co., Ltd.9 * http://www.samsung.com/10 */11 12#include <linux/delay.h>13#include <linux/errno.h>14#include <linux/io.h>15#include <linux/sched.h>16#include <linux/wait.h>17#include "s5p_mfc_common.h"18#include "s5p_mfc_debug.h"19#include "s5p_mfc_intr.h"20 21int s5p_mfc_wait_for_done_dev(struct s5p_mfc_dev *dev, int command)22{23	int ret;24 25	ret = wait_event_interruptible_timeout(dev->queue,26		(dev->int_cond && (dev->int_type == command27		|| dev->int_type == S5P_MFC_R2H_CMD_ERR_RET)),28		msecs_to_jiffies(MFC_INT_TIMEOUT));29	if (ret == 0) {30		mfc_err("Interrupt (dev->int_type:%d, command:%d) timed out\n",31							dev->int_type, command);32		return 1;33	} else if (ret == -ERESTARTSYS) {34		mfc_err("Interrupted by a signal\n");35		return 1;36	}37	mfc_debug(1, "Finished waiting (dev->int_type:%d, command: %d)\n",38							dev->int_type, command);39	if (dev->int_type == S5P_MFC_R2H_CMD_ERR_RET)40		return 1;41	return 0;42}43 44void s5p_mfc_clean_dev_int_flags(struct s5p_mfc_dev *dev)45{46	dev->int_cond = 0;47	dev->int_type = 0;48	dev->int_err = 0;49}50 51int s5p_mfc_wait_for_done_ctx(struct s5p_mfc_ctx *ctx,52				    int command, int interrupt)53{54	int ret;55 56	if (interrupt) {57		ret = wait_event_interruptible_timeout(ctx->queue,58				(ctx->int_cond && (ctx->int_type == command59			|| ctx->int_type == S5P_MFC_R2H_CMD_ERR_RET)),60					msecs_to_jiffies(MFC_INT_TIMEOUT));61	} else {62		ret = wait_event_timeout(ctx->queue,63				(ctx->int_cond && (ctx->int_type == command64			|| ctx->int_type == S5P_MFC_R2H_CMD_ERR_RET)),65					msecs_to_jiffies(MFC_INT_TIMEOUT));66	}67	if (ret == 0) {68		mfc_err("Interrupt (ctx->int_type:%d, command:%d) timed out\n",69							ctx->int_type, command);70		return 1;71	} else if (ret == -ERESTARTSYS) {72		mfc_err("Interrupted by a signal\n");73		return 1;74	}75	mfc_debug(1, "Finished waiting (ctx->int_type:%d, command: %d)\n",76							ctx->int_type, command);77	if (ctx->int_type == S5P_MFC_R2H_CMD_ERR_RET)78		return 1;79	return 0;80}81 82void s5p_mfc_clean_ctx_int_flags(struct s5p_mfc_ctx *ctx)83{84	ctx->int_cond = 0;85	ctx->int_type = 0;86	ctx->int_err = 0;87}88 89