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