151 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 * cxd2880_tnrdmd_mon.c4 * Sony CXD2880 DVB-T2/T tuner + demodulator driver5 * common monitor functions6 *7 * Copyright (C) 2016, 2017, 2018 Sony Semiconductor Solutions Corporation8 */9 10#include "cxd2880_common.h"11#include "cxd2880_tnrdmd_mon.h"12 13static const u8 rf_lvl_seq[2] = {14 0x80, 0x00,15};16 17int cxd2880_tnrdmd_mon_rf_lvl(struct cxd2880_tnrdmd *tnr_dmd,18 int *rf_lvl_db)19{20 u8 rdata[2];21 int ret;22 23 if (!tnr_dmd || !rf_lvl_db)24 return -EINVAL;25 26 if (tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE)27 return -EINVAL;28 29 ret = tnr_dmd->io->write_reg(tnr_dmd->io,30 CXD2880_IO_TGT_DMD,31 0x00, 0x00);32 if (ret)33 return ret;34 35 ret = tnr_dmd->io->write_reg(tnr_dmd->io,36 CXD2880_IO_TGT_DMD,37 0x10, 0x01);38 if (ret)39 return ret;40 41 ret = tnr_dmd->io->write_reg(tnr_dmd->io,42 CXD2880_IO_TGT_SYS,43 0x00, 0x10);44 if (ret)45 return ret;46 47 ret = tnr_dmd->io->write_regs(tnr_dmd->io,48 CXD2880_IO_TGT_SYS,49 0x5b, rf_lvl_seq, 2);50 if (ret)51 return ret;52 53 usleep_range(2000, 3000);54 55 ret = tnr_dmd->io->write_reg(tnr_dmd->io,56 CXD2880_IO_TGT_SYS,57 0x00, 0x1a);58 if (ret)59 return ret;60 61 ret = tnr_dmd->io->read_regs(tnr_dmd->io,62 CXD2880_IO_TGT_SYS,63 0x15, rdata, 2);64 if (ret)65 return ret;66 67 if (rdata[0] || rdata[1])68 return -EINVAL;69 70 ret = tnr_dmd->io->read_regs(tnr_dmd->io,71 CXD2880_IO_TGT_SYS,72 0x11, rdata, 2);73 if (ret)74 return ret;75 76 *rf_lvl_db =77 cxd2880_convert2s_complement((rdata[0] << 3) |78 ((rdata[1] & 0xe0) >> 5), 11);79 80 *rf_lvl_db *= 125;81 82 ret = tnr_dmd->io->write_reg(tnr_dmd->io,83 CXD2880_IO_TGT_DMD,84 0x00, 0x00);85 if (ret)86 return ret;87 88 ret = tnr_dmd->io->write_reg(tnr_dmd->io,89 CXD2880_IO_TGT_DMD,90 0x10, 0x00);91 if (ret)92 return ret;93 94 if (tnr_dmd->rf_lvl_cmpstn)95 ret = tnr_dmd->rf_lvl_cmpstn(tnr_dmd, rf_lvl_db);96 97 return ret;98}99 100int cxd2880_tnrdmd_mon_rf_lvl_sub(struct cxd2880_tnrdmd *tnr_dmd,101 int *rf_lvl_db)102{103 if (!tnr_dmd || !rf_lvl_db)104 return -EINVAL;105 106 if (tnr_dmd->diver_mode != CXD2880_TNRDMD_DIVERMODE_MAIN)107 return -EINVAL;108 109 return cxd2880_tnrdmd_mon_rf_lvl(tnr_dmd->diver_sub, rf_lvl_db);110}111 112int cxd2880_tnrdmd_mon_internal_cpu_status(struct cxd2880_tnrdmd113 *tnr_dmd, u16 *status)114{115 u8 data[2] = { 0 };116 int ret;117 118 if (!tnr_dmd || !status)119 return -EINVAL;120 121 ret = tnr_dmd->io->write_reg(tnr_dmd->io,122 CXD2880_IO_TGT_SYS,123 0x00, 0x1a);124 if (ret)125 return ret;126 ret = tnr_dmd->io->read_regs(tnr_dmd->io,127 CXD2880_IO_TGT_SYS,128 0x15, data, 2);129 if (ret)130 return ret;131 132 *status = (data[0] << 8) | data[1];133 134 return 0;135}136 137int cxd2880_tnrdmd_mon_internal_cpu_status_sub(struct138 cxd2880_tnrdmd139 *tnr_dmd,140 u16 *status)141{142 if (!tnr_dmd || !status)143 return -EINVAL;144 145 if (tnr_dmd->diver_mode != CXD2880_TNRDMD_DIVERMODE_MAIN)146 return -EINVAL;147 148 return cxd2880_tnrdmd_mon_internal_cpu_status(tnr_dmd->diver_sub,149 status);150}151