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 Takiguchiint 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 Takiguchiint 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 Takiguchiint 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