1aff18712SYasunari Takiguchi // SPDX-License-Identifier: GPL-2.0
2aff18712SYasunari Takiguchi /*
3aff18712SYasunari Takiguchi  * cxd2880_integ.c
4aff18712SYasunari Takiguchi  * Sony CXD2880 DVB-T2/T tuner + demodulator driver
5aff18712SYasunari Takiguchi  * integration layer common functions
6aff18712SYasunari Takiguchi  *
7aff18712SYasunari Takiguchi  * Copyright (C) 2016, 2017, 2018 Sony Semiconductor Solutions Corporation
8aff18712SYasunari Takiguchi  */
9aff18712SYasunari Takiguchi 
10aff18712SYasunari Takiguchi #include <linux/ktime.h>
11aff18712SYasunari Takiguchi #include <linux/errno.h>
12aff18712SYasunari Takiguchi 
13aff18712SYasunari Takiguchi #include "cxd2880_tnrdmd.h"
14aff18712SYasunari Takiguchi #include "cxd2880_tnrdmd_mon.h"
15aff18712SYasunari Takiguchi #include "cxd2880_integ.h"
16aff18712SYasunari Takiguchi 
cxd2880_integ_init(struct cxd2880_tnrdmd * tnr_dmd)17aff18712SYasunari Takiguchi int cxd2880_integ_init(struct cxd2880_tnrdmd *tnr_dmd)
18aff18712SYasunari Takiguchi {
19aff18712SYasunari Takiguchi 	int ret;
20aff18712SYasunari Takiguchi 	ktime_t start;
21aff18712SYasunari Takiguchi 	u8 cpu_task_completed = 0;
22aff18712SYasunari Takiguchi 
23aff18712SYasunari Takiguchi 	if (!tnr_dmd)
24aff18712SYasunari Takiguchi 		return -EINVAL;
25aff18712SYasunari Takiguchi 
26aff18712SYasunari Takiguchi 	ret = cxd2880_tnrdmd_init1(tnr_dmd);
27aff18712SYasunari Takiguchi 	if (ret)
28aff18712SYasunari Takiguchi 		return ret;
29aff18712SYasunari Takiguchi 
30aff18712SYasunari Takiguchi 	start = ktime_get();
31aff18712SYasunari Takiguchi 
32aff18712SYasunari Takiguchi 	while (1) {
33aff18712SYasunari Takiguchi 		ret =
34aff18712SYasunari Takiguchi 		    cxd2880_tnrdmd_check_internal_cpu_status(tnr_dmd,
35aff18712SYasunari Takiguchi 						     &cpu_task_completed);
36aff18712SYasunari Takiguchi 		if (ret)
37aff18712SYasunari Takiguchi 			return ret;
38aff18712SYasunari Takiguchi 
39aff18712SYasunari Takiguchi 		if (cpu_task_completed)
40aff18712SYasunari Takiguchi 			break;
41aff18712SYasunari Takiguchi 
42aff18712SYasunari Takiguchi 		if (ktime_to_ms(ktime_sub(ktime_get(), start)) >
43aff18712SYasunari Takiguchi 					CXD2880_TNRDMD_WAIT_INIT_TIMEOUT)
44aff18712SYasunari Takiguchi 			return -ETIMEDOUT;
45aff18712SYasunari Takiguchi 
46aff18712SYasunari Takiguchi 		usleep_range(CXD2880_TNRDMD_WAIT_INIT_INTVL,
47aff18712SYasunari Takiguchi 			     CXD2880_TNRDMD_WAIT_INIT_INTVL + 1000);
48aff18712SYasunari Takiguchi 	}
49aff18712SYasunari Takiguchi 
50aff18712SYasunari Takiguchi 	return cxd2880_tnrdmd_init2(tnr_dmd);
51aff18712SYasunari Takiguchi }
52aff18712SYasunari Takiguchi 
cxd2880_integ_cancel(struct cxd2880_tnrdmd * tnr_dmd)53aff18712SYasunari Takiguchi int cxd2880_integ_cancel(struct cxd2880_tnrdmd *tnr_dmd)
54aff18712SYasunari Takiguchi {
55aff18712SYasunari Takiguchi 	if (!tnr_dmd)
56aff18712SYasunari Takiguchi 		return -EINVAL;
57aff18712SYasunari Takiguchi 
58aff18712SYasunari Takiguchi 	atomic_set(&tnr_dmd->cancel, 1);
59aff18712SYasunari Takiguchi 
60aff18712SYasunari Takiguchi 	return 0;
61aff18712SYasunari Takiguchi }
62aff18712SYasunari Takiguchi 
cxd2880_integ_check_cancellation(struct cxd2880_tnrdmd * tnr_dmd)63aff18712SYasunari Takiguchi int cxd2880_integ_check_cancellation(struct cxd2880_tnrdmd *tnr_dmd)
64aff18712SYasunari Takiguchi {
65aff18712SYasunari Takiguchi 	if (!tnr_dmd)
66aff18712SYasunari Takiguchi 		return -EINVAL;
67aff18712SYasunari Takiguchi 
68aff18712SYasunari Takiguchi 	if (atomic_read(&tnr_dmd->cancel) != 0)
69aff18712SYasunari Takiguchi 		return -ECANCELED;
70aff18712SYasunari Takiguchi 
71aff18712SYasunari Takiguchi 	return 0;
72aff18712SYasunari Takiguchi }
73