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