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