18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * cxd2880_tnrdmd_dvbt.c 48c2ecf20Sopenharmony_ci * Sony CXD2880 DVB-T2/T tuner + demodulator driver 58c2ecf20Sopenharmony_ci * control functions for DVB-T 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 128c2ecf20Sopenharmony_ci#include "cxd2880_tnrdmd_dvbt.h" 138c2ecf20Sopenharmony_ci#include "cxd2880_tnrdmd_dvbt_mon.h" 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value tune_dmd_setting_seq1[] = { 168c2ecf20Sopenharmony_ci {0x00, 0x00}, {0x31, 0x01}, 178c2ecf20Sopenharmony_ci}; 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value tune_dmd_setting_seq2[] = { 208c2ecf20Sopenharmony_ci {0x00, 0x04}, {0x5c, 0xfb}, {0x00, 0x10}, {0xa4, 0x03}, 218c2ecf20Sopenharmony_ci {0x00, 0x14}, {0xb0, 0x00}, {0x00, 0x25}, 228c2ecf20Sopenharmony_ci}; 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value tune_dmd_setting_seq3[] = { 258c2ecf20Sopenharmony_ci {0x00, 0x12}, {0x44, 0x00}, 268c2ecf20Sopenharmony_ci}; 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value tune_dmd_setting_seq4[] = { 298c2ecf20Sopenharmony_ci {0x00, 0x11}, {0x87, 0xd2}, 308c2ecf20Sopenharmony_ci}; 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value tune_dmd_setting_seq5[] = { 338c2ecf20Sopenharmony_ci {0x00, 0x00}, {0xfd, 0x01}, 348c2ecf20Sopenharmony_ci}; 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value sleep_dmd_setting_seq1[] = { 378c2ecf20Sopenharmony_ci {0x00, 0x04}, {0x5c, 0xd8}, {0x00, 0x10}, {0xa4, 0x00}, 388c2ecf20Sopenharmony_ci}; 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_cistatic const struct cxd2880_reg_value sleep_dmd_setting_seq2[] = { 418c2ecf20Sopenharmony_ci {0x00, 0x11}, {0x87, 0x04}, 428c2ecf20Sopenharmony_ci}; 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_cistatic int x_tune_dvbt_demod_setting(struct cxd2880_tnrdmd 458c2ecf20Sopenharmony_ci *tnr_dmd, 468c2ecf20Sopenharmony_ci enum cxd2880_dtv_bandwidth 478c2ecf20Sopenharmony_ci bandwidth, 488c2ecf20Sopenharmony_ci enum cxd2880_tnrdmd_clockmode 498c2ecf20Sopenharmony_ci clk_mode) 508c2ecf20Sopenharmony_ci{ 518c2ecf20Sopenharmony_ci static const u8 clk_mode_ckffrq_a[2] = { 0x52, 0x49 }; 528c2ecf20Sopenharmony_ci static const u8 clk_mode_ckffrq_b[2] = { 0x5d, 0x55 }; 538c2ecf20Sopenharmony_ci static const u8 clk_mode_ckffrq_c[2] = { 0x60, 0x00 }; 548c2ecf20Sopenharmony_ci static const u8 ratectl_margin[2] = { 0x01, 0xf0 }; 558c2ecf20Sopenharmony_ci static const u8 maxclkcnt_a[3] = { 0x73, 0xca, 0x49 }; 568c2ecf20Sopenharmony_ci static const u8 maxclkcnt_b[3] = { 0xc8, 0x13, 0xaa }; 578c2ecf20Sopenharmony_ci static const u8 maxclkcnt_c[3] = { 0xdc, 0x6c, 0x00 }; 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_ci static const u8 bw8_nomi_ac[5] = { 0x15, 0x00, 0x00, 0x00, 0x00}; 608c2ecf20Sopenharmony_ci static const u8 bw8_nomi_b[5] = { 0x14, 0x6a, 0xaa, 0xaa, 0xaa}; 618c2ecf20Sopenharmony_ci static const u8 bw8_gtdofst_a[2] = { 0x01, 0x28 }; 628c2ecf20Sopenharmony_ci static const u8 bw8_gtdofst_b[2] = { 0x11, 0x44 }; 638c2ecf20Sopenharmony_ci static const u8 bw8_gtdofst_c[2] = { 0x15, 0x28 }; 648c2ecf20Sopenharmony_ci static const u8 bw8_mrc_a[5] = { 0x30, 0x00, 0x00, 0x90, 0x00 }; 658c2ecf20Sopenharmony_ci static const u8 bw8_mrc_b[5] = { 0x36, 0x71, 0x00, 0xa3, 0x55 }; 668c2ecf20Sopenharmony_ci static const u8 bw8_mrc_c[5] = { 0x38, 0x00, 0x00, 0xa8, 0x00 }; 678c2ecf20Sopenharmony_ci static const u8 bw8_notch[4] = { 0xb3, 0x00, 0x01, 0x02 }; 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_ci static const u8 bw7_nomi_ac[5] = { 0x18, 0x00, 0x00, 0x00, 0x00}; 708c2ecf20Sopenharmony_ci static const u8 bw7_nomi_b[5] = { 0x17, 0x55, 0x55, 0x55, 0x55}; 718c2ecf20Sopenharmony_ci static const u8 bw7_gtdofst_a[2] = { 0x12, 0x4c }; 728c2ecf20Sopenharmony_ci static const u8 bw7_gtdofst_b[2] = { 0x1f, 0x15 }; 738c2ecf20Sopenharmony_ci static const u8 bw7_gtdofst_c[2] = { 0x1f, 0xf8 }; 748c2ecf20Sopenharmony_ci static const u8 bw7_mrc_a[5] = { 0x36, 0xdb, 0x00, 0xa4, 0x92 }; 758c2ecf20Sopenharmony_ci static const u8 bw7_mrc_b[5] = { 0x3e, 0x38, 0x00, 0xba, 0xaa }; 768c2ecf20Sopenharmony_ci static const u8 bw7_mrc_c[5] = { 0x40, 0x00, 0x00, 0xc0, 0x00 }; 778c2ecf20Sopenharmony_ci static const u8 bw7_notch[4] = { 0xb8, 0x00, 0x00, 0x03 }; 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_ci static const u8 bw6_nomi_ac[5] = { 0x1c, 0x00, 0x00, 0x00, 0x00}; 808c2ecf20Sopenharmony_ci static const u8 bw6_nomi_b[5] = { 0x1b, 0x38, 0xe3, 0x8e, 0x38}; 818c2ecf20Sopenharmony_ci static const u8 bw6_gtdofst_a[2] = { 0x1f, 0xf8 }; 828c2ecf20Sopenharmony_ci static const u8 bw6_gtdofst_b[2] = { 0x24, 0x43 }; 838c2ecf20Sopenharmony_ci static const u8 bw6_gtdofst_c[2] = { 0x25, 0x4c }; 848c2ecf20Sopenharmony_ci static const u8 bw6_mrc_a[5] = { 0x40, 0x00, 0x00, 0xc0, 0x00 }; 858c2ecf20Sopenharmony_ci static const u8 bw6_mrc_b[5] = { 0x48, 0x97, 0x00, 0xd9, 0xc7 }; 868c2ecf20Sopenharmony_ci static const u8 bw6_mrc_c[5] = { 0x4a, 0xaa, 0x00, 0xdf, 0xff }; 878c2ecf20Sopenharmony_ci static const u8 bw6_notch[4] = { 0xbe, 0xab, 0x00, 0x03 }; 888c2ecf20Sopenharmony_ci 898c2ecf20Sopenharmony_ci static const u8 bw5_nomi_ac[5] = { 0x21, 0x99, 0x99, 0x99, 0x99}; 908c2ecf20Sopenharmony_ci static const u8 bw5_nomi_b[5] = { 0x20, 0xaa, 0xaa, 0xaa, 0xaa}; 918c2ecf20Sopenharmony_ci static const u8 bw5_gtdofst_a[2] = { 0x26, 0x5d }; 928c2ecf20Sopenharmony_ci static const u8 bw5_gtdofst_b[2] = { 0x2b, 0x84 }; 938c2ecf20Sopenharmony_ci static const u8 bw5_gtdofst_c[2] = { 0x2c, 0xc2 }; 948c2ecf20Sopenharmony_ci static const u8 bw5_mrc_a[5] = { 0x4c, 0xcc, 0x00, 0xe6, 0x66 }; 958c2ecf20Sopenharmony_ci static const u8 bw5_mrc_b[5] = { 0x57, 0x1c, 0x01, 0x05, 0x55 }; 968c2ecf20Sopenharmony_ci static const u8 bw5_mrc_c[5] = { 0x59, 0x99, 0x01, 0x0c, 0xcc }; 978c2ecf20Sopenharmony_ci static const u8 bw5_notch[4] = { 0xc8, 0x01, 0x00, 0x03 }; 988c2ecf20Sopenharmony_ci const u8 *data = NULL; 998c2ecf20Sopenharmony_ci u8 sst_data; 1008c2ecf20Sopenharmony_ci int ret; 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_ci if (!tnr_dmd) 1038c2ecf20Sopenharmony_ci return -EINVAL; 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 1068c2ecf20Sopenharmony_ci CXD2880_IO_TGT_SYS, 1078c2ecf20Sopenharmony_ci tune_dmd_setting_seq1, 1088c2ecf20Sopenharmony_ci ARRAY_SIZE(tune_dmd_setting_seq1)); 1098c2ecf20Sopenharmony_ci if (ret) 1108c2ecf20Sopenharmony_ci return ret; 1118c2ecf20Sopenharmony_ci 1128c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 1138c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 1148c2ecf20Sopenharmony_ci 0x00, 0x04); 1158c2ecf20Sopenharmony_ci if (ret) 1168c2ecf20Sopenharmony_ci return ret; 1178c2ecf20Sopenharmony_ci 1188c2ecf20Sopenharmony_ci switch (clk_mode) { 1198c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_A: 1208c2ecf20Sopenharmony_ci data = clk_mode_ckffrq_a; 1218c2ecf20Sopenharmony_ci break; 1228c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_B: 1238c2ecf20Sopenharmony_ci data = clk_mode_ckffrq_b; 1248c2ecf20Sopenharmony_ci break; 1258c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_C: 1268c2ecf20Sopenharmony_ci data = clk_mode_ckffrq_c; 1278c2ecf20Sopenharmony_ci break; 1288c2ecf20Sopenharmony_ci default: 1298c2ecf20Sopenharmony_ci return -EINVAL; 1308c2ecf20Sopenharmony_ci } 1318c2ecf20Sopenharmony_ci 1328c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 1338c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 1348c2ecf20Sopenharmony_ci 0x65, data, 2); 1358c2ecf20Sopenharmony_ci if (ret) 1368c2ecf20Sopenharmony_ci return ret; 1378c2ecf20Sopenharmony_ci 1388c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 1398c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 1408c2ecf20Sopenharmony_ci 0x5d, 0x07); 1418c2ecf20Sopenharmony_ci if (ret) 1428c2ecf20Sopenharmony_ci return ret; 1438c2ecf20Sopenharmony_ci 1448c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode != CXD2880_TNRDMD_DIVERMODE_SUB) { 1458c2ecf20Sopenharmony_ci u8 data[2] = { 0x01, 0x01 }; 1468c2ecf20Sopenharmony_ci 1478c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 1488c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 1498c2ecf20Sopenharmony_ci 0x00, 0x00); 1508c2ecf20Sopenharmony_ci if (ret) 1518c2ecf20Sopenharmony_ci return ret; 1528c2ecf20Sopenharmony_ci 1538c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 1548c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 1558c2ecf20Sopenharmony_ci 0xce, data, 2); 1568c2ecf20Sopenharmony_ci if (ret) 1578c2ecf20Sopenharmony_ci return ret; 1588c2ecf20Sopenharmony_ci } 1598c2ecf20Sopenharmony_ci 1608c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 1618c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 1628c2ecf20Sopenharmony_ci tune_dmd_setting_seq2, 1638c2ecf20Sopenharmony_ci ARRAY_SIZE(tune_dmd_setting_seq2)); 1648c2ecf20Sopenharmony_ci if (ret) 1658c2ecf20Sopenharmony_ci return ret; 1668c2ecf20Sopenharmony_ci 1678c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 1688c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 1698c2ecf20Sopenharmony_ci 0xf0, ratectl_margin, 2); 1708c2ecf20Sopenharmony_ci if (ret) 1718c2ecf20Sopenharmony_ci return ret; 1728c2ecf20Sopenharmony_ci 1738c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN || 1748c2ecf20Sopenharmony_ci tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB) { 1758c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 1768c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 1778c2ecf20Sopenharmony_ci tune_dmd_setting_seq3, 1788c2ecf20Sopenharmony_ci ARRAY_SIZE(tune_dmd_setting_seq3)); 1798c2ecf20Sopenharmony_ci if (ret) 1808c2ecf20Sopenharmony_ci return ret; 1818c2ecf20Sopenharmony_ci } 1828c2ecf20Sopenharmony_ci 1838c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB) { 1848c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 1858c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 1868c2ecf20Sopenharmony_ci tune_dmd_setting_seq4, 1878c2ecf20Sopenharmony_ci ARRAY_SIZE(tune_dmd_setting_seq4)); 1888c2ecf20Sopenharmony_ci if (ret) 1898c2ecf20Sopenharmony_ci return ret; 1908c2ecf20Sopenharmony_ci } 1918c2ecf20Sopenharmony_ci 1928c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode != CXD2880_TNRDMD_DIVERMODE_SUB) { 1938c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 1948c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 1958c2ecf20Sopenharmony_ci 0x00, 0x04); 1968c2ecf20Sopenharmony_ci if (ret) 1978c2ecf20Sopenharmony_ci return ret; 1988c2ecf20Sopenharmony_ci 1998c2ecf20Sopenharmony_ci switch (clk_mode) { 2008c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_A: 2018c2ecf20Sopenharmony_ci data = maxclkcnt_a; 2028c2ecf20Sopenharmony_ci break; 2038c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_B: 2048c2ecf20Sopenharmony_ci data = maxclkcnt_b; 2058c2ecf20Sopenharmony_ci break; 2068c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_C: 2078c2ecf20Sopenharmony_ci data = maxclkcnt_c; 2088c2ecf20Sopenharmony_ci break; 2098c2ecf20Sopenharmony_ci default: 2108c2ecf20Sopenharmony_ci return -EINVAL; 2118c2ecf20Sopenharmony_ci } 2128c2ecf20Sopenharmony_ci 2138c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 2148c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 2158c2ecf20Sopenharmony_ci 0x68, data, 3); 2168c2ecf20Sopenharmony_ci if (ret) 2178c2ecf20Sopenharmony_ci return ret; 2188c2ecf20Sopenharmony_ci } 2198c2ecf20Sopenharmony_ci 2208c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 2218c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 2228c2ecf20Sopenharmony_ci 0x00, 0x04); 2238c2ecf20Sopenharmony_ci if (ret) 2248c2ecf20Sopenharmony_ci return ret; 2258c2ecf20Sopenharmony_ci 2268c2ecf20Sopenharmony_ci switch (bandwidth) { 2278c2ecf20Sopenharmony_ci case CXD2880_DTV_BW_8_MHZ: 2288c2ecf20Sopenharmony_ci switch (clk_mode) { 2298c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_A: 2308c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_C: 2318c2ecf20Sopenharmony_ci data = bw8_nomi_ac; 2328c2ecf20Sopenharmony_ci break; 2338c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_B: 2348c2ecf20Sopenharmony_ci data = bw8_nomi_b; 2358c2ecf20Sopenharmony_ci break; 2368c2ecf20Sopenharmony_ci default: 2378c2ecf20Sopenharmony_ci return -EINVAL; 2388c2ecf20Sopenharmony_ci } 2398c2ecf20Sopenharmony_ci 2408c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 2418c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 2428c2ecf20Sopenharmony_ci 0x60, data, 5); 2438c2ecf20Sopenharmony_ci if (ret) 2448c2ecf20Sopenharmony_ci return ret; 2458c2ecf20Sopenharmony_ci 2468c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 2478c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 2488c2ecf20Sopenharmony_ci 0x4a, 0x00); 2498c2ecf20Sopenharmony_ci if (ret) 2508c2ecf20Sopenharmony_ci return ret; 2518c2ecf20Sopenharmony_ci 2528c2ecf20Sopenharmony_ci switch (clk_mode) { 2538c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_A: 2548c2ecf20Sopenharmony_ci data = bw8_gtdofst_a; 2558c2ecf20Sopenharmony_ci break; 2568c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_B: 2578c2ecf20Sopenharmony_ci data = bw8_gtdofst_b; 2588c2ecf20Sopenharmony_ci break; 2598c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_C: 2608c2ecf20Sopenharmony_ci data = bw8_gtdofst_c; 2618c2ecf20Sopenharmony_ci break; 2628c2ecf20Sopenharmony_ci default: 2638c2ecf20Sopenharmony_ci return -EINVAL; 2648c2ecf20Sopenharmony_ci } 2658c2ecf20Sopenharmony_ci 2668c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 2678c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 2688c2ecf20Sopenharmony_ci 0x7d, data, 2); 2698c2ecf20Sopenharmony_ci if (ret) 2708c2ecf20Sopenharmony_ci return ret; 2718c2ecf20Sopenharmony_ci 2728c2ecf20Sopenharmony_ci switch (clk_mode) { 2738c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_A: 2748c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_B: 2758c2ecf20Sopenharmony_ci sst_data = 0x35; 2768c2ecf20Sopenharmony_ci break; 2778c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_C: 2788c2ecf20Sopenharmony_ci sst_data = 0x34; 2798c2ecf20Sopenharmony_ci break; 2808c2ecf20Sopenharmony_ci default: 2818c2ecf20Sopenharmony_ci return -EINVAL; 2828c2ecf20Sopenharmony_ci } 2838c2ecf20Sopenharmony_ci 2848c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 2858c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 2868c2ecf20Sopenharmony_ci 0x71, sst_data); 2878c2ecf20Sopenharmony_ci if (ret) 2888c2ecf20Sopenharmony_ci return ret; 2898c2ecf20Sopenharmony_ci 2908c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) { 2918c2ecf20Sopenharmony_ci switch (clk_mode) { 2928c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_A: 2938c2ecf20Sopenharmony_ci data = bw8_mrc_a; 2948c2ecf20Sopenharmony_ci break; 2958c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_B: 2968c2ecf20Sopenharmony_ci data = bw8_mrc_b; 2978c2ecf20Sopenharmony_ci break; 2988c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_C: 2998c2ecf20Sopenharmony_ci data = bw8_mrc_c; 3008c2ecf20Sopenharmony_ci break; 3018c2ecf20Sopenharmony_ci default: 3028c2ecf20Sopenharmony_ci return -EINVAL; 3038c2ecf20Sopenharmony_ci } 3048c2ecf20Sopenharmony_ci 3058c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 3068c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 3078c2ecf20Sopenharmony_ci 0x4b, &data[0], 2); 3088c2ecf20Sopenharmony_ci if (ret) 3098c2ecf20Sopenharmony_ci return ret; 3108c2ecf20Sopenharmony_ci 3118c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 3128c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 3138c2ecf20Sopenharmony_ci 0x51, &data[2], 3); 3148c2ecf20Sopenharmony_ci if (ret) 3158c2ecf20Sopenharmony_ci return ret; 3168c2ecf20Sopenharmony_ci } 3178c2ecf20Sopenharmony_ci 3188c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 3198c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 3208c2ecf20Sopenharmony_ci 0x72, &bw8_notch[0], 2); 3218c2ecf20Sopenharmony_ci if (ret) 3228c2ecf20Sopenharmony_ci return ret; 3238c2ecf20Sopenharmony_ci 3248c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 3258c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 3268c2ecf20Sopenharmony_ci 0x6b, &bw8_notch[2], 2); 3278c2ecf20Sopenharmony_ci if (ret) 3288c2ecf20Sopenharmony_ci return ret; 3298c2ecf20Sopenharmony_ci break; 3308c2ecf20Sopenharmony_ci 3318c2ecf20Sopenharmony_ci case CXD2880_DTV_BW_7_MHZ: 3328c2ecf20Sopenharmony_ci switch (clk_mode) { 3338c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_A: 3348c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_C: 3358c2ecf20Sopenharmony_ci data = bw7_nomi_ac; 3368c2ecf20Sopenharmony_ci break; 3378c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_B: 3388c2ecf20Sopenharmony_ci data = bw7_nomi_b; 3398c2ecf20Sopenharmony_ci break; 3408c2ecf20Sopenharmony_ci default: 3418c2ecf20Sopenharmony_ci return -EINVAL; 3428c2ecf20Sopenharmony_ci } 3438c2ecf20Sopenharmony_ci 3448c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 3458c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 3468c2ecf20Sopenharmony_ci 0x60, data, 5); 3478c2ecf20Sopenharmony_ci if (ret) 3488c2ecf20Sopenharmony_ci return ret; 3498c2ecf20Sopenharmony_ci 3508c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 3518c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 3528c2ecf20Sopenharmony_ci 0x4a, 0x02); 3538c2ecf20Sopenharmony_ci if (ret) 3548c2ecf20Sopenharmony_ci return ret; 3558c2ecf20Sopenharmony_ci 3568c2ecf20Sopenharmony_ci switch (clk_mode) { 3578c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_A: 3588c2ecf20Sopenharmony_ci data = bw7_gtdofst_a; 3598c2ecf20Sopenharmony_ci break; 3608c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_B: 3618c2ecf20Sopenharmony_ci data = bw7_gtdofst_b; 3628c2ecf20Sopenharmony_ci break; 3638c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_C: 3648c2ecf20Sopenharmony_ci data = bw7_gtdofst_c; 3658c2ecf20Sopenharmony_ci break; 3668c2ecf20Sopenharmony_ci default: 3678c2ecf20Sopenharmony_ci return -EINVAL; 3688c2ecf20Sopenharmony_ci } 3698c2ecf20Sopenharmony_ci 3708c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 3718c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 3728c2ecf20Sopenharmony_ci 0x7d, data, 2); 3738c2ecf20Sopenharmony_ci if (ret) 3748c2ecf20Sopenharmony_ci return ret; 3758c2ecf20Sopenharmony_ci 3768c2ecf20Sopenharmony_ci switch (clk_mode) { 3778c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_A: 3788c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_B: 3798c2ecf20Sopenharmony_ci sst_data = 0x2f; 3808c2ecf20Sopenharmony_ci break; 3818c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_C: 3828c2ecf20Sopenharmony_ci sst_data = 0x2e; 3838c2ecf20Sopenharmony_ci break; 3848c2ecf20Sopenharmony_ci default: 3858c2ecf20Sopenharmony_ci return -EINVAL; 3868c2ecf20Sopenharmony_ci } 3878c2ecf20Sopenharmony_ci 3888c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 3898c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 3908c2ecf20Sopenharmony_ci 0x71, sst_data); 3918c2ecf20Sopenharmony_ci if (ret) 3928c2ecf20Sopenharmony_ci return ret; 3938c2ecf20Sopenharmony_ci 3948c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) { 3958c2ecf20Sopenharmony_ci switch (clk_mode) { 3968c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_A: 3978c2ecf20Sopenharmony_ci data = bw7_mrc_a; 3988c2ecf20Sopenharmony_ci break; 3998c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_B: 4008c2ecf20Sopenharmony_ci data = bw7_mrc_b; 4018c2ecf20Sopenharmony_ci break; 4028c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_C: 4038c2ecf20Sopenharmony_ci data = bw7_mrc_c; 4048c2ecf20Sopenharmony_ci break; 4058c2ecf20Sopenharmony_ci default: 4068c2ecf20Sopenharmony_ci return -EINVAL; 4078c2ecf20Sopenharmony_ci } 4088c2ecf20Sopenharmony_ci 4098c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 4108c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 4118c2ecf20Sopenharmony_ci 0x4b, &data[0], 2); 4128c2ecf20Sopenharmony_ci if (ret) 4138c2ecf20Sopenharmony_ci return ret; 4148c2ecf20Sopenharmony_ci 4158c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 4168c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 4178c2ecf20Sopenharmony_ci 0x51, &data[2], 3); 4188c2ecf20Sopenharmony_ci if (ret) 4198c2ecf20Sopenharmony_ci return ret; 4208c2ecf20Sopenharmony_ci } 4218c2ecf20Sopenharmony_ci 4228c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 4238c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 4248c2ecf20Sopenharmony_ci 0x72, &bw7_notch[0], 2); 4258c2ecf20Sopenharmony_ci if (ret) 4268c2ecf20Sopenharmony_ci return ret; 4278c2ecf20Sopenharmony_ci 4288c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 4298c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 4308c2ecf20Sopenharmony_ci 0x6b, &bw7_notch[2], 2); 4318c2ecf20Sopenharmony_ci if (ret) 4328c2ecf20Sopenharmony_ci return ret; 4338c2ecf20Sopenharmony_ci break; 4348c2ecf20Sopenharmony_ci 4358c2ecf20Sopenharmony_ci case CXD2880_DTV_BW_6_MHZ: 4368c2ecf20Sopenharmony_ci switch (clk_mode) { 4378c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_A: 4388c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_C: 4398c2ecf20Sopenharmony_ci data = bw6_nomi_ac; 4408c2ecf20Sopenharmony_ci break; 4418c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_B: 4428c2ecf20Sopenharmony_ci data = bw6_nomi_b; 4438c2ecf20Sopenharmony_ci break; 4448c2ecf20Sopenharmony_ci default: 4458c2ecf20Sopenharmony_ci return -EINVAL; 4468c2ecf20Sopenharmony_ci } 4478c2ecf20Sopenharmony_ci 4488c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 4498c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 4508c2ecf20Sopenharmony_ci 0x60, data, 5); 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_DMD, 4568c2ecf20Sopenharmony_ci 0x4a, 0x04); 4578c2ecf20Sopenharmony_ci if (ret) 4588c2ecf20Sopenharmony_ci return ret; 4598c2ecf20Sopenharmony_ci 4608c2ecf20Sopenharmony_ci switch (clk_mode) { 4618c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_A: 4628c2ecf20Sopenharmony_ci data = bw6_gtdofst_a; 4638c2ecf20Sopenharmony_ci break; 4648c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_B: 4658c2ecf20Sopenharmony_ci data = bw6_gtdofst_b; 4668c2ecf20Sopenharmony_ci break; 4678c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_C: 4688c2ecf20Sopenharmony_ci data = bw6_gtdofst_c; 4698c2ecf20Sopenharmony_ci break; 4708c2ecf20Sopenharmony_ci default: 4718c2ecf20Sopenharmony_ci return -EINVAL; 4728c2ecf20Sopenharmony_ci } 4738c2ecf20Sopenharmony_ci 4748c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 4758c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 4768c2ecf20Sopenharmony_ci 0x7d, data, 2); 4778c2ecf20Sopenharmony_ci if (ret) 4788c2ecf20Sopenharmony_ci return ret; 4798c2ecf20Sopenharmony_ci 4808c2ecf20Sopenharmony_ci switch (clk_mode) { 4818c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_A: 4828c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_C: 4838c2ecf20Sopenharmony_ci sst_data = 0x29; 4848c2ecf20Sopenharmony_ci break; 4858c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_B: 4868c2ecf20Sopenharmony_ci sst_data = 0x2a; 4878c2ecf20Sopenharmony_ci break; 4888c2ecf20Sopenharmony_ci default: 4898c2ecf20Sopenharmony_ci return -EINVAL; 4908c2ecf20Sopenharmony_ci } 4918c2ecf20Sopenharmony_ci 4928c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 4938c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 4948c2ecf20Sopenharmony_ci 0x71, sst_data); 4958c2ecf20Sopenharmony_ci if (ret) 4968c2ecf20Sopenharmony_ci return ret; 4978c2ecf20Sopenharmony_ci 4988c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) { 4998c2ecf20Sopenharmony_ci switch (clk_mode) { 5008c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_A: 5018c2ecf20Sopenharmony_ci data = bw6_mrc_a; 5028c2ecf20Sopenharmony_ci break; 5038c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_B: 5048c2ecf20Sopenharmony_ci data = bw6_mrc_b; 5058c2ecf20Sopenharmony_ci break; 5068c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_C: 5078c2ecf20Sopenharmony_ci data = bw6_mrc_c; 5088c2ecf20Sopenharmony_ci break; 5098c2ecf20Sopenharmony_ci default: 5108c2ecf20Sopenharmony_ci return -EINVAL; 5118c2ecf20Sopenharmony_ci } 5128c2ecf20Sopenharmony_ci 5138c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 5148c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 5158c2ecf20Sopenharmony_ci 0x4b, &data[0], 2); 5168c2ecf20Sopenharmony_ci if (ret) 5178c2ecf20Sopenharmony_ci return ret; 5188c2ecf20Sopenharmony_ci 5198c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 5208c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 5218c2ecf20Sopenharmony_ci 0x51, &data[2], 3); 5228c2ecf20Sopenharmony_ci if (ret) 5238c2ecf20Sopenharmony_ci return ret; 5248c2ecf20Sopenharmony_ci } 5258c2ecf20Sopenharmony_ci 5268c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 5278c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 5288c2ecf20Sopenharmony_ci 0x72, &bw6_notch[0], 2); 5298c2ecf20Sopenharmony_ci if (ret) 5308c2ecf20Sopenharmony_ci return ret; 5318c2ecf20Sopenharmony_ci 5328c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 5338c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 5348c2ecf20Sopenharmony_ci 0x6b, &bw6_notch[2], 2); 5358c2ecf20Sopenharmony_ci if (ret) 5368c2ecf20Sopenharmony_ci return ret; 5378c2ecf20Sopenharmony_ci break; 5388c2ecf20Sopenharmony_ci 5398c2ecf20Sopenharmony_ci case CXD2880_DTV_BW_5_MHZ: 5408c2ecf20Sopenharmony_ci switch (clk_mode) { 5418c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_A: 5428c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_C: 5438c2ecf20Sopenharmony_ci data = bw5_nomi_ac; 5448c2ecf20Sopenharmony_ci break; 5458c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_B: 5468c2ecf20Sopenharmony_ci data = bw5_nomi_b; 5478c2ecf20Sopenharmony_ci break; 5488c2ecf20Sopenharmony_ci default: 5498c2ecf20Sopenharmony_ci return -EINVAL; 5508c2ecf20Sopenharmony_ci } 5518c2ecf20Sopenharmony_ci 5528c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 5538c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 5548c2ecf20Sopenharmony_ci 0x60, data, 5); 5558c2ecf20Sopenharmony_ci if (ret) 5568c2ecf20Sopenharmony_ci return ret; 5578c2ecf20Sopenharmony_ci 5588c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 5598c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 5608c2ecf20Sopenharmony_ci 0x4a, 0x06); 5618c2ecf20Sopenharmony_ci if (ret) 5628c2ecf20Sopenharmony_ci return ret; 5638c2ecf20Sopenharmony_ci 5648c2ecf20Sopenharmony_ci switch (clk_mode) { 5658c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_A: 5668c2ecf20Sopenharmony_ci data = bw5_gtdofst_a; 5678c2ecf20Sopenharmony_ci break; 5688c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_B: 5698c2ecf20Sopenharmony_ci data = bw5_gtdofst_b; 5708c2ecf20Sopenharmony_ci break; 5718c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_C: 5728c2ecf20Sopenharmony_ci data = bw5_gtdofst_c; 5738c2ecf20Sopenharmony_ci break; 5748c2ecf20Sopenharmony_ci default: 5758c2ecf20Sopenharmony_ci return -EINVAL; 5768c2ecf20Sopenharmony_ci } 5778c2ecf20Sopenharmony_ci 5788c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 5798c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 5808c2ecf20Sopenharmony_ci 0x7d, data, 2); 5818c2ecf20Sopenharmony_ci if (ret) 5828c2ecf20Sopenharmony_ci return ret; 5838c2ecf20Sopenharmony_ci 5848c2ecf20Sopenharmony_ci switch (clk_mode) { 5858c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_A: 5868c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_B: 5878c2ecf20Sopenharmony_ci sst_data = 0x24; 5888c2ecf20Sopenharmony_ci break; 5898c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_C: 5908c2ecf20Sopenharmony_ci sst_data = 0x23; 5918c2ecf20Sopenharmony_ci break; 5928c2ecf20Sopenharmony_ci default: 5938c2ecf20Sopenharmony_ci return -EINVAL; 5948c2ecf20Sopenharmony_ci } 5958c2ecf20Sopenharmony_ci 5968c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 5978c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 5988c2ecf20Sopenharmony_ci 0x71, sst_data); 5998c2ecf20Sopenharmony_ci if (ret) 6008c2ecf20Sopenharmony_ci return ret; 6018c2ecf20Sopenharmony_ci 6028c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) { 6038c2ecf20Sopenharmony_ci switch (clk_mode) { 6048c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_A: 6058c2ecf20Sopenharmony_ci data = bw5_mrc_a; 6068c2ecf20Sopenharmony_ci break; 6078c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_B: 6088c2ecf20Sopenharmony_ci data = bw5_mrc_b; 6098c2ecf20Sopenharmony_ci break; 6108c2ecf20Sopenharmony_ci case CXD2880_TNRDMD_CLOCKMODE_C: 6118c2ecf20Sopenharmony_ci data = bw5_mrc_c; 6128c2ecf20Sopenharmony_ci break; 6138c2ecf20Sopenharmony_ci default: 6148c2ecf20Sopenharmony_ci return -EINVAL; 6158c2ecf20Sopenharmony_ci } 6168c2ecf20Sopenharmony_ci 6178c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 6188c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 6198c2ecf20Sopenharmony_ci 0x4b, &data[0], 2); 6208c2ecf20Sopenharmony_ci if (ret) 6218c2ecf20Sopenharmony_ci return ret; 6228c2ecf20Sopenharmony_ci 6238c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 6248c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 6258c2ecf20Sopenharmony_ci 0x51, &data[2], 3); 6268c2ecf20Sopenharmony_ci if (ret) 6278c2ecf20Sopenharmony_ci return ret; 6288c2ecf20Sopenharmony_ci } 6298c2ecf20Sopenharmony_ci 6308c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 6318c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 6328c2ecf20Sopenharmony_ci 0x72, &bw5_notch[0], 2); 6338c2ecf20Sopenharmony_ci if (ret) 6348c2ecf20Sopenharmony_ci return ret; 6358c2ecf20Sopenharmony_ci 6368c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_regs(tnr_dmd->io, 6378c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 6388c2ecf20Sopenharmony_ci 0x6b, &bw5_notch[2], 2); 6398c2ecf20Sopenharmony_ci if (ret) 6408c2ecf20Sopenharmony_ci return ret; 6418c2ecf20Sopenharmony_ci break; 6428c2ecf20Sopenharmony_ci 6438c2ecf20Sopenharmony_ci default: 6448c2ecf20Sopenharmony_ci return -EINVAL; 6458c2ecf20Sopenharmony_ci } 6468c2ecf20Sopenharmony_ci 6478c2ecf20Sopenharmony_ci return cxd2880_io_write_multi_regs(tnr_dmd->io, 6488c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 6498c2ecf20Sopenharmony_ci tune_dmd_setting_seq5, 6508c2ecf20Sopenharmony_ci ARRAY_SIZE(tune_dmd_setting_seq5)); 6518c2ecf20Sopenharmony_ci} 6528c2ecf20Sopenharmony_ci 6538c2ecf20Sopenharmony_cistatic int x_sleep_dvbt_demod_setting(struct cxd2880_tnrdmd 6548c2ecf20Sopenharmony_ci *tnr_dmd) 6558c2ecf20Sopenharmony_ci{ 6568c2ecf20Sopenharmony_ci int ret; 6578c2ecf20Sopenharmony_ci 6588c2ecf20Sopenharmony_ci if (!tnr_dmd) 6598c2ecf20Sopenharmony_ci return -EINVAL; 6608c2ecf20Sopenharmony_ci 6618c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 6628c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 6638c2ecf20Sopenharmony_ci sleep_dmd_setting_seq1, 6648c2ecf20Sopenharmony_ci ARRAY_SIZE(sleep_dmd_setting_seq1)); 6658c2ecf20Sopenharmony_ci if (ret) 6668c2ecf20Sopenharmony_ci return ret; 6678c2ecf20Sopenharmony_ci 6688c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB) 6698c2ecf20Sopenharmony_ci ret = cxd2880_io_write_multi_regs(tnr_dmd->io, 6708c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 6718c2ecf20Sopenharmony_ci sleep_dmd_setting_seq2, 6728c2ecf20Sopenharmony_ci ARRAY_SIZE(sleep_dmd_setting_seq2)); 6738c2ecf20Sopenharmony_ci 6748c2ecf20Sopenharmony_ci return ret; 6758c2ecf20Sopenharmony_ci} 6768c2ecf20Sopenharmony_ci 6778c2ecf20Sopenharmony_cistatic int dvbt_set_profile(struct cxd2880_tnrdmd *tnr_dmd, 6788c2ecf20Sopenharmony_ci enum cxd2880_dvbt_profile profile) 6798c2ecf20Sopenharmony_ci{ 6808c2ecf20Sopenharmony_ci int ret; 6818c2ecf20Sopenharmony_ci 6828c2ecf20Sopenharmony_ci if (!tnr_dmd) 6838c2ecf20Sopenharmony_ci return -EINVAL; 6848c2ecf20Sopenharmony_ci 6858c2ecf20Sopenharmony_ci ret = tnr_dmd->io->write_reg(tnr_dmd->io, 6868c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 6878c2ecf20Sopenharmony_ci 0x00, 0x10); 6888c2ecf20Sopenharmony_ci if (ret) 6898c2ecf20Sopenharmony_ci return ret; 6908c2ecf20Sopenharmony_ci 6918c2ecf20Sopenharmony_ci return tnr_dmd->io->write_reg(tnr_dmd->io, 6928c2ecf20Sopenharmony_ci CXD2880_IO_TGT_DMD, 6938c2ecf20Sopenharmony_ci 0x67, 6948c2ecf20Sopenharmony_ci (profile == CXD2880_DVBT_PROFILE_HP) 6958c2ecf20Sopenharmony_ci ? 0x00 : 0x01); 6968c2ecf20Sopenharmony_ci} 6978c2ecf20Sopenharmony_ci 6988c2ecf20Sopenharmony_ciint cxd2880_tnrdmd_dvbt_tune1(struct cxd2880_tnrdmd *tnr_dmd, 6998c2ecf20Sopenharmony_ci struct cxd2880_dvbt_tune_param 7008c2ecf20Sopenharmony_ci *tune_param) 7018c2ecf20Sopenharmony_ci{ 7028c2ecf20Sopenharmony_ci int ret; 7038c2ecf20Sopenharmony_ci 7048c2ecf20Sopenharmony_ci if (!tnr_dmd || !tune_param) 7058c2ecf20Sopenharmony_ci return -EINVAL; 7068c2ecf20Sopenharmony_ci 7078c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB) 7088c2ecf20Sopenharmony_ci return -EINVAL; 7098c2ecf20Sopenharmony_ci 7108c2ecf20Sopenharmony_ci if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP && 7118c2ecf20Sopenharmony_ci tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE) 7128c2ecf20Sopenharmony_ci return -EINVAL; 7138c2ecf20Sopenharmony_ci 7148c2ecf20Sopenharmony_ci ret = 7158c2ecf20Sopenharmony_ci cxd2880_tnrdmd_common_tune_setting1(tnr_dmd, CXD2880_DTV_SYS_DVBT, 7168c2ecf20Sopenharmony_ci tune_param->center_freq_khz, 7178c2ecf20Sopenharmony_ci tune_param->bandwidth, 0, 0); 7188c2ecf20Sopenharmony_ci if (ret) 7198c2ecf20Sopenharmony_ci return ret; 7208c2ecf20Sopenharmony_ci 7218c2ecf20Sopenharmony_ci ret = 7228c2ecf20Sopenharmony_ci x_tune_dvbt_demod_setting(tnr_dmd, tune_param->bandwidth, 7238c2ecf20Sopenharmony_ci tnr_dmd->clk_mode); 7248c2ecf20Sopenharmony_ci if (ret) 7258c2ecf20Sopenharmony_ci return ret; 7268c2ecf20Sopenharmony_ci 7278c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) { 7288c2ecf20Sopenharmony_ci ret = 7298c2ecf20Sopenharmony_ci x_tune_dvbt_demod_setting(tnr_dmd->diver_sub, 7308c2ecf20Sopenharmony_ci tune_param->bandwidth, 7318c2ecf20Sopenharmony_ci tnr_dmd->diver_sub->clk_mode); 7328c2ecf20Sopenharmony_ci if (ret) 7338c2ecf20Sopenharmony_ci return ret; 7348c2ecf20Sopenharmony_ci } 7358c2ecf20Sopenharmony_ci 7368c2ecf20Sopenharmony_ci return dvbt_set_profile(tnr_dmd, tune_param->profile); 7378c2ecf20Sopenharmony_ci} 7388c2ecf20Sopenharmony_ci 7398c2ecf20Sopenharmony_ciint cxd2880_tnrdmd_dvbt_tune2(struct cxd2880_tnrdmd *tnr_dmd, 7408c2ecf20Sopenharmony_ci struct cxd2880_dvbt_tune_param 7418c2ecf20Sopenharmony_ci *tune_param) 7428c2ecf20Sopenharmony_ci{ 7438c2ecf20Sopenharmony_ci int ret; 7448c2ecf20Sopenharmony_ci 7458c2ecf20Sopenharmony_ci if (!tnr_dmd || !tune_param) 7468c2ecf20Sopenharmony_ci return -EINVAL; 7478c2ecf20Sopenharmony_ci 7488c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB) 7498c2ecf20Sopenharmony_ci return -EINVAL; 7508c2ecf20Sopenharmony_ci 7518c2ecf20Sopenharmony_ci if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP && 7528c2ecf20Sopenharmony_ci tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE) 7538c2ecf20Sopenharmony_ci return -EINVAL; 7548c2ecf20Sopenharmony_ci 7558c2ecf20Sopenharmony_ci ret = 7568c2ecf20Sopenharmony_ci cxd2880_tnrdmd_common_tune_setting2(tnr_dmd, CXD2880_DTV_SYS_DVBT, 7578c2ecf20Sopenharmony_ci 0); 7588c2ecf20Sopenharmony_ci if (ret) 7598c2ecf20Sopenharmony_ci return ret; 7608c2ecf20Sopenharmony_ci 7618c2ecf20Sopenharmony_ci tnr_dmd->state = CXD2880_TNRDMD_STATE_ACTIVE; 7628c2ecf20Sopenharmony_ci tnr_dmd->frequency_khz = tune_param->center_freq_khz; 7638c2ecf20Sopenharmony_ci tnr_dmd->sys = CXD2880_DTV_SYS_DVBT; 7648c2ecf20Sopenharmony_ci tnr_dmd->bandwidth = tune_param->bandwidth; 7658c2ecf20Sopenharmony_ci 7668c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) { 7678c2ecf20Sopenharmony_ci tnr_dmd->diver_sub->state = CXD2880_TNRDMD_STATE_ACTIVE; 7688c2ecf20Sopenharmony_ci tnr_dmd->diver_sub->frequency_khz = tune_param->center_freq_khz; 7698c2ecf20Sopenharmony_ci tnr_dmd->diver_sub->sys = CXD2880_DTV_SYS_DVBT; 7708c2ecf20Sopenharmony_ci tnr_dmd->diver_sub->bandwidth = tune_param->bandwidth; 7718c2ecf20Sopenharmony_ci } 7728c2ecf20Sopenharmony_ci 7738c2ecf20Sopenharmony_ci return 0; 7748c2ecf20Sopenharmony_ci} 7758c2ecf20Sopenharmony_ci 7768c2ecf20Sopenharmony_ciint cxd2880_tnrdmd_dvbt_sleep_setting(struct cxd2880_tnrdmd *tnr_dmd) 7778c2ecf20Sopenharmony_ci{ 7788c2ecf20Sopenharmony_ci int ret; 7798c2ecf20Sopenharmony_ci 7808c2ecf20Sopenharmony_ci if (!tnr_dmd) 7818c2ecf20Sopenharmony_ci return -EINVAL; 7828c2ecf20Sopenharmony_ci 7838c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB) 7848c2ecf20Sopenharmony_ci return -EINVAL; 7858c2ecf20Sopenharmony_ci 7868c2ecf20Sopenharmony_ci if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP && 7878c2ecf20Sopenharmony_ci tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE) 7888c2ecf20Sopenharmony_ci return -EINVAL; 7898c2ecf20Sopenharmony_ci 7908c2ecf20Sopenharmony_ci ret = x_sleep_dvbt_demod_setting(tnr_dmd); 7918c2ecf20Sopenharmony_ci if (ret) 7928c2ecf20Sopenharmony_ci return ret; 7938c2ecf20Sopenharmony_ci 7948c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) 7958c2ecf20Sopenharmony_ci ret = x_sleep_dvbt_demod_setting(tnr_dmd->diver_sub); 7968c2ecf20Sopenharmony_ci 7978c2ecf20Sopenharmony_ci return ret; 7988c2ecf20Sopenharmony_ci} 7998c2ecf20Sopenharmony_ci 8008c2ecf20Sopenharmony_ciint cxd2880_tnrdmd_dvbt_check_demod_lock(struct cxd2880_tnrdmd 8018c2ecf20Sopenharmony_ci *tnr_dmd, 8028c2ecf20Sopenharmony_ci enum 8038c2ecf20Sopenharmony_ci cxd2880_tnrdmd_lock_result 8048c2ecf20Sopenharmony_ci *lock) 8058c2ecf20Sopenharmony_ci{ 8068c2ecf20Sopenharmony_ci int ret; 8078c2ecf20Sopenharmony_ci 8088c2ecf20Sopenharmony_ci u8 sync_stat = 0; 8098c2ecf20Sopenharmony_ci u8 ts_lock = 0; 8108c2ecf20Sopenharmony_ci u8 unlock_detected = 0; 8118c2ecf20Sopenharmony_ci u8 unlock_detected_sub = 0; 8128c2ecf20Sopenharmony_ci 8138c2ecf20Sopenharmony_ci if (!tnr_dmd || !lock) 8148c2ecf20Sopenharmony_ci return -EINVAL; 8158c2ecf20Sopenharmony_ci 8168c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB) 8178c2ecf20Sopenharmony_ci return -EINVAL; 8188c2ecf20Sopenharmony_ci 8198c2ecf20Sopenharmony_ci if (tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE) 8208c2ecf20Sopenharmony_ci return -EINVAL; 8218c2ecf20Sopenharmony_ci 8228c2ecf20Sopenharmony_ci ret = 8238c2ecf20Sopenharmony_ci cxd2880_tnrdmd_dvbt_mon_sync_stat(tnr_dmd, &sync_stat, &ts_lock, 8248c2ecf20Sopenharmony_ci &unlock_detected); 8258c2ecf20Sopenharmony_ci if (ret) 8268c2ecf20Sopenharmony_ci return ret; 8278c2ecf20Sopenharmony_ci 8288c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SINGLE) { 8298c2ecf20Sopenharmony_ci if (sync_stat == 6) 8308c2ecf20Sopenharmony_ci *lock = CXD2880_TNRDMD_LOCK_RESULT_LOCKED; 8318c2ecf20Sopenharmony_ci else if (unlock_detected) 8328c2ecf20Sopenharmony_ci *lock = CXD2880_TNRDMD_LOCK_RESULT_UNLOCKED; 8338c2ecf20Sopenharmony_ci else 8348c2ecf20Sopenharmony_ci *lock = CXD2880_TNRDMD_LOCK_RESULT_NOTDETECT; 8358c2ecf20Sopenharmony_ci 8368c2ecf20Sopenharmony_ci return ret; 8378c2ecf20Sopenharmony_ci } 8388c2ecf20Sopenharmony_ci 8398c2ecf20Sopenharmony_ci if (sync_stat == 6) { 8408c2ecf20Sopenharmony_ci *lock = CXD2880_TNRDMD_LOCK_RESULT_LOCKED; 8418c2ecf20Sopenharmony_ci return ret; 8428c2ecf20Sopenharmony_ci } 8438c2ecf20Sopenharmony_ci 8448c2ecf20Sopenharmony_ci ret = 8458c2ecf20Sopenharmony_ci cxd2880_tnrdmd_dvbt_mon_sync_stat_sub(tnr_dmd, &sync_stat, 8468c2ecf20Sopenharmony_ci &unlock_detected_sub); 8478c2ecf20Sopenharmony_ci if (ret) 8488c2ecf20Sopenharmony_ci return ret; 8498c2ecf20Sopenharmony_ci 8508c2ecf20Sopenharmony_ci if (sync_stat == 6) 8518c2ecf20Sopenharmony_ci *lock = CXD2880_TNRDMD_LOCK_RESULT_LOCKED; 8528c2ecf20Sopenharmony_ci else if (unlock_detected && unlock_detected_sub) 8538c2ecf20Sopenharmony_ci *lock = CXD2880_TNRDMD_LOCK_RESULT_UNLOCKED; 8548c2ecf20Sopenharmony_ci else 8558c2ecf20Sopenharmony_ci *lock = CXD2880_TNRDMD_LOCK_RESULT_NOTDETECT; 8568c2ecf20Sopenharmony_ci 8578c2ecf20Sopenharmony_ci return ret; 8588c2ecf20Sopenharmony_ci} 8598c2ecf20Sopenharmony_ci 8608c2ecf20Sopenharmony_ciint cxd2880_tnrdmd_dvbt_check_ts_lock(struct cxd2880_tnrdmd 8618c2ecf20Sopenharmony_ci *tnr_dmd, 8628c2ecf20Sopenharmony_ci enum 8638c2ecf20Sopenharmony_ci cxd2880_tnrdmd_lock_result 8648c2ecf20Sopenharmony_ci *lock) 8658c2ecf20Sopenharmony_ci{ 8668c2ecf20Sopenharmony_ci int ret; 8678c2ecf20Sopenharmony_ci 8688c2ecf20Sopenharmony_ci u8 sync_stat = 0; 8698c2ecf20Sopenharmony_ci u8 ts_lock = 0; 8708c2ecf20Sopenharmony_ci u8 unlock_detected = 0; 8718c2ecf20Sopenharmony_ci u8 unlock_detected_sub = 0; 8728c2ecf20Sopenharmony_ci 8738c2ecf20Sopenharmony_ci if (!tnr_dmd || !lock) 8748c2ecf20Sopenharmony_ci return -EINVAL; 8758c2ecf20Sopenharmony_ci 8768c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB) 8778c2ecf20Sopenharmony_ci return -EINVAL; 8788c2ecf20Sopenharmony_ci 8798c2ecf20Sopenharmony_ci if (tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE) 8808c2ecf20Sopenharmony_ci return -EINVAL; 8818c2ecf20Sopenharmony_ci 8828c2ecf20Sopenharmony_ci ret = 8838c2ecf20Sopenharmony_ci cxd2880_tnrdmd_dvbt_mon_sync_stat(tnr_dmd, &sync_stat, &ts_lock, 8848c2ecf20Sopenharmony_ci &unlock_detected); 8858c2ecf20Sopenharmony_ci if (ret) 8868c2ecf20Sopenharmony_ci return ret; 8878c2ecf20Sopenharmony_ci 8888c2ecf20Sopenharmony_ci if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SINGLE) { 8898c2ecf20Sopenharmony_ci if (ts_lock) 8908c2ecf20Sopenharmony_ci *lock = CXD2880_TNRDMD_LOCK_RESULT_LOCKED; 8918c2ecf20Sopenharmony_ci else if (unlock_detected) 8928c2ecf20Sopenharmony_ci *lock = CXD2880_TNRDMD_LOCK_RESULT_UNLOCKED; 8938c2ecf20Sopenharmony_ci else 8948c2ecf20Sopenharmony_ci *lock = CXD2880_TNRDMD_LOCK_RESULT_NOTDETECT; 8958c2ecf20Sopenharmony_ci 8968c2ecf20Sopenharmony_ci return ret; 8978c2ecf20Sopenharmony_ci } 8988c2ecf20Sopenharmony_ci 8998c2ecf20Sopenharmony_ci if (ts_lock) { 9008c2ecf20Sopenharmony_ci *lock = CXD2880_TNRDMD_LOCK_RESULT_LOCKED; 9018c2ecf20Sopenharmony_ci return ret; 9028c2ecf20Sopenharmony_ci } else if (!unlock_detected) { 9038c2ecf20Sopenharmony_ci *lock = CXD2880_TNRDMD_LOCK_RESULT_NOTDETECT; 9048c2ecf20Sopenharmony_ci return ret; 9058c2ecf20Sopenharmony_ci } 9068c2ecf20Sopenharmony_ci 9078c2ecf20Sopenharmony_ci ret = 9088c2ecf20Sopenharmony_ci cxd2880_tnrdmd_dvbt_mon_sync_stat_sub(tnr_dmd, &sync_stat, 9098c2ecf20Sopenharmony_ci &unlock_detected_sub); 9108c2ecf20Sopenharmony_ci if (ret) 9118c2ecf20Sopenharmony_ci return ret; 9128c2ecf20Sopenharmony_ci 9138c2ecf20Sopenharmony_ci if (unlock_detected && unlock_detected_sub) 9148c2ecf20Sopenharmony_ci *lock = CXD2880_TNRDMD_LOCK_RESULT_UNLOCKED; 9158c2ecf20Sopenharmony_ci else 9168c2ecf20Sopenharmony_ci *lock = CXD2880_TNRDMD_LOCK_RESULT_NOTDETECT; 9178c2ecf20Sopenharmony_ci 9188c2ecf20Sopenharmony_ci return ret; 9198c2ecf20Sopenharmony_ci} 920