18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * cxd2880_tnrdmd.c 48c2ecf20Sopenharmony_ci * Sony CXD2880 DVB-T2/T tuner + demodulator driver 58c2ecf20Sopenharmony_ci * common control functions 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * Copyright (C) 2016, 2017, 2018 Sony Semiconductor Solutions Corporation 88c2ecf20Sopenharmony_ci */ 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#include <media/dvb_frontend.h> 118c2ecf20Sopenharmony_ci#include "cxd2880_common.h" 128c2ecf20Sopenharmony_ci#include "cxd2880_tnrdmd.h" 138c2ecf20Sopenharmony_ci#include "cxd2880_tnrdmd_mon.h" 148c2ecf20Sopenharmony_ci#include "cxd2880_tnrdmd_dvbt.h" 158c2ecf20Sopenharmony_ci#include "cxd2880_tnrdmd_dvbt2.h" 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value p_init1_seq[] = { 188c2ecf20Sopenharmony_ci {0x11, 0x16}, {0x00, 0x10}, 198c2ecf20Sopenharmony_ci}; 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value rf_init1_seq1[] = { 228c2ecf20Sopenharmony_ci {0x4f, 0x18}, {0x61, 0x00}, {0x71, 0x00}, {0x9d, 0x01}, 238c2ecf20Sopenharmony_ci {0x7d, 0x02}, {0x8f, 0x01}, {0x8b, 0xc6}, {0x9a, 0x03}, 248c2ecf20Sopenharmony_ci {0x1c, 0x00}, 258c2ecf20Sopenharmony_ci}; 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value rf_init1_seq2[] = { 288c2ecf20Sopenharmony_ci {0xb9, 0x07}, {0x33, 0x01}, {0xc1, 0x01}, {0xc4, 0x1e}, 298c2ecf20Sopenharmony_ci}; 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value rf_init1_seq3[] = { 328c2ecf20Sopenharmony_ci {0x00, 0x10}, {0x51, 0x01}, {0xc5, 0x07}, {0x00, 0x11}, 338c2ecf20Sopenharmony_ci {0x70, 0xe9}, {0x76, 0x0a}, {0x78, 0x32}, {0x7a, 0x46}, 348c2ecf20Sopenharmony_ci {0x7c, 0x86}, {0x7e, 0xa4}, {0x00, 0x10}, {0xe1, 0x01}, 358c2ecf20Sopenharmony_ci}; 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value rf_init1_seq4[] = { 388c2ecf20Sopenharmony_ci {0x15, 0x00}, {0x00, 0x16} 398c2ecf20Sopenharmony_ci}; 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value rf_init1_seq5[] = { 428c2ecf20Sopenharmony_ci {0x00, 0x00}, {0x25, 0x00} 438c2ecf20Sopenharmony_ci}; 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value rf_init1_seq6[] = { 468c2ecf20Sopenharmony_ci {0x02, 0x00}, {0x00, 0x00}, {0x21, 0x01}, {0x00, 0xe1}, 478c2ecf20Sopenharmony_ci {0x8f, 0x16}, {0x67, 0x60}, {0x6a, 0x0f}, {0x6c, 0x17} 488c2ecf20Sopenharmony_ci}; 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value rf_init1_seq7[] = { 518c2ecf20Sopenharmony_ci {0x00, 0xe2}, {0x41, 0xa0}, {0x4b, 0x68}, {0x00, 0x00}, 528c2ecf20Sopenharmony_ci {0x21, 0x00}, {0x10, 0x01}, 538c2ecf20Sopenharmony_ci}; 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value rf_init1_seq8[] = { 568c2ecf20Sopenharmony_ci {0x00, 0x10}, {0x25, 0x01}, 578c2ecf20Sopenharmony_ci}; 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value rf_init1_seq9[] = { 608c2ecf20Sopenharmony_ci {0x00, 0x10}, {0x14, 0x01}, {0x00, 0x00}, {0x26, 0x00}, 618c2ecf20Sopenharmony_ci}; 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value rf_init2_seq1[] = { 648c2ecf20Sopenharmony_ci {0x00, 0x14}, {0x1b, 0x01}, 658c2ecf20Sopenharmony_ci}; 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value rf_init2_seq2[] = { 688c2ecf20Sopenharmony_ci {0x00, 0x00}, {0x21, 0x01}, {0x00, 0xe1}, {0xd3, 0x00}, 698c2ecf20Sopenharmony_ci {0x00, 0x00}, {0x21, 0x00}, 708c2ecf20Sopenharmony_ci}; 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value x_tune1_seq1[] = { 738c2ecf20Sopenharmony_ci {0x00, 0x00}, {0x10, 0x01}, 748c2ecf20Sopenharmony_ci}; 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value x_tune1_seq2[] = { 778c2ecf20Sopenharmony_ci {0x62, 0x00}, {0x00, 0x15}, 788c2ecf20Sopenharmony_ci}; 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value x_tune2_seq1[] = { 818c2ecf20Sopenharmony_ci {0x00, 0x1a}, {0x29, 0x01}, 828c2ecf20Sopenharmony_ci}; 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value x_tune2_seq2[] = { 858c2ecf20Sopenharmony_ci {0x62, 0x01}, {0x00, 0x11}, {0x2d, 0x00}, {0x2f, 0x00}, 868c2ecf20Sopenharmony_ci}; 878c2ecf20Sopenharmony_ci 888c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value x_tune2_seq3[] = { 898c2ecf20Sopenharmony_ci {0x00, 0x00}, {0x10, 0x00}, {0x21, 0x01}, 908c2ecf20Sopenharmony_ci}; 918c2ecf20Sopenharmony_ci 928c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value x_tune2_seq4[] = { 938c2ecf20Sopenharmony_ci {0x00, 0xe1}, {0x8a, 0x87}, 948c2ecf20Sopenharmony_ci}; 958c2ecf20Sopenharmony_ci 968c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value x_tune2_seq5[] = { 978c2ecf20Sopenharmony_ci {0x00, 0x00}, {0x21, 0x00}, 988c2ecf20Sopenharmony_ci}; 998c2ecf20Sopenharmony_ci 1008c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value x_tune3_seq[] = { 1018c2ecf20Sopenharmony_ci {0x00, 0x00}, {0x21, 0x01}, {0x00, 0xe2}, {0x41, 0xa0}, 1028c2ecf20Sopenharmony_ci {0x00, 0x00}, {0x21, 0x00}, {0xfe, 0x01}, 1038c2ecf20Sopenharmony_ci}; 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value x_tune4_seq[] = { 1068c2ecf20Sopenharmony_ci {0x00, 0x00}, {0xfe, 0x01}, 1078c2ecf20Sopenharmony_ci}; 1088c2ecf20Sopenharmony_ci 1098c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value x_sleep1_seq[] = { 1108c2ecf20Sopenharmony_ci {0x00, 0x00}, {0x57, 0x03}, 1118c2ecf20Sopenharmony_ci}; 1128c2ecf20Sopenharmony_ci 1138c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value x_sleep2_seq1[] = { 1148c2ecf20Sopenharmony_ci {0x00, 0x2d}, {0xb1, 0x01}, 1158c2ecf20Sopenharmony_ci}; 1168c2ecf20Sopenharmony_ci 1178c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value x_sleep2_seq2[] = { 1188c2ecf20Sopenharmony_ci {0x00, 0x10}, {0xf4, 0x00}, {0xf3, 0x00}, {0xf2, 0x00}, 1198c2ecf20Sopenharmony_ci {0xf1, 0x00}, {0xf0, 0x00}, {0xef, 0x00}, 1208c2ecf20Sopenharmony_ci}; 1218c2ecf20Sopenharmony_ci 1228c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value x_sleep3_seq[] = { 1238c2ecf20Sopenharmony_ci {0x00, 0x00}, {0xfd, 0x00}, 1248c2ecf20Sopenharmony_ci}; 1258c2ecf20Sopenharmony_ci 1268c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value x_sleep4_seq[] = { 1278c2ecf20Sopenharmony_ci {0x00, 0x00}, {0x21, 0x01}, {0x00, 0xe2}, {0x41, 0x00}, 1288c2ecf20Sopenharmony_ci {0x00, 0x00}, {0x21, 0x00}, 1298c2ecf20Sopenharmony_ci}; 1308c2ecf20Sopenharmony_ci 1318c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value spll_reset_seq1[] = { 1328c2ecf20Sopenharmony_ci {0x00, 0x10}, {0x29, 0x01}, {0x28, 0x01}, {0x27, 0x01}, 1338c2ecf20Sopenharmony_ci {0x26, 0x01}, 1348c2ecf20Sopenharmony_ci}; 1358c2ecf20Sopenharmony_ci 1368c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value spll_reset_seq2[] = { 1378c2ecf20Sopenharmony_ci {0x00, 0x00}, {0x10, 0x00}, 1388c2ecf20Sopenharmony_ci}; 1398c2ecf20Sopenharmony_ci 1408c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value spll_reset_seq3[] = { 1418c2ecf20Sopenharmony_ci {0x00, 0x00}, {0x27, 0x00}, {0x22, 0x01}, 1428c2ecf20Sopenharmony_ci}; 1438c2ecf20Sopenharmony_ci 1448c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value spll_reset_seq4[] = { 1458c2ecf20Sopenharmony_ci {0x00, 0x00}, {0x27, 0x01}, 1468c2ecf20Sopenharmony_ci}; 1478c2ecf20Sopenharmony_ci 1488c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value spll_reset_seq5[] = { 1498c2ecf20Sopenharmony_ci {0x00, 0x00}, {0x10, 0x01}, 1508c2ecf20Sopenharmony_ci}; 1518c2ecf20Sopenharmony_ci 1528c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value t_power_x_seq1[] = { 1538c2ecf20Sopenharmony_ci {0x00, 0x10}, {0x29, 0x01}, {0x28, 0x01}, {0x27, 0x01}, 1548c2ecf20Sopenharmony_ci}; 1558c2ecf20Sopenharmony_ci 1568c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value t_power_x_seq2[] = { 1578c2ecf20Sopenharmony_ci {0x00, 0x00}, {0x10, 0x00}, 1588c2ecf20Sopenharmony_ci}; 1598c2ecf20Sopenharmony_ci 1608c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value t_power_x_seq3[] = { 1618c2ecf20Sopenharmony_ci {0x00, 0x00}, {0x27, 0x00}, {0x25, 0x01}, 1628c2ecf20Sopenharmony_ci}; 1638c2ecf20Sopenharmony_ci 1648c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value t_power_x_seq4[] = { 1658c2ecf20Sopenharmony_ci {0x00, 0x00}, {0x2a, 0x00}, 1668c2ecf20Sopenharmony_ci}; 1678c2ecf20Sopenharmony_ci 1688c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value t_power_x_seq5[] = { 1698c2ecf20Sopenharmony_ci {0x00, 0x00}, {0x25, 0x00}, 1708c2ecf20Sopenharmony_ci}; 1718c2ecf20Sopenharmony_ci 1728c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value t_power_x_seq6[] = { 1738c2ecf20Sopenharmony_ci {0x00, 0x00}, {0x27, 0x01}, 1748c2ecf20Sopenharmony_ci}; 1758c2ecf20Sopenharmony_ci 1768c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value t_power_x_seq7[] = { 1778c2ecf20Sopenharmony_ci {0x00, 0x00}, {0x10, 0x01}, 1788c2ecf20Sopenharmony_ci}; 1798c2ecf20Sopenharmony_ci 1808c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value set_ts_pin_seq[] = { 1818c2ecf20Sopenharmony_ci {0x50, 0x3f}, {0x52, 0x1f}, 1828c2ecf20Sopenharmony_ci 1838c2ecf20Sopenharmony_ci}; 1848c2ecf20Sopenharmony_ci 1858c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value set_ts_output_seq1[] = { 1868c2ecf20Sopenharmony_ci {0x00, 0x00}, {0x52, 0x00}, 1878c2ecf20Sopenharmony_ci}; 1888c2ecf20Sopenharmony_ci 1898c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value set_ts_output_seq2[] = { 1908c2ecf20Sopenharmony_ci {0x00, 0x00}, {0xc3, 0x00}, 1918c2ecf20Sopenharmony_ci 1928c2ecf20Sopenharmony_ci}; 1938c2ecf20Sopenharmony_ci 1948c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value set_ts_output_seq3[] = { 1958c2ecf20Sopenharmony_ci {0x00, 0x00}, {0xc3, 0x01}, 1968c2ecf20Sopenharmony_ci 1978c2ecf20Sopenharmony_ci}; 1988c2ecf20Sopenharmony_ci 1998c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value set_ts_output_seq4[] = { 2008c2ecf20Sopenharmony_ci {0x00, 0x00}, {0x52, 0x1f}, 2018c2ecf20Sopenharmony_ci 2028c2ecf20Sopenharmony_ci}; 2038c2ecf20Sopenharmony_ci 2048c2ecf20Sopenharmony_cistatic int p_init1(struct cxd2880_tnrdmd *tnr_dmd) 2058c2ecf20Sopenharmony_ci{ 2068c2ecf20Sopenharmony_ci u8 data = 0; 2078c2ecf20Sopenharmony_ci int ret; 2088c2ecf20Sopenharmony_ci 2098c2ecf20Sopenharmony_ci if (!tnr_dmd) 2108c2ecf20Sopenharmony_ci return -EINVAL; 2118c2ecf20Sopenharmony_ci 2128c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 2138c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 2148c2ecf20Sopenharmony_ci 0x00, 0x00); 2158c2ecf20Sopenharmony_ci if (ret) 2168c2ecf20Sopenharmony_ci return ret; 2178c2ecf20Sopenharmony_ci 2188c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SINGLE || 2198c2ecf20Sopenharmony_ci tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) { 2208c2ecf20Sopenharmony_ci switch (tnr_dmd->create_param.ts_output_if) { 2218c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_TSOUT_IF_TS: 2228c2ecf20Sopenharmony_ci data = 0x00; 2238c2ecf20Sopenharmony_ci break; 2248c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_TSOUT_IF_SPI: 2258c2ecf20Sopenharmony_ci data = 0x01; 2268c2ecf20Sopenharmony_ci break; 2278c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_TSOUT_IF_SDIO: 2288c2ecf20Sopenharmony_ci data = 0x02; 2298c2ecf20Sopenharmony_ci break; 2308c2ecf20Sopenharmony_ci default: 2318c2ecf20Sopenharmony_ci return -EINVAL; 2328c2ecf20Sopenharmony_ci } 2338c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 2348c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 2358c2ecf20Sopenharmony_ci 0x10, data); 2368c2ecf20Sopenharmony_ci if (ret) 2378c2ecf20Sopenharmony_ci return ret; 2388c2ecf20Sopenharmony_ci } 2398c2ecf20Sopenharmony_ci 2408c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 2418c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 2428c2ecf20Sopenharmony_ci p_init1_seq, 2438c2ecf20Sopenharmony_ci ARRAY_SIZE(p_init1_seq)); 2448c2ecf20Sopenharmony_ci if (ret) 2458c2ecf20Sopenharmony_ci return ret; 2468c2ecf20Sopenharmony_ci 2478c2ecf20Sopenharmony_ci switch (tnr_dmd->chip_id) { 2488c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CHIP_ID_CXD2880_ES1_0X: 2498c2ecf20Sopenharmony_ci data = 0x1a; 2508c2ecf20Sopenharmony_ci break; 2518c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CHIP_ID_CXD2880_ES1_11: 2528c2ecf20Sopenharmony_ci data = 0x16; 2538c2ecf20Sopenharmony_ci break; 2548c2ecf20Sopenharmony_ci default: 2558c2ecf20Sopenharmony_ci return -ENOTTY; 2568c2ecf20Sopenharmony_ci } 2578c2ecf20Sopenharmony_ci 2588c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 2598c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 2608c2ecf20Sopenharmony_ci 0x10, data); 2618c2ecf20Sopenharmony_ci if (ret) 2628c2ecf20Sopenharmony_ci return ret; 2638c2ecf20Sopenharmony_ci 2648c2ecf20Sopenharmony_ci if (tnr_dmd->create_param.en_internal_ldo) 2658c2ecf20Sopenharmony_ci data = 0x01; 2668c2ecf20Sopenharmony_ci else 2678c2ecf20Sopenharmony_ci data = 0x00; 2688c2ecf20Sopenharmony_ci 2698c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 2708c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 2718c2ecf20Sopenharmony_ci 0x11, data); 2728c2ecf20Sopenharmony_ci if (ret) 2738c2ecf20Sopenharmony_ci return ret; 2748c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 2758c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 2768c2ecf20Sopenharmony_ci 0x13, data); 2778c2ecf20Sopenharmony_ci if (ret) 2788c2ecf20Sopenharmony_ci return ret; 2798c2ecf20Sopenharmony_ci 2808c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 2818c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 2828c2ecf20Sopenharmony_ci 0x00, 0x00); 2838c2ecf20Sopenharmony_ci if (ret) 2848c2ecf20Sopenharmony_ci return ret; 2858c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 2868c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 2878c2ecf20Sopenharmony_ci 0x12, data); 2888c2ecf20Sopenharmony_ci if (ret) 2898c2ecf20Sopenharmony_ci return ret; 2908c2ecf20Sopenharmony_ci 2918c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 2928c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 2938c2ecf20Sopenharmony_ci 0x00, 0x10); 2948c2ecf20Sopenharmony_ci if (ret) 2958c2ecf20Sopenharmony_ci return ret; 2968c2ecf20Sopenharmony_ci 2978c2ecf20Sopenharmony_ci switch (tnr_dmd->chip_id) { 2988c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CHIP_ID_CXD2880_ES1_0X: 2998c2ecf20Sopenharmony_ci data = 0x01; 3008c2ecf20Sopenharmony_ci break; 3018c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CHIP_ID_CXD2880_ES1_11: 3028c2ecf20Sopenharmony_ci data = 0x00; 3038c2ecf20Sopenharmony_ci break; 3048c2ecf20Sopenharmony_ci default: 3058c2ecf20Sopenharmony_ci return -ENOTTY; 3068c2ecf20Sopenharmony_ci } 3078c2ecf20Sopenharmony_ci 3088c2ecf20Sopenharmony_ci return tnr_dmd->io->write_reg(tnr_dmd->io, 3098c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 3108c2ecf20Sopenharmony_ci 0x69, data); 3118c2ecf20Sopenharmony_ci} 3128c2ecf20Sopenharmony_ci 3138c2ecf20Sopenharmony_cistatic int p_init2(struct cxd2880_tnrdmd *tnr_dmd) 3148c2ecf20Sopenharmony_ci{ 3158c2ecf20Sopenharmony_ci u8 data[6] = { 0 }; 3168c2ecf20Sopenharmony_ci int ret; 3178c2ecf20Sopenharmony_ci 3188c2ecf20Sopenharmony_ci if (!tnr_dmd) 3198c2ecf20Sopenharmony_ci return -EINVAL; 3208c2ecf20Sopenharmony_ci 3218c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 3228c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 3238c2ecf20Sopenharmony_ci 0x00, 0x00); 3248c2ecf20Sopenharmony_ci if (ret) 3258c2ecf20Sopenharmony_ci return ret; 3268c2ecf20Sopenharmony_ci data[0] = tnr_dmd->create_param.xosc_cap; 3278c2ecf20Sopenharmony_ci data[1] = tnr_dmd->create_param.xosc_i; 3288c2ecf20Sopenharmony_ci switch (tnr_dmd->create_param.xtal_share_type) { 3298c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_XTAL_SHARE_NONE: 3308c2ecf20Sopenharmony_ci data[2] = 0x01; 3318c2ecf20Sopenharmony_ci data[3] = 0x00; 3328c2ecf20Sopenharmony_ci break; 3338c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_XTAL_SHARE_EXTREF: 3348c2ecf20Sopenharmony_ci data[2] = 0x00; 3358c2ecf20Sopenharmony_ci data[3] = 0x00; 3368c2ecf20Sopenharmony_ci break; 3378c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_XTAL_SHARE_MASTER: 3388c2ecf20Sopenharmony_ci data[2] = 0x01; 3398c2ecf20Sopenharmony_ci data[3] = 0x01; 3408c2ecf20Sopenharmony_ci break; 3418c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_XTAL_SHARE_SLAVE: 3428c2ecf20Sopenharmony_ci data[2] = 0x00; 3438c2ecf20Sopenharmony_ci data[3] = 0x01; 3448c2ecf20Sopenharmony_ci break; 3458c2ecf20Sopenharmony_ci default: 3468c2ecf20Sopenharmony_ci return -EINVAL; 3478c2ecf20Sopenharmony_ci } 3488c2ecf20Sopenharmony_ci data[4] = 0x06; 3498c2ecf20Sopenharmony_ci data[5] = 0x00; 3508c2ecf20Sopenharmony_ci 3518c2ecf20Sopenharmony_ci return tnr_dmd->io->write_regs(tnr_dmd->io, 3528c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 3538c2ecf20Sopenharmony_ci 0x13, data, 6); 3548c2ecf20Sopenharmony_ci} 3558c2ecf20Sopenharmony_ci 3568c2ecf20Sopenharmony_cistatic int p_init3(struct cxd2880_tnrdmd *tnr_dmd) 3578c2ecf20Sopenharmony_ci{ 3588c2ecf20Sopenharmony_ci u8 data[2] = { 0 }; 3598c2ecf20Sopenharmony_ci int ret; 3608c2ecf20Sopenharmony_ci 3618c2ecf20Sopenharmony_ci if (!tnr_dmd) 3628c2ecf20Sopenharmony_ci return -EINVAL; 3638c2ecf20Sopenharmony_ci 3648c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 3658c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 3668c2ecf20Sopenharmony_ci 0x00, 0x00); 3678c2ecf20Sopenharmony_ci if (ret) 3688c2ecf20Sopenharmony_ci return ret; 3698c2ecf20Sopenharmony_ci 3708c2ecf20Sopenharmony_ci switch (tnr_dmd->diver_mode) { 3718c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_DIVERMODE_SINGLE: 3728c2ecf20Sopenharmony_ci data[0] = 0x00; 3738c2ecf20Sopenharmony_ci break; 3748c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_DIVERMODE_MAIN: 3758c2ecf20Sopenharmony_ci data[0] = 0x03; 3768c2ecf20Sopenharmony_ci break; 3778c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_DIVERMODE_SUB: 3788c2ecf20Sopenharmony_ci data[0] = 0x02; 3798c2ecf20Sopenharmony_ci break; 3808c2ecf20Sopenharmony_ci default: 3818c2ecf20Sopenharmony_ci return -EINVAL; 3828c2ecf20Sopenharmony_ci } 3838c2ecf20Sopenharmony_ci 3848c2ecf20Sopenharmony_ci data[1] = 0x01; 3858c2ecf20Sopenharmony_ci 3868c2ecf20Sopenharmony_ci return tnr_dmd->io->write_regs(tnr_dmd->io, 3878c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 3888c2ecf20Sopenharmony_ci 0x1f, data, 2); 3898c2ecf20Sopenharmony_ci} 3908c2ecf20Sopenharmony_ci 3918c2ecf20Sopenharmony_cistatic int rf_init1(struct cxd2880_tnrdmd *tnr_dmd) 3928c2ecf20Sopenharmony_ci{ 3938c2ecf20Sopenharmony_ci u8 data[8] = { 0 }; 3948c2ecf20Sopenharmony_ci static const u8 rf_init1_cdata1[40] = { 3958c2ecf20Sopenharmony_ci 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 3968c2ecf20Sopenharmony_ci 0x05, 0x05, 0x04, 0x04, 0x04, 0x03, 0x03, 3978c2ecf20Sopenharmony_ci 0x03, 0x04, 0x04, 0x05, 0x05, 0x05, 0x02, 3988c2ecf20Sopenharmony_ci 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 3998c2ecf20Sopenharmony_ci 0x02, 0x03, 0x02, 0x01, 0x01, 0x01, 0x02, 4008c2ecf20Sopenharmony_ci 0x02, 0x03, 0x04, 0x04, 0x04 4018c2ecf20Sopenharmony_ci }; 4028c2ecf20Sopenharmony_ci 4038c2ecf20Sopenharmony_ci static const u8 rf_init1_cdata2[5] = {0xff, 0x00, 0x00, 0x00, 0x00}; 4048c2ecf20Sopenharmony_ci static const u8 rf_init1_cdata3[80] = { 4058c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 4068c2ecf20Sopenharmony_ci 0x01, 0x00, 0x02, 0x00, 0x63, 0x00, 0x00, 4078c2ecf20Sopenharmony_ci 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 4088c2ecf20Sopenharmony_ci 0x06, 0x00, 0x06, 0x00, 0x08, 0x00, 0x09, 4098c2ecf20Sopenharmony_ci 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0d, 0x00, 4108c2ecf20Sopenharmony_ci 0x0d, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 4118c2ecf20Sopenharmony_ci 0x00, 0x10, 0x00, 0x79, 0x00, 0x00, 0x00, 4128c2ecf20Sopenharmony_ci 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 4138c2ecf20Sopenharmony_ci 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 4148c2ecf20Sopenharmony_ci 0x04, 0x00, 0x04, 0x00, 0x06, 0x00, 0x05, 4158c2ecf20Sopenharmony_ci 0x00, 0x07, 0x00, 0x07, 0x00, 0x08, 0x00, 4168c2ecf20Sopenharmony_ci 0x0a, 0x03, 0xe0 4178c2ecf20Sopenharmony_ci }; 4188c2ecf20Sopenharmony_ci 4198c2ecf20Sopenharmony_ci static const u8 rf_init1_cdata4[8] = { 4208c2ecf20Sopenharmony_ci 0x20, 0x20, 0x30, 0x41, 0x50, 0x5f, 0x6f, 0x80 4218c2ecf20Sopenharmony_ci }; 4228c2ecf20Sopenharmony_ci 4238c2ecf20Sopenharmony_ci static const u8 rf_init1_cdata5[50] = { 4248c2ecf20Sopenharmony_ci 0x00, 0x09, 0x00, 0x08, 0x00, 0x07, 0x00, 4258c2ecf20Sopenharmony_ci 0x06, 0x00, 0x05, 0x00, 0x03, 0x00, 0x02, 4268c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 4278c2ecf20Sopenharmony_ci 0x06, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0c, 4288c2ecf20Sopenharmony_ci 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0f, 0x00, 4298c2ecf20Sopenharmony_ci 0x0e, 0x00, 0x0e, 0x00, 0x10, 0x00, 0x0f, 4308c2ecf20Sopenharmony_ci 0x00, 0x0e, 0x00, 0x10, 0x00, 0x0f, 0x00, 4318c2ecf20Sopenharmony_ci 0x0e 4328c2ecf20Sopenharmony_ci }; 4338c2ecf20Sopenharmony_ci 4348c2ecf20Sopenharmony_ci u8 addr = 0; 4358c2ecf20Sopenharmony_ci int ret; 4368c2ecf20Sopenharmony_ci 4378c2ecf20Sopenharmony_ci if (!tnr_dmd) 4388c2ecf20Sopenharmony_ci return -EINVAL; 4398c2ecf20Sopenharmony_ci 4408c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 4418c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 4428c2ecf20Sopenharmony_ci 0x00, 0x00); 4438c2ecf20Sopenharmony_ci if (ret) 4448c2ecf20Sopenharmony_ci return ret; 4458c2ecf20Sopenharmony_ci data[0] = 0x01; 4468c2ecf20Sopenharmony_ci data[1] = 0x00; 4478c2ecf20Sopenharmony_ci data[2] = 0x01; 4488c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 4498c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 4508c2ecf20Sopenharmony_ci 0x21, data, 3); 4518c2ecf20Sopenharmony_ci if (ret) 4528c2ecf20Sopenharmony_ci return ret; 4538c2ecf20Sopenharmony_ci 4548c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 4558c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 4568c2ecf20Sopenharmony_ci 0x00, 0x10); 4578c2ecf20Sopenharmony_ci if (ret) 4588c2ecf20Sopenharmony_ci return ret; 4598c2ecf20Sopenharmony_ci data[0] = 0x01; 4608c2ecf20Sopenharmony_ci data[1] = 0x01; 4618c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 4628c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 4638c2ecf20Sopenharmony_ci 0x17, data, 2); 4648c2ecf20Sopenharmony_ci if (ret) 4658c2ecf20Sopenharmony_ci return ret; 4668c2ecf20Sopenharmony_ci 4678c2ecf20Sopenharmony_ci if (tnr_dmd->create_param.stationary_use) { 4688c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 4698c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 4708c2ecf20Sopenharmony_ci 0x1a, 0x06); 4718c2ecf20Sopenharmony_ci if (ret) 4728c2ecf20Sopenharmony_ci return ret; 4738c2ecf20Sopenharmony_ci } 4748c2ecf20Sopenharmony_ci 4758c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 4768c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 4778c2ecf20Sopenharmony_ci rf_init1_seq1, 4788c2ecf20Sopenharmony_ci ARRAY_SIZE(rf_init1_seq1)); 4798c2ecf20Sopenharmony_ci if (ret) 4808c2ecf20Sopenharmony_ci return ret; 4818c2ecf20Sopenharmony_ci 4828c2ecf20Sopenharmony_ci data[0] = 0x00; 4838c2ecf20Sopenharmony_ci if (tnr_dmd->create_param.is_cxd2881gg && 4848c2ecf20Sopenharmony_ci tnr_dmd->create_param.xtal_share_type == 4858c2ecf20Sopenharmony_ci CXD2880_TNRDMD_XTAL_SHARE_SLAVE) 4868c2ecf20Sopenharmony_ci data[1] = 0x00; 4878c2ecf20Sopenharmony_ci else 4888c2ecf20Sopenharmony_ci data[1] = 0x1f; 4898c2ecf20Sopenharmony_ci data[2] = 0x0a; 4908c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 4918c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 4928c2ecf20Sopenharmony_ci 0xb5, data, 3); 4938c2ecf20Sopenharmony_ci if (ret) 4948c2ecf20Sopenharmony_ci return ret; 4958c2ecf20Sopenharmony_ci 4968c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 4978c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 4988c2ecf20Sopenharmony_ci rf_init1_seq2, 4998c2ecf20Sopenharmony_ci ARRAY_SIZE(rf_init1_seq2)); 5008c2ecf20Sopenharmony_ci if (ret) 5018c2ecf20Sopenharmony_ci return ret; 5028c2ecf20Sopenharmony_ci 5038c2ecf20Sopenharmony_ci if (tnr_dmd->chip_id == CXD2880_TNRDMD_CHIP_ID_CXD2880_ES1_0X) { 5048c2ecf20Sopenharmony_ci data[0] = 0x34; 5058c2ecf20Sopenharmony_ci data[1] = 0x2c; 5068c2ecf20Sopenharmony_ci } else { 5078c2ecf20Sopenharmony_ci data[0] = 0x2f; 5088c2ecf20Sopenharmony_ci data[1] = 0x25; 5098c2ecf20Sopenharmony_ci } 5108c2ecf20Sopenharmony_ci data[2] = 0x15; 5118c2ecf20Sopenharmony_ci data[3] = 0x19; 5128c2ecf20Sopenharmony_ci data[4] = 0x1b; 5138c2ecf20Sopenharmony_ci data[5] = 0x15; 5148c2ecf20Sopenharmony_ci data[6] = 0x19; 5158c2ecf20Sopenharmony_ci data[7] = 0x1b; 5168c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 5178c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 5188c2ecf20Sopenharmony_ci 0xd9, data, 8); 5198c2ecf20Sopenharmony_ci if (ret) 5208c2ecf20Sopenharmony_ci return ret; 5218c2ecf20Sopenharmony_ci 5228c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 5238c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 5248c2ecf20Sopenharmony_ci 0x00, 0x11); 5258c2ecf20Sopenharmony_ci if (ret) 5268c2ecf20Sopenharmony_ci return ret; 5278c2ecf20Sopenharmony_ci data[0] = 0x6c; 5288c2ecf20Sopenharmony_ci data[1] = 0x10; 5298c2ecf20Sopenharmony_ci data[2] = 0xa6; 5308c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 5318c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 5328c2ecf20Sopenharmony_ci 0x44, data, 3); 5338c2ecf20Sopenharmony_ci if (ret) 5348c2ecf20Sopenharmony_ci return ret; 5358c2ecf20Sopenharmony_ci data[0] = 0x16; 5368c2ecf20Sopenharmony_ci data[1] = 0xa8; 5378c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 5388c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 5398c2ecf20Sopenharmony_ci 0x50, data, 2); 5408c2ecf20Sopenharmony_ci if (ret) 5418c2ecf20Sopenharmony_ci return ret; 5428c2ecf20Sopenharmony_ci data[0] = 0x00; 5438c2ecf20Sopenharmony_ci data[1] = 0x22; 5448c2ecf20Sopenharmony_ci data[2] = 0x00; 5458c2ecf20Sopenharmony_ci data[3] = 0x88; 5468c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 5478c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 5488c2ecf20Sopenharmony_ci 0x62, data, 4); 5498c2ecf20Sopenharmony_ci if (ret) 5508c2ecf20Sopenharmony_ci return ret; 5518c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 5528c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 5538c2ecf20Sopenharmony_ci 0x74, 0x75); 5548c2ecf20Sopenharmony_ci if (ret) 5558c2ecf20Sopenharmony_ci return ret; 5568c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 5578c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 5588c2ecf20Sopenharmony_ci 0x7f, rf_init1_cdata1, 40); 5598c2ecf20Sopenharmony_ci if (ret) 5608c2ecf20Sopenharmony_ci return ret; 5618c2ecf20Sopenharmony_ci 5628c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 5638c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 5648c2ecf20Sopenharmony_ci 0x00, 0x16); 5658c2ecf20Sopenharmony_ci if (ret) 5668c2ecf20Sopenharmony_ci return ret; 5678c2ecf20Sopenharmony_ci data[0] = 0x00; 5688c2ecf20Sopenharmony_ci data[1] = 0x71; 5698c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 5708c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 5718c2ecf20Sopenharmony_ci 0x10, data, 2); 5728c2ecf20Sopenharmony_ci if (ret) 5738c2ecf20Sopenharmony_ci return ret; 5748c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 5758c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 5768c2ecf20Sopenharmony_ci 0x23, 0x89); 5778c2ecf20Sopenharmony_ci if (ret) 5788c2ecf20Sopenharmony_ci return ret; 5798c2ecf20Sopenharmony_ci 5808c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 5818c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 5828c2ecf20Sopenharmony_ci 0x27, rf_init1_cdata2, 5); 5838c2ecf20Sopenharmony_ci if (ret) 5848c2ecf20Sopenharmony_ci return ret; 5858c2ecf20Sopenharmony_ci 5868c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 5878c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 5888c2ecf20Sopenharmony_ci 0x3a, rf_init1_cdata3, 80); 5898c2ecf20Sopenharmony_ci if (ret) 5908c2ecf20Sopenharmony_ci return ret; 5918c2ecf20Sopenharmony_ci 5928c2ecf20Sopenharmony_ci data[0] = 0x03; 5938c2ecf20Sopenharmony_ci data[1] = 0xe0; 5948c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 5958c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 5968c2ecf20Sopenharmony_ci 0xbc, data, 2); 5978c2ecf20Sopenharmony_ci if (ret) 5988c2ecf20Sopenharmony_ci return ret; 5998c2ecf20Sopenharmony_ci 6008c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 6018c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 6028c2ecf20Sopenharmony_ci rf_init1_seq3, 6038c2ecf20Sopenharmony_ci ARRAY_SIZE(rf_init1_seq3)); 6048c2ecf20Sopenharmony_ci if (ret) 6058c2ecf20Sopenharmony_ci return ret; 6068c2ecf20Sopenharmony_ci 6078c2ecf20Sopenharmony_ci if (tnr_dmd->create_param.stationary_use) { 6088c2ecf20Sopenharmony_ci data[0] = 0x06; 6098c2ecf20Sopenharmony_ci data[1] = 0x07; 6108c2ecf20Sopenharmony_ci data[2] = 0x1a; 6118c2ecf20Sopenharmony_ci } else { 6128c2ecf20Sopenharmony_ci data[0] = 0x00; 6138c2ecf20Sopenharmony_ci data[1] = 0x08; 6148c2ecf20Sopenharmony_ci data[2] = 0x19; 6158c2ecf20Sopenharmony_ci } 6168c2ecf20Sopenharmony_ci data[3] = 0x0e; 6178c2ecf20Sopenharmony_ci data[4] = 0x09; 6188c2ecf20Sopenharmony_ci data[5] = 0x0e; 6198c2ecf20Sopenharmony_ci 6208c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 6218c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 6228c2ecf20Sopenharmony_ci 0x00, 0x12); 6238c2ecf20Sopenharmony_ci if (ret) 6248c2ecf20Sopenharmony_ci return ret; 6258c2ecf20Sopenharmony_ci for (addr = 0x10; addr < 0x9f; addr += 6) { 6268c2ecf20Sopenharmony_ci if (tnr_dmd->lna_thrs_tbl_air) { 6278c2ecf20Sopenharmony_ci u8 idx = 0; 6288c2ecf20Sopenharmony_ci 6298c2ecf20Sopenharmony_ci idx = (addr - 0x10) / 6; 6308c2ecf20Sopenharmony_ci data[0] = 6318c2ecf20Sopenharmony_ci tnr_dmd->lna_thrs_tbl_air->thrs[idx].off_on; 6328c2ecf20Sopenharmony_ci data[1] = 6338c2ecf20Sopenharmony_ci tnr_dmd->lna_thrs_tbl_air->thrs[idx].on_off; 6348c2ecf20Sopenharmony_ci } 6358c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 6368c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 6378c2ecf20Sopenharmony_ci addr, data, 6); 6388c2ecf20Sopenharmony_ci if (ret) 6398c2ecf20Sopenharmony_ci return ret; 6408c2ecf20Sopenharmony_ci } 6418c2ecf20Sopenharmony_ci 6428c2ecf20Sopenharmony_ci data[0] = 0x00; 6438c2ecf20Sopenharmony_ci data[1] = 0x08; 6448c2ecf20Sopenharmony_ci if (tnr_dmd->create_param.stationary_use) 6458c2ecf20Sopenharmony_ci data[2] = 0x1a; 6468c2ecf20Sopenharmony_ci else 6478c2ecf20Sopenharmony_ci data[2] = 0x19; 6488c2ecf20Sopenharmony_ci data[3] = 0x0e; 6498c2ecf20Sopenharmony_ci data[4] = 0x09; 6508c2ecf20Sopenharmony_ci data[5] = 0x0e; 6518c2ecf20Sopenharmony_ci 6528c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 6538c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 6548c2ecf20Sopenharmony_ci 0x00, 0x13); 6558c2ecf20Sopenharmony_ci if (ret) 6568c2ecf20Sopenharmony_ci return ret; 6578c2ecf20Sopenharmony_ci for (addr = 0x10; addr < 0xcf; addr += 6) { 6588c2ecf20Sopenharmony_ci if (tnr_dmd->lna_thrs_tbl_cable) { 6598c2ecf20Sopenharmony_ci u8 idx = 0; 6608c2ecf20Sopenharmony_ci 6618c2ecf20Sopenharmony_ci idx = (addr - 0x10) / 6; 6628c2ecf20Sopenharmony_ci data[0] = 6638c2ecf20Sopenharmony_ci tnr_dmd->lna_thrs_tbl_cable->thrs[idx].off_on; 6648c2ecf20Sopenharmony_ci data[1] = 6658c2ecf20Sopenharmony_ci tnr_dmd->lna_thrs_tbl_cable->thrs[idx].on_off; 6668c2ecf20Sopenharmony_ci } 6678c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 6688c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 6698c2ecf20Sopenharmony_ci addr, data, 6); 6708c2ecf20Sopenharmony_ci if (ret) 6718c2ecf20Sopenharmony_ci return ret; 6728c2ecf20Sopenharmony_ci } 6738c2ecf20Sopenharmony_ci 6748c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 6758c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 6768c2ecf20Sopenharmony_ci 0x00, 0x11); 6778c2ecf20Sopenharmony_ci if (ret) 6788c2ecf20Sopenharmony_ci return ret; 6798c2ecf20Sopenharmony_ci data[0] = 0x08; 6808c2ecf20Sopenharmony_ci data[1] = 0x09; 6818c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 6828c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 6838c2ecf20Sopenharmony_ci 0xbd, data, 2); 6848c2ecf20Sopenharmony_ci if (ret) 6858c2ecf20Sopenharmony_ci return ret; 6868c2ecf20Sopenharmony_ci data[0] = 0x08; 6878c2ecf20Sopenharmony_ci data[1] = 0x09; 6888c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 6898c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 6908c2ecf20Sopenharmony_ci 0xc4, data, 2); 6918c2ecf20Sopenharmony_ci if (ret) 6928c2ecf20Sopenharmony_ci return ret; 6938c2ecf20Sopenharmony_ci 6948c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 6958c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 6968c2ecf20Sopenharmony_ci 0xc9, rf_init1_cdata4, 8); 6978c2ecf20Sopenharmony_ci if (ret) 6988c2ecf20Sopenharmony_ci return ret; 6998c2ecf20Sopenharmony_ci 7008c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 7018c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 7028c2ecf20Sopenharmony_ci 0x00, 0x14); 7038c2ecf20Sopenharmony_ci if (ret) 7048c2ecf20Sopenharmony_ci return ret; 7058c2ecf20Sopenharmony_ci data[0] = 0x15; 7068c2ecf20Sopenharmony_ci data[1] = 0x18; 7078c2ecf20Sopenharmony_ci data[2] = 0x00; 7088c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 7098c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 7108c2ecf20Sopenharmony_ci 0x10, data, 3); 7118c2ecf20Sopenharmony_ci if (ret) 7128c2ecf20Sopenharmony_ci return ret; 7138c2ecf20Sopenharmony_ci 7148c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 7158c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 7168c2ecf20Sopenharmony_ci rf_init1_seq4, 7178c2ecf20Sopenharmony_ci ARRAY_SIZE(rf_init1_seq4)); 7188c2ecf20Sopenharmony_ci if (ret) 7198c2ecf20Sopenharmony_ci return ret; 7208c2ecf20Sopenharmony_ci 7218c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 7228c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 7238c2ecf20Sopenharmony_ci 0x12, rf_init1_cdata5, 50); 7248c2ecf20Sopenharmony_ci if (ret) 7258c2ecf20Sopenharmony_ci return ret; 7268c2ecf20Sopenharmony_ci 7278c2ecf20Sopenharmony_ci usleep_range(1000, 2000); 7288c2ecf20Sopenharmony_ci 7298c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 7308c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 7318c2ecf20Sopenharmony_ci 0x00, 0x0a); 7328c2ecf20Sopenharmony_ci if (ret) 7338c2ecf20Sopenharmony_ci return ret; 7348c2ecf20Sopenharmony_ci ret = tnr_dmd->io->read_regs(tnr_dmd->io, 7358c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 7368c2ecf20Sopenharmony_ci 0x10, data, 1); 7378c2ecf20Sopenharmony_ci if (ret) 7388c2ecf20Sopenharmony_ci return ret; 7398c2ecf20Sopenharmony_ci if ((data[0] & 0x01) == 0x00) 7408c2ecf20Sopenharmony_ci return -EINVAL; 7418c2ecf20Sopenharmony_ci 7428c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 7438c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 7448c2ecf20Sopenharmony_ci rf_init1_seq5, 7458c2ecf20Sopenharmony_ci ARRAY_SIZE(rf_init1_seq5)); 7468c2ecf20Sopenharmony_ci if (ret) 7478c2ecf20Sopenharmony_ci return ret; 7488c2ecf20Sopenharmony_ci 7498c2ecf20Sopenharmony_ci usleep_range(1000, 2000); 7508c2ecf20Sopenharmony_ci 7518c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 7528c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 7538c2ecf20Sopenharmony_ci 0x00, 0x0a); 7548c2ecf20Sopenharmony_ci if (ret) 7558c2ecf20Sopenharmony_ci return ret; 7568c2ecf20Sopenharmony_ci ret = tnr_dmd->io->read_regs(tnr_dmd->io, 7578c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 7588c2ecf20Sopenharmony_ci 0x11, data, 1); 7598c2ecf20Sopenharmony_ci if (ret) 7608c2ecf20Sopenharmony_ci return ret; 7618c2ecf20Sopenharmony_ci if ((data[0] & 0x01) == 0x00) 7628c2ecf20Sopenharmony_ci return -EINVAL; 7638c2ecf20Sopenharmony_ci 7648c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 7658c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 7668c2ecf20Sopenharmony_ci rf_init1_seq6, 7678c2ecf20Sopenharmony_ci ARRAY_SIZE(rf_init1_seq6)); 7688c2ecf20Sopenharmony_ci if (ret) 7698c2ecf20Sopenharmony_ci return ret; 7708c2ecf20Sopenharmony_ci 7718c2ecf20Sopenharmony_ci data[0] = 0x00; 7728c2ecf20Sopenharmony_ci data[1] = 0xfe; 7738c2ecf20Sopenharmony_ci data[2] = 0xee; 7748c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 7758c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 7768c2ecf20Sopenharmony_ci 0x6e, data, 3); 7778c2ecf20Sopenharmony_ci if (ret) 7788c2ecf20Sopenharmony_ci return ret; 7798c2ecf20Sopenharmony_ci data[0] = 0xa1; 7808c2ecf20Sopenharmony_ci data[1] = 0x8b; 7818c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 7828c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 7838c2ecf20Sopenharmony_ci 0x8d, data, 2); 7848c2ecf20Sopenharmony_ci if (ret) 7858c2ecf20Sopenharmony_ci return ret; 7868c2ecf20Sopenharmony_ci data[0] = 0x08; 7878c2ecf20Sopenharmony_ci data[1] = 0x09; 7888c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 7898c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 7908c2ecf20Sopenharmony_ci 0x77, data, 2); 7918c2ecf20Sopenharmony_ci if (ret) 7928c2ecf20Sopenharmony_ci return ret; 7938c2ecf20Sopenharmony_ci 7948c2ecf20Sopenharmony_ci if (tnr_dmd->create_param.stationary_use) { 7958c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 7968c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 7978c2ecf20Sopenharmony_ci 0x80, 0xaa); 7988c2ecf20Sopenharmony_ci if (ret) 7998c2ecf20Sopenharmony_ci return ret; 8008c2ecf20Sopenharmony_ci } 8018c2ecf20Sopenharmony_ci 8028c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 8038c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 8048c2ecf20Sopenharmony_ci rf_init1_seq7, 8058c2ecf20Sopenharmony_ci ARRAY_SIZE(rf_init1_seq7)); 8068c2ecf20Sopenharmony_ci if (ret) 8078c2ecf20Sopenharmony_ci return ret; 8088c2ecf20Sopenharmony_ci 8098c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 8108c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 8118c2ecf20Sopenharmony_ci rf_init1_seq8, 8128c2ecf20Sopenharmony_ci ARRAY_SIZE(rf_init1_seq8)); 8138c2ecf20Sopenharmony_ci if (ret) 8148c2ecf20Sopenharmony_ci return ret; 8158c2ecf20Sopenharmony_ci 8168c2ecf20Sopenharmony_ci usleep_range(1000, 2000); 8178c2ecf20Sopenharmony_ci 8188c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 8198c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 8208c2ecf20Sopenharmony_ci 0x00, 0x1a); 8218c2ecf20Sopenharmony_ci if (ret) 8228c2ecf20Sopenharmony_ci return ret; 8238c2ecf20Sopenharmony_ci ret = tnr_dmd->io->read_regs(tnr_dmd->io, 8248c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 8258c2ecf20Sopenharmony_ci 0x10, data, 1); 8268c2ecf20Sopenharmony_ci if (ret) 8278c2ecf20Sopenharmony_ci return ret; 8288c2ecf20Sopenharmony_ci if ((data[0] & 0x01) == 0x00) 8298c2ecf20Sopenharmony_ci return -EINVAL; 8308c2ecf20Sopenharmony_ci 8318c2ecf20Sopenharmony_ci return cxd2880_io_write_multi_regs(tnr_dmd->io, 8328c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 8338c2ecf20Sopenharmony_ci rf_init1_seq9, 8348c2ecf20Sopenharmony_ci ARRAY_SIZE(rf_init1_seq9)); 8358c2ecf20Sopenharmony_ci} 8368c2ecf20Sopenharmony_ci 8378c2ecf20Sopenharmony_cistatic int rf_init2(struct cxd2880_tnrdmd *tnr_dmd) 8388c2ecf20Sopenharmony_ci{ 8398c2ecf20Sopenharmony_ci u8 data[5] = { 0 }; 8408c2ecf20Sopenharmony_ci int ret; 8418c2ecf20Sopenharmony_ci 8428c2ecf20Sopenharmony_ci if (!tnr_dmd) 8438c2ecf20Sopenharmony_ci return -EINVAL; 8448c2ecf20Sopenharmony_ci 8458c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 8468c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 8478c2ecf20Sopenharmony_ci 0x00, 0x10); 8488c2ecf20Sopenharmony_ci if (ret) 8498c2ecf20Sopenharmony_ci return ret; 8508c2ecf20Sopenharmony_ci data[0] = 0x40; 8518c2ecf20Sopenharmony_ci data[1] = 0x40; 8528c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 8538c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 8548c2ecf20Sopenharmony_ci 0xea, data, 2); 8558c2ecf20Sopenharmony_ci if (ret) 8568c2ecf20Sopenharmony_ci return ret; 8578c2ecf20Sopenharmony_ci 8588c2ecf20Sopenharmony_ci usleep_range(1000, 2000); 8598c2ecf20Sopenharmony_ci 8608c2ecf20Sopenharmony_ci data[0] = 0x00; 8618c2ecf20Sopenharmony_ci if (tnr_dmd->chip_id == CXD2880_TNRDMD_CHIP_ID_CXD2880_ES1_0X) 8628c2ecf20Sopenharmony_ci data[1] = 0x00; 8638c2ecf20Sopenharmony_ci else 8648c2ecf20Sopenharmony_ci data[1] = 0x01; 8658c2ecf20Sopenharmony_ci data[2] = 0x01; 8668c2ecf20Sopenharmony_ci data[3] = 0x03; 8678c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 8688c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 8698c2ecf20Sopenharmony_ci 0x30, data, 4); 8708c2ecf20Sopenharmony_ci if (ret) 8718c2ecf20Sopenharmony_ci return ret; 8728c2ecf20Sopenharmony_ci 8738c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 8748c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 8758c2ecf20Sopenharmony_ci rf_init2_seq1, 8768c2ecf20Sopenharmony_ci ARRAY_SIZE(rf_init2_seq1)); 8778c2ecf20Sopenharmony_ci if (ret) 8788c2ecf20Sopenharmony_ci return ret; 8798c2ecf20Sopenharmony_ci 8808c2ecf20Sopenharmony_ci return cxd2880_io_write_multi_regs(tnr_dmd->io, 8818c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 8828c2ecf20Sopenharmony_ci rf_init2_seq2, 8838c2ecf20Sopenharmony_ci ARRAY_SIZE(rf_init2_seq2)); 8848c2ecf20Sopenharmony_ci} 8858c2ecf20Sopenharmony_ci 8868c2ecf20Sopenharmony_cistatic int x_tune1(struct cxd2880_tnrdmd *tnr_dmd, 8878c2ecf20Sopenharmony_ci enum cxd2880_dtv_sys sys, u32 freq_khz, 8888c2ecf20Sopenharmony_ci enum cxd2880_dtv_bandwidth bandwidth, 8898c2ecf20Sopenharmony_ci u8 is_cable, int shift_frequency_khz) 8908c2ecf20Sopenharmony_ci{ 8918c2ecf20Sopenharmony_ci u8 data[11] = { 0 }; 8928c2ecf20Sopenharmony_ci int ret; 8938c2ecf20Sopenharmony_ci 8948c2ecf20Sopenharmony_ci if (!tnr_dmd) 8958c2ecf20Sopenharmony_ci return -EINVAL; 8968c2ecf20Sopenharmony_ci 8978c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 8988c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 8998c2ecf20Sopenharmony_ci x_tune1_seq1, 9008c2ecf20Sopenharmony_ci ARRAY_SIZE(x_tune1_seq1)); 9018c2ecf20Sopenharmony_ci if (ret) 9028c2ecf20Sopenharmony_ci return ret; 9038c2ecf20Sopenharmony_ci 9048c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 9058c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 9068c2ecf20Sopenharmony_ci 0x00, 0x10); 9078c2ecf20Sopenharmony_ci if (ret) 9088c2ecf20Sopenharmony_ci return ret; 9098c2ecf20Sopenharmony_ci 9108c2ecf20Sopenharmony_ci data[2] = 0x0e; 9118c2ecf20Sopenharmony_ci data[4] = 0x03; 9128c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 9138c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 9148c2ecf20Sopenharmony_ci 0xe7, data, 5); 9158c2ecf20Sopenharmony_ci if (ret) 9168c2ecf20Sopenharmony_ci return ret; 9178c2ecf20Sopenharmony_ci 9188c2ecf20Sopenharmony_ci data[0] = 0x1f; 9198c2ecf20Sopenharmony_ci data[1] = 0x80; 9208c2ecf20Sopenharmony_ci data[2] = 0x18; 9218c2ecf20Sopenharmony_ci data[3] = 0x00; 9228c2ecf20Sopenharmony_ci data[4] = 0x07; 9238c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 9248c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 9258c2ecf20Sopenharmony_ci 0xe7, data, 5); 9268c2ecf20Sopenharmony_ci if (ret) 9278c2ecf20Sopenharmony_ci return ret; 9288c2ecf20Sopenharmony_ci 9298c2ecf20Sopenharmony_ci usleep_range(1000, 2000); 9308c2ecf20Sopenharmony_ci 9318c2ecf20Sopenharmony_ci data[0] = 0x72; 9328c2ecf20Sopenharmony_ci data[1] = 0x81; 9338c2ecf20Sopenharmony_ci data[3] = 0x1d; 9348c2ecf20Sopenharmony_ci data[4] = 0x6f; 9358c2ecf20Sopenharmony_ci data[5] = 0x7e; 9368c2ecf20Sopenharmony_ci data[7] = 0x1c; 9378c2ecf20Sopenharmony_ci switch (sys) { 9388c2ecf20Sopenharmony_ci case CXD2880_DTV_SYS_DVBT: 9398c2ecf20Sopenharmony_ci data[2] = 0x94; 9408c2ecf20Sopenharmony_ci data[6] = 0x91; 9418c2ecf20Sopenharmony_ci break; 9428c2ecf20Sopenharmony_ci case CXD2880_DTV_SYS_DVBT2: 9438c2ecf20Sopenharmony_ci data[2] = 0x96; 9448c2ecf20Sopenharmony_ci data[6] = 0x93; 9458c2ecf20Sopenharmony_ci break; 9468c2ecf20Sopenharmony_ci default: 9478c2ecf20Sopenharmony_ci return -EINVAL; 9488c2ecf20Sopenharmony_ci } 9498c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 9508c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 9518c2ecf20Sopenharmony_ci 0x44, data, 8); 9528c2ecf20Sopenharmony_ci if (ret) 9538c2ecf20Sopenharmony_ci return ret; 9548c2ecf20Sopenharmony_ci 9558c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 9568c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 9578c2ecf20Sopenharmony_ci x_tune1_seq2, 9588c2ecf20Sopenharmony_ci ARRAY_SIZE(x_tune1_seq2)); 9598c2ecf20Sopenharmony_ci if (ret) 9608c2ecf20Sopenharmony_ci return ret; 9618c2ecf20Sopenharmony_ci 9628c2ecf20Sopenharmony_ci data[0] = 0x03; 9638c2ecf20Sopenharmony_ci data[1] = 0xe2; 9648c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 9658c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 9668c2ecf20Sopenharmony_ci 0x1e, data, 2); 9678c2ecf20Sopenharmony_ci if (ret) 9688c2ecf20Sopenharmony_ci return ret; 9698c2ecf20Sopenharmony_ci 9708c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 9718c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 9728c2ecf20Sopenharmony_ci 0x00, 0x10); 9738c2ecf20Sopenharmony_ci if (ret) 9748c2ecf20Sopenharmony_ci return ret; 9758c2ecf20Sopenharmony_ci 9768c2ecf20Sopenharmony_ci data[0] = is_cable ? 0x01 : 0x00; 9778c2ecf20Sopenharmony_ci data[1] = 0x00; 9788c2ecf20Sopenharmony_ci data[2] = 0x6b; 9798c2ecf20Sopenharmony_ci data[3] = 0x4d; 9808c2ecf20Sopenharmony_ci 9818c2ecf20Sopenharmony_ci switch (bandwidth) { 9828c2ecf20Sopenharmony_ci case CXD2880_DTV_BW_1_7_MHZ: 9838c2ecf20Sopenharmony_ci data[4] = 0x03; 9848c2ecf20Sopenharmony_ci break; 9858c2ecf20Sopenharmony_ci case CXD2880_DTV_BW_5_MHZ: 9868c2ecf20Sopenharmony_ci case CXD2880_DTV_BW_6_MHZ: 9878c2ecf20Sopenharmony_ci data[4] = 0x00; 9888c2ecf20Sopenharmony_ci break; 9898c2ecf20Sopenharmony_ci case CXD2880_DTV_BW_7_MHZ: 9908c2ecf20Sopenharmony_ci data[4] = 0x01; 9918c2ecf20Sopenharmony_ci break; 9928c2ecf20Sopenharmony_ci case CXD2880_DTV_BW_8_MHZ: 9938c2ecf20Sopenharmony_ci data[4] = 0x02; 9948c2ecf20Sopenharmony_ci break; 9958c2ecf20Sopenharmony_ci default: 9968c2ecf20Sopenharmony_ci return -EINVAL; 9978c2ecf20Sopenharmony_ci } 9988c2ecf20Sopenharmony_ci 9998c2ecf20Sopenharmony_ci data[5] = 0x00; 10008c2ecf20Sopenharmony_ci 10018c2ecf20Sopenharmony_ci freq_khz += shift_frequency_khz; 10028c2ecf20Sopenharmony_ci 10038c2ecf20Sopenharmony_ci data[6] = (freq_khz >> 16) & 0x0f; 10048c2ecf20Sopenharmony_ci data[7] = (freq_khz >> 8) & 0xff; 10058c2ecf20Sopenharmony_ci data[8] = freq_khz & 0xff; 10068c2ecf20Sopenharmony_ci data[9] = 0xff; 10078c2ecf20Sopenharmony_ci data[10] = 0xfe; 10088c2ecf20Sopenharmony_ci 10098c2ecf20Sopenharmony_ci return tnr_dmd->io->write_regs(tnr_dmd->io, 10108c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 10118c2ecf20Sopenharmony_ci 0x52, data, 11); 10128c2ecf20Sopenharmony_ci} 10138c2ecf20Sopenharmony_ci 10148c2ecf20Sopenharmony_cistatic int x_tune2(struct cxd2880_tnrdmd *tnr_dmd, 10158c2ecf20Sopenharmony_ci enum cxd2880_dtv_bandwidth bandwidth, 10168c2ecf20Sopenharmony_ci enum cxd2880_tnrdmd_clockmode clk_mode, 10178c2ecf20Sopenharmony_ci int shift_frequency_khz) 10188c2ecf20Sopenharmony_ci{ 10198c2ecf20Sopenharmony_ci u8 data[3] = { 0 }; 10208c2ecf20Sopenharmony_ci int ret; 10218c2ecf20Sopenharmony_ci 10228c2ecf20Sopenharmony_ci if (!tnr_dmd) 10238c2ecf20Sopenharmony_ci return -EINVAL; 10248c2ecf20Sopenharmony_ci 10258c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 10268c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 10278c2ecf20Sopenharmony_ci 0x00, 0x11); 10288c2ecf20Sopenharmony_ci if (ret) 10298c2ecf20Sopenharmony_ci return ret; 10308c2ecf20Sopenharmony_ci 10318c2ecf20Sopenharmony_ci data[0] = 0x01; 10328c2ecf20Sopenharmony_ci data[1] = 0x0e; 10338c2ecf20Sopenharmony_ci data[2] = 0x01; 10348c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 10358c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 10368c2ecf20Sopenharmony_ci 0x2d, data, 3); 10378c2ecf20Sopenharmony_ci if (ret) 10388c2ecf20Sopenharmony_ci return ret; 10398c2ecf20Sopenharmony_ci 10408c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 10418c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 10428c2ecf20Sopenharmony_ci x_tune2_seq1, 10438c2ecf20Sopenharmony_ci ARRAY_SIZE(x_tune2_seq1)); 10448c2ecf20Sopenharmony_ci if (ret) 10458c2ecf20Sopenharmony_ci return ret; 10468c2ecf20Sopenharmony_ci 10478c2ecf20Sopenharmony_ci ret = tnr_dmd->io->read_regs(tnr_dmd->io, 10488c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 10498c2ecf20Sopenharmony_ci 0x2c, data, 1); 10508c2ecf20Sopenharmony_ci if (ret) 10518c2ecf20Sopenharmony_ci return ret; 10528c2ecf20Sopenharmony_ci 10538c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 10548c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 10558c2ecf20Sopenharmony_ci 0x00, 0x10); 10568c2ecf20Sopenharmony_ci if (ret) 10578c2ecf20Sopenharmony_ci return ret; 10588c2ecf20Sopenharmony_ci 10598c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 10608c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 10618c2ecf20Sopenharmony_ci 0x60, data[0]); 10628c2ecf20Sopenharmony_ci if (ret) 10638c2ecf20Sopenharmony_ci return ret; 10648c2ecf20Sopenharmony_ci 10658c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 10668c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 10678c2ecf20Sopenharmony_ci x_tune2_seq2, 10688c2ecf20Sopenharmony_ci ARRAY_SIZE(x_tune2_seq2)); 10698c2ecf20Sopenharmony_ci if (ret) 10708c2ecf20Sopenharmony_ci return ret; 10718c2ecf20Sopenharmony_ci 10728c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 10738c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 10748c2ecf20Sopenharmony_ci x_tune2_seq3, 10758c2ecf20Sopenharmony_ci ARRAY_SIZE(x_tune2_seq3)); 10768c2ecf20Sopenharmony_ci if (ret) 10778c2ecf20Sopenharmony_ci return ret; 10788c2ecf20Sopenharmony_ci 10798c2ecf20Sopenharmony_ci if (shift_frequency_khz != 0) { 10808c2ecf20Sopenharmony_ci int shift_freq = 0; 10818c2ecf20Sopenharmony_ci 10828c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 10838c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 10848c2ecf20Sopenharmony_ci 0x00, 0xe1); 10858c2ecf20Sopenharmony_ci if (ret) 10868c2ecf20Sopenharmony_ci return ret; 10878c2ecf20Sopenharmony_ci 10888c2ecf20Sopenharmony_ci ret = tnr_dmd->io->read_regs(tnr_dmd->io, 10898c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 10908c2ecf20Sopenharmony_ci 0x60, data, 2); 10918c2ecf20Sopenharmony_ci if (ret) 10928c2ecf20Sopenharmony_ci return ret; 10938c2ecf20Sopenharmony_ci 10948c2ecf20Sopenharmony_ci shift_freq = shift_frequency_khz * 1000; 10958c2ecf20Sopenharmony_ci 10968c2ecf20Sopenharmony_ci switch (clk_mode) { 10978c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_A: 10988c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_C: 10998c2ecf20Sopenharmony_ci default: 11008c2ecf20Sopenharmony_ci if (shift_freq >= 0) 11018c2ecf20Sopenharmony_ci shift_freq = (shift_freq + 183 / 2) / 183; 11028c2ecf20Sopenharmony_ci else 11038c2ecf20Sopenharmony_ci shift_freq = (shift_freq - 183 / 2) / 183; 11048c2ecf20Sopenharmony_ci break; 11058c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_B: 11068c2ecf20Sopenharmony_ci if (shift_freq >= 0) 11078c2ecf20Sopenharmony_ci shift_freq = (shift_freq + 178 / 2) / 178; 11088c2ecf20Sopenharmony_ci else 11098c2ecf20Sopenharmony_ci shift_freq = (shift_freq - 178 / 2) / 178; 11108c2ecf20Sopenharmony_ci break; 11118c2ecf20Sopenharmony_ci } 11128c2ecf20Sopenharmony_ci 11138c2ecf20Sopenharmony_ci shift_freq += 11148c2ecf20Sopenharmony_ci cxd2880_convert2s_complement((data[0] << 8) | data[1], 16); 11158c2ecf20Sopenharmony_ci 11168c2ecf20Sopenharmony_ci if (shift_freq > 32767) 11178c2ecf20Sopenharmony_ci shift_freq = 32767; 11188c2ecf20Sopenharmony_ci else if (shift_freq < -32768) 11198c2ecf20Sopenharmony_ci shift_freq = -32768; 11208c2ecf20Sopenharmony_ci 11218c2ecf20Sopenharmony_ci data[0] = (shift_freq >> 8) & 0xff; 11228c2ecf20Sopenharmony_ci data[1] = shift_freq & 0xff; 11238c2ecf20Sopenharmony_ci 11248c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 11258c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 11268c2ecf20Sopenharmony_ci 0x60, data, 2); 11278c2ecf20Sopenharmony_ci if (ret) 11288c2ecf20Sopenharmony_ci return ret; 11298c2ecf20Sopenharmony_ci 11308c2ecf20Sopenharmony_ci ret = tnr_dmd->io->read_regs(tnr_dmd->io, 11318c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 11328c2ecf20Sopenharmony_ci 0x69, data, 1); 11338c2ecf20Sopenharmony_ci if (ret) 11348c2ecf20Sopenharmony_ci return ret; 11358c2ecf20Sopenharmony_ci 11368c2ecf20Sopenharmony_ci shift_freq = -shift_frequency_khz; 11378c2ecf20Sopenharmony_ci 11388c2ecf20Sopenharmony_ci if (bandwidth == CXD2880_DTV_BW_1_7_MHZ) { 11398c2ecf20Sopenharmony_ci switch (clk_mode) { 11408c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_A: 11418c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_C: 11428c2ecf20Sopenharmony_ci default: 11438c2ecf20Sopenharmony_ci if (shift_freq >= 0) 11448c2ecf20Sopenharmony_ci shift_freq = 11458c2ecf20Sopenharmony_ci (shift_freq * 1000 + 11468c2ecf20Sopenharmony_ci 17578 / 2) / 17578; 11478c2ecf20Sopenharmony_ci else 11488c2ecf20Sopenharmony_ci shift_freq = 11498c2ecf20Sopenharmony_ci (shift_freq * 1000 - 11508c2ecf20Sopenharmony_ci 17578 / 2) / 17578; 11518c2ecf20Sopenharmony_ci break; 11528c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_B: 11538c2ecf20Sopenharmony_ci if (shift_freq >= 0) 11548c2ecf20Sopenharmony_ci shift_freq = 11558c2ecf20Sopenharmony_ci (shift_freq * 1000 + 11568c2ecf20Sopenharmony_ci 17090 / 2) / 17090; 11578c2ecf20Sopenharmony_ci else 11588c2ecf20Sopenharmony_ci shift_freq = 11598c2ecf20Sopenharmony_ci (shift_freq * 1000 - 11608c2ecf20Sopenharmony_ci 17090 / 2) / 17090; 11618c2ecf20Sopenharmony_ci break; 11628c2ecf20Sopenharmony_ci } 11638c2ecf20Sopenharmony_ci } else { 11648c2ecf20Sopenharmony_ci switch (clk_mode) { 11658c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_A: 11668c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_C: 11678c2ecf20Sopenharmony_ci default: 11688c2ecf20Sopenharmony_ci if (shift_freq >= 0) 11698c2ecf20Sopenharmony_ci shift_freq = 11708c2ecf20Sopenharmony_ci (shift_freq * 1000 + 11718c2ecf20Sopenharmony_ci 35156 / 2) / 35156; 11728c2ecf20Sopenharmony_ci else 11738c2ecf20Sopenharmony_ci shift_freq = 11748c2ecf20Sopenharmony_ci (shift_freq * 1000 - 11758c2ecf20Sopenharmony_ci 35156 / 2) / 35156; 11768c2ecf20Sopenharmony_ci break; 11778c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_B: 11788c2ecf20Sopenharmony_ci if (shift_freq >= 0) 11798c2ecf20Sopenharmony_ci shift_freq = 11808c2ecf20Sopenharmony_ci (shift_freq * 1000 + 11818c2ecf20Sopenharmony_ci 34180 / 2) / 34180; 11828c2ecf20Sopenharmony_ci else 11838c2ecf20Sopenharmony_ci shift_freq = 11848c2ecf20Sopenharmony_ci (shift_freq * 1000 - 11858c2ecf20Sopenharmony_ci 34180 / 2) / 34180; 11868c2ecf20Sopenharmony_ci break; 11878c2ecf20Sopenharmony_ci } 11888c2ecf20Sopenharmony_ci } 11898c2ecf20Sopenharmony_ci 11908c2ecf20Sopenharmony_ci shift_freq += cxd2880_convert2s_complement(data[0], 8); 11918c2ecf20Sopenharmony_ci 11928c2ecf20Sopenharmony_ci if (shift_freq > 127) 11938c2ecf20Sopenharmony_ci shift_freq = 127; 11948c2ecf20Sopenharmony_ci else if (shift_freq < -128) 11958c2ecf20Sopenharmony_ci shift_freq = -128; 11968c2ecf20Sopenharmony_ci 11978c2ecf20Sopenharmony_ci data[0] = shift_freq & 0xff; 11988c2ecf20Sopenharmony_ci 11998c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 12008c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 12018c2ecf20Sopenharmony_ci 0x69, data[0]); 12028c2ecf20Sopenharmony_ci if (ret) 12038c2ecf20Sopenharmony_ci return ret; 12048c2ecf20Sopenharmony_ci } 12058c2ecf20Sopenharmony_ci 12068c2ecf20Sopenharmony_ci if (tnr_dmd->create_param.stationary_use) { 12078c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 12088c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 12098c2ecf20Sopenharmony_ci x_tune2_seq4, 12108c2ecf20Sopenharmony_ci ARRAY_SIZE(x_tune2_seq4)); 12118c2ecf20Sopenharmony_ci if (ret) 12128c2ecf20Sopenharmony_ci return ret; 12138c2ecf20Sopenharmony_ci } 12148c2ecf20Sopenharmony_ci 12158c2ecf20Sopenharmony_ci return cxd2880_io_write_multi_regs(tnr_dmd->io, 12168c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 12178c2ecf20Sopenharmony_ci x_tune2_seq5, 12188c2ecf20Sopenharmony_ci ARRAY_SIZE(x_tune2_seq5)); 12198c2ecf20Sopenharmony_ci} 12208c2ecf20Sopenharmony_ci 12218c2ecf20Sopenharmony_cistatic int x_tune3(struct cxd2880_tnrdmd *tnr_dmd, 12228c2ecf20Sopenharmony_ci enum cxd2880_dtv_sys sys, 12238c2ecf20Sopenharmony_ci u8 en_fef_intmtnt_ctrl) 12248c2ecf20Sopenharmony_ci{ 12258c2ecf20Sopenharmony_ci u8 data[6] = { 0 }; 12268c2ecf20Sopenharmony_ci int ret; 12278c2ecf20Sopenharmony_ci 12288c2ecf20Sopenharmony_ci if (!tnr_dmd) 12298c2ecf20Sopenharmony_ci return -EINVAL; 12308c2ecf20Sopenharmony_ci 12318c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 12328c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 12338c2ecf20Sopenharmony_ci x_tune3_seq, 12348c2ecf20Sopenharmony_ci ARRAY_SIZE(x_tune3_seq)); 12358c2ecf20Sopenharmony_ci if (ret) 12368c2ecf20Sopenharmony_ci return ret; 12378c2ecf20Sopenharmony_ci 12388c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 12398c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 12408c2ecf20Sopenharmony_ci 0x00, 0x10); 12418c2ecf20Sopenharmony_ci if (ret) 12428c2ecf20Sopenharmony_ci return ret; 12438c2ecf20Sopenharmony_ci 12448c2ecf20Sopenharmony_ci if (sys == CXD2880_DTV_SYS_DVBT2 && en_fef_intmtnt_ctrl) 12458c2ecf20Sopenharmony_ci memset(data, 0x01, sizeof(data)); 12468c2ecf20Sopenharmony_ci else 12478c2ecf20Sopenharmony_ci memset(data, 0x00, sizeof(data)); 12488c2ecf20Sopenharmony_ci 12498c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 12508c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 12518c2ecf20Sopenharmony_ci 0xef, data, 6); 12528c2ecf20Sopenharmony_ci if (ret) 12538c2ecf20Sopenharmony_ci return ret; 12548c2ecf20Sopenharmony_ci 12558c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 12568c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 12578c2ecf20Sopenharmony_ci 0x00, 0x2d); 12588c2ecf20Sopenharmony_ci if (ret) 12598c2ecf20Sopenharmony_ci return ret; 12608c2ecf20Sopenharmony_ci if (sys == CXD2880_DTV_SYS_DVBT2 && en_fef_intmtnt_ctrl) 12618c2ecf20Sopenharmony_ci data[0] = 0x00; 12628c2ecf20Sopenharmony_ci else 12638c2ecf20Sopenharmony_ci data[0] = 0x01; 12648c2ecf20Sopenharmony_ci 12658c2ecf20Sopenharmony_ci return tnr_dmd->io->write_reg(tnr_dmd->io, 12668c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 12678c2ecf20Sopenharmony_ci 0xb1, data[0]); 12688c2ecf20Sopenharmony_ci} 12698c2ecf20Sopenharmony_ci 12708c2ecf20Sopenharmony_cistatic int x_tune4(struct cxd2880_tnrdmd *tnr_dmd) 12718c2ecf20Sopenharmony_ci{ 12728c2ecf20Sopenharmony_ci u8 data[2] = { 0 }; 12738c2ecf20Sopenharmony_ci int ret; 12748c2ecf20Sopenharmony_ci 12758c2ecf20Sopenharmony_ci if (!tnr_dmd) 12768c2ecf20Sopenharmony_ci return -EINVAL; 12778c2ecf20Sopenharmony_ci 12788c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode != CXD2880_TNRDMD_DIVERMODE_MAIN) 12798c2ecf20Sopenharmony_ci return -EINVAL; 12808c2ecf20Sopenharmony_ci 12818c2ecf20Sopenharmony_ci ret = tnr_dmd->diver_sub->io->write_reg(tnr_dmd->diver_sub->io, 12828c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 12838c2ecf20Sopenharmony_ci 0x00, 0x00); 12848c2ecf20Sopenharmony_ci if (ret) 12858c2ecf20Sopenharmony_ci return ret; 12868c2ecf20Sopenharmony_ci data[0] = 0x14; 12878c2ecf20Sopenharmony_ci data[1] = 0x00; 12888c2ecf20Sopenharmony_ci ret = tnr_dmd->diver_sub->io->write_regs(tnr_dmd->diver_sub->io, 12898c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 12908c2ecf20Sopenharmony_ci 0x55, data, 2); 12918c2ecf20Sopenharmony_ci if (ret) 12928c2ecf20Sopenharmony_ci return ret; 12938c2ecf20Sopenharmony_ci 12948c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 12958c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 12968c2ecf20Sopenharmony_ci 0x00, 0x00); 12978c2ecf20Sopenharmony_ci if (ret) 12988c2ecf20Sopenharmony_ci return ret; 12998c2ecf20Sopenharmony_ci data[0] = 0x0b; 13008c2ecf20Sopenharmony_ci data[1] = 0xff; 13018c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 13028c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 13038c2ecf20Sopenharmony_ci 0x53, data, 2); 13048c2ecf20Sopenharmony_ci if (ret) 13058c2ecf20Sopenharmony_ci return ret; 13068c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 13078c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 13088c2ecf20Sopenharmony_ci 0x57, 0x01); 13098c2ecf20Sopenharmony_ci if (ret) 13108c2ecf20Sopenharmony_ci return ret; 13118c2ecf20Sopenharmony_ci data[0] = 0x0b; 13128c2ecf20Sopenharmony_ci data[1] = 0xff; 13138c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 13148c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 13158c2ecf20Sopenharmony_ci 0x55, data, 2); 13168c2ecf20Sopenharmony_ci if (ret) 13178c2ecf20Sopenharmony_ci return ret; 13188c2ecf20Sopenharmony_ci 13198c2ecf20Sopenharmony_ci ret = tnr_dmd->diver_sub->io->write_reg(tnr_dmd->diver_sub->io, 13208c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 13218c2ecf20Sopenharmony_ci 0x00, 0x00); 13228c2ecf20Sopenharmony_ci if (ret) 13238c2ecf20Sopenharmony_ci return ret; 13248c2ecf20Sopenharmony_ci data[0] = 0x14; 13258c2ecf20Sopenharmony_ci data[1] = 0x00; 13268c2ecf20Sopenharmony_ci ret = tnr_dmd->diver_sub->io->write_regs(tnr_dmd->diver_sub->io, 13278c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 13288c2ecf20Sopenharmony_ci 0x53, data, 2); 13298c2ecf20Sopenharmony_ci if (ret) 13308c2ecf20Sopenharmony_ci return ret; 13318c2ecf20Sopenharmony_ci ret = tnr_dmd->diver_sub->io->write_reg(tnr_dmd->diver_sub->io, 13328c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 13338c2ecf20Sopenharmony_ci 0x57, 0x02); 13348c2ecf20Sopenharmony_ci if (ret) 13358c2ecf20Sopenharmony_ci return ret; 13368c2ecf20Sopenharmony_ci 13378c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 13388c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 13398c2ecf20Sopenharmony_ci x_tune4_seq, 13408c2ecf20Sopenharmony_ci ARRAY_SIZE(x_tune4_seq)); 13418c2ecf20Sopenharmony_ci if (ret) 13428c2ecf20Sopenharmony_ci return ret; 13438c2ecf20Sopenharmony_ci 13448c2ecf20Sopenharmony_ci return cxd2880_io_write_multi_regs(tnr_dmd->diver_sub->io, 13458c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 13468c2ecf20Sopenharmony_ci x_tune4_seq, 13478c2ecf20Sopenharmony_ci ARRAY_SIZE(x_tune4_seq)); 13488c2ecf20Sopenharmony_ci} 13498c2ecf20Sopenharmony_ci 13508c2ecf20Sopenharmony_cistatic int x_sleep1(struct cxd2880_tnrdmd *tnr_dmd) 13518c2ecf20Sopenharmony_ci{ 13528c2ecf20Sopenharmony_ci u8 data[3] = { 0 }; 13538c2ecf20Sopenharmony_ci int ret; 13548c2ecf20Sopenharmony_ci 13558c2ecf20Sopenharmony_ci if (!tnr_dmd) 13568c2ecf20Sopenharmony_ci return -EINVAL; 13578c2ecf20Sopenharmony_ci 13588c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode != CXD2880_TNRDMD_DIVERMODE_MAIN) 13598c2ecf20Sopenharmony_ci return -EINVAL; 13608c2ecf20Sopenharmony_ci 13618c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 13628c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 13638c2ecf20Sopenharmony_ci x_sleep1_seq, 13648c2ecf20Sopenharmony_ci ARRAY_SIZE(x_sleep1_seq)); 13658c2ecf20Sopenharmony_ci if (ret) 13668c2ecf20Sopenharmony_ci return ret; 13678c2ecf20Sopenharmony_ci 13688c2ecf20Sopenharmony_ci data[0] = 0x00; 13698c2ecf20Sopenharmony_ci data[1] = 0x00; 13708c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 13718c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 13728c2ecf20Sopenharmony_ci 0x53, data, 2); 13738c2ecf20Sopenharmony_ci if (ret) 13748c2ecf20Sopenharmony_ci return ret; 13758c2ecf20Sopenharmony_ci 13768c2ecf20Sopenharmony_ci ret = tnr_dmd->diver_sub->io->write_reg(tnr_dmd->diver_sub->io, 13778c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 13788c2ecf20Sopenharmony_ci 0x00, 0x00); 13798c2ecf20Sopenharmony_ci if (ret) 13808c2ecf20Sopenharmony_ci return ret; 13818c2ecf20Sopenharmony_ci data[0] = 0x1f; 13828c2ecf20Sopenharmony_ci data[1] = 0xff; 13838c2ecf20Sopenharmony_ci data[2] = 0x03; 13848c2ecf20Sopenharmony_ci ret = tnr_dmd->diver_sub->io->write_regs(tnr_dmd->diver_sub->io, 13858c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 13868c2ecf20Sopenharmony_ci 0x55, data, 3); 13878c2ecf20Sopenharmony_ci if (ret) 13888c2ecf20Sopenharmony_ci return ret; 13898c2ecf20Sopenharmony_ci data[0] = 0x00; 13908c2ecf20Sopenharmony_ci data[1] = 0x00; 13918c2ecf20Sopenharmony_ci ret = tnr_dmd->diver_sub->io->write_regs(tnr_dmd->diver_sub->io, 13928c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 13938c2ecf20Sopenharmony_ci 0x53, data, 2); 13948c2ecf20Sopenharmony_ci if (ret) 13958c2ecf20Sopenharmony_ci return ret; 13968c2ecf20Sopenharmony_ci 13978c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 13988c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 13998c2ecf20Sopenharmony_ci 0x00, 0x00); 14008c2ecf20Sopenharmony_ci if (ret) 14018c2ecf20Sopenharmony_ci return ret; 14028c2ecf20Sopenharmony_ci data[0] = 0x1f; 14038c2ecf20Sopenharmony_ci data[1] = 0xff; 14048c2ecf20Sopenharmony_ci 14058c2ecf20Sopenharmony_ci return tnr_dmd->io->write_regs(tnr_dmd->io, 14068c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 14078c2ecf20Sopenharmony_ci 0x55, data, 2); 14088c2ecf20Sopenharmony_ci} 14098c2ecf20Sopenharmony_ci 14108c2ecf20Sopenharmony_cistatic int x_sleep2(struct cxd2880_tnrdmd *tnr_dmd) 14118c2ecf20Sopenharmony_ci{ 14128c2ecf20Sopenharmony_ci u8 data = 0; 14138c2ecf20Sopenharmony_ci int ret; 14148c2ecf20Sopenharmony_ci 14158c2ecf20Sopenharmony_ci if (!tnr_dmd) 14168c2ecf20Sopenharmony_ci return -EINVAL; 14178c2ecf20Sopenharmony_ci 14188c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 14198c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 14208c2ecf20Sopenharmony_ci x_sleep2_seq1, 14218c2ecf20Sopenharmony_ci ARRAY_SIZE(x_sleep2_seq1)); 14228c2ecf20Sopenharmony_ci if (ret) 14238c2ecf20Sopenharmony_ci return ret; 14248c2ecf20Sopenharmony_ci 14258c2ecf20Sopenharmony_ci usleep_range(1000, 2000); 14268c2ecf20Sopenharmony_ci 14278c2ecf20Sopenharmony_ci ret = tnr_dmd->io->read_regs(tnr_dmd->io, 14288c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 14298c2ecf20Sopenharmony_ci 0xb2, &data, 1); 14308c2ecf20Sopenharmony_ci if (ret) 14318c2ecf20Sopenharmony_ci return ret; 14328c2ecf20Sopenharmony_ci 14338c2ecf20Sopenharmony_ci if ((data & 0x01) == 0x00) 14348c2ecf20Sopenharmony_ci return -EINVAL; 14358c2ecf20Sopenharmony_ci 14368c2ecf20Sopenharmony_ci return cxd2880_io_write_multi_regs(tnr_dmd->io, 14378c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 14388c2ecf20Sopenharmony_ci x_sleep2_seq2, 14398c2ecf20Sopenharmony_ci ARRAY_SIZE(x_sleep2_seq2)); 14408c2ecf20Sopenharmony_ci} 14418c2ecf20Sopenharmony_ci 14428c2ecf20Sopenharmony_cistatic int x_sleep3(struct cxd2880_tnrdmd *tnr_dmd) 14438c2ecf20Sopenharmony_ci{ 14448c2ecf20Sopenharmony_ci if (!tnr_dmd) 14458c2ecf20Sopenharmony_ci return -EINVAL; 14468c2ecf20Sopenharmony_ci 14478c2ecf20Sopenharmony_ci return cxd2880_io_write_multi_regs(tnr_dmd->io, 14488c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 14498c2ecf20Sopenharmony_ci x_sleep3_seq, 14508c2ecf20Sopenharmony_ci ARRAY_SIZE(x_sleep3_seq)); 14518c2ecf20Sopenharmony_ci} 14528c2ecf20Sopenharmony_ci 14538c2ecf20Sopenharmony_cistatic int x_sleep4(struct cxd2880_tnrdmd *tnr_dmd) 14548c2ecf20Sopenharmony_ci{ 14558c2ecf20Sopenharmony_ci if (!tnr_dmd) 14568c2ecf20Sopenharmony_ci return -EINVAL; 14578c2ecf20Sopenharmony_ci 14588c2ecf20Sopenharmony_ci return cxd2880_io_write_multi_regs(tnr_dmd->io, 14598c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 14608c2ecf20Sopenharmony_ci x_sleep4_seq, 14618c2ecf20Sopenharmony_ci ARRAY_SIZE(x_sleep4_seq)); 14628c2ecf20Sopenharmony_ci} 14638c2ecf20Sopenharmony_ci 14648c2ecf20Sopenharmony_cistatic int spll_reset(struct cxd2880_tnrdmd *tnr_dmd, 14658c2ecf20Sopenharmony_ci enum cxd2880_tnrdmd_clockmode clockmode) 14668c2ecf20Sopenharmony_ci{ 14678c2ecf20Sopenharmony_ci u8 data[4] = { 0 }; 14688c2ecf20Sopenharmony_ci int ret; 14698c2ecf20Sopenharmony_ci 14708c2ecf20Sopenharmony_ci if (!tnr_dmd) 14718c2ecf20Sopenharmony_ci return -EINVAL; 14728c2ecf20Sopenharmony_ci 14738c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 14748c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 14758c2ecf20Sopenharmony_ci spll_reset_seq1, 14768c2ecf20Sopenharmony_ci ARRAY_SIZE(spll_reset_seq1)); 14778c2ecf20Sopenharmony_ci if (ret) 14788c2ecf20Sopenharmony_ci return ret; 14798c2ecf20Sopenharmony_ci 14808c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 14818c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 14828c2ecf20Sopenharmony_ci spll_reset_seq2, 14838c2ecf20Sopenharmony_ci ARRAY_SIZE(spll_reset_seq2)); 14848c2ecf20Sopenharmony_ci if (ret) 14858c2ecf20Sopenharmony_ci return ret; 14868c2ecf20Sopenharmony_ci 14878c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 14888c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 14898c2ecf20Sopenharmony_ci spll_reset_seq3, 14908c2ecf20Sopenharmony_ci ARRAY_SIZE(spll_reset_seq3)); 14918c2ecf20Sopenharmony_ci if (ret) 14928c2ecf20Sopenharmony_ci return ret; 14938c2ecf20Sopenharmony_ci 14948c2ecf20Sopenharmony_ci switch (clockmode) { 14958c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_A: 14968c2ecf20Sopenharmony_ci data[0] = 0x00; 14978c2ecf20Sopenharmony_ci break; 14988c2ecf20Sopenharmony_ci 14998c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_B: 15008c2ecf20Sopenharmony_ci data[0] = 0x01; 15018c2ecf20Sopenharmony_ci break; 15028c2ecf20Sopenharmony_ci 15038c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_C: 15048c2ecf20Sopenharmony_ci data[0] = 0x02; 15058c2ecf20Sopenharmony_ci break; 15068c2ecf20Sopenharmony_ci 15078c2ecf20Sopenharmony_ci default: 15088c2ecf20Sopenharmony_ci return -EINVAL; 15098c2ecf20Sopenharmony_ci } 15108c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 15118c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 15128c2ecf20Sopenharmony_ci 0x30, data[0]); 15138c2ecf20Sopenharmony_ci if (ret) 15148c2ecf20Sopenharmony_ci return ret; 15158c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 15168c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 15178c2ecf20Sopenharmony_ci 0x22, 0x00); 15188c2ecf20Sopenharmony_ci if (ret) 15198c2ecf20Sopenharmony_ci return ret; 15208c2ecf20Sopenharmony_ci 15218c2ecf20Sopenharmony_ci usleep_range(2000, 3000); 15228c2ecf20Sopenharmony_ci 15238c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 15248c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 15258c2ecf20Sopenharmony_ci 0x00, 0x0a); 15268c2ecf20Sopenharmony_ci if (ret) 15278c2ecf20Sopenharmony_ci return ret; 15288c2ecf20Sopenharmony_ci ret = tnr_dmd->io->read_regs(tnr_dmd->io, 15298c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 15308c2ecf20Sopenharmony_ci 0x10, data, 1); 15318c2ecf20Sopenharmony_ci if (ret) 15328c2ecf20Sopenharmony_ci return ret; 15338c2ecf20Sopenharmony_ci if ((data[0] & 0x01) == 0x00) 15348c2ecf20Sopenharmony_ci return -EINVAL; 15358c2ecf20Sopenharmony_ci 15368c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 15378c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 15388c2ecf20Sopenharmony_ci spll_reset_seq4, 15398c2ecf20Sopenharmony_ci ARRAY_SIZE(spll_reset_seq4)); 15408c2ecf20Sopenharmony_ci if (ret) 15418c2ecf20Sopenharmony_ci return ret; 15428c2ecf20Sopenharmony_ci 15438c2ecf20Sopenharmony_ci usleep_range(1000, 2000); 15448c2ecf20Sopenharmony_ci 15458c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 15468c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 15478c2ecf20Sopenharmony_ci spll_reset_seq5, 15488c2ecf20Sopenharmony_ci ARRAY_SIZE(spll_reset_seq5)); 15498c2ecf20Sopenharmony_ci if (ret) 15508c2ecf20Sopenharmony_ci return ret; 15518c2ecf20Sopenharmony_ci 15528c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 15538c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 15548c2ecf20Sopenharmony_ci 0x00, 0x10); 15558c2ecf20Sopenharmony_ci if (ret) 15568c2ecf20Sopenharmony_ci return ret; 15578c2ecf20Sopenharmony_ci 15588c2ecf20Sopenharmony_ci memset(data, 0x00, sizeof(data)); 15598c2ecf20Sopenharmony_ci 15608c2ecf20Sopenharmony_ci return tnr_dmd->io->write_regs(tnr_dmd->io, 15618c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 15628c2ecf20Sopenharmony_ci 0x26, data, 4); 15638c2ecf20Sopenharmony_ci} 15648c2ecf20Sopenharmony_ci 15658c2ecf20Sopenharmony_cistatic int t_power_x(struct cxd2880_tnrdmd *tnr_dmd, u8 on) 15668c2ecf20Sopenharmony_ci{ 15678c2ecf20Sopenharmony_ci u8 data[3] = { 0 }; 15688c2ecf20Sopenharmony_ci int ret; 15698c2ecf20Sopenharmony_ci 15708c2ecf20Sopenharmony_ci if (!tnr_dmd) 15718c2ecf20Sopenharmony_ci return -EINVAL; 15728c2ecf20Sopenharmony_ci 15738c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 15748c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 15758c2ecf20Sopenharmony_ci t_power_x_seq1, 15768c2ecf20Sopenharmony_ci ARRAY_SIZE(t_power_x_seq1)); 15778c2ecf20Sopenharmony_ci if (ret) 15788c2ecf20Sopenharmony_ci return ret; 15798c2ecf20Sopenharmony_ci 15808c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 15818c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 15828c2ecf20Sopenharmony_ci t_power_x_seq2, 15838c2ecf20Sopenharmony_ci ARRAY_SIZE(t_power_x_seq2)); 15848c2ecf20Sopenharmony_ci if (ret) 15858c2ecf20Sopenharmony_ci return ret; 15868c2ecf20Sopenharmony_ci 15878c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 15888c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 15898c2ecf20Sopenharmony_ci t_power_x_seq3, 15908c2ecf20Sopenharmony_ci ARRAY_SIZE(t_power_x_seq3)); 15918c2ecf20Sopenharmony_ci if (ret) 15928c2ecf20Sopenharmony_ci return ret; 15938c2ecf20Sopenharmony_ci 15948c2ecf20Sopenharmony_ci if (on) { 15958c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 15968c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 15978c2ecf20Sopenharmony_ci 0x2b, 0x01); 15988c2ecf20Sopenharmony_ci if (ret) 15998c2ecf20Sopenharmony_ci return ret; 16008c2ecf20Sopenharmony_ci 16018c2ecf20Sopenharmony_ci usleep_range(1000, 2000); 16028c2ecf20Sopenharmony_ci 16038c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 16048c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 16058c2ecf20Sopenharmony_ci 0x00, 0x0a); 16068c2ecf20Sopenharmony_ci if (ret) 16078c2ecf20Sopenharmony_ci return ret; 16088c2ecf20Sopenharmony_ci ret = tnr_dmd->io->read_regs(tnr_dmd->io, 16098c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 16108c2ecf20Sopenharmony_ci 0x12, data, 1); 16118c2ecf20Sopenharmony_ci if (ret) 16128c2ecf20Sopenharmony_ci return ret; 16138c2ecf20Sopenharmony_ci if ((data[0] & 0x01) == 0) 16148c2ecf20Sopenharmony_ci return -EINVAL; 16158c2ecf20Sopenharmony_ci 16168c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 16178c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 16188c2ecf20Sopenharmony_ci t_power_x_seq4, 16198c2ecf20Sopenharmony_ci ARRAY_SIZE(t_power_x_seq4)); 16208c2ecf20Sopenharmony_ci if (ret) 16218c2ecf20Sopenharmony_ci return ret; 16228c2ecf20Sopenharmony_ci } else { 16238c2ecf20Sopenharmony_ci data[0] = 0x03; 16248c2ecf20Sopenharmony_ci data[1] = 0x00; 16258c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 16268c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 16278c2ecf20Sopenharmony_ci 0x2a, data, 2); 16288c2ecf20Sopenharmony_ci if (ret) 16298c2ecf20Sopenharmony_ci return ret; 16308c2ecf20Sopenharmony_ci 16318c2ecf20Sopenharmony_ci usleep_range(1000, 2000); 16328c2ecf20Sopenharmony_ci 16338c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 16348c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 16358c2ecf20Sopenharmony_ci 0x00, 0x0a); 16368c2ecf20Sopenharmony_ci if (ret) 16378c2ecf20Sopenharmony_ci return ret; 16388c2ecf20Sopenharmony_ci ret = tnr_dmd->io->read_regs(tnr_dmd->io, 16398c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 16408c2ecf20Sopenharmony_ci 0x13, data, 1); 16418c2ecf20Sopenharmony_ci if (ret) 16428c2ecf20Sopenharmony_ci return ret; 16438c2ecf20Sopenharmony_ci if ((data[0] & 0x01) == 0) 16448c2ecf20Sopenharmony_ci return -EINVAL; 16458c2ecf20Sopenharmony_ci } 16468c2ecf20Sopenharmony_ci 16478c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 16488c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 16498c2ecf20Sopenharmony_ci t_power_x_seq5, 16508c2ecf20Sopenharmony_ci ARRAY_SIZE(t_power_x_seq5)); 16518c2ecf20Sopenharmony_ci if (ret) 16528c2ecf20Sopenharmony_ci return ret; 16538c2ecf20Sopenharmony_ci 16548c2ecf20Sopenharmony_ci usleep_range(1000, 2000); 16558c2ecf20Sopenharmony_ci 16568c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 16578c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 16588c2ecf20Sopenharmony_ci 0x00, 0x0a); 16598c2ecf20Sopenharmony_ci if (ret) 16608c2ecf20Sopenharmony_ci return ret; 16618c2ecf20Sopenharmony_ci ret = tnr_dmd->io->read_regs(tnr_dmd->io, 16628c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 16638c2ecf20Sopenharmony_ci 0x11, data, 1); 16648c2ecf20Sopenharmony_ci if (ret) 16658c2ecf20Sopenharmony_ci return ret; 16668c2ecf20Sopenharmony_ci if ((data[0] & 0x01) == 0) 16678c2ecf20Sopenharmony_ci return -EINVAL; 16688c2ecf20Sopenharmony_ci 16698c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 16708c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 16718c2ecf20Sopenharmony_ci t_power_x_seq6, 16728c2ecf20Sopenharmony_ci ARRAY_SIZE(t_power_x_seq6)); 16738c2ecf20Sopenharmony_ci if (ret) 16748c2ecf20Sopenharmony_ci return ret; 16758c2ecf20Sopenharmony_ci 16768c2ecf20Sopenharmony_ci usleep_range(1000, 2000); 16778c2ecf20Sopenharmony_ci 16788c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 16798c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 16808c2ecf20Sopenharmony_ci t_power_x_seq7, 16818c2ecf20Sopenharmony_ci ARRAY_SIZE(t_power_x_seq7)); 16828c2ecf20Sopenharmony_ci if (ret) 16838c2ecf20Sopenharmony_ci return ret; 16848c2ecf20Sopenharmony_ci 16858c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 16868c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 16878c2ecf20Sopenharmony_ci 0x00, 0x10); 16888c2ecf20Sopenharmony_ci if (ret) 16898c2ecf20Sopenharmony_ci return ret; 16908c2ecf20Sopenharmony_ci 16918c2ecf20Sopenharmony_ci memset(data, 0x00, sizeof(data)); 16928c2ecf20Sopenharmony_ci 16938c2ecf20Sopenharmony_ci return tnr_dmd->io->write_regs(tnr_dmd->io, 16948c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 16958c2ecf20Sopenharmony_ci 0x27, data, 3); 16968c2ecf20Sopenharmony_ci} 16978c2ecf20Sopenharmony_ci 16988c2ecf20Sopenharmony_cistruct cxd2880_tnrdmd_ts_clk_cfg { 16998c2ecf20Sopenharmony_ci u8 srl_clk_mode; 17008c2ecf20Sopenharmony_ci u8 srl_duty_mode; 17018c2ecf20Sopenharmony_ci u8 ts_clk_period; 17028c2ecf20Sopenharmony_ci}; 17038c2ecf20Sopenharmony_ci 17048c2ecf20Sopenharmony_cistatic int set_ts_clk_mode_and_freq(struct cxd2880_tnrdmd *tnr_dmd, 17058c2ecf20Sopenharmony_ci enum cxd2880_dtv_sys sys) 17068c2ecf20Sopenharmony_ci{ 17078c2ecf20Sopenharmony_ci int ret; 17088c2ecf20Sopenharmony_ci u8 backwards_compatible = 0; 17098c2ecf20Sopenharmony_ci struct cxd2880_tnrdmd_ts_clk_cfg ts_clk_cfg; 17108c2ecf20Sopenharmony_ci u8 ts_rate_ctrl_off = 0; 17118c2ecf20Sopenharmony_ci u8 ts_in_off = 0; 17128c2ecf20Sopenharmony_ci u8 ts_clk_manaul_on = 0; 17138c2ecf20Sopenharmony_ci u8 data = 0; 17148c2ecf20Sopenharmony_ci 17158c2ecf20Sopenharmony_ci static const struct cxd2880_tnrdmd_ts_clk_cfg srl_ts_clk_stgs[2][2] = { 17168c2ecf20Sopenharmony_ci { 17178c2ecf20Sopenharmony_ci {3, 1, 8,}, 17188c2ecf20Sopenharmony_ci {0, 2, 16,} 17198c2ecf20Sopenharmony_ci }, { 17208c2ecf20Sopenharmony_ci {1, 1, 8,}, 17218c2ecf20Sopenharmony_ci {2, 2, 16,} 17228c2ecf20Sopenharmony_ci } 17238c2ecf20Sopenharmony_ci }; 17248c2ecf20Sopenharmony_ci 17258c2ecf20Sopenharmony_ci if (!tnr_dmd) 17268c2ecf20Sopenharmony_ci return -EINVAL; 17278c2ecf20Sopenharmony_ci 17288c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 17298c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 17308c2ecf20Sopenharmony_ci 0x00, 0x00); 17318c2ecf20Sopenharmony_ci if (ret) 17328c2ecf20Sopenharmony_ci return ret; 17338c2ecf20Sopenharmony_ci 17348c2ecf20Sopenharmony_ci if (tnr_dmd->is_ts_backwards_compatible_mode) { 17358c2ecf20Sopenharmony_ci backwards_compatible = 1; 17368c2ecf20Sopenharmony_ci ts_rate_ctrl_off = 1; 17378c2ecf20Sopenharmony_ci ts_in_off = 1; 17388c2ecf20Sopenharmony_ci } else { 17398c2ecf20Sopenharmony_ci backwards_compatible = 0; 17408c2ecf20Sopenharmony_ci ts_rate_ctrl_off = 0; 17418c2ecf20Sopenharmony_ci ts_in_off = 0; 17428c2ecf20Sopenharmony_ci } 17438c2ecf20Sopenharmony_ci 17448c2ecf20Sopenharmony_ci if (tnr_dmd->ts_byte_clk_manual_setting) { 17458c2ecf20Sopenharmony_ci ts_clk_manaul_on = 1; 17468c2ecf20Sopenharmony_ci ts_rate_ctrl_off = 0; 17478c2ecf20Sopenharmony_ci } 17488c2ecf20Sopenharmony_ci 17498c2ecf20Sopenharmony_ci ret = cxd2880_io_set_reg_bits(tnr_dmd->io, 17508c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 17518c2ecf20Sopenharmony_ci 0xd3, ts_rate_ctrl_off, 0x01); 17528c2ecf20Sopenharmony_ci if (ret) 17538c2ecf20Sopenharmony_ci return ret; 17548c2ecf20Sopenharmony_ci 17558c2ecf20Sopenharmony_ci ret = cxd2880_io_set_reg_bits(tnr_dmd->io, 17568c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 17578c2ecf20Sopenharmony_ci 0xde, ts_in_off, 0x01); 17588c2ecf20Sopenharmony_ci if (ret) 17598c2ecf20Sopenharmony_ci return ret; 17608c2ecf20Sopenharmony_ci 17618c2ecf20Sopenharmony_ci ret = cxd2880_io_set_reg_bits(tnr_dmd->io, 17628c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 17638c2ecf20Sopenharmony_ci 0xda, ts_clk_manaul_on, 0x01); 17648c2ecf20Sopenharmony_ci if (ret) 17658c2ecf20Sopenharmony_ci return ret; 17668c2ecf20Sopenharmony_ci 17678c2ecf20Sopenharmony_ci ts_clk_cfg = srl_ts_clk_stgs[tnr_dmd->srl_ts_clk_mod_cnts] 17688c2ecf20Sopenharmony_ci [tnr_dmd->srl_ts_clk_frq]; 17698c2ecf20Sopenharmony_ci 17708c2ecf20Sopenharmony_ci if (tnr_dmd->ts_byte_clk_manual_setting) 17718c2ecf20Sopenharmony_ci ts_clk_cfg.ts_clk_period = tnr_dmd->ts_byte_clk_manual_setting; 17728c2ecf20Sopenharmony_ci 17738c2ecf20Sopenharmony_ci ret = cxd2880_io_set_reg_bits(tnr_dmd->io, 17748c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 17758c2ecf20Sopenharmony_ci 0xc4, ts_clk_cfg.srl_clk_mode, 0x03); 17768c2ecf20Sopenharmony_ci if (ret) 17778c2ecf20Sopenharmony_ci return ret; 17788c2ecf20Sopenharmony_ci 17798c2ecf20Sopenharmony_ci ret = cxd2880_io_set_reg_bits(tnr_dmd->io, 17808c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 17818c2ecf20Sopenharmony_ci 0xd1, ts_clk_cfg.srl_duty_mode, 0x03); 17828c2ecf20Sopenharmony_ci if (ret) 17838c2ecf20Sopenharmony_ci return ret; 17848c2ecf20Sopenharmony_ci 17858c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 17868c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 0xd9, 17878c2ecf20Sopenharmony_ci ts_clk_cfg.ts_clk_period); 17888c2ecf20Sopenharmony_ci if (ret) 17898c2ecf20Sopenharmony_ci return ret; 17908c2ecf20Sopenharmony_ci 17918c2ecf20Sopenharmony_ci data = backwards_compatible ? 0x00 : 0x01; 17928c2ecf20Sopenharmony_ci 17938c2ecf20Sopenharmony_ci if (sys == CXD2880_DTV_SYS_DVBT) { 17948c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 17958c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 17968c2ecf20Sopenharmony_ci 0x00, 0x10); 17978c2ecf20Sopenharmony_ci if (ret) 17988c2ecf20Sopenharmony_ci return ret; 17998c2ecf20Sopenharmony_ci 18008c2ecf20Sopenharmony_ci ret = 18018c2ecf20Sopenharmony_ci cxd2880_io_set_reg_bits(tnr_dmd->io, 18028c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 18038c2ecf20Sopenharmony_ci 0x66, data, 0x01); 18048c2ecf20Sopenharmony_ci } 18058c2ecf20Sopenharmony_ci 18068c2ecf20Sopenharmony_ci return ret; 18078c2ecf20Sopenharmony_ci} 18088c2ecf20Sopenharmony_ci 18098c2ecf20Sopenharmony_cistatic int pid_ftr_setting(struct cxd2880_tnrdmd *tnr_dmd, 18108c2ecf20Sopenharmony_ci struct cxd2880_tnrdmd_pid_ftr_cfg 18118c2ecf20Sopenharmony_ci *pid_ftr_cfg) 18128c2ecf20Sopenharmony_ci{ 18138c2ecf20Sopenharmony_ci int i; 18148c2ecf20Sopenharmony_ci int ret; 18158c2ecf20Sopenharmony_ci u8 data[65]; 18168c2ecf20Sopenharmony_ci 18178c2ecf20Sopenharmony_ci if (!tnr_dmd) 18188c2ecf20Sopenharmony_ci return -EINVAL; 18198c2ecf20Sopenharmony_ci 18208c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 18218c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 18228c2ecf20Sopenharmony_ci 0x00, 0x00); 18238c2ecf20Sopenharmony_ci if (ret) 18248c2ecf20Sopenharmony_ci return ret; 18258c2ecf20Sopenharmony_ci 18268c2ecf20Sopenharmony_ci if (!pid_ftr_cfg) 18278c2ecf20Sopenharmony_ci return tnr_dmd->io->write_reg(tnr_dmd->io, 18288c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 18298c2ecf20Sopenharmony_ci 0x50, 0x02); 18308c2ecf20Sopenharmony_ci 18318c2ecf20Sopenharmony_ci data[0] = pid_ftr_cfg->is_negative ? 0x01 : 0x00; 18328c2ecf20Sopenharmony_ci 18338c2ecf20Sopenharmony_ci for (i = 0; i < 32; i++) { 18348c2ecf20Sopenharmony_ci if (pid_ftr_cfg->pid_cfg[i].is_en) { 18358c2ecf20Sopenharmony_ci data[1 + (i * 2)] = (pid_ftr_cfg->pid_cfg[i].pid >> 8) | 0x20; 18368c2ecf20Sopenharmony_ci data[2 + (i * 2)] = pid_ftr_cfg->pid_cfg[i].pid & 0xff; 18378c2ecf20Sopenharmony_ci } else { 18388c2ecf20Sopenharmony_ci data[1 + (i * 2)] = 0x00; 18398c2ecf20Sopenharmony_ci data[2 + (i * 2)] = 0x00; 18408c2ecf20Sopenharmony_ci } 18418c2ecf20Sopenharmony_ci } 18428c2ecf20Sopenharmony_ci 18438c2ecf20Sopenharmony_ci return tnr_dmd->io->write_regs(tnr_dmd->io, 18448c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 18458c2ecf20Sopenharmony_ci 0x50, data, 65); 18468c2ecf20Sopenharmony_ci} 18478c2ecf20Sopenharmony_ci 18488c2ecf20Sopenharmony_cistatic int load_cfg_mem(struct cxd2880_tnrdmd *tnr_dmd) 18498c2ecf20Sopenharmony_ci{ 18508c2ecf20Sopenharmony_ci int ret; 18518c2ecf20Sopenharmony_ci u8 i; 18528c2ecf20Sopenharmony_ci 18538c2ecf20Sopenharmony_ci if (!tnr_dmd) 18548c2ecf20Sopenharmony_ci return -EINVAL; 18558c2ecf20Sopenharmony_ci 18568c2ecf20Sopenharmony_ci for (i = 0; i < tnr_dmd->cfg_mem_last_entry; i++) { 18578c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 18588c2ecf20Sopenharmony_ci tnr_dmd->cfg_mem[i].tgt, 18598c2ecf20Sopenharmony_ci 0x00, tnr_dmd->cfg_mem[i].bank); 18608c2ecf20Sopenharmony_ci if (ret) 18618c2ecf20Sopenharmony_ci return ret; 18628c2ecf20Sopenharmony_ci 18638c2ecf20Sopenharmony_ci ret = cxd2880_io_set_reg_bits(tnr_dmd->io, 18648c2ecf20Sopenharmony_ci tnr_dmd->cfg_mem[i].tgt, 18658c2ecf20Sopenharmony_ci tnr_dmd->cfg_mem[i].address, 18668c2ecf20Sopenharmony_ci tnr_dmd->cfg_mem[i].value, 18678c2ecf20Sopenharmony_ci tnr_dmd->cfg_mem[i].bit_mask); 18688c2ecf20Sopenharmony_ci if (ret) 18698c2ecf20Sopenharmony_ci return ret; 18708c2ecf20Sopenharmony_ci } 18718c2ecf20Sopenharmony_ci 18728c2ecf20Sopenharmony_ci return 0; 18738c2ecf20Sopenharmony_ci} 18748c2ecf20Sopenharmony_ci 18758c2ecf20Sopenharmony_cistatic int set_cfg_mem(struct cxd2880_tnrdmd *tnr_dmd, 18768c2ecf20Sopenharmony_ci enum cxd2880_io_tgt tgt, 18778c2ecf20Sopenharmony_ci u8 bank, u8 address, u8 value, u8 bit_mask) 18788c2ecf20Sopenharmony_ci{ 18798c2ecf20Sopenharmony_ci u8 i; 18808c2ecf20Sopenharmony_ci u8 value_stored = 0; 18818c2ecf20Sopenharmony_ci 18828c2ecf20Sopenharmony_ci if (!tnr_dmd) 18838c2ecf20Sopenharmony_ci return -EINVAL; 18848c2ecf20Sopenharmony_ci 18858c2ecf20Sopenharmony_ci for (i = 0; i < tnr_dmd->cfg_mem_last_entry; i++) { 18868c2ecf20Sopenharmony_ci if (value_stored == 0 && 18878c2ecf20Sopenharmony_ci tnr_dmd->cfg_mem[i].tgt == tgt && 18888c2ecf20Sopenharmony_ci tnr_dmd->cfg_mem[i].bank == bank && 18898c2ecf20Sopenharmony_ci tnr_dmd->cfg_mem[i].address == address) { 18908c2ecf20Sopenharmony_ci tnr_dmd->cfg_mem[i].value &= ~bit_mask; 18918c2ecf20Sopenharmony_ci tnr_dmd->cfg_mem[i].value |= (value & bit_mask); 18928c2ecf20Sopenharmony_ci 18938c2ecf20Sopenharmony_ci tnr_dmd->cfg_mem[i].bit_mask |= bit_mask; 18948c2ecf20Sopenharmony_ci 18958c2ecf20Sopenharmony_ci value_stored = 1; 18968c2ecf20Sopenharmony_ci } 18978c2ecf20Sopenharmony_ci } 18988c2ecf20Sopenharmony_ci 18998c2ecf20Sopenharmony_ci if (value_stored) 19008c2ecf20Sopenharmony_ci return 0; 19018c2ecf20Sopenharmony_ci 19028c2ecf20Sopenharmony_ci if (tnr_dmd->cfg_mem_last_entry < CXD2880_TNRDMD_MAX_CFG_MEM_COUNT) { 19038c2ecf20Sopenharmony_ci tnr_dmd->cfg_mem[tnr_dmd->cfg_mem_last_entry].tgt = tgt; 19048c2ecf20Sopenharmony_ci tnr_dmd->cfg_mem[tnr_dmd->cfg_mem_last_entry].bank = bank; 19058c2ecf20Sopenharmony_ci tnr_dmd->cfg_mem[tnr_dmd->cfg_mem_last_entry].address = address; 19068c2ecf20Sopenharmony_ci tnr_dmd->cfg_mem[tnr_dmd->cfg_mem_last_entry].value = (value & bit_mask); 19078c2ecf20Sopenharmony_ci tnr_dmd->cfg_mem[tnr_dmd->cfg_mem_last_entry].bit_mask = bit_mask; 19088c2ecf20Sopenharmony_ci tnr_dmd->cfg_mem_last_entry++; 19098c2ecf20Sopenharmony_ci } else { 19108c2ecf20Sopenharmony_ci return -ENOMEM; 19118c2ecf20Sopenharmony_ci } 19128c2ecf20Sopenharmony_ci 19138c2ecf20Sopenharmony_ci return 0; 19148c2ecf20Sopenharmony_ci} 19158c2ecf20Sopenharmony_ci 19168c2ecf20Sopenharmony_ciint cxd2880_tnrdmd_create(struct cxd2880_tnrdmd *tnr_dmd, 19178c2ecf20Sopenharmony_ci struct cxd2880_io *io, 19188c2ecf20Sopenharmony_ci struct cxd2880_tnrdmd_create_param 19198c2ecf20Sopenharmony_ci *create_param) 19208c2ecf20Sopenharmony_ci{ 19218c2ecf20Sopenharmony_ci if (!tnr_dmd || !io || !create_param) 19228c2ecf20Sopenharmony_ci return -EINVAL; 19238c2ecf20Sopenharmony_ci 19248c2ecf20Sopenharmony_ci memset(tnr_dmd, 0, sizeof(struct cxd2880_tnrdmd)); 19258c2ecf20Sopenharmony_ci 19268c2ecf20Sopenharmony_ci tnr_dmd->io = io; 19278c2ecf20Sopenharmony_ci tnr_dmd->create_param = *create_param; 19288c2ecf20Sopenharmony_ci 19298c2ecf20Sopenharmony_ci tnr_dmd->diver_mode = CXD2880_TNRDMD_DIVERMODE_SINGLE; 19308c2ecf20Sopenharmony_ci tnr_dmd->diver_sub = NULL; 19318c2ecf20Sopenharmony_ci 19328c2ecf20Sopenharmony_ci tnr_dmd->srl_ts_clk_mod_cnts = 1; 19338c2ecf20Sopenharmony_ci tnr_dmd->en_fef_intmtnt_base = 1; 19348c2ecf20Sopenharmony_ci tnr_dmd->en_fef_intmtnt_lite = 1; 19358c2ecf20Sopenharmony_ci tnr_dmd->rf_lvl_cmpstn = NULL; 19368c2ecf20Sopenharmony_ci tnr_dmd->lna_thrs_tbl_air = NULL; 19378c2ecf20Sopenharmony_ci tnr_dmd->lna_thrs_tbl_cable = NULL; 19388c2ecf20Sopenharmony_ci atomic_set(&tnr_dmd->cancel, 0); 19398c2ecf20Sopenharmony_ci 19408c2ecf20Sopenharmony_ci return 0; 19418c2ecf20Sopenharmony_ci} 19428c2ecf20Sopenharmony_ci 19438c2ecf20Sopenharmony_ciint cxd2880_tnrdmd_diver_create(struct cxd2880_tnrdmd 19448c2ecf20Sopenharmony_ci *tnr_dmd_main, 19458c2ecf20Sopenharmony_ci struct cxd2880_io *io_main, 19468c2ecf20Sopenharmony_ci struct cxd2880_tnrdmd *tnr_dmd_sub, 19478c2ecf20Sopenharmony_ci struct cxd2880_io *io_sub, 19488c2ecf20Sopenharmony_ci struct 19498c2ecf20Sopenharmony_ci cxd2880_tnrdmd_diver_create_param 19508c2ecf20Sopenharmony_ci *create_param) 19518c2ecf20Sopenharmony_ci{ 19528c2ecf20Sopenharmony_ci struct cxd2880_tnrdmd_create_param *main_param, *sub_param; 19538c2ecf20Sopenharmony_ci 19548c2ecf20Sopenharmony_ci if (!tnr_dmd_main || !io_main || !tnr_dmd_sub || !io_sub || 19558c2ecf20Sopenharmony_ci !create_param) 19568c2ecf20Sopenharmony_ci return -EINVAL; 19578c2ecf20Sopenharmony_ci 19588c2ecf20Sopenharmony_ci memset(tnr_dmd_main, 0, sizeof(struct cxd2880_tnrdmd)); 19598c2ecf20Sopenharmony_ci memset(tnr_dmd_sub, 0, sizeof(struct cxd2880_tnrdmd)); 19608c2ecf20Sopenharmony_ci 19618c2ecf20Sopenharmony_ci main_param = &tnr_dmd_main->create_param; 19628c2ecf20Sopenharmony_ci sub_param = &tnr_dmd_sub->create_param; 19638c2ecf20Sopenharmony_ci 19648c2ecf20Sopenharmony_ci tnr_dmd_main->io = io_main; 19658c2ecf20Sopenharmony_ci tnr_dmd_main->diver_mode = CXD2880_TNRDMD_DIVERMODE_MAIN; 19668c2ecf20Sopenharmony_ci tnr_dmd_main->diver_sub = tnr_dmd_sub; 19678c2ecf20Sopenharmony_ci tnr_dmd_main->create_param.en_internal_ldo = 19688c2ecf20Sopenharmony_ci create_param->en_internal_ldo; 19698c2ecf20Sopenharmony_ci 19708c2ecf20Sopenharmony_ci main_param->ts_output_if = create_param->ts_output_if; 19718c2ecf20Sopenharmony_ci main_param->xtal_share_type = CXD2880_TNRDMD_XTAL_SHARE_MASTER; 19728c2ecf20Sopenharmony_ci main_param->xosc_cap = create_param->xosc_cap_main; 19738c2ecf20Sopenharmony_ci main_param->xosc_i = create_param->xosc_i_main; 19748c2ecf20Sopenharmony_ci main_param->is_cxd2881gg = create_param->is_cxd2881gg; 19758c2ecf20Sopenharmony_ci main_param->stationary_use = create_param->stationary_use; 19768c2ecf20Sopenharmony_ci 19778c2ecf20Sopenharmony_ci tnr_dmd_sub->io = io_sub; 19788c2ecf20Sopenharmony_ci tnr_dmd_sub->diver_mode = CXD2880_TNRDMD_DIVERMODE_SUB; 19798c2ecf20Sopenharmony_ci tnr_dmd_sub->diver_sub = NULL; 19808c2ecf20Sopenharmony_ci 19818c2ecf20Sopenharmony_ci sub_param->en_internal_ldo = create_param->en_internal_ldo; 19828c2ecf20Sopenharmony_ci sub_param->ts_output_if = create_param->ts_output_if; 19838c2ecf20Sopenharmony_ci sub_param->xtal_share_type = CXD2880_TNRDMD_XTAL_SHARE_SLAVE; 19848c2ecf20Sopenharmony_ci sub_param->xosc_cap = 0; 19858c2ecf20Sopenharmony_ci sub_param->xosc_i = create_param->xosc_i_sub; 19868c2ecf20Sopenharmony_ci sub_param->is_cxd2881gg = create_param->is_cxd2881gg; 19878c2ecf20Sopenharmony_ci sub_param->stationary_use = create_param->stationary_use; 19888c2ecf20Sopenharmony_ci 19898c2ecf20Sopenharmony_ci tnr_dmd_main->srl_ts_clk_mod_cnts = 1; 19908c2ecf20Sopenharmony_ci tnr_dmd_main->en_fef_intmtnt_base = 1; 19918c2ecf20Sopenharmony_ci tnr_dmd_main->en_fef_intmtnt_lite = 1; 19928c2ecf20Sopenharmony_ci tnr_dmd_main->rf_lvl_cmpstn = NULL; 19938c2ecf20Sopenharmony_ci tnr_dmd_main->lna_thrs_tbl_air = NULL; 19948c2ecf20Sopenharmony_ci tnr_dmd_main->lna_thrs_tbl_cable = NULL; 19958c2ecf20Sopenharmony_ci 19968c2ecf20Sopenharmony_ci tnr_dmd_sub->srl_ts_clk_mod_cnts = 1; 19978c2ecf20Sopenharmony_ci tnr_dmd_sub->en_fef_intmtnt_base = 1; 19988c2ecf20Sopenharmony_ci tnr_dmd_sub->en_fef_intmtnt_lite = 1; 19998c2ecf20Sopenharmony_ci tnr_dmd_sub->rf_lvl_cmpstn = NULL; 20008c2ecf20Sopenharmony_ci tnr_dmd_sub->lna_thrs_tbl_air = NULL; 20018c2ecf20Sopenharmony_ci tnr_dmd_sub->lna_thrs_tbl_cable = NULL; 20028c2ecf20Sopenharmony_ci 20038c2ecf20Sopenharmony_ci return 0; 20048c2ecf20Sopenharmony_ci} 20058c2ecf20Sopenharmony_ci 20068c2ecf20Sopenharmony_ciint cxd2880_tnrdmd_init1(struct cxd2880_tnrdmd *tnr_dmd) 20078c2ecf20Sopenharmony_ci{ 20088c2ecf20Sopenharmony_ci int ret; 20098c2ecf20Sopenharmony_ci 20108c2ecf20Sopenharmony_ci if (!tnr_dmd || tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB) 20118c2ecf20Sopenharmony_ci return -EINVAL; 20128c2ecf20Sopenharmony_ci 20138c2ecf20Sopenharmony_ci tnr_dmd->chip_id = CXD2880_TNRDMD_CHIP_ID_UNKNOWN; 20148c2ecf20Sopenharmony_ci tnr_dmd->state = CXD2880_TNRDMD_STATE_UNKNOWN; 20158c2ecf20Sopenharmony_ci tnr_dmd->clk_mode = CXD2880_TNRDMD_CLOCKMODE_UNKNOWN; 20168c2ecf20Sopenharmony_ci tnr_dmd->frequency_khz = 0; 20178c2ecf20Sopenharmony_ci tnr_dmd->sys = CXD2880_DTV_SYS_UNKNOWN; 20188c2ecf20Sopenharmony_ci tnr_dmd->bandwidth = CXD2880_DTV_BW_UNKNOWN; 20198c2ecf20Sopenharmony_ci tnr_dmd->scan_mode = 0; 20208c2ecf20Sopenharmony_ci atomic_set(&tnr_dmd->cancel, 0); 20218c2ecf20Sopenharmony_ci 20228c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) { 20238c2ecf20Sopenharmony_ci tnr_dmd->diver_sub->chip_id = CXD2880_TNRDMD_CHIP_ID_UNKNOWN; 20248c2ecf20Sopenharmony_ci tnr_dmd->diver_sub->state = CXD2880_TNRDMD_STATE_UNKNOWN; 20258c2ecf20Sopenharmony_ci tnr_dmd->diver_sub->clk_mode = CXD2880_TNRDMD_CLOCKMODE_UNKNOWN; 20268c2ecf20Sopenharmony_ci tnr_dmd->diver_sub->frequency_khz = 0; 20278c2ecf20Sopenharmony_ci tnr_dmd->diver_sub->sys = CXD2880_DTV_SYS_UNKNOWN; 20288c2ecf20Sopenharmony_ci tnr_dmd->diver_sub->bandwidth = CXD2880_DTV_BW_UNKNOWN; 20298c2ecf20Sopenharmony_ci tnr_dmd->diver_sub->scan_mode = 0; 20308c2ecf20Sopenharmony_ci atomic_set(&tnr_dmd->diver_sub->cancel, 0); 20318c2ecf20Sopenharmony_ci } 20328c2ecf20Sopenharmony_ci 20338c2ecf20Sopenharmony_ci ret = cxd2880_tnrdmd_chip_id(tnr_dmd, &tnr_dmd->chip_id); 20348c2ecf20Sopenharmony_ci if (ret) 20358c2ecf20Sopenharmony_ci return ret; 20368c2ecf20Sopenharmony_ci 20378c2ecf20Sopenharmony_ci if (!CXD2880_TNRDMD_CHIP_ID_VALID(tnr_dmd->chip_id)) 20388c2ecf20Sopenharmony_ci return -ENOTTY; 20398c2ecf20Sopenharmony_ci 20408c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) { 20418c2ecf20Sopenharmony_ci ret = 20428c2ecf20Sopenharmony_ci cxd2880_tnrdmd_chip_id(tnr_dmd->diver_sub, 20438c2ecf20Sopenharmony_ci &tnr_dmd->diver_sub->chip_id); 20448c2ecf20Sopenharmony_ci if (ret) 20458c2ecf20Sopenharmony_ci return ret; 20468c2ecf20Sopenharmony_ci 20478c2ecf20Sopenharmony_ci if (!CXD2880_TNRDMD_CHIP_ID_VALID(tnr_dmd->diver_sub->chip_id)) 20488c2ecf20Sopenharmony_ci return -ENOTTY; 20498c2ecf20Sopenharmony_ci } 20508c2ecf20Sopenharmony_ci 20518c2ecf20Sopenharmony_ci ret = p_init1(tnr_dmd); 20528c2ecf20Sopenharmony_ci if (ret) 20538c2ecf20Sopenharmony_ci return ret; 20548c2ecf20Sopenharmony_ci 20558c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) { 20568c2ecf20Sopenharmony_ci ret = p_init1(tnr_dmd->diver_sub); 20578c2ecf20Sopenharmony_ci if (ret) 20588c2ecf20Sopenharmony_ci return ret; 20598c2ecf20Sopenharmony_ci } 20608c2ecf20Sopenharmony_ci 20618c2ecf20Sopenharmony_ci usleep_range(1000, 2000); 20628c2ecf20Sopenharmony_ci 20638c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) { 20648c2ecf20Sopenharmony_ci ret = p_init2(tnr_dmd->diver_sub); 20658c2ecf20Sopenharmony_ci if (ret) 20668c2ecf20Sopenharmony_ci return ret; 20678c2ecf20Sopenharmony_ci } 20688c2ecf20Sopenharmony_ci 20698c2ecf20Sopenharmony_ci ret = p_init2(tnr_dmd); 20708c2ecf20Sopenharmony_ci if (ret) 20718c2ecf20Sopenharmony_ci return ret; 20728c2ecf20Sopenharmony_ci 20738c2ecf20Sopenharmony_ci usleep_range(5000, 6000); 20748c2ecf20Sopenharmony_ci 20758c2ecf20Sopenharmony_ci ret = p_init3(tnr_dmd); 20768c2ecf20Sopenharmony_ci if (ret) 20778c2ecf20Sopenharmony_ci return ret; 20788c2ecf20Sopenharmony_ci 20798c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) { 20808c2ecf20Sopenharmony_ci ret = p_init3(tnr_dmd->diver_sub); 20818c2ecf20Sopenharmony_ci if (ret) 20828c2ecf20Sopenharmony_ci return ret; 20838c2ecf20Sopenharmony_ci } 20848c2ecf20Sopenharmony_ci 20858c2ecf20Sopenharmony_ci ret = rf_init1(tnr_dmd); 20868c2ecf20Sopenharmony_ci if (ret) 20878c2ecf20Sopenharmony_ci return ret; 20888c2ecf20Sopenharmony_ci 20898c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) 20908c2ecf20Sopenharmony_ci ret = rf_init1(tnr_dmd->diver_sub); 20918c2ecf20Sopenharmony_ci 20928c2ecf20Sopenharmony_ci return ret; 20938c2ecf20Sopenharmony_ci} 20948c2ecf20Sopenharmony_ci 20958c2ecf20Sopenharmony_ciint cxd2880_tnrdmd_init2(struct cxd2880_tnrdmd *tnr_dmd) 20968c2ecf20Sopenharmony_ci{ 20978c2ecf20Sopenharmony_ci u8 cpu_task_completed; 20988c2ecf20Sopenharmony_ci int ret; 20998c2ecf20Sopenharmony_ci 21008c2ecf20Sopenharmony_ci if (!tnr_dmd) 21018c2ecf20Sopenharmony_ci return -EINVAL; 21028c2ecf20Sopenharmony_ci 21038c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB) 21048c2ecf20Sopenharmony_ci return -EINVAL; 21058c2ecf20Sopenharmony_ci 21068c2ecf20Sopenharmony_ci ret = cxd2880_tnrdmd_check_internal_cpu_status(tnr_dmd, 21078c2ecf20Sopenharmony_ci &cpu_task_completed); 21088c2ecf20Sopenharmony_ci if (ret) 21098c2ecf20Sopenharmony_ci return ret; 21108c2ecf20Sopenharmony_ci 21118c2ecf20Sopenharmony_ci if (!cpu_task_completed) 21128c2ecf20Sopenharmony_ci return -EINVAL; 21138c2ecf20Sopenharmony_ci 21148c2ecf20Sopenharmony_ci ret = rf_init2(tnr_dmd); 21158c2ecf20Sopenharmony_ci if (ret) 21168c2ecf20Sopenharmony_ci return ret; 21178c2ecf20Sopenharmony_ci 21188c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) { 21198c2ecf20Sopenharmony_ci ret = rf_init2(tnr_dmd->diver_sub); 21208c2ecf20Sopenharmony_ci if (ret) 21218c2ecf20Sopenharmony_ci return ret; 21228c2ecf20Sopenharmony_ci } 21238c2ecf20Sopenharmony_ci 21248c2ecf20Sopenharmony_ci ret = load_cfg_mem(tnr_dmd); 21258c2ecf20Sopenharmony_ci if (ret) 21268c2ecf20Sopenharmony_ci return ret; 21278c2ecf20Sopenharmony_ci 21288c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) { 21298c2ecf20Sopenharmony_ci ret = load_cfg_mem(tnr_dmd->diver_sub); 21308c2ecf20Sopenharmony_ci if (ret) 21318c2ecf20Sopenharmony_ci return ret; 21328c2ecf20Sopenharmony_ci } 21338c2ecf20Sopenharmony_ci 21348c2ecf20Sopenharmony_ci tnr_dmd->state = CXD2880_TNRDMD_STATE_SLEEP; 21358c2ecf20Sopenharmony_ci 21368c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) 21378c2ecf20Sopenharmony_ci tnr_dmd->diver_sub->state = CXD2880_TNRDMD_STATE_SLEEP; 21388c2ecf20Sopenharmony_ci 21398c2ecf20Sopenharmony_ci return ret; 21408c2ecf20Sopenharmony_ci} 21418c2ecf20Sopenharmony_ci 21428c2ecf20Sopenharmony_ciint cxd2880_tnrdmd_check_internal_cpu_status(struct cxd2880_tnrdmd 21438c2ecf20Sopenharmony_ci *tnr_dmd, 21448c2ecf20Sopenharmony_ci u8 *task_completed) 21458c2ecf20Sopenharmony_ci{ 21468c2ecf20Sopenharmony_ci u16 cpu_status = 0; 21478c2ecf20Sopenharmony_ci int ret; 21488c2ecf20Sopenharmony_ci 21498c2ecf20Sopenharmony_ci if (!tnr_dmd || !task_completed) 21508c2ecf20Sopenharmony_ci return -EINVAL; 21518c2ecf20Sopenharmony_ci 21528c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB) 21538c2ecf20Sopenharmony_ci return -EINVAL; 21548c2ecf20Sopenharmony_ci 21558c2ecf20Sopenharmony_ci ret = cxd2880_tnrdmd_mon_internal_cpu_status(tnr_dmd, &cpu_status); 21568c2ecf20Sopenharmony_ci if (ret) 21578c2ecf20Sopenharmony_ci return ret; 21588c2ecf20Sopenharmony_ci 21598c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SINGLE) { 21608c2ecf20Sopenharmony_ci if (cpu_status == 0) 21618c2ecf20Sopenharmony_ci *task_completed = 1; 21628c2ecf20Sopenharmony_ci else 21638c2ecf20Sopenharmony_ci *task_completed = 0; 21648c2ecf20Sopenharmony_ci 21658c2ecf20Sopenharmony_ci return ret; 21668c2ecf20Sopenharmony_ci } 21678c2ecf20Sopenharmony_ci if (cpu_status != 0) { 21688c2ecf20Sopenharmony_ci *task_completed = 0; 21698c2ecf20Sopenharmony_ci return ret; 21708c2ecf20Sopenharmony_ci } 21718c2ecf20Sopenharmony_ci 21728c2ecf20Sopenharmony_ci ret = cxd2880_tnrdmd_mon_internal_cpu_status_sub(tnr_dmd, &cpu_status); 21738c2ecf20Sopenharmony_ci if (ret) 21748c2ecf20Sopenharmony_ci return ret; 21758c2ecf20Sopenharmony_ci 21768c2ecf20Sopenharmony_ci if (cpu_status == 0) 21778c2ecf20Sopenharmony_ci *task_completed = 1; 21788c2ecf20Sopenharmony_ci else 21798c2ecf20Sopenharmony_ci *task_completed = 0; 21808c2ecf20Sopenharmony_ci 21818c2ecf20Sopenharmony_ci return ret; 21828c2ecf20Sopenharmony_ci} 21838c2ecf20Sopenharmony_ci 21848c2ecf20Sopenharmony_ciint cxd2880_tnrdmd_common_tune_setting1(struct cxd2880_tnrdmd *tnr_dmd, 21858c2ecf20Sopenharmony_ci enum cxd2880_dtv_sys sys, 21868c2ecf20Sopenharmony_ci u32 frequency_khz, 21878c2ecf20Sopenharmony_ci enum cxd2880_dtv_bandwidth 21888c2ecf20Sopenharmony_ci bandwidth, u8 one_seg_opt, 21898c2ecf20Sopenharmony_ci u8 one_seg_opt_shft_dir) 21908c2ecf20Sopenharmony_ci{ 21918c2ecf20Sopenharmony_ci u8 data; 21928c2ecf20Sopenharmony_ci enum cxd2880_tnrdmd_clockmode new_clk_mode = 21938c2ecf20Sopenharmony_ci CXD2880_TNRDMD_CLOCKMODE_A; 21948c2ecf20Sopenharmony_ci int shift_frequency_khz; 21958c2ecf20Sopenharmony_ci u8 cpu_task_completed; 21968c2ecf20Sopenharmony_ci int ret; 21978c2ecf20Sopenharmony_ci 21988c2ecf20Sopenharmony_ci if (!tnr_dmd) 21998c2ecf20Sopenharmony_ci return -EINVAL; 22008c2ecf20Sopenharmony_ci 22018c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB) 22028c2ecf20Sopenharmony_ci return -EINVAL; 22038c2ecf20Sopenharmony_ci 22048c2ecf20Sopenharmony_ci if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP && 22058c2ecf20Sopenharmony_ci tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE) 22068c2ecf20Sopenharmony_ci return -EINVAL; 22078c2ecf20Sopenharmony_ci 22088c2ecf20Sopenharmony_ci if (frequency_khz < 4000) 22098c2ecf20Sopenharmony_ci return -EINVAL; 22108c2ecf20Sopenharmony_ci 22118c2ecf20Sopenharmony_ci ret = cxd2880_tnrdmd_sleep(tnr_dmd); 22128c2ecf20Sopenharmony_ci if (ret) 22138c2ecf20Sopenharmony_ci return ret; 22148c2ecf20Sopenharmony_ci 22158c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 22168c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 22178c2ecf20Sopenharmony_ci 0x00, 22188c2ecf20Sopenharmony_ci 0x00); 22198c2ecf20Sopenharmony_ci if (ret) 22208c2ecf20Sopenharmony_ci return ret; 22218c2ecf20Sopenharmony_ci 22228c2ecf20Sopenharmony_ci ret = tnr_dmd->io->read_regs(tnr_dmd->io, 22238c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 22248c2ecf20Sopenharmony_ci 0x2b, 22258c2ecf20Sopenharmony_ci &data, 22268c2ecf20Sopenharmony_ci 1); 22278c2ecf20Sopenharmony_ci if (ret) 22288c2ecf20Sopenharmony_ci return ret; 22298c2ecf20Sopenharmony_ci 22308c2ecf20Sopenharmony_ci switch (sys) { 22318c2ecf20Sopenharmony_ci case CXD2880_DTV_SYS_DVBT: 22328c2ecf20Sopenharmony_ci if (data == 0x00) { 22338c2ecf20Sopenharmony_ci ret = t_power_x(tnr_dmd, 1); 22348c2ecf20Sopenharmony_ci if (ret) 22358c2ecf20Sopenharmony_ci return ret; 22368c2ecf20Sopenharmony_ci 22378c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == 22388c2ecf20Sopenharmony_ci CXD2880_TNRDMD_DIVERMODE_MAIN) { 22398c2ecf20Sopenharmony_ci ret = t_power_x(tnr_dmd->diver_sub, 1); 22408c2ecf20Sopenharmony_ci if (ret) 22418c2ecf20Sopenharmony_ci return ret; 22428c2ecf20Sopenharmony_ci } 22438c2ecf20Sopenharmony_ci } 22448c2ecf20Sopenharmony_ci break; 22458c2ecf20Sopenharmony_ci 22468c2ecf20Sopenharmony_ci case CXD2880_DTV_SYS_DVBT2: 22478c2ecf20Sopenharmony_ci if (data == 0x01) { 22488c2ecf20Sopenharmony_ci ret = t_power_x(tnr_dmd, 0); 22498c2ecf20Sopenharmony_ci if (ret) 22508c2ecf20Sopenharmony_ci return ret; 22518c2ecf20Sopenharmony_ci 22528c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == 22538c2ecf20Sopenharmony_ci CXD2880_TNRDMD_DIVERMODE_MAIN) { 22548c2ecf20Sopenharmony_ci ret = t_power_x(tnr_dmd->diver_sub, 0); 22558c2ecf20Sopenharmony_ci if (ret) 22568c2ecf20Sopenharmony_ci return ret; 22578c2ecf20Sopenharmony_ci } 22588c2ecf20Sopenharmony_ci } 22598c2ecf20Sopenharmony_ci break; 22608c2ecf20Sopenharmony_ci 22618c2ecf20Sopenharmony_ci default: 22628c2ecf20Sopenharmony_ci return -EINVAL; 22638c2ecf20Sopenharmony_ci } 22648c2ecf20Sopenharmony_ci 22658c2ecf20Sopenharmony_ci ret = spll_reset(tnr_dmd, new_clk_mode); 22668c2ecf20Sopenharmony_ci if (ret) 22678c2ecf20Sopenharmony_ci return ret; 22688c2ecf20Sopenharmony_ci 22698c2ecf20Sopenharmony_ci tnr_dmd->clk_mode = new_clk_mode; 22708c2ecf20Sopenharmony_ci 22718c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) { 22728c2ecf20Sopenharmony_ci ret = spll_reset(tnr_dmd->diver_sub, new_clk_mode); 22738c2ecf20Sopenharmony_ci if (ret) 22748c2ecf20Sopenharmony_ci return ret; 22758c2ecf20Sopenharmony_ci 22768c2ecf20Sopenharmony_ci tnr_dmd->diver_sub->clk_mode = new_clk_mode; 22778c2ecf20Sopenharmony_ci } 22788c2ecf20Sopenharmony_ci 22798c2ecf20Sopenharmony_ci ret = load_cfg_mem(tnr_dmd); 22808c2ecf20Sopenharmony_ci if (ret) 22818c2ecf20Sopenharmony_ci return ret; 22828c2ecf20Sopenharmony_ci 22838c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) { 22848c2ecf20Sopenharmony_ci ret = load_cfg_mem(tnr_dmd->diver_sub); 22858c2ecf20Sopenharmony_ci if (ret) 22868c2ecf20Sopenharmony_ci return ret; 22878c2ecf20Sopenharmony_ci } 22888c2ecf20Sopenharmony_ci 22898c2ecf20Sopenharmony_ci if (one_seg_opt) { 22908c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == 22918c2ecf20Sopenharmony_ci CXD2880_TNRDMD_DIVERMODE_MAIN) { 22928c2ecf20Sopenharmony_ci shift_frequency_khz = 350; 22938c2ecf20Sopenharmony_ci } else { 22948c2ecf20Sopenharmony_ci if (one_seg_opt_shft_dir) 22958c2ecf20Sopenharmony_ci shift_frequency_khz = 350; 22968c2ecf20Sopenharmony_ci else 22978c2ecf20Sopenharmony_ci shift_frequency_khz = -350; 22988c2ecf20Sopenharmony_ci 22998c2ecf20Sopenharmony_ci if (tnr_dmd->create_param.xtal_share_type == 23008c2ecf20Sopenharmony_ci CXD2880_TNRDMD_XTAL_SHARE_SLAVE) 23018c2ecf20Sopenharmony_ci shift_frequency_khz *= -1; 23028c2ecf20Sopenharmony_ci } 23038c2ecf20Sopenharmony_ci } else { 23048c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == 23058c2ecf20Sopenharmony_ci CXD2880_TNRDMD_DIVERMODE_MAIN) { 23068c2ecf20Sopenharmony_ci shift_frequency_khz = 150; 23078c2ecf20Sopenharmony_ci } else { 23088c2ecf20Sopenharmony_ci switch (tnr_dmd->create_param.xtal_share_type) { 23098c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_XTAL_SHARE_NONE: 23108c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_XTAL_SHARE_EXTREF: 23118c2ecf20Sopenharmony_ci default: 23128c2ecf20Sopenharmony_ci shift_frequency_khz = 0; 23138c2ecf20Sopenharmony_ci break; 23148c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_XTAL_SHARE_MASTER: 23158c2ecf20Sopenharmony_ci shift_frequency_khz = 150; 23168c2ecf20Sopenharmony_ci break; 23178c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_XTAL_SHARE_SLAVE: 23188c2ecf20Sopenharmony_ci shift_frequency_khz = -150; 23198c2ecf20Sopenharmony_ci break; 23208c2ecf20Sopenharmony_ci } 23218c2ecf20Sopenharmony_ci } 23228c2ecf20Sopenharmony_ci } 23238c2ecf20Sopenharmony_ci 23248c2ecf20Sopenharmony_ci ret = 23258c2ecf20Sopenharmony_ci x_tune1(tnr_dmd, sys, frequency_khz, bandwidth, 23268c2ecf20Sopenharmony_ci tnr_dmd->is_cable_input, shift_frequency_khz); 23278c2ecf20Sopenharmony_ci if (ret) 23288c2ecf20Sopenharmony_ci return ret; 23298c2ecf20Sopenharmony_ci 23308c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) { 23318c2ecf20Sopenharmony_ci ret = 23328c2ecf20Sopenharmony_ci x_tune1(tnr_dmd->diver_sub, sys, frequency_khz, 23338c2ecf20Sopenharmony_ci bandwidth, tnr_dmd->is_cable_input, 23348c2ecf20Sopenharmony_ci -shift_frequency_khz); 23358c2ecf20Sopenharmony_ci if (ret) 23368c2ecf20Sopenharmony_ci return ret; 23378c2ecf20Sopenharmony_ci } 23388c2ecf20Sopenharmony_ci 23398c2ecf20Sopenharmony_ci usleep_range(10000, 11000); 23408c2ecf20Sopenharmony_ci 23418c2ecf20Sopenharmony_ci ret = 23428c2ecf20Sopenharmony_ci cxd2880_tnrdmd_check_internal_cpu_status(tnr_dmd, 23438c2ecf20Sopenharmony_ci &cpu_task_completed); 23448c2ecf20Sopenharmony_ci if (ret) 23458c2ecf20Sopenharmony_ci return ret; 23468c2ecf20Sopenharmony_ci 23478c2ecf20Sopenharmony_ci if (!cpu_task_completed) 23488c2ecf20Sopenharmony_ci return -EINVAL; 23498c2ecf20Sopenharmony_ci 23508c2ecf20Sopenharmony_ci ret = 23518c2ecf20Sopenharmony_ci x_tune2(tnr_dmd, bandwidth, tnr_dmd->clk_mode, 23528c2ecf20Sopenharmony_ci shift_frequency_khz); 23538c2ecf20Sopenharmony_ci if (ret) 23548c2ecf20Sopenharmony_ci return ret; 23558c2ecf20Sopenharmony_ci 23568c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) { 23578c2ecf20Sopenharmony_ci ret = 23588c2ecf20Sopenharmony_ci x_tune2(tnr_dmd->diver_sub, bandwidth, 23598c2ecf20Sopenharmony_ci tnr_dmd->diver_sub->clk_mode, 23608c2ecf20Sopenharmony_ci -shift_frequency_khz); 23618c2ecf20Sopenharmony_ci if (ret) 23628c2ecf20Sopenharmony_ci return ret; 23638c2ecf20Sopenharmony_ci } 23648c2ecf20Sopenharmony_ci 23658c2ecf20Sopenharmony_ci if (tnr_dmd->create_param.ts_output_if == CXD2880_TNRDMD_TSOUT_IF_TS) { 23668c2ecf20Sopenharmony_ci ret = set_ts_clk_mode_and_freq(tnr_dmd, sys); 23678c2ecf20Sopenharmony_ci } else { 23688c2ecf20Sopenharmony_ci struct cxd2880_tnrdmd_pid_ftr_cfg *pid_ftr_cfg; 23698c2ecf20Sopenharmony_ci 23708c2ecf20Sopenharmony_ci if (tnr_dmd->pid_ftr_cfg_en) 23718c2ecf20Sopenharmony_ci pid_ftr_cfg = &tnr_dmd->pid_ftr_cfg; 23728c2ecf20Sopenharmony_ci else 23738c2ecf20Sopenharmony_ci pid_ftr_cfg = NULL; 23748c2ecf20Sopenharmony_ci 23758c2ecf20Sopenharmony_ci ret = pid_ftr_setting(tnr_dmd, pid_ftr_cfg); 23768c2ecf20Sopenharmony_ci } 23778c2ecf20Sopenharmony_ci 23788c2ecf20Sopenharmony_ci return ret; 23798c2ecf20Sopenharmony_ci} 23808c2ecf20Sopenharmony_ci 23818c2ecf20Sopenharmony_ciint cxd2880_tnrdmd_common_tune_setting2(struct cxd2880_tnrdmd 23828c2ecf20Sopenharmony_ci *tnr_dmd, 23838c2ecf20Sopenharmony_ci enum cxd2880_dtv_sys sys, 23848c2ecf20Sopenharmony_ci u8 en_fef_intmtnt_ctrl) 23858c2ecf20Sopenharmony_ci{ 23868c2ecf20Sopenharmony_ci int ret; 23878c2ecf20Sopenharmony_ci 23888c2ecf20Sopenharmony_ci if (!tnr_dmd) 23898c2ecf20Sopenharmony_ci return -EINVAL; 23908c2ecf20Sopenharmony_ci 23918c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB) 23928c2ecf20Sopenharmony_ci return -EINVAL; 23938c2ecf20Sopenharmony_ci 23948c2ecf20Sopenharmony_ci if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP && 23958c2ecf20Sopenharmony_ci tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE) 23968c2ecf20Sopenharmony_ci return -EINVAL; 23978c2ecf20Sopenharmony_ci 23988c2ecf20Sopenharmony_ci ret = x_tune3(tnr_dmd, sys, en_fef_intmtnt_ctrl); 23998c2ecf20Sopenharmony_ci if (ret) 24008c2ecf20Sopenharmony_ci return ret; 24018c2ecf20Sopenharmony_ci 24028c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) { 24038c2ecf20Sopenharmony_ci ret = x_tune3(tnr_dmd->diver_sub, sys, en_fef_intmtnt_ctrl); 24048c2ecf20Sopenharmony_ci if (ret) 24058c2ecf20Sopenharmony_ci return ret; 24068c2ecf20Sopenharmony_ci ret = x_tune4(tnr_dmd); 24078c2ecf20Sopenharmony_ci if (ret) 24088c2ecf20Sopenharmony_ci return ret; 24098c2ecf20Sopenharmony_ci } 24108c2ecf20Sopenharmony_ci 24118c2ecf20Sopenharmony_ci return cxd2880_tnrdmd_set_ts_output(tnr_dmd, 1); 24128c2ecf20Sopenharmony_ci} 24138c2ecf20Sopenharmony_ci 24148c2ecf20Sopenharmony_ciint cxd2880_tnrdmd_sleep(struct cxd2880_tnrdmd *tnr_dmd) 24158c2ecf20Sopenharmony_ci{ 24168c2ecf20Sopenharmony_ci int ret; 24178c2ecf20Sopenharmony_ci 24188c2ecf20Sopenharmony_ci if (!tnr_dmd) 24198c2ecf20Sopenharmony_ci return -EINVAL; 24208c2ecf20Sopenharmony_ci 24218c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB) 24228c2ecf20Sopenharmony_ci return -EINVAL; 24238c2ecf20Sopenharmony_ci 24248c2ecf20Sopenharmony_ci if (tnr_dmd->state == CXD2880_TNRDMD_STATE_SLEEP) 24258c2ecf20Sopenharmony_ci return 0; 24268c2ecf20Sopenharmony_ci 24278c2ecf20Sopenharmony_ci if (tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE) 24288c2ecf20Sopenharmony_ci return -EINVAL; 24298c2ecf20Sopenharmony_ci 24308c2ecf20Sopenharmony_ci ret = cxd2880_tnrdmd_set_ts_output(tnr_dmd, 0); 24318c2ecf20Sopenharmony_ci if (ret) 24328c2ecf20Sopenharmony_ci return ret; 24338c2ecf20Sopenharmony_ci 24348c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) { 24358c2ecf20Sopenharmony_ci ret = x_sleep1(tnr_dmd); 24368c2ecf20Sopenharmony_ci if (ret) 24378c2ecf20Sopenharmony_ci return ret; 24388c2ecf20Sopenharmony_ci } 24398c2ecf20Sopenharmony_ci 24408c2ecf20Sopenharmony_ci ret = x_sleep2(tnr_dmd); 24418c2ecf20Sopenharmony_ci if (ret) 24428c2ecf20Sopenharmony_ci return ret; 24438c2ecf20Sopenharmony_ci 24448c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) { 24458c2ecf20Sopenharmony_ci ret = x_sleep2(tnr_dmd->diver_sub); 24468c2ecf20Sopenharmony_ci if (ret) 24478c2ecf20Sopenharmony_ci return ret; 24488c2ecf20Sopenharmony_ci } 24498c2ecf20Sopenharmony_ci 24508c2ecf20Sopenharmony_ci switch (tnr_dmd->sys) { 24518c2ecf20Sopenharmony_ci case CXD2880_DTV_SYS_DVBT: 24528c2ecf20Sopenharmony_ci ret = cxd2880_tnrdmd_dvbt_sleep_setting(tnr_dmd); 24538c2ecf20Sopenharmony_ci if (ret) 24548c2ecf20Sopenharmony_ci return ret; 24558c2ecf20Sopenharmony_ci break; 24568c2ecf20Sopenharmony_ci 24578c2ecf20Sopenharmony_ci case CXD2880_DTV_SYS_DVBT2: 24588c2ecf20Sopenharmony_ci ret = cxd2880_tnrdmd_dvbt2_sleep_setting(tnr_dmd); 24598c2ecf20Sopenharmony_ci if (ret) 24608c2ecf20Sopenharmony_ci return ret; 24618c2ecf20Sopenharmony_ci break; 24628c2ecf20Sopenharmony_ci 24638c2ecf20Sopenharmony_ci default: 24648c2ecf20Sopenharmony_ci return -EINVAL; 24658c2ecf20Sopenharmony_ci } 24668c2ecf20Sopenharmony_ci 24678c2ecf20Sopenharmony_ci ret = x_sleep3(tnr_dmd); 24688c2ecf20Sopenharmony_ci if (ret) 24698c2ecf20Sopenharmony_ci return ret; 24708c2ecf20Sopenharmony_ci 24718c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) { 24728c2ecf20Sopenharmony_ci ret = x_sleep3(tnr_dmd->diver_sub); 24738c2ecf20Sopenharmony_ci if (ret) 24748c2ecf20Sopenharmony_ci return ret; 24758c2ecf20Sopenharmony_ci } 24768c2ecf20Sopenharmony_ci 24778c2ecf20Sopenharmony_ci ret = x_sleep4(tnr_dmd); 24788c2ecf20Sopenharmony_ci if (ret) 24798c2ecf20Sopenharmony_ci return ret; 24808c2ecf20Sopenharmony_ci 24818c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) { 24828c2ecf20Sopenharmony_ci ret = x_sleep4(tnr_dmd->diver_sub); 24838c2ecf20Sopenharmony_ci if (ret) 24848c2ecf20Sopenharmony_ci return ret; 24858c2ecf20Sopenharmony_ci } 24868c2ecf20Sopenharmony_ci 24878c2ecf20Sopenharmony_ci tnr_dmd->state = CXD2880_TNRDMD_STATE_SLEEP; 24888c2ecf20Sopenharmony_ci tnr_dmd->frequency_khz = 0; 24898c2ecf20Sopenharmony_ci tnr_dmd->sys = CXD2880_DTV_SYS_UNKNOWN; 24908c2ecf20Sopenharmony_ci tnr_dmd->bandwidth = CXD2880_DTV_BW_UNKNOWN; 24918c2ecf20Sopenharmony_ci 24928c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) { 24938c2ecf20Sopenharmony_ci tnr_dmd->diver_sub->state = CXD2880_TNRDMD_STATE_SLEEP; 24948c2ecf20Sopenharmony_ci tnr_dmd->diver_sub->frequency_khz = 0; 24958c2ecf20Sopenharmony_ci tnr_dmd->diver_sub->sys = CXD2880_DTV_SYS_UNKNOWN; 24968c2ecf20Sopenharmony_ci tnr_dmd->diver_sub->bandwidth = CXD2880_DTV_BW_UNKNOWN; 24978c2ecf20Sopenharmony_ci } 24988c2ecf20Sopenharmony_ci 24998c2ecf20Sopenharmony_ci return 0; 25008c2ecf20Sopenharmony_ci} 25018c2ecf20Sopenharmony_ci 25028c2ecf20Sopenharmony_ciint cxd2880_tnrdmd_set_cfg(struct cxd2880_tnrdmd *tnr_dmd, 25038c2ecf20Sopenharmony_ci enum cxd2880_tnrdmd_cfg_id id, 25048c2ecf20Sopenharmony_ci int value) 25058c2ecf20Sopenharmony_ci{ 25068c2ecf20Sopenharmony_ci int ret = 0; 25078c2ecf20Sopenharmony_ci u8 data[2] = { 0 }; 25088c2ecf20Sopenharmony_ci u8 need_sub_setting = 0; 25098c2ecf20Sopenharmony_ci 25108c2ecf20Sopenharmony_ci if (!tnr_dmd) 25118c2ecf20Sopenharmony_ci return -EINVAL; 25128c2ecf20Sopenharmony_ci 25138c2ecf20Sopenharmony_ci if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP && 25148c2ecf20Sopenharmony_ci tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE) 25158c2ecf20Sopenharmony_ci return -EINVAL; 25168c2ecf20Sopenharmony_ci 25178c2ecf20Sopenharmony_ci switch (id) { 25188c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CFG_OUTPUT_SEL_MSB: 25198c2ecf20Sopenharmony_ci if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP) 25208c2ecf20Sopenharmony_ci return -EINVAL; 25218c2ecf20Sopenharmony_ci 25228c2ecf20Sopenharmony_ci ret = 25238c2ecf20Sopenharmony_ci cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, 25248c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 25258c2ecf20Sopenharmony_ci 0x00, 0xc4, 25268c2ecf20Sopenharmony_ci value ? 0x00 : 0x10, 25278c2ecf20Sopenharmony_ci 0x10); 25288c2ecf20Sopenharmony_ci if (ret) 25298c2ecf20Sopenharmony_ci return ret; 25308c2ecf20Sopenharmony_ci break; 25318c2ecf20Sopenharmony_ci 25328c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CFG_TSVALID_ACTIVE_HI: 25338c2ecf20Sopenharmony_ci if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP) 25348c2ecf20Sopenharmony_ci return -EINVAL; 25358c2ecf20Sopenharmony_ci 25368c2ecf20Sopenharmony_ci ret = 25378c2ecf20Sopenharmony_ci cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, 25388c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 25398c2ecf20Sopenharmony_ci 0x00, 0xc5, 25408c2ecf20Sopenharmony_ci value ? 0x00 : 0x02, 25418c2ecf20Sopenharmony_ci 0x02); 25428c2ecf20Sopenharmony_ci if (ret) 25438c2ecf20Sopenharmony_ci return ret; 25448c2ecf20Sopenharmony_ci break; 25458c2ecf20Sopenharmony_ci 25468c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CFG_TSSYNC_ACTIVE_HI: 25478c2ecf20Sopenharmony_ci if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP) 25488c2ecf20Sopenharmony_ci return -EINVAL; 25498c2ecf20Sopenharmony_ci 25508c2ecf20Sopenharmony_ci ret = 25518c2ecf20Sopenharmony_ci cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, 25528c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 25538c2ecf20Sopenharmony_ci 0x00, 0xc5, 25548c2ecf20Sopenharmony_ci value ? 0x00 : 0x04, 25558c2ecf20Sopenharmony_ci 0x04); 25568c2ecf20Sopenharmony_ci if (ret) 25578c2ecf20Sopenharmony_ci return ret; 25588c2ecf20Sopenharmony_ci break; 25598c2ecf20Sopenharmony_ci 25608c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CFG_TSERR_ACTIVE_HI: 25618c2ecf20Sopenharmony_ci if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP) 25628c2ecf20Sopenharmony_ci return -EINVAL; 25638c2ecf20Sopenharmony_ci 25648c2ecf20Sopenharmony_ci ret = 25658c2ecf20Sopenharmony_ci cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, 25668c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 25678c2ecf20Sopenharmony_ci 0x00, 0xcb, 25688c2ecf20Sopenharmony_ci value ? 0x00 : 0x01, 25698c2ecf20Sopenharmony_ci 0x01); 25708c2ecf20Sopenharmony_ci if (ret) 25718c2ecf20Sopenharmony_ci return ret; 25728c2ecf20Sopenharmony_ci break; 25738c2ecf20Sopenharmony_ci 25748c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CFG_LATCH_ON_POSEDGE: 25758c2ecf20Sopenharmony_ci if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP) 25768c2ecf20Sopenharmony_ci return -EINVAL; 25778c2ecf20Sopenharmony_ci 25788c2ecf20Sopenharmony_ci ret = 25798c2ecf20Sopenharmony_ci cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, 25808c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 25818c2ecf20Sopenharmony_ci 0x00, 0xc5, 25828c2ecf20Sopenharmony_ci value ? 0x01 : 0x00, 25838c2ecf20Sopenharmony_ci 0x01); 25848c2ecf20Sopenharmony_ci if (ret) 25858c2ecf20Sopenharmony_ci return ret; 25868c2ecf20Sopenharmony_ci break; 25878c2ecf20Sopenharmony_ci 25888c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CFG_TSCLK_CONT: 25898c2ecf20Sopenharmony_ci if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP) 25908c2ecf20Sopenharmony_ci return -EINVAL; 25918c2ecf20Sopenharmony_ci 25928c2ecf20Sopenharmony_ci tnr_dmd->srl_ts_clk_mod_cnts = value ? 0x01 : 0x00; 25938c2ecf20Sopenharmony_ci break; 25948c2ecf20Sopenharmony_ci 25958c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CFG_TSCLK_MASK: 25968c2ecf20Sopenharmony_ci if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP) 25978c2ecf20Sopenharmony_ci return -EINVAL; 25988c2ecf20Sopenharmony_ci 25998c2ecf20Sopenharmony_ci if (value < 0 || value > 0x1f) 26008c2ecf20Sopenharmony_ci return -EINVAL; 26018c2ecf20Sopenharmony_ci 26028c2ecf20Sopenharmony_ci ret = 26038c2ecf20Sopenharmony_ci cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, 26048c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 26058c2ecf20Sopenharmony_ci 0x00, 0xc6, value, 26068c2ecf20Sopenharmony_ci 0x1f); 26078c2ecf20Sopenharmony_ci if (ret) 26088c2ecf20Sopenharmony_ci return ret; 26098c2ecf20Sopenharmony_ci break; 26108c2ecf20Sopenharmony_ci 26118c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CFG_TSVALID_MASK: 26128c2ecf20Sopenharmony_ci if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP) 26138c2ecf20Sopenharmony_ci return -EINVAL; 26148c2ecf20Sopenharmony_ci 26158c2ecf20Sopenharmony_ci if (value < 0 || value > 0x1f) 26168c2ecf20Sopenharmony_ci return -EINVAL; 26178c2ecf20Sopenharmony_ci 26188c2ecf20Sopenharmony_ci ret = 26198c2ecf20Sopenharmony_ci cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, 26208c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 26218c2ecf20Sopenharmony_ci 0x00, 0xc8, value, 26228c2ecf20Sopenharmony_ci 0x1f); 26238c2ecf20Sopenharmony_ci if (ret) 26248c2ecf20Sopenharmony_ci return ret; 26258c2ecf20Sopenharmony_ci break; 26268c2ecf20Sopenharmony_ci 26278c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CFG_TSERR_MASK: 26288c2ecf20Sopenharmony_ci if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP) 26298c2ecf20Sopenharmony_ci return -EINVAL; 26308c2ecf20Sopenharmony_ci 26318c2ecf20Sopenharmony_ci if (value < 0 || value > 0x1f) 26328c2ecf20Sopenharmony_ci return -EINVAL; 26338c2ecf20Sopenharmony_ci 26348c2ecf20Sopenharmony_ci ret = 26358c2ecf20Sopenharmony_ci cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, 26368c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 26378c2ecf20Sopenharmony_ci 0x00, 0xc9, value, 26388c2ecf20Sopenharmony_ci 0x1f); 26398c2ecf20Sopenharmony_ci if (ret) 26408c2ecf20Sopenharmony_ci return ret; 26418c2ecf20Sopenharmony_ci break; 26428c2ecf20Sopenharmony_ci 26438c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CFG_TSERR_VALID_DIS: 26448c2ecf20Sopenharmony_ci if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP) 26458c2ecf20Sopenharmony_ci return -EINVAL; 26468c2ecf20Sopenharmony_ci 26478c2ecf20Sopenharmony_ci ret = 26488c2ecf20Sopenharmony_ci cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, 26498c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 26508c2ecf20Sopenharmony_ci 0x00, 0x91, 26518c2ecf20Sopenharmony_ci value ? 0x01 : 0x00, 26528c2ecf20Sopenharmony_ci 0x01); 26538c2ecf20Sopenharmony_ci if (ret) 26548c2ecf20Sopenharmony_ci return ret; 26558c2ecf20Sopenharmony_ci break; 26568c2ecf20Sopenharmony_ci 26578c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CFG_TSPIN_CURRENT: 26588c2ecf20Sopenharmony_ci if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP) 26598c2ecf20Sopenharmony_ci return -EINVAL; 26608c2ecf20Sopenharmony_ci 26618c2ecf20Sopenharmony_ci ret = 26628c2ecf20Sopenharmony_ci cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, 26638c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 26648c2ecf20Sopenharmony_ci 0x00, 0x51, value, 26658c2ecf20Sopenharmony_ci 0x3f); 26668c2ecf20Sopenharmony_ci if (ret) 26678c2ecf20Sopenharmony_ci return ret; 26688c2ecf20Sopenharmony_ci break; 26698c2ecf20Sopenharmony_ci 26708c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CFG_TSPIN_PULLUP_MANUAL: 26718c2ecf20Sopenharmony_ci if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP) 26728c2ecf20Sopenharmony_ci return -EINVAL; 26738c2ecf20Sopenharmony_ci 26748c2ecf20Sopenharmony_ci ret = 26758c2ecf20Sopenharmony_ci cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, 26768c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 26778c2ecf20Sopenharmony_ci 0x00, 0x50, 26788c2ecf20Sopenharmony_ci value ? 0x80 : 0x00, 26798c2ecf20Sopenharmony_ci 0x80); 26808c2ecf20Sopenharmony_ci if (ret) 26818c2ecf20Sopenharmony_ci return ret; 26828c2ecf20Sopenharmony_ci break; 26838c2ecf20Sopenharmony_ci 26848c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CFG_TSPIN_PULLUP: 26858c2ecf20Sopenharmony_ci if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP) 26868c2ecf20Sopenharmony_ci return -EINVAL; 26878c2ecf20Sopenharmony_ci 26888c2ecf20Sopenharmony_ci ret = 26898c2ecf20Sopenharmony_ci cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, 26908c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 26918c2ecf20Sopenharmony_ci 0x00, 0x50, value, 26928c2ecf20Sopenharmony_ci 0x3f); 26938c2ecf20Sopenharmony_ci if (ret) 26948c2ecf20Sopenharmony_ci return ret; 26958c2ecf20Sopenharmony_ci break; 26968c2ecf20Sopenharmony_ci 26978c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CFG_TSCLK_FREQ: 26988c2ecf20Sopenharmony_ci if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP) 26998c2ecf20Sopenharmony_ci return -EINVAL; 27008c2ecf20Sopenharmony_ci 27018c2ecf20Sopenharmony_ci if (value < 0 || value > 1) 27028c2ecf20Sopenharmony_ci return -EINVAL; 27038c2ecf20Sopenharmony_ci 27048c2ecf20Sopenharmony_ci tnr_dmd->srl_ts_clk_frq = 27058c2ecf20Sopenharmony_ci (enum cxd2880_tnrdmd_serial_ts_clk)value; 27068c2ecf20Sopenharmony_ci break; 27078c2ecf20Sopenharmony_ci 27088c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CFG_TSBYTECLK_MANUAL: 27098c2ecf20Sopenharmony_ci if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP) 27108c2ecf20Sopenharmony_ci return -EINVAL; 27118c2ecf20Sopenharmony_ci 27128c2ecf20Sopenharmony_ci if (value < 0 || value > 0xff) 27138c2ecf20Sopenharmony_ci return -EINVAL; 27148c2ecf20Sopenharmony_ci 27158c2ecf20Sopenharmony_ci tnr_dmd->ts_byte_clk_manual_setting = value; 27168c2ecf20Sopenharmony_ci 27178c2ecf20Sopenharmony_ci break; 27188c2ecf20Sopenharmony_ci 27198c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CFG_TS_PACKET_GAP: 27208c2ecf20Sopenharmony_ci if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP) 27218c2ecf20Sopenharmony_ci return -EINVAL; 27228c2ecf20Sopenharmony_ci 27238c2ecf20Sopenharmony_ci if (value < 0 || value > 7) 27248c2ecf20Sopenharmony_ci return -EINVAL; 27258c2ecf20Sopenharmony_ci 27268c2ecf20Sopenharmony_ci ret = 27278c2ecf20Sopenharmony_ci cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, 27288c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 27298c2ecf20Sopenharmony_ci 0x00, 0xd6, value, 27308c2ecf20Sopenharmony_ci 0x07); 27318c2ecf20Sopenharmony_ci if (ret) 27328c2ecf20Sopenharmony_ci return ret; 27338c2ecf20Sopenharmony_ci 27348c2ecf20Sopenharmony_ci break; 27358c2ecf20Sopenharmony_ci 27368c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CFG_TS_BACKWARDS_COMPATIBLE: 27378c2ecf20Sopenharmony_ci if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP) 27388c2ecf20Sopenharmony_ci return -EINVAL; 27398c2ecf20Sopenharmony_ci 27408c2ecf20Sopenharmony_ci tnr_dmd->is_ts_backwards_compatible_mode = value ? 1 : 0; 27418c2ecf20Sopenharmony_ci 27428c2ecf20Sopenharmony_ci break; 27438c2ecf20Sopenharmony_ci 27448c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CFG_PWM_VALUE: 27458c2ecf20Sopenharmony_ci if (value < 0 || value > 0x1000) 27468c2ecf20Sopenharmony_ci return -EINVAL; 27478c2ecf20Sopenharmony_ci 27488c2ecf20Sopenharmony_ci ret = 27498c2ecf20Sopenharmony_ci cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, 27508c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 27518c2ecf20Sopenharmony_ci 0x00, 0x22, 27528c2ecf20Sopenharmony_ci value ? 0x01 : 0x00, 27538c2ecf20Sopenharmony_ci 0x01); 27548c2ecf20Sopenharmony_ci if (ret) 27558c2ecf20Sopenharmony_ci return ret; 27568c2ecf20Sopenharmony_ci 27578c2ecf20Sopenharmony_ci data[0] = (value >> 8) & 0x1f; 27588c2ecf20Sopenharmony_ci data[1] = value & 0xff; 27598c2ecf20Sopenharmony_ci 27608c2ecf20Sopenharmony_ci ret = 27618c2ecf20Sopenharmony_ci cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, 27628c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 27638c2ecf20Sopenharmony_ci 0x00, 0x23, 27648c2ecf20Sopenharmony_ci data[0], 0x1f); 27658c2ecf20Sopenharmony_ci if (ret) 27668c2ecf20Sopenharmony_ci return ret; 27678c2ecf20Sopenharmony_ci 27688c2ecf20Sopenharmony_ci ret = 27698c2ecf20Sopenharmony_ci cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, 27708c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 27718c2ecf20Sopenharmony_ci 0x00, 0x24, 27728c2ecf20Sopenharmony_ci data[1], 0xff); 27738c2ecf20Sopenharmony_ci if (ret) 27748c2ecf20Sopenharmony_ci return ret; 27758c2ecf20Sopenharmony_ci 27768c2ecf20Sopenharmony_ci break; 27778c2ecf20Sopenharmony_ci 27788c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CFG_INTERRUPT: 27798c2ecf20Sopenharmony_ci data[0] = (value >> 8) & 0xff; 27808c2ecf20Sopenharmony_ci data[1] = value & 0xff; 27818c2ecf20Sopenharmony_ci ret = 27828c2ecf20Sopenharmony_ci cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, 27838c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 27848c2ecf20Sopenharmony_ci 0x00, 0x48, data[0], 27858c2ecf20Sopenharmony_ci 0xff); 27868c2ecf20Sopenharmony_ci if (ret) 27878c2ecf20Sopenharmony_ci return ret; 27888c2ecf20Sopenharmony_ci ret = 27898c2ecf20Sopenharmony_ci cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, 27908c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 27918c2ecf20Sopenharmony_ci 0x00, 0x49, data[1], 27928c2ecf20Sopenharmony_ci 0xff); 27938c2ecf20Sopenharmony_ci if (ret) 27948c2ecf20Sopenharmony_ci return ret; 27958c2ecf20Sopenharmony_ci break; 27968c2ecf20Sopenharmony_ci 27978c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CFG_INTERRUPT_LOCK_SEL: 27988c2ecf20Sopenharmony_ci data[0] = value & 0x07; 27998c2ecf20Sopenharmony_ci ret = 28008c2ecf20Sopenharmony_ci cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, 28018c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 28028c2ecf20Sopenharmony_ci 0x00, 0x4a, data[0], 28038c2ecf20Sopenharmony_ci 0x07); 28048c2ecf20Sopenharmony_ci if (ret) 28058c2ecf20Sopenharmony_ci return ret; 28068c2ecf20Sopenharmony_ci break; 28078c2ecf20Sopenharmony_ci 28088c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CFG_INTERRUPT_INV_LOCK_SEL: 28098c2ecf20Sopenharmony_ci data[0] = (value & 0x07) << 3; 28108c2ecf20Sopenharmony_ci ret = 28118c2ecf20Sopenharmony_ci cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, 28128c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 28138c2ecf20Sopenharmony_ci 0x00, 0x4a, data[0], 28148c2ecf20Sopenharmony_ci 0x38); 28158c2ecf20Sopenharmony_ci if (ret) 28168c2ecf20Sopenharmony_ci return ret; 28178c2ecf20Sopenharmony_ci break; 28188c2ecf20Sopenharmony_ci 28198c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CFG_FIXED_CLOCKMODE: 28208c2ecf20Sopenharmony_ci if (value < CXD2880_TNRDMD_CLOCKMODE_UNKNOWN || 28218c2ecf20Sopenharmony_ci value > CXD2880_TNRDMD_CLOCKMODE_C) 28228c2ecf20Sopenharmony_ci return -EINVAL; 28238c2ecf20Sopenharmony_ci tnr_dmd->fixed_clk_mode = (enum cxd2880_tnrdmd_clockmode)value; 28248c2ecf20Sopenharmony_ci break; 28258c2ecf20Sopenharmony_ci 28268c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CFG_CABLE_INPUT: 28278c2ecf20Sopenharmony_ci tnr_dmd->is_cable_input = value ? 1 : 0; 28288c2ecf20Sopenharmony_ci break; 28298c2ecf20Sopenharmony_ci 28308c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CFG_DVBT2_FEF_INTERMITTENT_BASE: 28318c2ecf20Sopenharmony_ci tnr_dmd->en_fef_intmtnt_base = value ? 1 : 0; 28328c2ecf20Sopenharmony_ci break; 28338c2ecf20Sopenharmony_ci 28348c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CFG_DVBT2_FEF_INTERMITTENT_LITE: 28358c2ecf20Sopenharmony_ci tnr_dmd->en_fef_intmtnt_lite = value ? 1 : 0; 28368c2ecf20Sopenharmony_ci break; 28378c2ecf20Sopenharmony_ci 28388c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CFG_TS_BUF_ALMOST_EMPTY_THRS: 28398c2ecf20Sopenharmony_ci data[0] = (value >> 8) & 0x07; 28408c2ecf20Sopenharmony_ci data[1] = value & 0xff; 28418c2ecf20Sopenharmony_ci ret = 28428c2ecf20Sopenharmony_ci cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, 28438c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 28448c2ecf20Sopenharmony_ci 0x00, 0x99, data[0], 28458c2ecf20Sopenharmony_ci 0x07); 28468c2ecf20Sopenharmony_ci if (ret) 28478c2ecf20Sopenharmony_ci return ret; 28488c2ecf20Sopenharmony_ci ret = 28498c2ecf20Sopenharmony_ci cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, 28508c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 28518c2ecf20Sopenharmony_ci 0x00, 0x9a, data[1], 28528c2ecf20Sopenharmony_ci 0xff); 28538c2ecf20Sopenharmony_ci if (ret) 28548c2ecf20Sopenharmony_ci return ret; 28558c2ecf20Sopenharmony_ci break; 28568c2ecf20Sopenharmony_ci 28578c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CFG_TS_BUF_ALMOST_FULL_THRS: 28588c2ecf20Sopenharmony_ci data[0] = (value >> 8) & 0x07; 28598c2ecf20Sopenharmony_ci data[1] = value & 0xff; 28608c2ecf20Sopenharmony_ci ret = 28618c2ecf20Sopenharmony_ci cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, 28628c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 28638c2ecf20Sopenharmony_ci 0x00, 0x9b, data[0], 28648c2ecf20Sopenharmony_ci 0x07); 28658c2ecf20Sopenharmony_ci if (ret) 28668c2ecf20Sopenharmony_ci return ret; 28678c2ecf20Sopenharmony_ci ret = 28688c2ecf20Sopenharmony_ci cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, 28698c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 28708c2ecf20Sopenharmony_ci 0x00, 0x9c, data[1], 28718c2ecf20Sopenharmony_ci 0xff); 28728c2ecf20Sopenharmony_ci if (ret) 28738c2ecf20Sopenharmony_ci return ret; 28748c2ecf20Sopenharmony_ci break; 28758c2ecf20Sopenharmony_ci 28768c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CFG_TS_BUF_RRDY_THRS: 28778c2ecf20Sopenharmony_ci data[0] = (value >> 8) & 0x07; 28788c2ecf20Sopenharmony_ci data[1] = value & 0xff; 28798c2ecf20Sopenharmony_ci ret = 28808c2ecf20Sopenharmony_ci cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, 28818c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 28828c2ecf20Sopenharmony_ci 0x00, 0x9d, data[0], 28838c2ecf20Sopenharmony_ci 0x07); 28848c2ecf20Sopenharmony_ci if (ret) 28858c2ecf20Sopenharmony_ci return ret; 28868c2ecf20Sopenharmony_ci ret = 28878c2ecf20Sopenharmony_ci cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, 28888c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 28898c2ecf20Sopenharmony_ci 0x00, 0x9e, data[1], 28908c2ecf20Sopenharmony_ci 0xff); 28918c2ecf20Sopenharmony_ci if (ret) 28928c2ecf20Sopenharmony_ci return ret; 28938c2ecf20Sopenharmony_ci break; 28948c2ecf20Sopenharmony_ci 28958c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CFG_BLINDTUNE_DVBT2_FIRST: 28968c2ecf20Sopenharmony_ci tnr_dmd->blind_tune_dvbt2_first = value ? 1 : 0; 28978c2ecf20Sopenharmony_ci break; 28988c2ecf20Sopenharmony_ci 28998c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CFG_DVBT_BERN_PERIOD: 29008c2ecf20Sopenharmony_ci if (value < 0 || value > 31) 29018c2ecf20Sopenharmony_ci return -EINVAL; 29028c2ecf20Sopenharmony_ci 29038c2ecf20Sopenharmony_ci ret = 29048c2ecf20Sopenharmony_ci cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, 29058c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 29068c2ecf20Sopenharmony_ci 0x10, 0x60, 29078c2ecf20Sopenharmony_ci value & 0x1f, 0x1f); 29088c2ecf20Sopenharmony_ci if (ret) 29098c2ecf20Sopenharmony_ci return ret; 29108c2ecf20Sopenharmony_ci break; 29118c2ecf20Sopenharmony_ci 29128c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CFG_DVBT_VBER_PERIOD: 29138c2ecf20Sopenharmony_ci if (value < 0 || value > 7) 29148c2ecf20Sopenharmony_ci return -EINVAL; 29158c2ecf20Sopenharmony_ci 29168c2ecf20Sopenharmony_ci ret = 29178c2ecf20Sopenharmony_ci cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, 29188c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 29198c2ecf20Sopenharmony_ci 0x10, 0x6f, 29208c2ecf20Sopenharmony_ci value & 0x07, 0x07); 29218c2ecf20Sopenharmony_ci if (ret) 29228c2ecf20Sopenharmony_ci return ret; 29238c2ecf20Sopenharmony_ci break; 29248c2ecf20Sopenharmony_ci 29258c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CFG_DVBT2_BBER_MES: 29268c2ecf20Sopenharmony_ci if (value < 0 || value > 15) 29278c2ecf20Sopenharmony_ci return -EINVAL; 29288c2ecf20Sopenharmony_ci 29298c2ecf20Sopenharmony_ci ret = 29308c2ecf20Sopenharmony_ci cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, 29318c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 29328c2ecf20Sopenharmony_ci 0x20, 0x72, 29338c2ecf20Sopenharmony_ci value & 0x0f, 0x0f); 29348c2ecf20Sopenharmony_ci if (ret) 29358c2ecf20Sopenharmony_ci return ret; 29368c2ecf20Sopenharmony_ci break; 29378c2ecf20Sopenharmony_ci 29388c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CFG_DVBT2_LBER_MES: 29398c2ecf20Sopenharmony_ci if (value < 0 || value > 15) 29408c2ecf20Sopenharmony_ci return -EINVAL; 29418c2ecf20Sopenharmony_ci 29428c2ecf20Sopenharmony_ci ret = 29438c2ecf20Sopenharmony_ci cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, 29448c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 29458c2ecf20Sopenharmony_ci 0x20, 0x6f, 29468c2ecf20Sopenharmony_ci value & 0x0f, 0x0f); 29478c2ecf20Sopenharmony_ci if (ret) 29488c2ecf20Sopenharmony_ci return ret; 29498c2ecf20Sopenharmony_ci break; 29508c2ecf20Sopenharmony_ci 29518c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CFG_DVBT_PER_MES: 29528c2ecf20Sopenharmony_ci if (value < 0 || value > 15) 29538c2ecf20Sopenharmony_ci return -EINVAL; 29548c2ecf20Sopenharmony_ci 29558c2ecf20Sopenharmony_ci ret = 29568c2ecf20Sopenharmony_ci cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, 29578c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 29588c2ecf20Sopenharmony_ci 0x10, 0x5c, 29598c2ecf20Sopenharmony_ci value & 0x0f, 0x0f); 29608c2ecf20Sopenharmony_ci if (ret) 29618c2ecf20Sopenharmony_ci return ret; 29628c2ecf20Sopenharmony_ci break; 29638c2ecf20Sopenharmony_ci 29648c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CFG_DVBT2_PER_MES: 29658c2ecf20Sopenharmony_ci if (value < 0 || value > 15) 29668c2ecf20Sopenharmony_ci return -EINVAL; 29678c2ecf20Sopenharmony_ci 29688c2ecf20Sopenharmony_ci ret = 29698c2ecf20Sopenharmony_ci cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, 29708c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 29718c2ecf20Sopenharmony_ci 0x24, 0xdc, 29728c2ecf20Sopenharmony_ci value & 0x0f, 0x0f); 29738c2ecf20Sopenharmony_ci if (ret) 29748c2ecf20Sopenharmony_ci return ret; 29758c2ecf20Sopenharmony_ci break; 29768c2ecf20Sopenharmony_ci 29778c2ecf20Sopenharmony_ci default: 29788c2ecf20Sopenharmony_ci return -EINVAL; 29798c2ecf20Sopenharmony_ci } 29808c2ecf20Sopenharmony_ci 29818c2ecf20Sopenharmony_ci if (need_sub_setting && 29828c2ecf20Sopenharmony_ci tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) 29838c2ecf20Sopenharmony_ci ret = cxd2880_tnrdmd_set_cfg(tnr_dmd->diver_sub, id, value); 29848c2ecf20Sopenharmony_ci 29858c2ecf20Sopenharmony_ci return ret; 29868c2ecf20Sopenharmony_ci} 29878c2ecf20Sopenharmony_ci 29888c2ecf20Sopenharmony_ciint cxd2880_tnrdmd_gpio_set_cfg(struct cxd2880_tnrdmd *tnr_dmd, 29898c2ecf20Sopenharmony_ci u8 id, 29908c2ecf20Sopenharmony_ci u8 en, 29918c2ecf20Sopenharmony_ci enum cxd2880_tnrdmd_gpio_mode mode, 29928c2ecf20Sopenharmony_ci u8 open_drain, u8 invert) 29938c2ecf20Sopenharmony_ci{ 29948c2ecf20Sopenharmony_ci int ret; 29958c2ecf20Sopenharmony_ci 29968c2ecf20Sopenharmony_ci if (!tnr_dmd) 29978c2ecf20Sopenharmony_ci return -EINVAL; 29988c2ecf20Sopenharmony_ci 29998c2ecf20Sopenharmony_ci if (id > 2) 30008c2ecf20Sopenharmony_ci return -EINVAL; 30018c2ecf20Sopenharmony_ci 30028c2ecf20Sopenharmony_ci if (mode > CXD2880_TNRDMD_GPIO_MODE_EEW) 30038c2ecf20Sopenharmony_ci return -EINVAL; 30048c2ecf20Sopenharmony_ci 30058c2ecf20Sopenharmony_ci if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP && 30068c2ecf20Sopenharmony_ci tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE) 30078c2ecf20Sopenharmony_ci return -EINVAL; 30088c2ecf20Sopenharmony_ci 30098c2ecf20Sopenharmony_ci ret = 30108c2ecf20Sopenharmony_ci cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, CXD2880_IO_TGT_SYS, 30118c2ecf20Sopenharmony_ci 0x00, 0x40 + id, mode, 30128c2ecf20Sopenharmony_ci 0x0f); 30138c2ecf20Sopenharmony_ci if (ret) 30148c2ecf20Sopenharmony_ci return ret; 30158c2ecf20Sopenharmony_ci 30168c2ecf20Sopenharmony_ci ret = 30178c2ecf20Sopenharmony_ci cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, CXD2880_IO_TGT_SYS, 30188c2ecf20Sopenharmony_ci 0x00, 0x43, 30198c2ecf20Sopenharmony_ci open_drain ? (1 << id) : 0, 30208c2ecf20Sopenharmony_ci 1 << id); 30218c2ecf20Sopenharmony_ci if (ret) 30228c2ecf20Sopenharmony_ci return ret; 30238c2ecf20Sopenharmony_ci 30248c2ecf20Sopenharmony_ci ret = 30258c2ecf20Sopenharmony_ci cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, CXD2880_IO_TGT_SYS, 30268c2ecf20Sopenharmony_ci 0x00, 0x44, 30278c2ecf20Sopenharmony_ci invert ? (1 << id) : 0, 30288c2ecf20Sopenharmony_ci 1 << id); 30298c2ecf20Sopenharmony_ci if (ret) 30308c2ecf20Sopenharmony_ci return ret; 30318c2ecf20Sopenharmony_ci 30328c2ecf20Sopenharmony_ci return cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, 30338c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 30348c2ecf20Sopenharmony_ci 0x00, 0x45, 30358c2ecf20Sopenharmony_ci en ? 0 : (1 << id), 30368c2ecf20Sopenharmony_ci 1 << id); 30378c2ecf20Sopenharmony_ci} 30388c2ecf20Sopenharmony_ci 30398c2ecf20Sopenharmony_ciint cxd2880_tnrdmd_gpio_set_cfg_sub(struct cxd2880_tnrdmd *tnr_dmd, 30408c2ecf20Sopenharmony_ci u8 id, 30418c2ecf20Sopenharmony_ci u8 en, 30428c2ecf20Sopenharmony_ci enum cxd2880_tnrdmd_gpio_mode 30438c2ecf20Sopenharmony_ci mode, u8 open_drain, u8 invert) 30448c2ecf20Sopenharmony_ci{ 30458c2ecf20Sopenharmony_ci if (!tnr_dmd) 30468c2ecf20Sopenharmony_ci return -EINVAL; 30478c2ecf20Sopenharmony_ci 30488c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode != CXD2880_TNRDMD_DIVERMODE_MAIN) 30498c2ecf20Sopenharmony_ci return -EINVAL; 30508c2ecf20Sopenharmony_ci 30518c2ecf20Sopenharmony_ci return cxd2880_tnrdmd_gpio_set_cfg(tnr_dmd->diver_sub, id, en, mode, 30528c2ecf20Sopenharmony_ci open_drain, invert); 30538c2ecf20Sopenharmony_ci} 30548c2ecf20Sopenharmony_ci 30558c2ecf20Sopenharmony_ciint cxd2880_tnrdmd_gpio_read(struct cxd2880_tnrdmd *tnr_dmd, 30568c2ecf20Sopenharmony_ci u8 id, u8 *value) 30578c2ecf20Sopenharmony_ci{ 30588c2ecf20Sopenharmony_ci u8 data = 0; 30598c2ecf20Sopenharmony_ci int ret; 30608c2ecf20Sopenharmony_ci 30618c2ecf20Sopenharmony_ci if (!tnr_dmd || !value) 30628c2ecf20Sopenharmony_ci return -EINVAL; 30638c2ecf20Sopenharmony_ci 30648c2ecf20Sopenharmony_ci if (id > 2) 30658c2ecf20Sopenharmony_ci return -EINVAL; 30668c2ecf20Sopenharmony_ci 30678c2ecf20Sopenharmony_ci if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP && 30688c2ecf20Sopenharmony_ci tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE) 30698c2ecf20Sopenharmony_ci return -EINVAL; 30708c2ecf20Sopenharmony_ci 30718c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 30728c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 30738c2ecf20Sopenharmony_ci 0x00, 0x0a); 30748c2ecf20Sopenharmony_ci if (ret) 30758c2ecf20Sopenharmony_ci return ret; 30768c2ecf20Sopenharmony_ci ret = tnr_dmd->io->read_regs(tnr_dmd->io, 30778c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 30788c2ecf20Sopenharmony_ci 0x20, &data, 1); 30798c2ecf20Sopenharmony_ci if (ret) 30808c2ecf20Sopenharmony_ci return ret; 30818c2ecf20Sopenharmony_ci 30828c2ecf20Sopenharmony_ci *value = (data >> id) & 0x01; 30838c2ecf20Sopenharmony_ci 30848c2ecf20Sopenharmony_ci return 0; 30858c2ecf20Sopenharmony_ci} 30868c2ecf20Sopenharmony_ci 30878c2ecf20Sopenharmony_ciint cxd2880_tnrdmd_gpio_read_sub(struct cxd2880_tnrdmd *tnr_dmd, 30888c2ecf20Sopenharmony_ci u8 id, u8 *value) 30898c2ecf20Sopenharmony_ci{ 30908c2ecf20Sopenharmony_ci if (!tnr_dmd) 30918c2ecf20Sopenharmony_ci return -EINVAL; 30928c2ecf20Sopenharmony_ci 30938c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode != CXD2880_TNRDMD_DIVERMODE_MAIN) 30948c2ecf20Sopenharmony_ci return -EINVAL; 30958c2ecf20Sopenharmony_ci 30968c2ecf20Sopenharmony_ci return cxd2880_tnrdmd_gpio_read(tnr_dmd->diver_sub, id, value); 30978c2ecf20Sopenharmony_ci} 30988c2ecf20Sopenharmony_ci 30998c2ecf20Sopenharmony_ciint cxd2880_tnrdmd_gpio_write(struct cxd2880_tnrdmd *tnr_dmd, 31008c2ecf20Sopenharmony_ci u8 id, u8 value) 31018c2ecf20Sopenharmony_ci{ 31028c2ecf20Sopenharmony_ci if (!tnr_dmd) 31038c2ecf20Sopenharmony_ci return -EINVAL; 31048c2ecf20Sopenharmony_ci 31058c2ecf20Sopenharmony_ci if (id > 2) 31068c2ecf20Sopenharmony_ci return -EINVAL; 31078c2ecf20Sopenharmony_ci 31088c2ecf20Sopenharmony_ci if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP && 31098c2ecf20Sopenharmony_ci tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE) 31108c2ecf20Sopenharmony_ci return -EINVAL; 31118c2ecf20Sopenharmony_ci 31128c2ecf20Sopenharmony_ci return cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, 31138c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 31148c2ecf20Sopenharmony_ci 0x00, 0x46, 31158c2ecf20Sopenharmony_ci value ? (1 << id) : 0, 31168c2ecf20Sopenharmony_ci 1 << id); 31178c2ecf20Sopenharmony_ci} 31188c2ecf20Sopenharmony_ci 31198c2ecf20Sopenharmony_ciint cxd2880_tnrdmd_gpio_write_sub(struct cxd2880_tnrdmd *tnr_dmd, 31208c2ecf20Sopenharmony_ci u8 id, u8 value) 31218c2ecf20Sopenharmony_ci{ 31228c2ecf20Sopenharmony_ci if (!tnr_dmd) 31238c2ecf20Sopenharmony_ci return -EINVAL; 31248c2ecf20Sopenharmony_ci 31258c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode != CXD2880_TNRDMD_DIVERMODE_MAIN) 31268c2ecf20Sopenharmony_ci return -EINVAL; 31278c2ecf20Sopenharmony_ci 31288c2ecf20Sopenharmony_ci return cxd2880_tnrdmd_gpio_write(tnr_dmd->diver_sub, id, value); 31298c2ecf20Sopenharmony_ci} 31308c2ecf20Sopenharmony_ci 31318c2ecf20Sopenharmony_ciint cxd2880_tnrdmd_interrupt_read(struct cxd2880_tnrdmd *tnr_dmd, 31328c2ecf20Sopenharmony_ci u16 *value) 31338c2ecf20Sopenharmony_ci{ 31348c2ecf20Sopenharmony_ci int ret; 31358c2ecf20Sopenharmony_ci u8 data[2] = { 0 }; 31368c2ecf20Sopenharmony_ci 31378c2ecf20Sopenharmony_ci if (!tnr_dmd || !value) 31388c2ecf20Sopenharmony_ci return -EINVAL; 31398c2ecf20Sopenharmony_ci 31408c2ecf20Sopenharmony_ci if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP && 31418c2ecf20Sopenharmony_ci tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE) 31428c2ecf20Sopenharmony_ci return -EINVAL; 31438c2ecf20Sopenharmony_ci 31448c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 31458c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 31468c2ecf20Sopenharmony_ci 0x00, 0x0a); 31478c2ecf20Sopenharmony_ci if (ret) 31488c2ecf20Sopenharmony_ci return ret; 31498c2ecf20Sopenharmony_ci ret = tnr_dmd->io->read_regs(tnr_dmd->io, 31508c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 31518c2ecf20Sopenharmony_ci 0x15, data, 2); 31528c2ecf20Sopenharmony_ci if (ret) 31538c2ecf20Sopenharmony_ci return ret; 31548c2ecf20Sopenharmony_ci 31558c2ecf20Sopenharmony_ci *value = (data[0] << 8) | data[1]; 31568c2ecf20Sopenharmony_ci 31578c2ecf20Sopenharmony_ci return 0; 31588c2ecf20Sopenharmony_ci} 31598c2ecf20Sopenharmony_ci 31608c2ecf20Sopenharmony_ciint cxd2880_tnrdmd_interrupt_clear(struct cxd2880_tnrdmd *tnr_dmd, 31618c2ecf20Sopenharmony_ci u16 value) 31628c2ecf20Sopenharmony_ci{ 31638c2ecf20Sopenharmony_ci int ret; 31648c2ecf20Sopenharmony_ci u8 data[2] = { 0 }; 31658c2ecf20Sopenharmony_ci 31668c2ecf20Sopenharmony_ci if (!tnr_dmd) 31678c2ecf20Sopenharmony_ci return -EINVAL; 31688c2ecf20Sopenharmony_ci 31698c2ecf20Sopenharmony_ci if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP && 31708c2ecf20Sopenharmony_ci tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE) 31718c2ecf20Sopenharmony_ci return -EINVAL; 31728c2ecf20Sopenharmony_ci 31738c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 31748c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 31758c2ecf20Sopenharmony_ci 0x00, 0x00); 31768c2ecf20Sopenharmony_ci if (ret) 31778c2ecf20Sopenharmony_ci return ret; 31788c2ecf20Sopenharmony_ci 31798c2ecf20Sopenharmony_ci data[0] = (value >> 8) & 0xff; 31808c2ecf20Sopenharmony_ci data[1] = value & 0xff; 31818c2ecf20Sopenharmony_ci 31828c2ecf20Sopenharmony_ci return tnr_dmd->io->write_regs(tnr_dmd->io, 31838c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 31848c2ecf20Sopenharmony_ci 0x3c, data, 2); 31858c2ecf20Sopenharmony_ci} 31868c2ecf20Sopenharmony_ci 31878c2ecf20Sopenharmony_ciint cxd2880_tnrdmd_ts_buf_clear(struct cxd2880_tnrdmd *tnr_dmd, 31888c2ecf20Sopenharmony_ci u8 clear_overflow_flag, 31898c2ecf20Sopenharmony_ci u8 clear_underflow_flag, 31908c2ecf20Sopenharmony_ci u8 clear_buf) 31918c2ecf20Sopenharmony_ci{ 31928c2ecf20Sopenharmony_ci int ret; 31938c2ecf20Sopenharmony_ci u8 data[2] = { 0 }; 31948c2ecf20Sopenharmony_ci 31958c2ecf20Sopenharmony_ci if (!tnr_dmd) 31968c2ecf20Sopenharmony_ci return -EINVAL; 31978c2ecf20Sopenharmony_ci 31988c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB) 31998c2ecf20Sopenharmony_ci return -EINVAL; 32008c2ecf20Sopenharmony_ci 32018c2ecf20Sopenharmony_ci if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP && 32028c2ecf20Sopenharmony_ci tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE) 32038c2ecf20Sopenharmony_ci return -EINVAL; 32048c2ecf20Sopenharmony_ci 32058c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 32068c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 32078c2ecf20Sopenharmony_ci 0x00, 0x00); 32088c2ecf20Sopenharmony_ci if (ret) 32098c2ecf20Sopenharmony_ci return ret; 32108c2ecf20Sopenharmony_ci 32118c2ecf20Sopenharmony_ci data[0] = clear_overflow_flag ? 0x02 : 0x00; 32128c2ecf20Sopenharmony_ci data[0] |= clear_underflow_flag ? 0x01 : 0x00; 32138c2ecf20Sopenharmony_ci data[1] = clear_buf ? 0x01 : 0x00; 32148c2ecf20Sopenharmony_ci 32158c2ecf20Sopenharmony_ci return tnr_dmd->io->write_regs(tnr_dmd->io, 32168c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 32178c2ecf20Sopenharmony_ci 0x9f, data, 2); 32188c2ecf20Sopenharmony_ci} 32198c2ecf20Sopenharmony_ci 32208c2ecf20Sopenharmony_ciint cxd2880_tnrdmd_chip_id(struct cxd2880_tnrdmd *tnr_dmd, 32218c2ecf20Sopenharmony_ci enum cxd2880_tnrdmd_chip_id *chip_id) 32228c2ecf20Sopenharmony_ci{ 32238c2ecf20Sopenharmony_ci int ret; 32248c2ecf20Sopenharmony_ci u8 data = 0; 32258c2ecf20Sopenharmony_ci 32268c2ecf20Sopenharmony_ci if (!tnr_dmd || !chip_id) 32278c2ecf20Sopenharmony_ci return -EINVAL; 32288c2ecf20Sopenharmony_ci 32298c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 32308c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 32318c2ecf20Sopenharmony_ci 0x00, 0x00); 32328c2ecf20Sopenharmony_ci if (ret) 32338c2ecf20Sopenharmony_ci return ret; 32348c2ecf20Sopenharmony_ci ret = tnr_dmd->io->read_regs(tnr_dmd->io, 32358c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 32368c2ecf20Sopenharmony_ci 0xfd, &data, 1); 32378c2ecf20Sopenharmony_ci if (ret) 32388c2ecf20Sopenharmony_ci return ret; 32398c2ecf20Sopenharmony_ci 32408c2ecf20Sopenharmony_ci *chip_id = (enum cxd2880_tnrdmd_chip_id)data; 32418c2ecf20Sopenharmony_ci 32428c2ecf20Sopenharmony_ci return 0; 32438c2ecf20Sopenharmony_ci} 32448c2ecf20Sopenharmony_ci 32458c2ecf20Sopenharmony_ciint cxd2880_tnrdmd_set_and_save_reg_bits(struct cxd2880_tnrdmd 32468c2ecf20Sopenharmony_ci *tnr_dmd, 32478c2ecf20Sopenharmony_ci enum cxd2880_io_tgt tgt, 32488c2ecf20Sopenharmony_ci u8 bank, u8 address, 32498c2ecf20Sopenharmony_ci u8 value, u8 bit_mask) 32508c2ecf20Sopenharmony_ci{ 32518c2ecf20Sopenharmony_ci int ret; 32528c2ecf20Sopenharmony_ci 32538c2ecf20Sopenharmony_ci if (!tnr_dmd) 32548c2ecf20Sopenharmony_ci return -EINVAL; 32558c2ecf20Sopenharmony_ci 32568c2ecf20Sopenharmony_ci if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP && 32578c2ecf20Sopenharmony_ci tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE) 32588c2ecf20Sopenharmony_ci return -EINVAL; 32598c2ecf20Sopenharmony_ci 32608c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, tgt, 0x00, bank); 32618c2ecf20Sopenharmony_ci if (ret) 32628c2ecf20Sopenharmony_ci return ret; 32638c2ecf20Sopenharmony_ci 32648c2ecf20Sopenharmony_ci ret = cxd2880_io_set_reg_bits(tnr_dmd->io, 32658c2ecf20Sopenharmony_ci tgt, address, value, bit_mask); 32668c2ecf20Sopenharmony_ci if (ret) 32678c2ecf20Sopenharmony_ci return ret; 32688c2ecf20Sopenharmony_ci 32698c2ecf20Sopenharmony_ci return set_cfg_mem(tnr_dmd, tgt, bank, address, value, bit_mask); 32708c2ecf20Sopenharmony_ci} 32718c2ecf20Sopenharmony_ci 32728c2ecf20Sopenharmony_ciint cxd2880_tnrdmd_set_scan_mode(struct cxd2880_tnrdmd *tnr_dmd, 32738c2ecf20Sopenharmony_ci enum cxd2880_dtv_sys sys, 32748c2ecf20Sopenharmony_ci u8 scan_mode_end) 32758c2ecf20Sopenharmony_ci{ 32768c2ecf20Sopenharmony_ci if (!tnr_dmd) 32778c2ecf20Sopenharmony_ci return -EINVAL; 32788c2ecf20Sopenharmony_ci 32798c2ecf20Sopenharmony_ci if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP && 32808c2ecf20Sopenharmony_ci tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE) 32818c2ecf20Sopenharmony_ci return -EINVAL; 32828c2ecf20Sopenharmony_ci 32838c2ecf20Sopenharmony_ci tnr_dmd->scan_mode = scan_mode_end; 32848c2ecf20Sopenharmony_ci 32858c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) 32868c2ecf20Sopenharmony_ci return cxd2880_tnrdmd_set_scan_mode(tnr_dmd->diver_sub, sys, 32878c2ecf20Sopenharmony_ci scan_mode_end); 32888c2ecf20Sopenharmony_ci else 32898c2ecf20Sopenharmony_ci return 0; 32908c2ecf20Sopenharmony_ci} 32918c2ecf20Sopenharmony_ci 32928c2ecf20Sopenharmony_ciint cxd2880_tnrdmd_set_pid_ftr(struct cxd2880_tnrdmd *tnr_dmd, 32938c2ecf20Sopenharmony_ci struct cxd2880_tnrdmd_pid_ftr_cfg 32948c2ecf20Sopenharmony_ci *pid_ftr_cfg) 32958c2ecf20Sopenharmony_ci{ 32968c2ecf20Sopenharmony_ci if (!tnr_dmd) 32978c2ecf20Sopenharmony_ci return -EINVAL; 32988c2ecf20Sopenharmony_ci 32998c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB) 33008c2ecf20Sopenharmony_ci return -EINVAL; 33018c2ecf20Sopenharmony_ci 33028c2ecf20Sopenharmony_ci if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP && 33038c2ecf20Sopenharmony_ci tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE) 33048c2ecf20Sopenharmony_ci return -EINVAL; 33058c2ecf20Sopenharmony_ci 33068c2ecf20Sopenharmony_ci if (tnr_dmd->create_param.ts_output_if == CXD2880_TNRDMD_TSOUT_IF_TS) 33078c2ecf20Sopenharmony_ci return -ENOTTY; 33088c2ecf20Sopenharmony_ci 33098c2ecf20Sopenharmony_ci if (pid_ftr_cfg) { 33108c2ecf20Sopenharmony_ci tnr_dmd->pid_ftr_cfg = *pid_ftr_cfg; 33118c2ecf20Sopenharmony_ci tnr_dmd->pid_ftr_cfg_en = 1; 33128c2ecf20Sopenharmony_ci } else { 33138c2ecf20Sopenharmony_ci tnr_dmd->pid_ftr_cfg_en = 0; 33148c2ecf20Sopenharmony_ci } 33158c2ecf20Sopenharmony_ci 33168c2ecf20Sopenharmony_ci if (tnr_dmd->state == CXD2880_TNRDMD_STATE_ACTIVE) 33178c2ecf20Sopenharmony_ci return pid_ftr_setting(tnr_dmd, pid_ftr_cfg); 33188c2ecf20Sopenharmony_ci else 33198c2ecf20Sopenharmony_ci return 0; 33208c2ecf20Sopenharmony_ci} 33218c2ecf20Sopenharmony_ci 33228c2ecf20Sopenharmony_ciint cxd2880_tnrdmd_set_rf_lvl_cmpstn(struct cxd2880_tnrdmd 33238c2ecf20Sopenharmony_ci *tnr_dmd, 33248c2ecf20Sopenharmony_ci int (*rf_lvl_cmpstn) 33258c2ecf20Sopenharmony_ci (struct cxd2880_tnrdmd *, 33268c2ecf20Sopenharmony_ci int *)) 33278c2ecf20Sopenharmony_ci{ 33288c2ecf20Sopenharmony_ci if (!tnr_dmd) 33298c2ecf20Sopenharmony_ci return -EINVAL; 33308c2ecf20Sopenharmony_ci 33318c2ecf20Sopenharmony_ci tnr_dmd->rf_lvl_cmpstn = rf_lvl_cmpstn; 33328c2ecf20Sopenharmony_ci 33338c2ecf20Sopenharmony_ci return 0; 33348c2ecf20Sopenharmony_ci} 33358c2ecf20Sopenharmony_ci 33368c2ecf20Sopenharmony_ciint cxd2880_tnrdmd_set_rf_lvl_cmpstn_sub(struct cxd2880_tnrdmd 33378c2ecf20Sopenharmony_ci *tnr_dmd, 33388c2ecf20Sopenharmony_ci int (*rf_lvl_cmpstn) 33398c2ecf20Sopenharmony_ci (struct cxd2880_tnrdmd *, 33408c2ecf20Sopenharmony_ci int *)) 33418c2ecf20Sopenharmony_ci{ 33428c2ecf20Sopenharmony_ci if (!tnr_dmd) 33438c2ecf20Sopenharmony_ci return -EINVAL; 33448c2ecf20Sopenharmony_ci 33458c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode != CXD2880_TNRDMD_DIVERMODE_MAIN) 33468c2ecf20Sopenharmony_ci return -EINVAL; 33478c2ecf20Sopenharmony_ci 33488c2ecf20Sopenharmony_ci return cxd2880_tnrdmd_set_rf_lvl_cmpstn(tnr_dmd->diver_sub, 33498c2ecf20Sopenharmony_ci rf_lvl_cmpstn); 33508c2ecf20Sopenharmony_ci} 33518c2ecf20Sopenharmony_ci 33528c2ecf20Sopenharmony_ciint cxd2880_tnrdmd_set_lna_thrs(struct cxd2880_tnrdmd *tnr_dmd, 33538c2ecf20Sopenharmony_ci struct cxd2880_tnrdmd_lna_thrs_tbl_air 33548c2ecf20Sopenharmony_ci *tbl_air, 33558c2ecf20Sopenharmony_ci struct cxd2880_tnrdmd_lna_thrs_tbl_cable 33568c2ecf20Sopenharmony_ci *tbl_cable) 33578c2ecf20Sopenharmony_ci{ 33588c2ecf20Sopenharmony_ci if (!tnr_dmd) 33598c2ecf20Sopenharmony_ci return -EINVAL; 33608c2ecf20Sopenharmony_ci 33618c2ecf20Sopenharmony_ci tnr_dmd->lna_thrs_tbl_air = tbl_air; 33628c2ecf20Sopenharmony_ci tnr_dmd->lna_thrs_tbl_cable = tbl_cable; 33638c2ecf20Sopenharmony_ci 33648c2ecf20Sopenharmony_ci return 0; 33658c2ecf20Sopenharmony_ci} 33668c2ecf20Sopenharmony_ci 33678c2ecf20Sopenharmony_ciint cxd2880_tnrdmd_set_lna_thrs_sub(struct cxd2880_tnrdmd *tnr_dmd, 33688c2ecf20Sopenharmony_ci struct 33698c2ecf20Sopenharmony_ci cxd2880_tnrdmd_lna_thrs_tbl_air 33708c2ecf20Sopenharmony_ci *tbl_air, 33718c2ecf20Sopenharmony_ci struct cxd2880_tnrdmd_lna_thrs_tbl_cable 33728c2ecf20Sopenharmony_ci *tbl_cable) 33738c2ecf20Sopenharmony_ci{ 33748c2ecf20Sopenharmony_ci if (!tnr_dmd) 33758c2ecf20Sopenharmony_ci return -EINVAL; 33768c2ecf20Sopenharmony_ci 33778c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode != CXD2880_TNRDMD_DIVERMODE_MAIN) 33788c2ecf20Sopenharmony_ci return -EINVAL; 33798c2ecf20Sopenharmony_ci 33808c2ecf20Sopenharmony_ci return cxd2880_tnrdmd_set_lna_thrs(tnr_dmd->diver_sub, 33818c2ecf20Sopenharmony_ci tbl_air, tbl_cable); 33828c2ecf20Sopenharmony_ci} 33838c2ecf20Sopenharmony_ci 33848c2ecf20Sopenharmony_ciint cxd2880_tnrdmd_set_ts_pin_high_low(struct cxd2880_tnrdmd 33858c2ecf20Sopenharmony_ci *tnr_dmd, u8 en, u8 value) 33868c2ecf20Sopenharmony_ci{ 33878c2ecf20Sopenharmony_ci int ret; 33888c2ecf20Sopenharmony_ci 33898c2ecf20Sopenharmony_ci if (!tnr_dmd) 33908c2ecf20Sopenharmony_ci return -EINVAL; 33918c2ecf20Sopenharmony_ci 33928c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB) 33938c2ecf20Sopenharmony_ci return -EINVAL; 33948c2ecf20Sopenharmony_ci 33958c2ecf20Sopenharmony_ci if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP) 33968c2ecf20Sopenharmony_ci return -EINVAL; 33978c2ecf20Sopenharmony_ci 33988c2ecf20Sopenharmony_ci if (tnr_dmd->create_param.ts_output_if != CXD2880_TNRDMD_TSOUT_IF_TS) 33998c2ecf20Sopenharmony_ci return -ENOTTY; 34008c2ecf20Sopenharmony_ci 34018c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 34028c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 34038c2ecf20Sopenharmony_ci 0x00, 0x00); 34048c2ecf20Sopenharmony_ci if (ret) 34058c2ecf20Sopenharmony_ci return ret; 34068c2ecf20Sopenharmony_ci 34078c2ecf20Sopenharmony_ci if (en) { 34088c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 34098c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 34108c2ecf20Sopenharmony_ci 0x50, ((value & 0x1f) | 0x80)); 34118c2ecf20Sopenharmony_ci if (ret) 34128c2ecf20Sopenharmony_ci return ret; 34138c2ecf20Sopenharmony_ci 34148c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 34158c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 34168c2ecf20Sopenharmony_ci 0x52, (value & 0x1f)); 34178c2ecf20Sopenharmony_ci } else { 34188c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 34198c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 34208c2ecf20Sopenharmony_ci set_ts_pin_seq, 34218c2ecf20Sopenharmony_ci ARRAY_SIZE(set_ts_pin_seq)); 34228c2ecf20Sopenharmony_ci if (ret) 34238c2ecf20Sopenharmony_ci return ret; 34248c2ecf20Sopenharmony_ci 34258c2ecf20Sopenharmony_ci ret = load_cfg_mem(tnr_dmd); 34268c2ecf20Sopenharmony_ci } 34278c2ecf20Sopenharmony_ci 34288c2ecf20Sopenharmony_ci return ret; 34298c2ecf20Sopenharmony_ci} 34308c2ecf20Sopenharmony_ci 34318c2ecf20Sopenharmony_ciint cxd2880_tnrdmd_set_ts_output(struct cxd2880_tnrdmd *tnr_dmd, 34328c2ecf20Sopenharmony_ci u8 en) 34338c2ecf20Sopenharmony_ci{ 34348c2ecf20Sopenharmony_ci int ret; 34358c2ecf20Sopenharmony_ci 34368c2ecf20Sopenharmony_ci if (!tnr_dmd) 34378c2ecf20Sopenharmony_ci return -EINVAL; 34388c2ecf20Sopenharmony_ci 34398c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB) 34408c2ecf20Sopenharmony_ci return -EINVAL; 34418c2ecf20Sopenharmony_ci 34428c2ecf20Sopenharmony_ci if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP && 34438c2ecf20Sopenharmony_ci tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE) 34448c2ecf20Sopenharmony_ci return -EINVAL; 34458c2ecf20Sopenharmony_ci 34468c2ecf20Sopenharmony_ci switch (tnr_dmd->create_param.ts_output_if) { 34478c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_TSOUT_IF_TS: 34488c2ecf20Sopenharmony_ci if (en) { 34498c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 34508c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 34518c2ecf20Sopenharmony_ci set_ts_output_seq1, 34528c2ecf20Sopenharmony_ci ARRAY_SIZE(set_ts_output_seq1)); 34538c2ecf20Sopenharmony_ci if (ret) 34548c2ecf20Sopenharmony_ci return ret; 34558c2ecf20Sopenharmony_ci 34568c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 34578c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 34588c2ecf20Sopenharmony_ci set_ts_output_seq2, 34598c2ecf20Sopenharmony_ci ARRAY_SIZE(set_ts_output_seq2)); 34608c2ecf20Sopenharmony_ci if (ret) 34618c2ecf20Sopenharmony_ci return ret; 34628c2ecf20Sopenharmony_ci } else { 34638c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 34648c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 34658c2ecf20Sopenharmony_ci set_ts_output_seq3, 34668c2ecf20Sopenharmony_ci ARRAY_SIZE(set_ts_output_seq3)); 34678c2ecf20Sopenharmony_ci if (ret) 34688c2ecf20Sopenharmony_ci return ret; 34698c2ecf20Sopenharmony_ci 34708c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 34718c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 34728c2ecf20Sopenharmony_ci set_ts_output_seq4, 34738c2ecf20Sopenharmony_ci ARRAY_SIZE(set_ts_output_seq4)); 34748c2ecf20Sopenharmony_ci if (ret) 34758c2ecf20Sopenharmony_ci return ret; 34768c2ecf20Sopenharmony_ci } 34778c2ecf20Sopenharmony_ci break; 34788c2ecf20Sopenharmony_ci 34798c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_TSOUT_IF_SPI: 34808c2ecf20Sopenharmony_ci break; 34818c2ecf20Sopenharmony_ci 34828c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_TSOUT_IF_SDIO: 34838c2ecf20Sopenharmony_ci break; 34848c2ecf20Sopenharmony_ci 34858c2ecf20Sopenharmony_ci default: 34868c2ecf20Sopenharmony_ci return -EINVAL; 34878c2ecf20Sopenharmony_ci } 34888c2ecf20Sopenharmony_ci 34898c2ecf20Sopenharmony_ci return 0; 34908c2ecf20Sopenharmony_ci} 34918c2ecf20Sopenharmony_ci 34928c2ecf20Sopenharmony_ciint slvt_freeze_reg(struct cxd2880_tnrdmd *tnr_dmd) 34938c2ecf20Sopenharmony_ci{ 34948c2ecf20Sopenharmony_ci u8 data; 34958c2ecf20Sopenharmony_ci int ret; 34968c2ecf20Sopenharmony_ci 34978c2ecf20Sopenharmony_ci if (!tnr_dmd) 34988c2ecf20Sopenharmony_ci return -EINVAL; 34998c2ecf20Sopenharmony_ci 35008c2ecf20Sopenharmony_ci switch (tnr_dmd->create_param.ts_output_if) { 35018c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_TSOUT_IF_SPI: 35028c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_TSOUT_IF_SDIO: 35038c2ecf20Sopenharmony_ci 35048c2ecf20Sopenharmony_ci ret = tnr_dmd->io->read_regs(tnr_dmd->io, 35058c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 35068c2ecf20Sopenharmony_ci 0x00, &data, 1); 35078c2ecf20Sopenharmony_ci if (ret) 35088c2ecf20Sopenharmony_ci return ret; 35098c2ecf20Sopenharmony_ci 35108c2ecf20Sopenharmony_ci break; 35118c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_TSOUT_IF_TS: 35128c2ecf20Sopenharmony_ci default: 35138c2ecf20Sopenharmony_ci break; 35148c2ecf20Sopenharmony_ci } 35158c2ecf20Sopenharmony_ci 35168c2ecf20Sopenharmony_ci return tnr_dmd->io->write_reg(tnr_dmd->io, 35178c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 35188c2ecf20Sopenharmony_ci 0x01, 0x01); 35198c2ecf20Sopenharmony_ci} 3520