162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * cxd2880_tnrdmd.c
462306a36Sopenharmony_ci * Sony CXD2880 DVB-T2/T tuner + demodulator driver
562306a36Sopenharmony_ci * common control functions
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Copyright (C) 2016, 2017, 2018 Sony Semiconductor Solutions Corporation
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include <media/dvb_frontend.h>
1162306a36Sopenharmony_ci#include "cxd2880_common.h"
1262306a36Sopenharmony_ci#include "cxd2880_tnrdmd.h"
1362306a36Sopenharmony_ci#include "cxd2880_tnrdmd_mon.h"
1462306a36Sopenharmony_ci#include "cxd2880_tnrdmd_dvbt.h"
1562306a36Sopenharmony_ci#include "cxd2880_tnrdmd_dvbt2.h"
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_cistatic const struct cxd2880_reg_value p_init1_seq[] = {
1862306a36Sopenharmony_ci	{0x11, 0x16}, {0x00, 0x10},
1962306a36Sopenharmony_ci};
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_cistatic const struct cxd2880_reg_value rf_init1_seq1[] = {
2262306a36Sopenharmony_ci	{0x4f, 0x18}, {0x61, 0x00}, {0x71, 0x00}, {0x9d, 0x01},
2362306a36Sopenharmony_ci	{0x7d, 0x02}, {0x8f, 0x01}, {0x8b, 0xc6}, {0x9a, 0x03},
2462306a36Sopenharmony_ci	{0x1c, 0x00},
2562306a36Sopenharmony_ci};
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_cistatic const struct cxd2880_reg_value rf_init1_seq2[] = {
2862306a36Sopenharmony_ci	{0xb9, 0x07}, {0x33, 0x01}, {0xc1, 0x01}, {0xc4, 0x1e},
2962306a36Sopenharmony_ci};
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_cistatic const struct cxd2880_reg_value rf_init1_seq3[] = {
3262306a36Sopenharmony_ci	{0x00, 0x10}, {0x51, 0x01}, {0xc5, 0x07}, {0x00, 0x11},
3362306a36Sopenharmony_ci	{0x70, 0xe9}, {0x76, 0x0a}, {0x78, 0x32}, {0x7a, 0x46},
3462306a36Sopenharmony_ci	{0x7c, 0x86}, {0x7e, 0xa4}, {0x00, 0x10}, {0xe1, 0x01},
3562306a36Sopenharmony_ci};
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_cistatic const struct cxd2880_reg_value rf_init1_seq4[] = {
3862306a36Sopenharmony_ci	{0x15, 0x00}, {0x00, 0x16}
3962306a36Sopenharmony_ci};
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_cistatic const struct cxd2880_reg_value rf_init1_seq5[] = {
4262306a36Sopenharmony_ci	{0x00, 0x00}, {0x25, 0x00}
4362306a36Sopenharmony_ci};
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_cistatic const struct cxd2880_reg_value rf_init1_seq6[] = {
4662306a36Sopenharmony_ci	{0x02, 0x00}, {0x00, 0x00}, {0x21, 0x01}, {0x00, 0xe1},
4762306a36Sopenharmony_ci	{0x8f, 0x16}, {0x67, 0x60}, {0x6a, 0x0f}, {0x6c, 0x17}
4862306a36Sopenharmony_ci};
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_cistatic const struct cxd2880_reg_value rf_init1_seq7[] = {
5162306a36Sopenharmony_ci	{0x00, 0xe2}, {0x41, 0xa0}, {0x4b, 0x68}, {0x00, 0x00},
5262306a36Sopenharmony_ci	{0x21, 0x00}, {0x10, 0x01},
5362306a36Sopenharmony_ci};
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_cistatic const struct cxd2880_reg_value rf_init1_seq8[] = {
5662306a36Sopenharmony_ci	{0x00, 0x10}, {0x25, 0x01},
5762306a36Sopenharmony_ci};
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_cistatic const struct cxd2880_reg_value rf_init1_seq9[] = {
6062306a36Sopenharmony_ci	{0x00, 0x10}, {0x14, 0x01}, {0x00, 0x00}, {0x26, 0x00},
6162306a36Sopenharmony_ci};
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_cistatic const struct cxd2880_reg_value rf_init2_seq1[] = {
6462306a36Sopenharmony_ci	{0x00, 0x14}, {0x1b, 0x01},
6562306a36Sopenharmony_ci};
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_cistatic const struct cxd2880_reg_value rf_init2_seq2[] = {
6862306a36Sopenharmony_ci	{0x00, 0x00}, {0x21, 0x01}, {0x00, 0xe1}, {0xd3, 0x00},
6962306a36Sopenharmony_ci	{0x00, 0x00}, {0x21, 0x00},
7062306a36Sopenharmony_ci};
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_cistatic const struct cxd2880_reg_value x_tune1_seq1[] = {
7362306a36Sopenharmony_ci	{0x00, 0x00}, {0x10, 0x01},
7462306a36Sopenharmony_ci};
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_cistatic const struct cxd2880_reg_value x_tune1_seq2[] = {
7762306a36Sopenharmony_ci	{0x62, 0x00}, {0x00, 0x15},
7862306a36Sopenharmony_ci};
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_cistatic const struct cxd2880_reg_value x_tune2_seq1[] = {
8162306a36Sopenharmony_ci	{0x00, 0x1a}, {0x29, 0x01},
8262306a36Sopenharmony_ci};
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_cistatic const struct cxd2880_reg_value x_tune2_seq2[] = {
8562306a36Sopenharmony_ci	{0x62, 0x01}, {0x00, 0x11}, {0x2d, 0x00}, {0x2f, 0x00},
8662306a36Sopenharmony_ci};
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_cistatic const struct cxd2880_reg_value x_tune2_seq3[] = {
8962306a36Sopenharmony_ci	{0x00, 0x00}, {0x10, 0x00}, {0x21, 0x01},
9062306a36Sopenharmony_ci};
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_cistatic const struct cxd2880_reg_value x_tune2_seq4[] = {
9362306a36Sopenharmony_ci	{0x00, 0xe1}, {0x8a, 0x87},
9462306a36Sopenharmony_ci};
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_cistatic const struct cxd2880_reg_value x_tune2_seq5[] = {
9762306a36Sopenharmony_ci	{0x00, 0x00}, {0x21, 0x00},
9862306a36Sopenharmony_ci};
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_cistatic const struct cxd2880_reg_value x_tune3_seq[] = {
10162306a36Sopenharmony_ci	{0x00, 0x00}, {0x21, 0x01}, {0x00, 0xe2}, {0x41, 0xa0},
10262306a36Sopenharmony_ci	{0x00, 0x00}, {0x21, 0x00}, {0xfe, 0x01},
10362306a36Sopenharmony_ci};
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_cistatic const struct cxd2880_reg_value x_tune4_seq[] = {
10662306a36Sopenharmony_ci	{0x00, 0x00}, {0xfe, 0x01},
10762306a36Sopenharmony_ci};
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_cistatic const struct cxd2880_reg_value x_sleep1_seq[] = {
11062306a36Sopenharmony_ci	{0x00, 0x00}, {0x57, 0x03},
11162306a36Sopenharmony_ci};
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_cistatic const struct cxd2880_reg_value x_sleep2_seq1[] = {
11462306a36Sopenharmony_ci	{0x00, 0x2d}, {0xb1, 0x01},
11562306a36Sopenharmony_ci};
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_cistatic const struct cxd2880_reg_value x_sleep2_seq2[] = {
11862306a36Sopenharmony_ci	{0x00, 0x10}, {0xf4, 0x00}, {0xf3, 0x00}, {0xf2, 0x00},
11962306a36Sopenharmony_ci	{0xf1, 0x00}, {0xf0, 0x00}, {0xef, 0x00},
12062306a36Sopenharmony_ci};
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_cistatic const struct cxd2880_reg_value x_sleep3_seq[] = {
12362306a36Sopenharmony_ci	{0x00, 0x00}, {0xfd, 0x00},
12462306a36Sopenharmony_ci};
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_cistatic const struct cxd2880_reg_value x_sleep4_seq[] = {
12762306a36Sopenharmony_ci	{0x00, 0x00}, {0x21, 0x01}, {0x00, 0xe2}, {0x41, 0x00},
12862306a36Sopenharmony_ci	{0x00, 0x00}, {0x21, 0x00},
12962306a36Sopenharmony_ci};
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_cistatic const struct cxd2880_reg_value spll_reset_seq1[] = {
13262306a36Sopenharmony_ci	{0x00, 0x10}, {0x29, 0x01}, {0x28, 0x01}, {0x27, 0x01},
13362306a36Sopenharmony_ci	{0x26, 0x01},
13462306a36Sopenharmony_ci};
13562306a36Sopenharmony_ci
13662306a36Sopenharmony_cistatic const struct cxd2880_reg_value spll_reset_seq2[] = {
13762306a36Sopenharmony_ci	{0x00, 0x00}, {0x10, 0x00},
13862306a36Sopenharmony_ci};
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_cistatic const struct cxd2880_reg_value spll_reset_seq3[] = {
14162306a36Sopenharmony_ci	{0x00, 0x00}, {0x27, 0x00}, {0x22, 0x01},
14262306a36Sopenharmony_ci};
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_cistatic const struct cxd2880_reg_value spll_reset_seq4[] = {
14562306a36Sopenharmony_ci	{0x00, 0x00}, {0x27, 0x01},
14662306a36Sopenharmony_ci};
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_cistatic const struct cxd2880_reg_value spll_reset_seq5[] = {
14962306a36Sopenharmony_ci	{0x00, 0x00}, {0x10, 0x01},
15062306a36Sopenharmony_ci};
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_cistatic const struct cxd2880_reg_value t_power_x_seq1[] = {
15362306a36Sopenharmony_ci	{0x00, 0x10}, {0x29, 0x01}, {0x28, 0x01}, {0x27, 0x01},
15462306a36Sopenharmony_ci};
15562306a36Sopenharmony_ci
15662306a36Sopenharmony_cistatic const struct cxd2880_reg_value t_power_x_seq2[] = {
15762306a36Sopenharmony_ci	{0x00, 0x00}, {0x10, 0x00},
15862306a36Sopenharmony_ci};
15962306a36Sopenharmony_ci
16062306a36Sopenharmony_cistatic const struct cxd2880_reg_value t_power_x_seq3[] = {
16162306a36Sopenharmony_ci	{0x00, 0x00}, {0x27, 0x00}, {0x25, 0x01},
16262306a36Sopenharmony_ci};
16362306a36Sopenharmony_ci
16462306a36Sopenharmony_cistatic const struct cxd2880_reg_value t_power_x_seq4[] = {
16562306a36Sopenharmony_ci	{0x00, 0x00}, {0x2a, 0x00},
16662306a36Sopenharmony_ci};
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_cistatic const struct cxd2880_reg_value t_power_x_seq5[] = {
16962306a36Sopenharmony_ci	{0x00, 0x00}, {0x25, 0x00},
17062306a36Sopenharmony_ci};
17162306a36Sopenharmony_ci
17262306a36Sopenharmony_cistatic const struct cxd2880_reg_value t_power_x_seq6[] = {
17362306a36Sopenharmony_ci	{0x00, 0x00}, {0x27, 0x01},
17462306a36Sopenharmony_ci};
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_cistatic const struct cxd2880_reg_value t_power_x_seq7[] = {
17762306a36Sopenharmony_ci	{0x00, 0x00}, {0x10, 0x01},
17862306a36Sopenharmony_ci};
17962306a36Sopenharmony_ci
18062306a36Sopenharmony_cistatic const struct cxd2880_reg_value set_ts_pin_seq[] = {
18162306a36Sopenharmony_ci	{0x50, 0x3f}, {0x52, 0x1f},
18262306a36Sopenharmony_ci
18362306a36Sopenharmony_ci};
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_cistatic const struct cxd2880_reg_value set_ts_output_seq1[] = {
18662306a36Sopenharmony_ci	{0x00, 0x00}, {0x52, 0x00},
18762306a36Sopenharmony_ci};
18862306a36Sopenharmony_ci
18962306a36Sopenharmony_cistatic const struct cxd2880_reg_value set_ts_output_seq2[] = {
19062306a36Sopenharmony_ci	{0x00, 0x00}, {0xc3, 0x00},
19162306a36Sopenharmony_ci
19262306a36Sopenharmony_ci};
19362306a36Sopenharmony_ci
19462306a36Sopenharmony_cistatic const struct cxd2880_reg_value set_ts_output_seq3[] = {
19562306a36Sopenharmony_ci	{0x00, 0x00}, {0xc3, 0x01},
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_ci};
19862306a36Sopenharmony_ci
19962306a36Sopenharmony_cistatic const struct cxd2880_reg_value set_ts_output_seq4[] = {
20062306a36Sopenharmony_ci	{0x00, 0x00}, {0x52, 0x1f},
20162306a36Sopenharmony_ci
20262306a36Sopenharmony_ci};
20362306a36Sopenharmony_ci
20462306a36Sopenharmony_cistatic int p_init1(struct cxd2880_tnrdmd *tnr_dmd)
20562306a36Sopenharmony_ci{
20662306a36Sopenharmony_ci	u8 data = 0;
20762306a36Sopenharmony_ci	int ret;
20862306a36Sopenharmony_ci
20962306a36Sopenharmony_ci	if (!tnr_dmd)
21062306a36Sopenharmony_ci		return -EINVAL;
21162306a36Sopenharmony_ci
21262306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
21362306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
21462306a36Sopenharmony_ci				     0x00, 0x00);
21562306a36Sopenharmony_ci	if (ret)
21662306a36Sopenharmony_ci		return ret;
21762306a36Sopenharmony_ci
21862306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SINGLE ||
21962306a36Sopenharmony_ci	    tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) {
22062306a36Sopenharmony_ci		switch (tnr_dmd->create_param.ts_output_if) {
22162306a36Sopenharmony_ci		case CXD2880_TNRDMD_TSOUT_IF_TS:
22262306a36Sopenharmony_ci			data = 0x00;
22362306a36Sopenharmony_ci			break;
22462306a36Sopenharmony_ci		case CXD2880_TNRDMD_TSOUT_IF_SPI:
22562306a36Sopenharmony_ci			data = 0x01;
22662306a36Sopenharmony_ci			break;
22762306a36Sopenharmony_ci		case CXD2880_TNRDMD_TSOUT_IF_SDIO:
22862306a36Sopenharmony_ci			data = 0x02;
22962306a36Sopenharmony_ci			break;
23062306a36Sopenharmony_ci		default:
23162306a36Sopenharmony_ci			return -EINVAL;
23262306a36Sopenharmony_ci		}
23362306a36Sopenharmony_ci		ret = tnr_dmd->io->write_reg(tnr_dmd->io,
23462306a36Sopenharmony_ci					     CXD2880_IO_TGT_SYS,
23562306a36Sopenharmony_ci					     0x10, data);
23662306a36Sopenharmony_ci		if (ret)
23762306a36Sopenharmony_ci			return ret;
23862306a36Sopenharmony_ci	}
23962306a36Sopenharmony_ci
24062306a36Sopenharmony_ci	ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
24162306a36Sopenharmony_ci					  CXD2880_IO_TGT_SYS,
24262306a36Sopenharmony_ci					  p_init1_seq,
24362306a36Sopenharmony_ci					  ARRAY_SIZE(p_init1_seq));
24462306a36Sopenharmony_ci	if (ret)
24562306a36Sopenharmony_ci		return ret;
24662306a36Sopenharmony_ci
24762306a36Sopenharmony_ci	switch (tnr_dmd->chip_id) {
24862306a36Sopenharmony_ci	case CXD2880_TNRDMD_CHIP_ID_CXD2880_ES1_0X:
24962306a36Sopenharmony_ci		data = 0x1a;
25062306a36Sopenharmony_ci		break;
25162306a36Sopenharmony_ci	case CXD2880_TNRDMD_CHIP_ID_CXD2880_ES1_11:
25262306a36Sopenharmony_ci		data = 0x16;
25362306a36Sopenharmony_ci		break;
25462306a36Sopenharmony_ci	default:
25562306a36Sopenharmony_ci		return -ENOTTY;
25662306a36Sopenharmony_ci	}
25762306a36Sopenharmony_ci
25862306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
25962306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
26062306a36Sopenharmony_ci				     0x10, data);
26162306a36Sopenharmony_ci	if (ret)
26262306a36Sopenharmony_ci		return ret;
26362306a36Sopenharmony_ci
26462306a36Sopenharmony_ci	if (tnr_dmd->create_param.en_internal_ldo)
26562306a36Sopenharmony_ci		data = 0x01;
26662306a36Sopenharmony_ci	else
26762306a36Sopenharmony_ci		data = 0x00;
26862306a36Sopenharmony_ci
26962306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
27062306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
27162306a36Sopenharmony_ci				     0x11, data);
27262306a36Sopenharmony_ci	if (ret)
27362306a36Sopenharmony_ci		return ret;
27462306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
27562306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
27662306a36Sopenharmony_ci				     0x13, data);
27762306a36Sopenharmony_ci	if (ret)
27862306a36Sopenharmony_ci		return ret;
27962306a36Sopenharmony_ci
28062306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
28162306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
28262306a36Sopenharmony_ci				     0x00, 0x00);
28362306a36Sopenharmony_ci	if (ret)
28462306a36Sopenharmony_ci		return ret;
28562306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
28662306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
28762306a36Sopenharmony_ci				     0x12, data);
28862306a36Sopenharmony_ci	if (ret)
28962306a36Sopenharmony_ci		return ret;
29062306a36Sopenharmony_ci
29162306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
29262306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
29362306a36Sopenharmony_ci				     0x00, 0x10);
29462306a36Sopenharmony_ci	if (ret)
29562306a36Sopenharmony_ci		return ret;
29662306a36Sopenharmony_ci
29762306a36Sopenharmony_ci	switch (tnr_dmd->chip_id) {
29862306a36Sopenharmony_ci	case CXD2880_TNRDMD_CHIP_ID_CXD2880_ES1_0X:
29962306a36Sopenharmony_ci		data = 0x01;
30062306a36Sopenharmony_ci		break;
30162306a36Sopenharmony_ci	case CXD2880_TNRDMD_CHIP_ID_CXD2880_ES1_11:
30262306a36Sopenharmony_ci		data = 0x00;
30362306a36Sopenharmony_ci		break;
30462306a36Sopenharmony_ci	default:
30562306a36Sopenharmony_ci		return -ENOTTY;
30662306a36Sopenharmony_ci	}
30762306a36Sopenharmony_ci
30862306a36Sopenharmony_ci	return tnr_dmd->io->write_reg(tnr_dmd->io,
30962306a36Sopenharmony_ci				      CXD2880_IO_TGT_SYS,
31062306a36Sopenharmony_ci				      0x69, data);
31162306a36Sopenharmony_ci}
31262306a36Sopenharmony_ci
31362306a36Sopenharmony_cistatic int p_init2(struct cxd2880_tnrdmd *tnr_dmd)
31462306a36Sopenharmony_ci{
31562306a36Sopenharmony_ci	u8 data[6] = { 0 };
31662306a36Sopenharmony_ci	int ret;
31762306a36Sopenharmony_ci
31862306a36Sopenharmony_ci	if (!tnr_dmd)
31962306a36Sopenharmony_ci		return -EINVAL;
32062306a36Sopenharmony_ci
32162306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
32262306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
32362306a36Sopenharmony_ci				     0x00, 0x00);
32462306a36Sopenharmony_ci	if (ret)
32562306a36Sopenharmony_ci		return ret;
32662306a36Sopenharmony_ci	data[0] = tnr_dmd->create_param.xosc_cap;
32762306a36Sopenharmony_ci	data[1] = tnr_dmd->create_param.xosc_i;
32862306a36Sopenharmony_ci	switch (tnr_dmd->create_param.xtal_share_type) {
32962306a36Sopenharmony_ci	case CXD2880_TNRDMD_XTAL_SHARE_NONE:
33062306a36Sopenharmony_ci		data[2] = 0x01;
33162306a36Sopenharmony_ci		data[3] = 0x00;
33262306a36Sopenharmony_ci		break;
33362306a36Sopenharmony_ci	case CXD2880_TNRDMD_XTAL_SHARE_EXTREF:
33462306a36Sopenharmony_ci		data[2] = 0x00;
33562306a36Sopenharmony_ci		data[3] = 0x00;
33662306a36Sopenharmony_ci		break;
33762306a36Sopenharmony_ci	case CXD2880_TNRDMD_XTAL_SHARE_MASTER:
33862306a36Sopenharmony_ci		data[2] = 0x01;
33962306a36Sopenharmony_ci		data[3] = 0x01;
34062306a36Sopenharmony_ci		break;
34162306a36Sopenharmony_ci	case CXD2880_TNRDMD_XTAL_SHARE_SLAVE:
34262306a36Sopenharmony_ci		data[2] = 0x00;
34362306a36Sopenharmony_ci		data[3] = 0x01;
34462306a36Sopenharmony_ci		break;
34562306a36Sopenharmony_ci	default:
34662306a36Sopenharmony_ci		return -EINVAL;
34762306a36Sopenharmony_ci	}
34862306a36Sopenharmony_ci	data[4] = 0x06;
34962306a36Sopenharmony_ci	data[5] = 0x00;
35062306a36Sopenharmony_ci
35162306a36Sopenharmony_ci	return tnr_dmd->io->write_regs(tnr_dmd->io,
35262306a36Sopenharmony_ci				       CXD2880_IO_TGT_SYS,
35362306a36Sopenharmony_ci				       0x13, data, 6);
35462306a36Sopenharmony_ci}
35562306a36Sopenharmony_ci
35662306a36Sopenharmony_cistatic int p_init3(struct cxd2880_tnrdmd *tnr_dmd)
35762306a36Sopenharmony_ci{
35862306a36Sopenharmony_ci	u8 data[2] = { 0 };
35962306a36Sopenharmony_ci	int ret;
36062306a36Sopenharmony_ci
36162306a36Sopenharmony_ci	if (!tnr_dmd)
36262306a36Sopenharmony_ci		return -EINVAL;
36362306a36Sopenharmony_ci
36462306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
36562306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
36662306a36Sopenharmony_ci				     0x00, 0x00);
36762306a36Sopenharmony_ci	if (ret)
36862306a36Sopenharmony_ci		return ret;
36962306a36Sopenharmony_ci
37062306a36Sopenharmony_ci	switch (tnr_dmd->diver_mode) {
37162306a36Sopenharmony_ci	case CXD2880_TNRDMD_DIVERMODE_SINGLE:
37262306a36Sopenharmony_ci		data[0] = 0x00;
37362306a36Sopenharmony_ci		break;
37462306a36Sopenharmony_ci	case CXD2880_TNRDMD_DIVERMODE_MAIN:
37562306a36Sopenharmony_ci		data[0] = 0x03;
37662306a36Sopenharmony_ci		break;
37762306a36Sopenharmony_ci	case CXD2880_TNRDMD_DIVERMODE_SUB:
37862306a36Sopenharmony_ci		data[0] = 0x02;
37962306a36Sopenharmony_ci		break;
38062306a36Sopenharmony_ci	default:
38162306a36Sopenharmony_ci		return -EINVAL;
38262306a36Sopenharmony_ci	}
38362306a36Sopenharmony_ci
38462306a36Sopenharmony_ci	data[1] = 0x01;
38562306a36Sopenharmony_ci
38662306a36Sopenharmony_ci	return tnr_dmd->io->write_regs(tnr_dmd->io,
38762306a36Sopenharmony_ci				       CXD2880_IO_TGT_SYS,
38862306a36Sopenharmony_ci				       0x1f, data, 2);
38962306a36Sopenharmony_ci}
39062306a36Sopenharmony_ci
39162306a36Sopenharmony_cistatic int rf_init1(struct cxd2880_tnrdmd *tnr_dmd)
39262306a36Sopenharmony_ci{
39362306a36Sopenharmony_ci	u8 data[8] = { 0 };
39462306a36Sopenharmony_ci	static const u8 rf_init1_cdata1[40] = {
39562306a36Sopenharmony_ci		0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
39662306a36Sopenharmony_ci		0x05, 0x05, 0x04, 0x04, 0x04, 0x03, 0x03,
39762306a36Sopenharmony_ci		0x03, 0x04, 0x04, 0x05, 0x05, 0x05, 0x02,
39862306a36Sopenharmony_ci		0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
39962306a36Sopenharmony_ci		0x02, 0x03, 0x02, 0x01, 0x01, 0x01, 0x02,
40062306a36Sopenharmony_ci		0x02, 0x03, 0x04, 0x04, 0x04
40162306a36Sopenharmony_ci	};
40262306a36Sopenharmony_ci
40362306a36Sopenharmony_ci	static const u8 rf_init1_cdata2[5] = {0xff, 0x00, 0x00, 0x00, 0x00};
40462306a36Sopenharmony_ci	static const u8 rf_init1_cdata3[80] = {
40562306a36Sopenharmony_ci		0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
40662306a36Sopenharmony_ci		0x01, 0x00, 0x02, 0x00, 0x63, 0x00, 0x00,
40762306a36Sopenharmony_ci		0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00,
40862306a36Sopenharmony_ci		0x06, 0x00, 0x06, 0x00, 0x08, 0x00, 0x09,
40962306a36Sopenharmony_ci		0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0d, 0x00,
41062306a36Sopenharmony_ci		0x0d, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f,
41162306a36Sopenharmony_ci		0x00, 0x10, 0x00, 0x79, 0x00, 0x00, 0x00,
41262306a36Sopenharmony_ci		0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01,
41362306a36Sopenharmony_ci		0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00,
41462306a36Sopenharmony_ci		0x04, 0x00, 0x04, 0x00, 0x06, 0x00, 0x05,
41562306a36Sopenharmony_ci		0x00, 0x07, 0x00, 0x07, 0x00, 0x08, 0x00,
41662306a36Sopenharmony_ci		0x0a, 0x03, 0xe0
41762306a36Sopenharmony_ci	};
41862306a36Sopenharmony_ci
41962306a36Sopenharmony_ci	static const u8 rf_init1_cdata4[8] = {
42062306a36Sopenharmony_ci		0x20, 0x20, 0x30, 0x41, 0x50, 0x5f, 0x6f, 0x80
42162306a36Sopenharmony_ci	};
42262306a36Sopenharmony_ci
42362306a36Sopenharmony_ci	static const u8 rf_init1_cdata5[50] = {
42462306a36Sopenharmony_ci		0x00, 0x09, 0x00, 0x08, 0x00, 0x07, 0x00,
42562306a36Sopenharmony_ci		0x06, 0x00, 0x05, 0x00, 0x03, 0x00, 0x02,
42662306a36Sopenharmony_ci		0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00,
42762306a36Sopenharmony_ci		0x06, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0c,
42862306a36Sopenharmony_ci		0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0f, 0x00,
42962306a36Sopenharmony_ci		0x0e, 0x00, 0x0e, 0x00, 0x10, 0x00, 0x0f,
43062306a36Sopenharmony_ci		0x00, 0x0e, 0x00, 0x10, 0x00, 0x0f, 0x00,
43162306a36Sopenharmony_ci		0x0e
43262306a36Sopenharmony_ci	};
43362306a36Sopenharmony_ci
43462306a36Sopenharmony_ci	u8 addr = 0;
43562306a36Sopenharmony_ci	int ret;
43662306a36Sopenharmony_ci
43762306a36Sopenharmony_ci	if (!tnr_dmd)
43862306a36Sopenharmony_ci		return -EINVAL;
43962306a36Sopenharmony_ci
44062306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
44162306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
44262306a36Sopenharmony_ci				     0x00, 0x00);
44362306a36Sopenharmony_ci	if (ret)
44462306a36Sopenharmony_ci		return ret;
44562306a36Sopenharmony_ci	data[0] = 0x01;
44662306a36Sopenharmony_ci	data[1] = 0x00;
44762306a36Sopenharmony_ci	data[2] = 0x01;
44862306a36Sopenharmony_ci	ret = tnr_dmd->io->write_regs(tnr_dmd->io,
44962306a36Sopenharmony_ci				      CXD2880_IO_TGT_SYS,
45062306a36Sopenharmony_ci				      0x21, data, 3);
45162306a36Sopenharmony_ci	if (ret)
45262306a36Sopenharmony_ci		return ret;
45362306a36Sopenharmony_ci
45462306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
45562306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
45662306a36Sopenharmony_ci				     0x00, 0x10);
45762306a36Sopenharmony_ci	if (ret)
45862306a36Sopenharmony_ci		return ret;
45962306a36Sopenharmony_ci	data[0] = 0x01;
46062306a36Sopenharmony_ci	data[1] = 0x01;
46162306a36Sopenharmony_ci	ret = tnr_dmd->io->write_regs(tnr_dmd->io,
46262306a36Sopenharmony_ci				      CXD2880_IO_TGT_SYS,
46362306a36Sopenharmony_ci				      0x17, data, 2);
46462306a36Sopenharmony_ci	if (ret)
46562306a36Sopenharmony_ci		return ret;
46662306a36Sopenharmony_ci
46762306a36Sopenharmony_ci	if (tnr_dmd->create_param.stationary_use) {
46862306a36Sopenharmony_ci		ret = tnr_dmd->io->write_reg(tnr_dmd->io,
46962306a36Sopenharmony_ci					     CXD2880_IO_TGT_SYS,
47062306a36Sopenharmony_ci					     0x1a, 0x06);
47162306a36Sopenharmony_ci		if (ret)
47262306a36Sopenharmony_ci			return ret;
47362306a36Sopenharmony_ci	}
47462306a36Sopenharmony_ci
47562306a36Sopenharmony_ci	ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
47662306a36Sopenharmony_ci					  CXD2880_IO_TGT_SYS,
47762306a36Sopenharmony_ci					  rf_init1_seq1,
47862306a36Sopenharmony_ci					  ARRAY_SIZE(rf_init1_seq1));
47962306a36Sopenharmony_ci	if (ret)
48062306a36Sopenharmony_ci		return ret;
48162306a36Sopenharmony_ci
48262306a36Sopenharmony_ci	data[0] = 0x00;
48362306a36Sopenharmony_ci	if (tnr_dmd->create_param.is_cxd2881gg &&
48462306a36Sopenharmony_ci	    tnr_dmd->create_param.xtal_share_type ==
48562306a36Sopenharmony_ci		CXD2880_TNRDMD_XTAL_SHARE_SLAVE)
48662306a36Sopenharmony_ci		data[1] = 0x00;
48762306a36Sopenharmony_ci	else
48862306a36Sopenharmony_ci		data[1] = 0x1f;
48962306a36Sopenharmony_ci	data[2] = 0x0a;
49062306a36Sopenharmony_ci	ret = tnr_dmd->io->write_regs(tnr_dmd->io,
49162306a36Sopenharmony_ci				      CXD2880_IO_TGT_SYS,
49262306a36Sopenharmony_ci				      0xb5, data, 3);
49362306a36Sopenharmony_ci	if (ret)
49462306a36Sopenharmony_ci		return ret;
49562306a36Sopenharmony_ci
49662306a36Sopenharmony_ci	ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
49762306a36Sopenharmony_ci					  CXD2880_IO_TGT_SYS,
49862306a36Sopenharmony_ci					  rf_init1_seq2,
49962306a36Sopenharmony_ci					  ARRAY_SIZE(rf_init1_seq2));
50062306a36Sopenharmony_ci	if (ret)
50162306a36Sopenharmony_ci		return ret;
50262306a36Sopenharmony_ci
50362306a36Sopenharmony_ci	if (tnr_dmd->chip_id == CXD2880_TNRDMD_CHIP_ID_CXD2880_ES1_0X) {
50462306a36Sopenharmony_ci		data[0] = 0x34;
50562306a36Sopenharmony_ci		data[1] = 0x2c;
50662306a36Sopenharmony_ci	} else {
50762306a36Sopenharmony_ci		data[0] = 0x2f;
50862306a36Sopenharmony_ci		data[1] = 0x25;
50962306a36Sopenharmony_ci	}
51062306a36Sopenharmony_ci	data[2] = 0x15;
51162306a36Sopenharmony_ci	data[3] = 0x19;
51262306a36Sopenharmony_ci	data[4] = 0x1b;
51362306a36Sopenharmony_ci	data[5] = 0x15;
51462306a36Sopenharmony_ci	data[6] = 0x19;
51562306a36Sopenharmony_ci	data[7] = 0x1b;
51662306a36Sopenharmony_ci	ret = tnr_dmd->io->write_regs(tnr_dmd->io,
51762306a36Sopenharmony_ci				      CXD2880_IO_TGT_SYS,
51862306a36Sopenharmony_ci				      0xd9, data, 8);
51962306a36Sopenharmony_ci	if (ret)
52062306a36Sopenharmony_ci		return ret;
52162306a36Sopenharmony_ci
52262306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
52362306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
52462306a36Sopenharmony_ci				     0x00, 0x11);
52562306a36Sopenharmony_ci	if (ret)
52662306a36Sopenharmony_ci		return ret;
52762306a36Sopenharmony_ci	data[0] = 0x6c;
52862306a36Sopenharmony_ci	data[1] = 0x10;
52962306a36Sopenharmony_ci	data[2] = 0xa6;
53062306a36Sopenharmony_ci	ret = tnr_dmd->io->write_regs(tnr_dmd->io,
53162306a36Sopenharmony_ci				      CXD2880_IO_TGT_SYS,
53262306a36Sopenharmony_ci				      0x44, data, 3);
53362306a36Sopenharmony_ci	if (ret)
53462306a36Sopenharmony_ci		return ret;
53562306a36Sopenharmony_ci	data[0] = 0x16;
53662306a36Sopenharmony_ci	data[1] = 0xa8;
53762306a36Sopenharmony_ci	ret = tnr_dmd->io->write_regs(tnr_dmd->io,
53862306a36Sopenharmony_ci				      CXD2880_IO_TGT_SYS,
53962306a36Sopenharmony_ci				      0x50, data, 2);
54062306a36Sopenharmony_ci	if (ret)
54162306a36Sopenharmony_ci		return ret;
54262306a36Sopenharmony_ci	data[0] = 0x00;
54362306a36Sopenharmony_ci	data[1] = 0x22;
54462306a36Sopenharmony_ci	data[2] = 0x00;
54562306a36Sopenharmony_ci	data[3] = 0x88;
54662306a36Sopenharmony_ci	ret = tnr_dmd->io->write_regs(tnr_dmd->io,
54762306a36Sopenharmony_ci				      CXD2880_IO_TGT_SYS,
54862306a36Sopenharmony_ci				      0x62, data, 4);
54962306a36Sopenharmony_ci	if (ret)
55062306a36Sopenharmony_ci		return ret;
55162306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
55262306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
55362306a36Sopenharmony_ci				     0x74, 0x75);
55462306a36Sopenharmony_ci	if (ret)
55562306a36Sopenharmony_ci		return ret;
55662306a36Sopenharmony_ci	ret = tnr_dmd->io->write_regs(tnr_dmd->io,
55762306a36Sopenharmony_ci				      CXD2880_IO_TGT_SYS,
55862306a36Sopenharmony_ci				      0x7f, rf_init1_cdata1, 40);
55962306a36Sopenharmony_ci	if (ret)
56062306a36Sopenharmony_ci		return ret;
56162306a36Sopenharmony_ci
56262306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
56362306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
56462306a36Sopenharmony_ci				     0x00, 0x16);
56562306a36Sopenharmony_ci	if (ret)
56662306a36Sopenharmony_ci		return ret;
56762306a36Sopenharmony_ci	data[0] = 0x00;
56862306a36Sopenharmony_ci	data[1] = 0x71;
56962306a36Sopenharmony_ci	ret = tnr_dmd->io->write_regs(tnr_dmd->io,
57062306a36Sopenharmony_ci				      CXD2880_IO_TGT_SYS,
57162306a36Sopenharmony_ci				      0x10, data, 2);
57262306a36Sopenharmony_ci	if (ret)
57362306a36Sopenharmony_ci		return ret;
57462306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
57562306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
57662306a36Sopenharmony_ci				     0x23, 0x89);
57762306a36Sopenharmony_ci	if (ret)
57862306a36Sopenharmony_ci		return ret;
57962306a36Sopenharmony_ci
58062306a36Sopenharmony_ci	ret = tnr_dmd->io->write_regs(tnr_dmd->io,
58162306a36Sopenharmony_ci				      CXD2880_IO_TGT_SYS,
58262306a36Sopenharmony_ci				      0x27, rf_init1_cdata2, 5);
58362306a36Sopenharmony_ci	if (ret)
58462306a36Sopenharmony_ci		return ret;
58562306a36Sopenharmony_ci
58662306a36Sopenharmony_ci	ret = tnr_dmd->io->write_regs(tnr_dmd->io,
58762306a36Sopenharmony_ci				      CXD2880_IO_TGT_SYS,
58862306a36Sopenharmony_ci				      0x3a, rf_init1_cdata3, 80);
58962306a36Sopenharmony_ci	if (ret)
59062306a36Sopenharmony_ci		return ret;
59162306a36Sopenharmony_ci
59262306a36Sopenharmony_ci	data[0] = 0x03;
59362306a36Sopenharmony_ci	data[1] = 0xe0;
59462306a36Sopenharmony_ci	ret = tnr_dmd->io->write_regs(tnr_dmd->io,
59562306a36Sopenharmony_ci				      CXD2880_IO_TGT_SYS,
59662306a36Sopenharmony_ci				      0xbc, data, 2);
59762306a36Sopenharmony_ci	if (ret)
59862306a36Sopenharmony_ci		return ret;
59962306a36Sopenharmony_ci
60062306a36Sopenharmony_ci	ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
60162306a36Sopenharmony_ci					  CXD2880_IO_TGT_SYS,
60262306a36Sopenharmony_ci					  rf_init1_seq3,
60362306a36Sopenharmony_ci					  ARRAY_SIZE(rf_init1_seq3));
60462306a36Sopenharmony_ci	if (ret)
60562306a36Sopenharmony_ci		return ret;
60662306a36Sopenharmony_ci
60762306a36Sopenharmony_ci	if (tnr_dmd->create_param.stationary_use) {
60862306a36Sopenharmony_ci		data[0] = 0x06;
60962306a36Sopenharmony_ci		data[1] = 0x07;
61062306a36Sopenharmony_ci		data[2] = 0x1a;
61162306a36Sopenharmony_ci	} else {
61262306a36Sopenharmony_ci		data[0] = 0x00;
61362306a36Sopenharmony_ci		data[1] = 0x08;
61462306a36Sopenharmony_ci		data[2] = 0x19;
61562306a36Sopenharmony_ci	}
61662306a36Sopenharmony_ci	data[3] = 0x0e;
61762306a36Sopenharmony_ci	data[4] = 0x09;
61862306a36Sopenharmony_ci	data[5] = 0x0e;
61962306a36Sopenharmony_ci
62062306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
62162306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
62262306a36Sopenharmony_ci				     0x00, 0x12);
62362306a36Sopenharmony_ci	if (ret)
62462306a36Sopenharmony_ci		return ret;
62562306a36Sopenharmony_ci	for (addr = 0x10; addr < 0x9f; addr += 6) {
62662306a36Sopenharmony_ci		if (tnr_dmd->lna_thrs_tbl_air) {
62762306a36Sopenharmony_ci			u8 idx = 0;
62862306a36Sopenharmony_ci
62962306a36Sopenharmony_ci			idx = (addr - 0x10) / 6;
63062306a36Sopenharmony_ci			data[0] =
63162306a36Sopenharmony_ci			    tnr_dmd->lna_thrs_tbl_air->thrs[idx].off_on;
63262306a36Sopenharmony_ci			data[1] =
63362306a36Sopenharmony_ci			    tnr_dmd->lna_thrs_tbl_air->thrs[idx].on_off;
63462306a36Sopenharmony_ci		}
63562306a36Sopenharmony_ci		ret = tnr_dmd->io->write_regs(tnr_dmd->io,
63662306a36Sopenharmony_ci					      CXD2880_IO_TGT_SYS,
63762306a36Sopenharmony_ci					      addr, data, 6);
63862306a36Sopenharmony_ci		if (ret)
63962306a36Sopenharmony_ci			return ret;
64062306a36Sopenharmony_ci	}
64162306a36Sopenharmony_ci
64262306a36Sopenharmony_ci	data[0] = 0x00;
64362306a36Sopenharmony_ci	data[1] = 0x08;
64462306a36Sopenharmony_ci	if (tnr_dmd->create_param.stationary_use)
64562306a36Sopenharmony_ci		data[2] = 0x1a;
64662306a36Sopenharmony_ci	else
64762306a36Sopenharmony_ci		data[2] = 0x19;
64862306a36Sopenharmony_ci	data[3] = 0x0e;
64962306a36Sopenharmony_ci	data[4] = 0x09;
65062306a36Sopenharmony_ci	data[5] = 0x0e;
65162306a36Sopenharmony_ci
65262306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
65362306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
65462306a36Sopenharmony_ci				     0x00, 0x13);
65562306a36Sopenharmony_ci	if (ret)
65662306a36Sopenharmony_ci		return ret;
65762306a36Sopenharmony_ci	for (addr = 0x10; addr < 0xcf; addr += 6) {
65862306a36Sopenharmony_ci		if (tnr_dmd->lna_thrs_tbl_cable) {
65962306a36Sopenharmony_ci			u8 idx = 0;
66062306a36Sopenharmony_ci
66162306a36Sopenharmony_ci			idx = (addr - 0x10) / 6;
66262306a36Sopenharmony_ci			data[0] =
66362306a36Sopenharmony_ci			    tnr_dmd->lna_thrs_tbl_cable->thrs[idx].off_on;
66462306a36Sopenharmony_ci			data[1] =
66562306a36Sopenharmony_ci			    tnr_dmd->lna_thrs_tbl_cable->thrs[idx].on_off;
66662306a36Sopenharmony_ci		}
66762306a36Sopenharmony_ci		ret = tnr_dmd->io->write_regs(tnr_dmd->io,
66862306a36Sopenharmony_ci					      CXD2880_IO_TGT_SYS,
66962306a36Sopenharmony_ci					      addr, data, 6);
67062306a36Sopenharmony_ci		if (ret)
67162306a36Sopenharmony_ci			return ret;
67262306a36Sopenharmony_ci	}
67362306a36Sopenharmony_ci
67462306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
67562306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
67662306a36Sopenharmony_ci				     0x00, 0x11);
67762306a36Sopenharmony_ci	if (ret)
67862306a36Sopenharmony_ci		return ret;
67962306a36Sopenharmony_ci	data[0] = 0x08;
68062306a36Sopenharmony_ci	data[1] = 0x09;
68162306a36Sopenharmony_ci	ret = tnr_dmd->io->write_regs(tnr_dmd->io,
68262306a36Sopenharmony_ci				      CXD2880_IO_TGT_SYS,
68362306a36Sopenharmony_ci				      0xbd, data, 2);
68462306a36Sopenharmony_ci	if (ret)
68562306a36Sopenharmony_ci		return ret;
68662306a36Sopenharmony_ci	data[0] = 0x08;
68762306a36Sopenharmony_ci	data[1] = 0x09;
68862306a36Sopenharmony_ci	ret = tnr_dmd->io->write_regs(tnr_dmd->io,
68962306a36Sopenharmony_ci				      CXD2880_IO_TGT_SYS,
69062306a36Sopenharmony_ci				      0xc4, data, 2);
69162306a36Sopenharmony_ci	if (ret)
69262306a36Sopenharmony_ci		return ret;
69362306a36Sopenharmony_ci
69462306a36Sopenharmony_ci	ret = tnr_dmd->io->write_regs(tnr_dmd->io,
69562306a36Sopenharmony_ci				      CXD2880_IO_TGT_SYS,
69662306a36Sopenharmony_ci				      0xc9, rf_init1_cdata4, 8);
69762306a36Sopenharmony_ci	if (ret)
69862306a36Sopenharmony_ci		return ret;
69962306a36Sopenharmony_ci
70062306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
70162306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
70262306a36Sopenharmony_ci				     0x00, 0x14);
70362306a36Sopenharmony_ci	if (ret)
70462306a36Sopenharmony_ci		return ret;
70562306a36Sopenharmony_ci	data[0] = 0x15;
70662306a36Sopenharmony_ci	data[1] = 0x18;
70762306a36Sopenharmony_ci	data[2] = 0x00;
70862306a36Sopenharmony_ci	ret = tnr_dmd->io->write_regs(tnr_dmd->io,
70962306a36Sopenharmony_ci				      CXD2880_IO_TGT_SYS,
71062306a36Sopenharmony_ci				      0x10, data, 3);
71162306a36Sopenharmony_ci	if (ret)
71262306a36Sopenharmony_ci		return ret;
71362306a36Sopenharmony_ci
71462306a36Sopenharmony_ci	ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
71562306a36Sopenharmony_ci					  CXD2880_IO_TGT_SYS,
71662306a36Sopenharmony_ci					  rf_init1_seq4,
71762306a36Sopenharmony_ci					  ARRAY_SIZE(rf_init1_seq4));
71862306a36Sopenharmony_ci	if (ret)
71962306a36Sopenharmony_ci		return ret;
72062306a36Sopenharmony_ci
72162306a36Sopenharmony_ci	ret = tnr_dmd->io->write_regs(tnr_dmd->io,
72262306a36Sopenharmony_ci				      CXD2880_IO_TGT_SYS,
72362306a36Sopenharmony_ci				      0x12, rf_init1_cdata5, 50);
72462306a36Sopenharmony_ci	if (ret)
72562306a36Sopenharmony_ci		return ret;
72662306a36Sopenharmony_ci
72762306a36Sopenharmony_ci	usleep_range(1000, 2000);
72862306a36Sopenharmony_ci
72962306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
73062306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
73162306a36Sopenharmony_ci				     0x00, 0x0a);
73262306a36Sopenharmony_ci	if (ret)
73362306a36Sopenharmony_ci		return ret;
73462306a36Sopenharmony_ci	ret = tnr_dmd->io->read_regs(tnr_dmd->io,
73562306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
73662306a36Sopenharmony_ci				     0x10, data, 1);
73762306a36Sopenharmony_ci	if (ret)
73862306a36Sopenharmony_ci		return ret;
73962306a36Sopenharmony_ci	if ((data[0] & 0x01) == 0x00)
74062306a36Sopenharmony_ci		return -EINVAL;
74162306a36Sopenharmony_ci
74262306a36Sopenharmony_ci	ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
74362306a36Sopenharmony_ci					  CXD2880_IO_TGT_SYS,
74462306a36Sopenharmony_ci					  rf_init1_seq5,
74562306a36Sopenharmony_ci					  ARRAY_SIZE(rf_init1_seq5));
74662306a36Sopenharmony_ci	if (ret)
74762306a36Sopenharmony_ci		return ret;
74862306a36Sopenharmony_ci
74962306a36Sopenharmony_ci	usleep_range(1000, 2000);
75062306a36Sopenharmony_ci
75162306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
75262306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
75362306a36Sopenharmony_ci				     0x00, 0x0a);
75462306a36Sopenharmony_ci	if (ret)
75562306a36Sopenharmony_ci		return ret;
75662306a36Sopenharmony_ci	ret = tnr_dmd->io->read_regs(tnr_dmd->io,
75762306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
75862306a36Sopenharmony_ci				     0x11, data, 1);
75962306a36Sopenharmony_ci	if (ret)
76062306a36Sopenharmony_ci		return ret;
76162306a36Sopenharmony_ci	if ((data[0] & 0x01) == 0x00)
76262306a36Sopenharmony_ci		return -EINVAL;
76362306a36Sopenharmony_ci
76462306a36Sopenharmony_ci	ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
76562306a36Sopenharmony_ci					  CXD2880_IO_TGT_DMD,
76662306a36Sopenharmony_ci					  rf_init1_seq6,
76762306a36Sopenharmony_ci					  ARRAY_SIZE(rf_init1_seq6));
76862306a36Sopenharmony_ci	if (ret)
76962306a36Sopenharmony_ci		return ret;
77062306a36Sopenharmony_ci
77162306a36Sopenharmony_ci	data[0] = 0x00;
77262306a36Sopenharmony_ci	data[1] = 0xfe;
77362306a36Sopenharmony_ci	data[2] = 0xee;
77462306a36Sopenharmony_ci	ret = tnr_dmd->io->write_regs(tnr_dmd->io,
77562306a36Sopenharmony_ci				      CXD2880_IO_TGT_DMD,
77662306a36Sopenharmony_ci				      0x6e, data, 3);
77762306a36Sopenharmony_ci	if (ret)
77862306a36Sopenharmony_ci		return ret;
77962306a36Sopenharmony_ci	data[0] = 0xa1;
78062306a36Sopenharmony_ci	data[1] = 0x8b;
78162306a36Sopenharmony_ci	ret = tnr_dmd->io->write_regs(tnr_dmd->io,
78262306a36Sopenharmony_ci				      CXD2880_IO_TGT_DMD,
78362306a36Sopenharmony_ci				      0x8d, data, 2);
78462306a36Sopenharmony_ci	if (ret)
78562306a36Sopenharmony_ci		return ret;
78662306a36Sopenharmony_ci	data[0] = 0x08;
78762306a36Sopenharmony_ci	data[1] = 0x09;
78862306a36Sopenharmony_ci	ret = tnr_dmd->io->write_regs(tnr_dmd->io,
78962306a36Sopenharmony_ci				      CXD2880_IO_TGT_DMD,
79062306a36Sopenharmony_ci				      0x77, data, 2);
79162306a36Sopenharmony_ci	if (ret)
79262306a36Sopenharmony_ci		return ret;
79362306a36Sopenharmony_ci
79462306a36Sopenharmony_ci	if (tnr_dmd->create_param.stationary_use) {
79562306a36Sopenharmony_ci		ret = tnr_dmd->io->write_reg(tnr_dmd->io,
79662306a36Sopenharmony_ci					     CXD2880_IO_TGT_DMD,
79762306a36Sopenharmony_ci					     0x80, 0xaa);
79862306a36Sopenharmony_ci		if (ret)
79962306a36Sopenharmony_ci			return ret;
80062306a36Sopenharmony_ci	}
80162306a36Sopenharmony_ci
80262306a36Sopenharmony_ci	ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
80362306a36Sopenharmony_ci					  CXD2880_IO_TGT_DMD,
80462306a36Sopenharmony_ci					  rf_init1_seq7,
80562306a36Sopenharmony_ci					  ARRAY_SIZE(rf_init1_seq7));
80662306a36Sopenharmony_ci	if (ret)
80762306a36Sopenharmony_ci		return ret;
80862306a36Sopenharmony_ci
80962306a36Sopenharmony_ci	ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
81062306a36Sopenharmony_ci					  CXD2880_IO_TGT_SYS,
81162306a36Sopenharmony_ci					  rf_init1_seq8,
81262306a36Sopenharmony_ci					  ARRAY_SIZE(rf_init1_seq8));
81362306a36Sopenharmony_ci	if (ret)
81462306a36Sopenharmony_ci		return ret;
81562306a36Sopenharmony_ci
81662306a36Sopenharmony_ci	usleep_range(1000, 2000);
81762306a36Sopenharmony_ci
81862306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
81962306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
82062306a36Sopenharmony_ci				     0x00, 0x1a);
82162306a36Sopenharmony_ci	if (ret)
82262306a36Sopenharmony_ci		return ret;
82362306a36Sopenharmony_ci	ret = tnr_dmd->io->read_regs(tnr_dmd->io,
82462306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
82562306a36Sopenharmony_ci				     0x10, data, 1);
82662306a36Sopenharmony_ci	if (ret)
82762306a36Sopenharmony_ci		return ret;
82862306a36Sopenharmony_ci	if ((data[0] & 0x01) == 0x00)
82962306a36Sopenharmony_ci		return -EINVAL;
83062306a36Sopenharmony_ci
83162306a36Sopenharmony_ci	return cxd2880_io_write_multi_regs(tnr_dmd->io,
83262306a36Sopenharmony_ci					   CXD2880_IO_TGT_SYS,
83362306a36Sopenharmony_ci					   rf_init1_seq9,
83462306a36Sopenharmony_ci					   ARRAY_SIZE(rf_init1_seq9));
83562306a36Sopenharmony_ci}
83662306a36Sopenharmony_ci
83762306a36Sopenharmony_cistatic int rf_init2(struct cxd2880_tnrdmd *tnr_dmd)
83862306a36Sopenharmony_ci{
83962306a36Sopenharmony_ci	u8 data[5] = { 0 };
84062306a36Sopenharmony_ci	int ret;
84162306a36Sopenharmony_ci
84262306a36Sopenharmony_ci	if (!tnr_dmd)
84362306a36Sopenharmony_ci		return -EINVAL;
84462306a36Sopenharmony_ci
84562306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
84662306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
84762306a36Sopenharmony_ci				     0x00, 0x10);
84862306a36Sopenharmony_ci	if (ret)
84962306a36Sopenharmony_ci		return ret;
85062306a36Sopenharmony_ci	data[0] = 0x40;
85162306a36Sopenharmony_ci	data[1] = 0x40;
85262306a36Sopenharmony_ci	ret = tnr_dmd->io->write_regs(tnr_dmd->io,
85362306a36Sopenharmony_ci				      CXD2880_IO_TGT_SYS,
85462306a36Sopenharmony_ci				      0xea, data, 2);
85562306a36Sopenharmony_ci	if (ret)
85662306a36Sopenharmony_ci		return ret;
85762306a36Sopenharmony_ci
85862306a36Sopenharmony_ci	usleep_range(1000, 2000);
85962306a36Sopenharmony_ci
86062306a36Sopenharmony_ci	data[0] = 0x00;
86162306a36Sopenharmony_ci	if (tnr_dmd->chip_id == CXD2880_TNRDMD_CHIP_ID_CXD2880_ES1_0X)
86262306a36Sopenharmony_ci		data[1] = 0x00;
86362306a36Sopenharmony_ci	else
86462306a36Sopenharmony_ci		data[1] = 0x01;
86562306a36Sopenharmony_ci	data[2] = 0x01;
86662306a36Sopenharmony_ci	data[3] = 0x03;
86762306a36Sopenharmony_ci	ret = tnr_dmd->io->write_regs(tnr_dmd->io,
86862306a36Sopenharmony_ci				      CXD2880_IO_TGT_SYS,
86962306a36Sopenharmony_ci				      0x30, data, 4);
87062306a36Sopenharmony_ci	if (ret)
87162306a36Sopenharmony_ci		return ret;
87262306a36Sopenharmony_ci
87362306a36Sopenharmony_ci	ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
87462306a36Sopenharmony_ci					  CXD2880_IO_TGT_SYS,
87562306a36Sopenharmony_ci					  rf_init2_seq1,
87662306a36Sopenharmony_ci					  ARRAY_SIZE(rf_init2_seq1));
87762306a36Sopenharmony_ci	if (ret)
87862306a36Sopenharmony_ci		return ret;
87962306a36Sopenharmony_ci
88062306a36Sopenharmony_ci	return cxd2880_io_write_multi_regs(tnr_dmd->io,
88162306a36Sopenharmony_ci					   CXD2880_IO_TGT_DMD,
88262306a36Sopenharmony_ci					   rf_init2_seq2,
88362306a36Sopenharmony_ci					   ARRAY_SIZE(rf_init2_seq2));
88462306a36Sopenharmony_ci}
88562306a36Sopenharmony_ci
88662306a36Sopenharmony_cistatic int x_tune1(struct cxd2880_tnrdmd *tnr_dmd,
88762306a36Sopenharmony_ci		   enum cxd2880_dtv_sys sys, u32 freq_khz,
88862306a36Sopenharmony_ci		   enum cxd2880_dtv_bandwidth bandwidth,
88962306a36Sopenharmony_ci		   u8 is_cable, int shift_frequency_khz)
89062306a36Sopenharmony_ci{
89162306a36Sopenharmony_ci	u8 data[11] = { 0 };
89262306a36Sopenharmony_ci	int ret;
89362306a36Sopenharmony_ci
89462306a36Sopenharmony_ci	if (!tnr_dmd)
89562306a36Sopenharmony_ci		return -EINVAL;
89662306a36Sopenharmony_ci
89762306a36Sopenharmony_ci	ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
89862306a36Sopenharmony_ci					  CXD2880_IO_TGT_DMD,
89962306a36Sopenharmony_ci					  x_tune1_seq1,
90062306a36Sopenharmony_ci					  ARRAY_SIZE(x_tune1_seq1));
90162306a36Sopenharmony_ci	if (ret)
90262306a36Sopenharmony_ci		return ret;
90362306a36Sopenharmony_ci
90462306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
90562306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
90662306a36Sopenharmony_ci				     0x00, 0x10);
90762306a36Sopenharmony_ci	if (ret)
90862306a36Sopenharmony_ci		return ret;
90962306a36Sopenharmony_ci
91062306a36Sopenharmony_ci	data[2] = 0x0e;
91162306a36Sopenharmony_ci	data[4] = 0x03;
91262306a36Sopenharmony_ci	ret = tnr_dmd->io->write_regs(tnr_dmd->io,
91362306a36Sopenharmony_ci				      CXD2880_IO_TGT_SYS,
91462306a36Sopenharmony_ci				      0xe7, data, 5);
91562306a36Sopenharmony_ci	if (ret)
91662306a36Sopenharmony_ci		return ret;
91762306a36Sopenharmony_ci
91862306a36Sopenharmony_ci	data[0] = 0x1f;
91962306a36Sopenharmony_ci	data[1] = 0x80;
92062306a36Sopenharmony_ci	data[2] = 0x18;
92162306a36Sopenharmony_ci	data[3] = 0x00;
92262306a36Sopenharmony_ci	data[4] = 0x07;
92362306a36Sopenharmony_ci	ret = tnr_dmd->io->write_regs(tnr_dmd->io,
92462306a36Sopenharmony_ci				      CXD2880_IO_TGT_SYS,
92562306a36Sopenharmony_ci				      0xe7, data, 5);
92662306a36Sopenharmony_ci	if (ret)
92762306a36Sopenharmony_ci		return ret;
92862306a36Sopenharmony_ci
92962306a36Sopenharmony_ci	usleep_range(1000, 2000);
93062306a36Sopenharmony_ci
93162306a36Sopenharmony_ci	data[0] = 0x72;
93262306a36Sopenharmony_ci	data[1] = 0x81;
93362306a36Sopenharmony_ci	data[3] = 0x1d;
93462306a36Sopenharmony_ci	data[4] = 0x6f;
93562306a36Sopenharmony_ci	data[5] = 0x7e;
93662306a36Sopenharmony_ci	data[7] = 0x1c;
93762306a36Sopenharmony_ci	switch (sys) {
93862306a36Sopenharmony_ci	case CXD2880_DTV_SYS_DVBT:
93962306a36Sopenharmony_ci		data[2] = 0x94;
94062306a36Sopenharmony_ci		data[6] = 0x91;
94162306a36Sopenharmony_ci		break;
94262306a36Sopenharmony_ci	case CXD2880_DTV_SYS_DVBT2:
94362306a36Sopenharmony_ci		data[2] = 0x96;
94462306a36Sopenharmony_ci		data[6] = 0x93;
94562306a36Sopenharmony_ci		break;
94662306a36Sopenharmony_ci	default:
94762306a36Sopenharmony_ci		return -EINVAL;
94862306a36Sopenharmony_ci	}
94962306a36Sopenharmony_ci	ret = tnr_dmd->io->write_regs(tnr_dmd->io,
95062306a36Sopenharmony_ci				      CXD2880_IO_TGT_SYS,
95162306a36Sopenharmony_ci				      0x44, data, 8);
95262306a36Sopenharmony_ci	if (ret)
95362306a36Sopenharmony_ci		return ret;
95462306a36Sopenharmony_ci
95562306a36Sopenharmony_ci	ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
95662306a36Sopenharmony_ci					  CXD2880_IO_TGT_SYS,
95762306a36Sopenharmony_ci					  x_tune1_seq2,
95862306a36Sopenharmony_ci					  ARRAY_SIZE(x_tune1_seq2));
95962306a36Sopenharmony_ci	if (ret)
96062306a36Sopenharmony_ci		return ret;
96162306a36Sopenharmony_ci
96262306a36Sopenharmony_ci	data[0] = 0x03;
96362306a36Sopenharmony_ci	data[1] = 0xe2;
96462306a36Sopenharmony_ci	ret = tnr_dmd->io->write_regs(tnr_dmd->io,
96562306a36Sopenharmony_ci				      CXD2880_IO_TGT_SYS,
96662306a36Sopenharmony_ci				      0x1e, data, 2);
96762306a36Sopenharmony_ci	if (ret)
96862306a36Sopenharmony_ci		return ret;
96962306a36Sopenharmony_ci
97062306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
97162306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
97262306a36Sopenharmony_ci				     0x00, 0x10);
97362306a36Sopenharmony_ci	if (ret)
97462306a36Sopenharmony_ci		return ret;
97562306a36Sopenharmony_ci
97662306a36Sopenharmony_ci	data[0] = is_cable ? 0x01 : 0x00;
97762306a36Sopenharmony_ci	data[1] = 0x00;
97862306a36Sopenharmony_ci	data[2] = 0x6b;
97962306a36Sopenharmony_ci	data[3] = 0x4d;
98062306a36Sopenharmony_ci
98162306a36Sopenharmony_ci	switch (bandwidth) {
98262306a36Sopenharmony_ci	case CXD2880_DTV_BW_1_7_MHZ:
98362306a36Sopenharmony_ci		data[4] = 0x03;
98462306a36Sopenharmony_ci		break;
98562306a36Sopenharmony_ci	case CXD2880_DTV_BW_5_MHZ:
98662306a36Sopenharmony_ci	case CXD2880_DTV_BW_6_MHZ:
98762306a36Sopenharmony_ci		data[4] = 0x00;
98862306a36Sopenharmony_ci		break;
98962306a36Sopenharmony_ci	case CXD2880_DTV_BW_7_MHZ:
99062306a36Sopenharmony_ci		data[4] = 0x01;
99162306a36Sopenharmony_ci		break;
99262306a36Sopenharmony_ci	case CXD2880_DTV_BW_8_MHZ:
99362306a36Sopenharmony_ci		data[4] = 0x02;
99462306a36Sopenharmony_ci		break;
99562306a36Sopenharmony_ci	default:
99662306a36Sopenharmony_ci		return -EINVAL;
99762306a36Sopenharmony_ci	}
99862306a36Sopenharmony_ci
99962306a36Sopenharmony_ci	data[5] = 0x00;
100062306a36Sopenharmony_ci
100162306a36Sopenharmony_ci	freq_khz += shift_frequency_khz;
100262306a36Sopenharmony_ci
100362306a36Sopenharmony_ci	data[6] = (freq_khz >> 16) & 0x0f;
100462306a36Sopenharmony_ci	data[7] = (freq_khz >> 8) & 0xff;
100562306a36Sopenharmony_ci	data[8] = freq_khz & 0xff;
100662306a36Sopenharmony_ci	data[9] = 0xff;
100762306a36Sopenharmony_ci	data[10] = 0xfe;
100862306a36Sopenharmony_ci
100962306a36Sopenharmony_ci	return tnr_dmd->io->write_regs(tnr_dmd->io,
101062306a36Sopenharmony_ci				       CXD2880_IO_TGT_SYS,
101162306a36Sopenharmony_ci				       0x52, data, 11);
101262306a36Sopenharmony_ci}
101362306a36Sopenharmony_ci
101462306a36Sopenharmony_cistatic int x_tune2(struct cxd2880_tnrdmd *tnr_dmd,
101562306a36Sopenharmony_ci		   enum cxd2880_dtv_bandwidth bandwidth,
101662306a36Sopenharmony_ci		   enum cxd2880_tnrdmd_clockmode clk_mode,
101762306a36Sopenharmony_ci		   int shift_frequency_khz)
101862306a36Sopenharmony_ci{
101962306a36Sopenharmony_ci	u8 data[3] = { 0 };
102062306a36Sopenharmony_ci	int ret;
102162306a36Sopenharmony_ci
102262306a36Sopenharmony_ci	if (!tnr_dmd)
102362306a36Sopenharmony_ci		return -EINVAL;
102462306a36Sopenharmony_ci
102562306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
102662306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
102762306a36Sopenharmony_ci				     0x00, 0x11);
102862306a36Sopenharmony_ci	if (ret)
102962306a36Sopenharmony_ci		return ret;
103062306a36Sopenharmony_ci
103162306a36Sopenharmony_ci	data[0] = 0x01;
103262306a36Sopenharmony_ci	data[1] = 0x0e;
103362306a36Sopenharmony_ci	data[2] = 0x01;
103462306a36Sopenharmony_ci	ret = tnr_dmd->io->write_regs(tnr_dmd->io,
103562306a36Sopenharmony_ci				      CXD2880_IO_TGT_SYS,
103662306a36Sopenharmony_ci				      0x2d, data, 3);
103762306a36Sopenharmony_ci	if (ret)
103862306a36Sopenharmony_ci		return ret;
103962306a36Sopenharmony_ci
104062306a36Sopenharmony_ci	ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
104162306a36Sopenharmony_ci					  CXD2880_IO_TGT_SYS,
104262306a36Sopenharmony_ci					  x_tune2_seq1,
104362306a36Sopenharmony_ci					  ARRAY_SIZE(x_tune2_seq1));
104462306a36Sopenharmony_ci	if (ret)
104562306a36Sopenharmony_ci		return ret;
104662306a36Sopenharmony_ci
104762306a36Sopenharmony_ci	ret = tnr_dmd->io->read_regs(tnr_dmd->io,
104862306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
104962306a36Sopenharmony_ci				     0x2c, data, 1);
105062306a36Sopenharmony_ci	if (ret)
105162306a36Sopenharmony_ci		return ret;
105262306a36Sopenharmony_ci
105362306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
105462306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
105562306a36Sopenharmony_ci				     0x00, 0x10);
105662306a36Sopenharmony_ci	if (ret)
105762306a36Sopenharmony_ci		return ret;
105862306a36Sopenharmony_ci
105962306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
106062306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
106162306a36Sopenharmony_ci				     0x60, data[0]);
106262306a36Sopenharmony_ci	if (ret)
106362306a36Sopenharmony_ci		return ret;
106462306a36Sopenharmony_ci
106562306a36Sopenharmony_ci	ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
106662306a36Sopenharmony_ci					  CXD2880_IO_TGT_SYS,
106762306a36Sopenharmony_ci					  x_tune2_seq2,
106862306a36Sopenharmony_ci					  ARRAY_SIZE(x_tune2_seq2));
106962306a36Sopenharmony_ci	if (ret)
107062306a36Sopenharmony_ci		return ret;
107162306a36Sopenharmony_ci
107262306a36Sopenharmony_ci	ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
107362306a36Sopenharmony_ci					  CXD2880_IO_TGT_DMD,
107462306a36Sopenharmony_ci					  x_tune2_seq3,
107562306a36Sopenharmony_ci					  ARRAY_SIZE(x_tune2_seq3));
107662306a36Sopenharmony_ci	if (ret)
107762306a36Sopenharmony_ci		return ret;
107862306a36Sopenharmony_ci
107962306a36Sopenharmony_ci	if (shift_frequency_khz != 0) {
108062306a36Sopenharmony_ci		int shift_freq = 0;
108162306a36Sopenharmony_ci
108262306a36Sopenharmony_ci		ret = tnr_dmd->io->write_reg(tnr_dmd->io,
108362306a36Sopenharmony_ci					     CXD2880_IO_TGT_DMD,
108462306a36Sopenharmony_ci					     0x00, 0xe1);
108562306a36Sopenharmony_ci		if (ret)
108662306a36Sopenharmony_ci			return ret;
108762306a36Sopenharmony_ci
108862306a36Sopenharmony_ci		ret = tnr_dmd->io->read_regs(tnr_dmd->io,
108962306a36Sopenharmony_ci					     CXD2880_IO_TGT_DMD,
109062306a36Sopenharmony_ci					     0x60, data, 2);
109162306a36Sopenharmony_ci		if (ret)
109262306a36Sopenharmony_ci			return ret;
109362306a36Sopenharmony_ci
109462306a36Sopenharmony_ci		shift_freq = shift_frequency_khz * 1000;
109562306a36Sopenharmony_ci
109662306a36Sopenharmony_ci		switch (clk_mode) {
109762306a36Sopenharmony_ci		case CXD2880_TNRDMD_CLOCKMODE_A:
109862306a36Sopenharmony_ci		case CXD2880_TNRDMD_CLOCKMODE_C:
109962306a36Sopenharmony_ci		default:
110062306a36Sopenharmony_ci			if (shift_freq >= 0)
110162306a36Sopenharmony_ci				shift_freq = (shift_freq + 183 / 2) / 183;
110262306a36Sopenharmony_ci			else
110362306a36Sopenharmony_ci				shift_freq = (shift_freq - 183 / 2) / 183;
110462306a36Sopenharmony_ci			break;
110562306a36Sopenharmony_ci		case CXD2880_TNRDMD_CLOCKMODE_B:
110662306a36Sopenharmony_ci			if (shift_freq >= 0)
110762306a36Sopenharmony_ci				shift_freq = (shift_freq + 178 / 2) / 178;
110862306a36Sopenharmony_ci			else
110962306a36Sopenharmony_ci				shift_freq = (shift_freq - 178 / 2) / 178;
111062306a36Sopenharmony_ci			break;
111162306a36Sopenharmony_ci		}
111262306a36Sopenharmony_ci
111362306a36Sopenharmony_ci		shift_freq +=
111462306a36Sopenharmony_ci		    cxd2880_convert2s_complement((data[0] << 8) | data[1], 16);
111562306a36Sopenharmony_ci
111662306a36Sopenharmony_ci		if (shift_freq > 32767)
111762306a36Sopenharmony_ci			shift_freq = 32767;
111862306a36Sopenharmony_ci		else if (shift_freq < -32768)
111962306a36Sopenharmony_ci			shift_freq = -32768;
112062306a36Sopenharmony_ci
112162306a36Sopenharmony_ci		data[0] = (shift_freq >> 8) & 0xff;
112262306a36Sopenharmony_ci		data[1] = shift_freq & 0xff;
112362306a36Sopenharmony_ci
112462306a36Sopenharmony_ci		ret = tnr_dmd->io->write_regs(tnr_dmd->io,
112562306a36Sopenharmony_ci					      CXD2880_IO_TGT_DMD,
112662306a36Sopenharmony_ci					      0x60, data, 2);
112762306a36Sopenharmony_ci		if (ret)
112862306a36Sopenharmony_ci			return ret;
112962306a36Sopenharmony_ci
113062306a36Sopenharmony_ci		ret = tnr_dmd->io->read_regs(tnr_dmd->io,
113162306a36Sopenharmony_ci					     CXD2880_IO_TGT_DMD,
113262306a36Sopenharmony_ci					     0x69, data, 1);
113362306a36Sopenharmony_ci		if (ret)
113462306a36Sopenharmony_ci			return ret;
113562306a36Sopenharmony_ci
113662306a36Sopenharmony_ci		shift_freq = -shift_frequency_khz;
113762306a36Sopenharmony_ci
113862306a36Sopenharmony_ci		if (bandwidth == CXD2880_DTV_BW_1_7_MHZ) {
113962306a36Sopenharmony_ci			switch (clk_mode) {
114062306a36Sopenharmony_ci			case CXD2880_TNRDMD_CLOCKMODE_A:
114162306a36Sopenharmony_ci			case CXD2880_TNRDMD_CLOCKMODE_C:
114262306a36Sopenharmony_ci			default:
114362306a36Sopenharmony_ci				if (shift_freq >= 0)
114462306a36Sopenharmony_ci					shift_freq =
114562306a36Sopenharmony_ci					    (shift_freq * 1000 +
114662306a36Sopenharmony_ci					     17578 / 2) / 17578;
114762306a36Sopenharmony_ci				else
114862306a36Sopenharmony_ci					shift_freq =
114962306a36Sopenharmony_ci					    (shift_freq * 1000 -
115062306a36Sopenharmony_ci					     17578 / 2) / 17578;
115162306a36Sopenharmony_ci				break;
115262306a36Sopenharmony_ci			case CXD2880_TNRDMD_CLOCKMODE_B:
115362306a36Sopenharmony_ci				if (shift_freq >= 0)
115462306a36Sopenharmony_ci					shift_freq =
115562306a36Sopenharmony_ci					    (shift_freq * 1000 +
115662306a36Sopenharmony_ci					     17090 / 2) / 17090;
115762306a36Sopenharmony_ci				else
115862306a36Sopenharmony_ci					shift_freq =
115962306a36Sopenharmony_ci					    (shift_freq * 1000 -
116062306a36Sopenharmony_ci					     17090 / 2) / 17090;
116162306a36Sopenharmony_ci				break;
116262306a36Sopenharmony_ci			}
116362306a36Sopenharmony_ci		} else {
116462306a36Sopenharmony_ci			switch (clk_mode) {
116562306a36Sopenharmony_ci			case CXD2880_TNRDMD_CLOCKMODE_A:
116662306a36Sopenharmony_ci			case CXD2880_TNRDMD_CLOCKMODE_C:
116762306a36Sopenharmony_ci			default:
116862306a36Sopenharmony_ci				if (shift_freq >= 0)
116962306a36Sopenharmony_ci					shift_freq =
117062306a36Sopenharmony_ci					    (shift_freq * 1000 +
117162306a36Sopenharmony_ci					     35156 / 2) / 35156;
117262306a36Sopenharmony_ci				else
117362306a36Sopenharmony_ci					shift_freq =
117462306a36Sopenharmony_ci					    (shift_freq * 1000 -
117562306a36Sopenharmony_ci					     35156 / 2) / 35156;
117662306a36Sopenharmony_ci				break;
117762306a36Sopenharmony_ci			case CXD2880_TNRDMD_CLOCKMODE_B:
117862306a36Sopenharmony_ci				if (shift_freq >= 0)
117962306a36Sopenharmony_ci					shift_freq =
118062306a36Sopenharmony_ci					    (shift_freq * 1000 +
118162306a36Sopenharmony_ci					     34180 / 2) / 34180;
118262306a36Sopenharmony_ci				else
118362306a36Sopenharmony_ci					shift_freq =
118462306a36Sopenharmony_ci					    (shift_freq * 1000 -
118562306a36Sopenharmony_ci					     34180 / 2) / 34180;
118662306a36Sopenharmony_ci				break;
118762306a36Sopenharmony_ci			}
118862306a36Sopenharmony_ci		}
118962306a36Sopenharmony_ci
119062306a36Sopenharmony_ci		shift_freq += cxd2880_convert2s_complement(data[0], 8);
119162306a36Sopenharmony_ci
119262306a36Sopenharmony_ci		if (shift_freq > 127)
119362306a36Sopenharmony_ci			shift_freq = 127;
119462306a36Sopenharmony_ci		else if (shift_freq < -128)
119562306a36Sopenharmony_ci			shift_freq = -128;
119662306a36Sopenharmony_ci
119762306a36Sopenharmony_ci		data[0] = shift_freq & 0xff;
119862306a36Sopenharmony_ci
119962306a36Sopenharmony_ci		ret = tnr_dmd->io->write_reg(tnr_dmd->io,
120062306a36Sopenharmony_ci					     CXD2880_IO_TGT_DMD,
120162306a36Sopenharmony_ci					     0x69, data[0]);
120262306a36Sopenharmony_ci		if (ret)
120362306a36Sopenharmony_ci			return ret;
120462306a36Sopenharmony_ci	}
120562306a36Sopenharmony_ci
120662306a36Sopenharmony_ci	if (tnr_dmd->create_param.stationary_use) {
120762306a36Sopenharmony_ci		ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
120862306a36Sopenharmony_ci						  CXD2880_IO_TGT_DMD,
120962306a36Sopenharmony_ci						  x_tune2_seq4,
121062306a36Sopenharmony_ci						  ARRAY_SIZE(x_tune2_seq4));
121162306a36Sopenharmony_ci		if (ret)
121262306a36Sopenharmony_ci			return ret;
121362306a36Sopenharmony_ci	}
121462306a36Sopenharmony_ci
121562306a36Sopenharmony_ci	return cxd2880_io_write_multi_regs(tnr_dmd->io,
121662306a36Sopenharmony_ci					   CXD2880_IO_TGT_DMD,
121762306a36Sopenharmony_ci					   x_tune2_seq5,
121862306a36Sopenharmony_ci					   ARRAY_SIZE(x_tune2_seq5));
121962306a36Sopenharmony_ci}
122062306a36Sopenharmony_ci
122162306a36Sopenharmony_cistatic int x_tune3(struct cxd2880_tnrdmd *tnr_dmd,
122262306a36Sopenharmony_ci		   enum cxd2880_dtv_sys sys,
122362306a36Sopenharmony_ci		   u8 en_fef_intmtnt_ctrl)
122462306a36Sopenharmony_ci{
122562306a36Sopenharmony_ci	u8 data[6] = { 0 };
122662306a36Sopenharmony_ci	int ret;
122762306a36Sopenharmony_ci
122862306a36Sopenharmony_ci	if (!tnr_dmd)
122962306a36Sopenharmony_ci		return -EINVAL;
123062306a36Sopenharmony_ci
123162306a36Sopenharmony_ci	ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
123262306a36Sopenharmony_ci					  CXD2880_IO_TGT_DMD,
123362306a36Sopenharmony_ci					  x_tune3_seq,
123462306a36Sopenharmony_ci					  ARRAY_SIZE(x_tune3_seq));
123562306a36Sopenharmony_ci	if (ret)
123662306a36Sopenharmony_ci		return ret;
123762306a36Sopenharmony_ci
123862306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
123962306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
124062306a36Sopenharmony_ci				     0x00, 0x10);
124162306a36Sopenharmony_ci	if (ret)
124262306a36Sopenharmony_ci		return ret;
124362306a36Sopenharmony_ci
124462306a36Sopenharmony_ci	if (sys == CXD2880_DTV_SYS_DVBT2 && en_fef_intmtnt_ctrl)
124562306a36Sopenharmony_ci		memset(data, 0x01, sizeof(data));
124662306a36Sopenharmony_ci	else
124762306a36Sopenharmony_ci		memset(data, 0x00, sizeof(data));
124862306a36Sopenharmony_ci
124962306a36Sopenharmony_ci	ret = tnr_dmd->io->write_regs(tnr_dmd->io,
125062306a36Sopenharmony_ci				      CXD2880_IO_TGT_SYS,
125162306a36Sopenharmony_ci				      0xef, data, 6);
125262306a36Sopenharmony_ci	if (ret)
125362306a36Sopenharmony_ci		return ret;
125462306a36Sopenharmony_ci
125562306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
125662306a36Sopenharmony_ci				     CXD2880_IO_TGT_DMD,
125762306a36Sopenharmony_ci				     0x00, 0x2d);
125862306a36Sopenharmony_ci	if (ret)
125962306a36Sopenharmony_ci		return ret;
126062306a36Sopenharmony_ci	if (sys == CXD2880_DTV_SYS_DVBT2 && en_fef_intmtnt_ctrl)
126162306a36Sopenharmony_ci		data[0] = 0x00;
126262306a36Sopenharmony_ci	else
126362306a36Sopenharmony_ci		data[0] = 0x01;
126462306a36Sopenharmony_ci
126562306a36Sopenharmony_ci	return tnr_dmd->io->write_reg(tnr_dmd->io,
126662306a36Sopenharmony_ci				      CXD2880_IO_TGT_DMD,
126762306a36Sopenharmony_ci				      0xb1, data[0]);
126862306a36Sopenharmony_ci}
126962306a36Sopenharmony_ci
127062306a36Sopenharmony_cistatic int x_tune4(struct cxd2880_tnrdmd *tnr_dmd)
127162306a36Sopenharmony_ci{
127262306a36Sopenharmony_ci	u8 data[2] = { 0 };
127362306a36Sopenharmony_ci	int ret;
127462306a36Sopenharmony_ci
127562306a36Sopenharmony_ci	if (!tnr_dmd)
127662306a36Sopenharmony_ci		return -EINVAL;
127762306a36Sopenharmony_ci
127862306a36Sopenharmony_ci	if (tnr_dmd->diver_mode != CXD2880_TNRDMD_DIVERMODE_MAIN)
127962306a36Sopenharmony_ci		return -EINVAL;
128062306a36Sopenharmony_ci
128162306a36Sopenharmony_ci	ret = tnr_dmd->diver_sub->io->write_reg(tnr_dmd->diver_sub->io,
128262306a36Sopenharmony_ci						CXD2880_IO_TGT_SYS,
128362306a36Sopenharmony_ci						0x00, 0x00);
128462306a36Sopenharmony_ci	if (ret)
128562306a36Sopenharmony_ci		return ret;
128662306a36Sopenharmony_ci	data[0] = 0x14;
128762306a36Sopenharmony_ci	data[1] = 0x00;
128862306a36Sopenharmony_ci	ret = tnr_dmd->diver_sub->io->write_regs(tnr_dmd->diver_sub->io,
128962306a36Sopenharmony_ci						CXD2880_IO_TGT_SYS,
129062306a36Sopenharmony_ci						0x55, data, 2);
129162306a36Sopenharmony_ci	if (ret)
129262306a36Sopenharmony_ci		return ret;
129362306a36Sopenharmony_ci
129462306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
129562306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
129662306a36Sopenharmony_ci				     0x00, 0x00);
129762306a36Sopenharmony_ci	if (ret)
129862306a36Sopenharmony_ci		return ret;
129962306a36Sopenharmony_ci	data[0] = 0x0b;
130062306a36Sopenharmony_ci	data[1] = 0xff;
130162306a36Sopenharmony_ci	ret = tnr_dmd->io->write_regs(tnr_dmd->io,
130262306a36Sopenharmony_ci				      CXD2880_IO_TGT_SYS,
130362306a36Sopenharmony_ci				      0x53, data, 2);
130462306a36Sopenharmony_ci	if (ret)
130562306a36Sopenharmony_ci		return ret;
130662306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
130762306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
130862306a36Sopenharmony_ci				     0x57, 0x01);
130962306a36Sopenharmony_ci	if (ret)
131062306a36Sopenharmony_ci		return ret;
131162306a36Sopenharmony_ci	data[0] = 0x0b;
131262306a36Sopenharmony_ci	data[1] = 0xff;
131362306a36Sopenharmony_ci	ret = tnr_dmd->io->write_regs(tnr_dmd->io,
131462306a36Sopenharmony_ci				      CXD2880_IO_TGT_SYS,
131562306a36Sopenharmony_ci				      0x55, data, 2);
131662306a36Sopenharmony_ci	if (ret)
131762306a36Sopenharmony_ci		return ret;
131862306a36Sopenharmony_ci
131962306a36Sopenharmony_ci	ret = tnr_dmd->diver_sub->io->write_reg(tnr_dmd->diver_sub->io,
132062306a36Sopenharmony_ci						CXD2880_IO_TGT_SYS,
132162306a36Sopenharmony_ci						0x00, 0x00);
132262306a36Sopenharmony_ci	if (ret)
132362306a36Sopenharmony_ci		return ret;
132462306a36Sopenharmony_ci	data[0] = 0x14;
132562306a36Sopenharmony_ci	data[1] = 0x00;
132662306a36Sopenharmony_ci	ret = tnr_dmd->diver_sub->io->write_regs(tnr_dmd->diver_sub->io,
132762306a36Sopenharmony_ci						 CXD2880_IO_TGT_SYS,
132862306a36Sopenharmony_ci						 0x53, data, 2);
132962306a36Sopenharmony_ci	if (ret)
133062306a36Sopenharmony_ci		return ret;
133162306a36Sopenharmony_ci	ret = tnr_dmd->diver_sub->io->write_reg(tnr_dmd->diver_sub->io,
133262306a36Sopenharmony_ci						CXD2880_IO_TGT_SYS,
133362306a36Sopenharmony_ci						0x57, 0x02);
133462306a36Sopenharmony_ci	if (ret)
133562306a36Sopenharmony_ci		return ret;
133662306a36Sopenharmony_ci
133762306a36Sopenharmony_ci	ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
133862306a36Sopenharmony_ci					  CXD2880_IO_TGT_DMD,
133962306a36Sopenharmony_ci					  x_tune4_seq,
134062306a36Sopenharmony_ci					  ARRAY_SIZE(x_tune4_seq));
134162306a36Sopenharmony_ci	if (ret)
134262306a36Sopenharmony_ci		return ret;
134362306a36Sopenharmony_ci
134462306a36Sopenharmony_ci	return cxd2880_io_write_multi_regs(tnr_dmd->diver_sub->io,
134562306a36Sopenharmony_ci					   CXD2880_IO_TGT_DMD,
134662306a36Sopenharmony_ci					   x_tune4_seq,
134762306a36Sopenharmony_ci					   ARRAY_SIZE(x_tune4_seq));
134862306a36Sopenharmony_ci}
134962306a36Sopenharmony_ci
135062306a36Sopenharmony_cistatic int x_sleep1(struct cxd2880_tnrdmd *tnr_dmd)
135162306a36Sopenharmony_ci{
135262306a36Sopenharmony_ci	u8 data[3] = { 0 };
135362306a36Sopenharmony_ci	int ret;
135462306a36Sopenharmony_ci
135562306a36Sopenharmony_ci	if (!tnr_dmd)
135662306a36Sopenharmony_ci		return -EINVAL;
135762306a36Sopenharmony_ci
135862306a36Sopenharmony_ci	if (tnr_dmd->diver_mode != CXD2880_TNRDMD_DIVERMODE_MAIN)
135962306a36Sopenharmony_ci		return -EINVAL;
136062306a36Sopenharmony_ci
136162306a36Sopenharmony_ci	ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
136262306a36Sopenharmony_ci					  CXD2880_IO_TGT_SYS,
136362306a36Sopenharmony_ci					  x_sleep1_seq,
136462306a36Sopenharmony_ci					  ARRAY_SIZE(x_sleep1_seq));
136562306a36Sopenharmony_ci	if (ret)
136662306a36Sopenharmony_ci		return ret;
136762306a36Sopenharmony_ci
136862306a36Sopenharmony_ci	data[0] = 0x00;
136962306a36Sopenharmony_ci	data[1] = 0x00;
137062306a36Sopenharmony_ci	ret = tnr_dmd->io->write_regs(tnr_dmd->io,
137162306a36Sopenharmony_ci				      CXD2880_IO_TGT_SYS,
137262306a36Sopenharmony_ci				      0x53, data, 2);
137362306a36Sopenharmony_ci	if (ret)
137462306a36Sopenharmony_ci		return ret;
137562306a36Sopenharmony_ci
137662306a36Sopenharmony_ci	ret = tnr_dmd->diver_sub->io->write_reg(tnr_dmd->diver_sub->io,
137762306a36Sopenharmony_ci						CXD2880_IO_TGT_SYS,
137862306a36Sopenharmony_ci						0x00, 0x00);
137962306a36Sopenharmony_ci	if (ret)
138062306a36Sopenharmony_ci		return ret;
138162306a36Sopenharmony_ci	data[0] = 0x1f;
138262306a36Sopenharmony_ci	data[1] = 0xff;
138362306a36Sopenharmony_ci	data[2] = 0x03;
138462306a36Sopenharmony_ci	ret = tnr_dmd->diver_sub->io->write_regs(tnr_dmd->diver_sub->io,
138562306a36Sopenharmony_ci						 CXD2880_IO_TGT_SYS,
138662306a36Sopenharmony_ci						 0x55, data, 3);
138762306a36Sopenharmony_ci	if (ret)
138862306a36Sopenharmony_ci		return ret;
138962306a36Sopenharmony_ci	data[0] = 0x00;
139062306a36Sopenharmony_ci	data[1] = 0x00;
139162306a36Sopenharmony_ci	ret = tnr_dmd->diver_sub->io->write_regs(tnr_dmd->diver_sub->io,
139262306a36Sopenharmony_ci						 CXD2880_IO_TGT_SYS,
139362306a36Sopenharmony_ci						 0x53, data, 2);
139462306a36Sopenharmony_ci	if (ret)
139562306a36Sopenharmony_ci		return ret;
139662306a36Sopenharmony_ci
139762306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
139862306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
139962306a36Sopenharmony_ci				     0x00, 0x00);
140062306a36Sopenharmony_ci	if (ret)
140162306a36Sopenharmony_ci		return ret;
140262306a36Sopenharmony_ci	data[0] = 0x1f;
140362306a36Sopenharmony_ci	data[1] = 0xff;
140462306a36Sopenharmony_ci
140562306a36Sopenharmony_ci	return tnr_dmd->io->write_regs(tnr_dmd->io,
140662306a36Sopenharmony_ci				       CXD2880_IO_TGT_SYS,
140762306a36Sopenharmony_ci				       0x55, data, 2);
140862306a36Sopenharmony_ci}
140962306a36Sopenharmony_ci
141062306a36Sopenharmony_cistatic int x_sleep2(struct cxd2880_tnrdmd *tnr_dmd)
141162306a36Sopenharmony_ci{
141262306a36Sopenharmony_ci	u8 data = 0;
141362306a36Sopenharmony_ci	int ret;
141462306a36Sopenharmony_ci
141562306a36Sopenharmony_ci	if (!tnr_dmd)
141662306a36Sopenharmony_ci		return -EINVAL;
141762306a36Sopenharmony_ci
141862306a36Sopenharmony_ci	ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
141962306a36Sopenharmony_ci					  CXD2880_IO_TGT_DMD,
142062306a36Sopenharmony_ci					  x_sleep2_seq1,
142162306a36Sopenharmony_ci					  ARRAY_SIZE(x_sleep2_seq1));
142262306a36Sopenharmony_ci	if (ret)
142362306a36Sopenharmony_ci		return ret;
142462306a36Sopenharmony_ci
142562306a36Sopenharmony_ci	usleep_range(1000, 2000);
142662306a36Sopenharmony_ci
142762306a36Sopenharmony_ci	ret = tnr_dmd->io->read_regs(tnr_dmd->io,
142862306a36Sopenharmony_ci				     CXD2880_IO_TGT_DMD,
142962306a36Sopenharmony_ci				     0xb2, &data, 1);
143062306a36Sopenharmony_ci	if (ret)
143162306a36Sopenharmony_ci		return ret;
143262306a36Sopenharmony_ci
143362306a36Sopenharmony_ci	if ((data & 0x01) == 0x00)
143462306a36Sopenharmony_ci		return -EINVAL;
143562306a36Sopenharmony_ci
143662306a36Sopenharmony_ci	return cxd2880_io_write_multi_regs(tnr_dmd->io,
143762306a36Sopenharmony_ci					   CXD2880_IO_TGT_SYS,
143862306a36Sopenharmony_ci					   x_sleep2_seq2,
143962306a36Sopenharmony_ci					   ARRAY_SIZE(x_sleep2_seq2));
144062306a36Sopenharmony_ci}
144162306a36Sopenharmony_ci
144262306a36Sopenharmony_cistatic int x_sleep3(struct cxd2880_tnrdmd *tnr_dmd)
144362306a36Sopenharmony_ci{
144462306a36Sopenharmony_ci	if (!tnr_dmd)
144562306a36Sopenharmony_ci		return -EINVAL;
144662306a36Sopenharmony_ci
144762306a36Sopenharmony_ci	return cxd2880_io_write_multi_regs(tnr_dmd->io,
144862306a36Sopenharmony_ci					   CXD2880_IO_TGT_DMD,
144962306a36Sopenharmony_ci					   x_sleep3_seq,
145062306a36Sopenharmony_ci					   ARRAY_SIZE(x_sleep3_seq));
145162306a36Sopenharmony_ci}
145262306a36Sopenharmony_ci
145362306a36Sopenharmony_cistatic int x_sleep4(struct cxd2880_tnrdmd *tnr_dmd)
145462306a36Sopenharmony_ci{
145562306a36Sopenharmony_ci	if (!tnr_dmd)
145662306a36Sopenharmony_ci		return -EINVAL;
145762306a36Sopenharmony_ci
145862306a36Sopenharmony_ci	return cxd2880_io_write_multi_regs(tnr_dmd->io,
145962306a36Sopenharmony_ci					   CXD2880_IO_TGT_DMD,
146062306a36Sopenharmony_ci					   x_sleep4_seq,
146162306a36Sopenharmony_ci					   ARRAY_SIZE(x_sleep4_seq));
146262306a36Sopenharmony_ci}
146362306a36Sopenharmony_ci
146462306a36Sopenharmony_cistatic int spll_reset(struct cxd2880_tnrdmd *tnr_dmd,
146562306a36Sopenharmony_ci		      enum cxd2880_tnrdmd_clockmode clockmode)
146662306a36Sopenharmony_ci{
146762306a36Sopenharmony_ci	u8 data[4] = { 0 };
146862306a36Sopenharmony_ci	int ret;
146962306a36Sopenharmony_ci
147062306a36Sopenharmony_ci	if (!tnr_dmd)
147162306a36Sopenharmony_ci		return -EINVAL;
147262306a36Sopenharmony_ci
147362306a36Sopenharmony_ci	ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
147462306a36Sopenharmony_ci					  CXD2880_IO_TGT_SYS,
147562306a36Sopenharmony_ci					  spll_reset_seq1,
147662306a36Sopenharmony_ci					  ARRAY_SIZE(spll_reset_seq1));
147762306a36Sopenharmony_ci	if (ret)
147862306a36Sopenharmony_ci		return ret;
147962306a36Sopenharmony_ci
148062306a36Sopenharmony_ci	ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
148162306a36Sopenharmony_ci					  CXD2880_IO_TGT_DMD,
148262306a36Sopenharmony_ci					  spll_reset_seq2,
148362306a36Sopenharmony_ci					  ARRAY_SIZE(spll_reset_seq2));
148462306a36Sopenharmony_ci	if (ret)
148562306a36Sopenharmony_ci		return ret;
148662306a36Sopenharmony_ci
148762306a36Sopenharmony_ci	ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
148862306a36Sopenharmony_ci					  CXD2880_IO_TGT_SYS,
148962306a36Sopenharmony_ci					  spll_reset_seq3,
149062306a36Sopenharmony_ci					  ARRAY_SIZE(spll_reset_seq3));
149162306a36Sopenharmony_ci	if (ret)
149262306a36Sopenharmony_ci		return ret;
149362306a36Sopenharmony_ci
149462306a36Sopenharmony_ci	switch (clockmode) {
149562306a36Sopenharmony_ci	case CXD2880_TNRDMD_CLOCKMODE_A:
149662306a36Sopenharmony_ci		data[0] = 0x00;
149762306a36Sopenharmony_ci		break;
149862306a36Sopenharmony_ci
149962306a36Sopenharmony_ci	case CXD2880_TNRDMD_CLOCKMODE_B:
150062306a36Sopenharmony_ci		data[0] = 0x01;
150162306a36Sopenharmony_ci		break;
150262306a36Sopenharmony_ci
150362306a36Sopenharmony_ci	case CXD2880_TNRDMD_CLOCKMODE_C:
150462306a36Sopenharmony_ci		data[0] = 0x02;
150562306a36Sopenharmony_ci		break;
150662306a36Sopenharmony_ci
150762306a36Sopenharmony_ci	default:
150862306a36Sopenharmony_ci		return -EINVAL;
150962306a36Sopenharmony_ci	}
151062306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
151162306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
151262306a36Sopenharmony_ci				     0x30, data[0]);
151362306a36Sopenharmony_ci	if (ret)
151462306a36Sopenharmony_ci		return ret;
151562306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
151662306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
151762306a36Sopenharmony_ci				     0x22, 0x00);
151862306a36Sopenharmony_ci	if (ret)
151962306a36Sopenharmony_ci		return ret;
152062306a36Sopenharmony_ci
152162306a36Sopenharmony_ci	usleep_range(2000, 3000);
152262306a36Sopenharmony_ci
152362306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
152462306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
152562306a36Sopenharmony_ci				     0x00, 0x0a);
152662306a36Sopenharmony_ci	if (ret)
152762306a36Sopenharmony_ci		return ret;
152862306a36Sopenharmony_ci	ret = tnr_dmd->io->read_regs(tnr_dmd->io,
152962306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
153062306a36Sopenharmony_ci				     0x10, data, 1);
153162306a36Sopenharmony_ci	if (ret)
153262306a36Sopenharmony_ci		return ret;
153362306a36Sopenharmony_ci	if ((data[0] & 0x01) == 0x00)
153462306a36Sopenharmony_ci		return -EINVAL;
153562306a36Sopenharmony_ci
153662306a36Sopenharmony_ci	ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
153762306a36Sopenharmony_ci					  CXD2880_IO_TGT_SYS,
153862306a36Sopenharmony_ci					  spll_reset_seq4,
153962306a36Sopenharmony_ci					  ARRAY_SIZE(spll_reset_seq4));
154062306a36Sopenharmony_ci	if (ret)
154162306a36Sopenharmony_ci		return ret;
154262306a36Sopenharmony_ci
154362306a36Sopenharmony_ci	usleep_range(1000, 2000);
154462306a36Sopenharmony_ci
154562306a36Sopenharmony_ci	ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
154662306a36Sopenharmony_ci					  CXD2880_IO_TGT_DMD,
154762306a36Sopenharmony_ci					  spll_reset_seq5,
154862306a36Sopenharmony_ci					  ARRAY_SIZE(spll_reset_seq5));
154962306a36Sopenharmony_ci	if (ret)
155062306a36Sopenharmony_ci		return ret;
155162306a36Sopenharmony_ci
155262306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
155362306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
155462306a36Sopenharmony_ci				     0x00, 0x10);
155562306a36Sopenharmony_ci	if (ret)
155662306a36Sopenharmony_ci		return ret;
155762306a36Sopenharmony_ci
155862306a36Sopenharmony_ci	memset(data, 0x00, sizeof(data));
155962306a36Sopenharmony_ci
156062306a36Sopenharmony_ci	return tnr_dmd->io->write_regs(tnr_dmd->io,
156162306a36Sopenharmony_ci				       CXD2880_IO_TGT_SYS,
156262306a36Sopenharmony_ci				       0x26, data, 4);
156362306a36Sopenharmony_ci}
156462306a36Sopenharmony_ci
156562306a36Sopenharmony_cistatic int t_power_x(struct cxd2880_tnrdmd *tnr_dmd, u8 on)
156662306a36Sopenharmony_ci{
156762306a36Sopenharmony_ci	u8 data[3] = { 0 };
156862306a36Sopenharmony_ci	int ret;
156962306a36Sopenharmony_ci
157062306a36Sopenharmony_ci	if (!tnr_dmd)
157162306a36Sopenharmony_ci		return -EINVAL;
157262306a36Sopenharmony_ci
157362306a36Sopenharmony_ci	ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
157462306a36Sopenharmony_ci					  CXD2880_IO_TGT_SYS,
157562306a36Sopenharmony_ci					  t_power_x_seq1,
157662306a36Sopenharmony_ci					  ARRAY_SIZE(t_power_x_seq1));
157762306a36Sopenharmony_ci	if (ret)
157862306a36Sopenharmony_ci		return ret;
157962306a36Sopenharmony_ci
158062306a36Sopenharmony_ci	ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
158162306a36Sopenharmony_ci					  CXD2880_IO_TGT_DMD,
158262306a36Sopenharmony_ci					  t_power_x_seq2,
158362306a36Sopenharmony_ci					  ARRAY_SIZE(t_power_x_seq2));
158462306a36Sopenharmony_ci	if (ret)
158562306a36Sopenharmony_ci		return ret;
158662306a36Sopenharmony_ci
158762306a36Sopenharmony_ci	ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
158862306a36Sopenharmony_ci					  CXD2880_IO_TGT_SYS,
158962306a36Sopenharmony_ci					  t_power_x_seq3,
159062306a36Sopenharmony_ci					  ARRAY_SIZE(t_power_x_seq3));
159162306a36Sopenharmony_ci	if (ret)
159262306a36Sopenharmony_ci		return ret;
159362306a36Sopenharmony_ci
159462306a36Sopenharmony_ci	if (on) {
159562306a36Sopenharmony_ci		ret = tnr_dmd->io->write_reg(tnr_dmd->io,
159662306a36Sopenharmony_ci					     CXD2880_IO_TGT_SYS,
159762306a36Sopenharmony_ci					     0x2b, 0x01);
159862306a36Sopenharmony_ci		if (ret)
159962306a36Sopenharmony_ci			return ret;
160062306a36Sopenharmony_ci
160162306a36Sopenharmony_ci		usleep_range(1000, 2000);
160262306a36Sopenharmony_ci
160362306a36Sopenharmony_ci		ret = tnr_dmd->io->write_reg(tnr_dmd->io,
160462306a36Sopenharmony_ci					     CXD2880_IO_TGT_SYS,
160562306a36Sopenharmony_ci					     0x00, 0x0a);
160662306a36Sopenharmony_ci		if (ret)
160762306a36Sopenharmony_ci			return ret;
160862306a36Sopenharmony_ci		ret = tnr_dmd->io->read_regs(tnr_dmd->io,
160962306a36Sopenharmony_ci					     CXD2880_IO_TGT_SYS,
161062306a36Sopenharmony_ci					     0x12, data, 1);
161162306a36Sopenharmony_ci		if (ret)
161262306a36Sopenharmony_ci			return ret;
161362306a36Sopenharmony_ci		if ((data[0] & 0x01) == 0)
161462306a36Sopenharmony_ci			return -EINVAL;
161562306a36Sopenharmony_ci
161662306a36Sopenharmony_ci		ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
161762306a36Sopenharmony_ci						  CXD2880_IO_TGT_SYS,
161862306a36Sopenharmony_ci						  t_power_x_seq4,
161962306a36Sopenharmony_ci						  ARRAY_SIZE(t_power_x_seq4));
162062306a36Sopenharmony_ci		if (ret)
162162306a36Sopenharmony_ci			return ret;
162262306a36Sopenharmony_ci	} else {
162362306a36Sopenharmony_ci		data[0] = 0x03;
162462306a36Sopenharmony_ci		data[1] = 0x00;
162562306a36Sopenharmony_ci		ret = tnr_dmd->io->write_regs(tnr_dmd->io,
162662306a36Sopenharmony_ci					      CXD2880_IO_TGT_SYS,
162762306a36Sopenharmony_ci					      0x2a, data, 2);
162862306a36Sopenharmony_ci		if (ret)
162962306a36Sopenharmony_ci			return ret;
163062306a36Sopenharmony_ci
163162306a36Sopenharmony_ci		usleep_range(1000, 2000);
163262306a36Sopenharmony_ci
163362306a36Sopenharmony_ci		ret = tnr_dmd->io->write_reg(tnr_dmd->io,
163462306a36Sopenharmony_ci					     CXD2880_IO_TGT_SYS,
163562306a36Sopenharmony_ci					     0x00, 0x0a);
163662306a36Sopenharmony_ci		if (ret)
163762306a36Sopenharmony_ci			return ret;
163862306a36Sopenharmony_ci		ret = tnr_dmd->io->read_regs(tnr_dmd->io,
163962306a36Sopenharmony_ci					     CXD2880_IO_TGT_SYS,
164062306a36Sopenharmony_ci					     0x13, data, 1);
164162306a36Sopenharmony_ci		if (ret)
164262306a36Sopenharmony_ci			return ret;
164362306a36Sopenharmony_ci		if ((data[0] & 0x01) == 0)
164462306a36Sopenharmony_ci			return -EINVAL;
164562306a36Sopenharmony_ci	}
164662306a36Sopenharmony_ci
164762306a36Sopenharmony_ci	ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
164862306a36Sopenharmony_ci					  CXD2880_IO_TGT_SYS,
164962306a36Sopenharmony_ci					  t_power_x_seq5,
165062306a36Sopenharmony_ci					  ARRAY_SIZE(t_power_x_seq5));
165162306a36Sopenharmony_ci	if (ret)
165262306a36Sopenharmony_ci		return ret;
165362306a36Sopenharmony_ci
165462306a36Sopenharmony_ci	usleep_range(1000, 2000);
165562306a36Sopenharmony_ci
165662306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
165762306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
165862306a36Sopenharmony_ci				     0x00, 0x0a);
165962306a36Sopenharmony_ci	if (ret)
166062306a36Sopenharmony_ci		return ret;
166162306a36Sopenharmony_ci	ret = tnr_dmd->io->read_regs(tnr_dmd->io,
166262306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
166362306a36Sopenharmony_ci				     0x11, data, 1);
166462306a36Sopenharmony_ci	if (ret)
166562306a36Sopenharmony_ci		return ret;
166662306a36Sopenharmony_ci	if ((data[0] & 0x01) == 0)
166762306a36Sopenharmony_ci		return -EINVAL;
166862306a36Sopenharmony_ci
166962306a36Sopenharmony_ci	ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
167062306a36Sopenharmony_ci					  CXD2880_IO_TGT_SYS,
167162306a36Sopenharmony_ci					  t_power_x_seq6,
167262306a36Sopenharmony_ci					  ARRAY_SIZE(t_power_x_seq6));
167362306a36Sopenharmony_ci	if (ret)
167462306a36Sopenharmony_ci		return ret;
167562306a36Sopenharmony_ci
167662306a36Sopenharmony_ci	usleep_range(1000, 2000);
167762306a36Sopenharmony_ci
167862306a36Sopenharmony_ci	ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
167962306a36Sopenharmony_ci					  CXD2880_IO_TGT_DMD,
168062306a36Sopenharmony_ci					  t_power_x_seq7,
168162306a36Sopenharmony_ci					  ARRAY_SIZE(t_power_x_seq7));
168262306a36Sopenharmony_ci	if (ret)
168362306a36Sopenharmony_ci		return ret;
168462306a36Sopenharmony_ci
168562306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
168662306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
168762306a36Sopenharmony_ci				     0x00, 0x10);
168862306a36Sopenharmony_ci	if (ret)
168962306a36Sopenharmony_ci		return ret;
169062306a36Sopenharmony_ci
169162306a36Sopenharmony_ci	memset(data, 0x00, sizeof(data));
169262306a36Sopenharmony_ci
169362306a36Sopenharmony_ci	return tnr_dmd->io->write_regs(tnr_dmd->io,
169462306a36Sopenharmony_ci				       CXD2880_IO_TGT_SYS,
169562306a36Sopenharmony_ci				       0x27, data, 3);
169662306a36Sopenharmony_ci}
169762306a36Sopenharmony_ci
169862306a36Sopenharmony_cistruct cxd2880_tnrdmd_ts_clk_cfg {
169962306a36Sopenharmony_ci	u8 srl_clk_mode;
170062306a36Sopenharmony_ci	u8 srl_duty_mode;
170162306a36Sopenharmony_ci	u8 ts_clk_period;
170262306a36Sopenharmony_ci};
170362306a36Sopenharmony_ci
170462306a36Sopenharmony_cistatic int set_ts_clk_mode_and_freq(struct cxd2880_tnrdmd *tnr_dmd,
170562306a36Sopenharmony_ci				    enum cxd2880_dtv_sys sys)
170662306a36Sopenharmony_ci{
170762306a36Sopenharmony_ci	int ret;
170862306a36Sopenharmony_ci	u8 backwards_compatible = 0;
170962306a36Sopenharmony_ci	struct cxd2880_tnrdmd_ts_clk_cfg ts_clk_cfg;
171062306a36Sopenharmony_ci	u8 ts_rate_ctrl_off = 0;
171162306a36Sopenharmony_ci	u8 ts_in_off = 0;
171262306a36Sopenharmony_ci	u8 ts_clk_manaul_on = 0;
171362306a36Sopenharmony_ci	u8 data = 0;
171462306a36Sopenharmony_ci
171562306a36Sopenharmony_ci	static const struct cxd2880_tnrdmd_ts_clk_cfg srl_ts_clk_stgs[2][2] = {
171662306a36Sopenharmony_ci		{
171762306a36Sopenharmony_ci			{3, 1, 8,},
171862306a36Sopenharmony_ci			{0, 2, 16,}
171962306a36Sopenharmony_ci		}, {
172062306a36Sopenharmony_ci			{1, 1, 8,},
172162306a36Sopenharmony_ci			{2, 2, 16,}
172262306a36Sopenharmony_ci		}
172362306a36Sopenharmony_ci	};
172462306a36Sopenharmony_ci
172562306a36Sopenharmony_ci	if (!tnr_dmd)
172662306a36Sopenharmony_ci		return -EINVAL;
172762306a36Sopenharmony_ci
172862306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
172962306a36Sopenharmony_ci				     CXD2880_IO_TGT_DMD,
173062306a36Sopenharmony_ci				     0x00, 0x00);
173162306a36Sopenharmony_ci	if (ret)
173262306a36Sopenharmony_ci		return ret;
173362306a36Sopenharmony_ci
173462306a36Sopenharmony_ci	if (tnr_dmd->is_ts_backwards_compatible_mode) {
173562306a36Sopenharmony_ci		backwards_compatible = 1;
173662306a36Sopenharmony_ci		ts_rate_ctrl_off = 1;
173762306a36Sopenharmony_ci		ts_in_off = 1;
173862306a36Sopenharmony_ci	} else {
173962306a36Sopenharmony_ci		backwards_compatible = 0;
174062306a36Sopenharmony_ci		ts_rate_ctrl_off = 0;
174162306a36Sopenharmony_ci		ts_in_off = 0;
174262306a36Sopenharmony_ci	}
174362306a36Sopenharmony_ci
174462306a36Sopenharmony_ci	if (tnr_dmd->ts_byte_clk_manual_setting) {
174562306a36Sopenharmony_ci		ts_clk_manaul_on = 1;
174662306a36Sopenharmony_ci		ts_rate_ctrl_off = 0;
174762306a36Sopenharmony_ci	}
174862306a36Sopenharmony_ci
174962306a36Sopenharmony_ci	ret = cxd2880_io_set_reg_bits(tnr_dmd->io,
175062306a36Sopenharmony_ci				      CXD2880_IO_TGT_DMD,
175162306a36Sopenharmony_ci				      0xd3, ts_rate_ctrl_off, 0x01);
175262306a36Sopenharmony_ci	if (ret)
175362306a36Sopenharmony_ci		return ret;
175462306a36Sopenharmony_ci
175562306a36Sopenharmony_ci	ret = cxd2880_io_set_reg_bits(tnr_dmd->io,
175662306a36Sopenharmony_ci				      CXD2880_IO_TGT_DMD,
175762306a36Sopenharmony_ci				      0xde, ts_in_off, 0x01);
175862306a36Sopenharmony_ci	if (ret)
175962306a36Sopenharmony_ci		return ret;
176062306a36Sopenharmony_ci
176162306a36Sopenharmony_ci	ret = cxd2880_io_set_reg_bits(tnr_dmd->io,
176262306a36Sopenharmony_ci				      CXD2880_IO_TGT_DMD,
176362306a36Sopenharmony_ci				      0xda, ts_clk_manaul_on, 0x01);
176462306a36Sopenharmony_ci	if (ret)
176562306a36Sopenharmony_ci		return ret;
176662306a36Sopenharmony_ci
176762306a36Sopenharmony_ci	ts_clk_cfg = srl_ts_clk_stgs[tnr_dmd->srl_ts_clk_mod_cnts]
176862306a36Sopenharmony_ci				    [tnr_dmd->srl_ts_clk_frq];
176962306a36Sopenharmony_ci
177062306a36Sopenharmony_ci	if (tnr_dmd->ts_byte_clk_manual_setting)
177162306a36Sopenharmony_ci		ts_clk_cfg.ts_clk_period = tnr_dmd->ts_byte_clk_manual_setting;
177262306a36Sopenharmony_ci
177362306a36Sopenharmony_ci	ret = cxd2880_io_set_reg_bits(tnr_dmd->io,
177462306a36Sopenharmony_ci				      CXD2880_IO_TGT_DMD,
177562306a36Sopenharmony_ci				      0xc4, ts_clk_cfg.srl_clk_mode, 0x03);
177662306a36Sopenharmony_ci	if (ret)
177762306a36Sopenharmony_ci		return ret;
177862306a36Sopenharmony_ci
177962306a36Sopenharmony_ci	ret = cxd2880_io_set_reg_bits(tnr_dmd->io,
178062306a36Sopenharmony_ci				      CXD2880_IO_TGT_DMD,
178162306a36Sopenharmony_ci				      0xd1, ts_clk_cfg.srl_duty_mode, 0x03);
178262306a36Sopenharmony_ci	if (ret)
178362306a36Sopenharmony_ci		return ret;
178462306a36Sopenharmony_ci
178562306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
178662306a36Sopenharmony_ci				     CXD2880_IO_TGT_DMD, 0xd9,
178762306a36Sopenharmony_ci				     ts_clk_cfg.ts_clk_period);
178862306a36Sopenharmony_ci	if (ret)
178962306a36Sopenharmony_ci		return ret;
179062306a36Sopenharmony_ci
179162306a36Sopenharmony_ci	data = backwards_compatible ? 0x00 : 0x01;
179262306a36Sopenharmony_ci
179362306a36Sopenharmony_ci	if (sys == CXD2880_DTV_SYS_DVBT) {
179462306a36Sopenharmony_ci		ret = tnr_dmd->io->write_reg(tnr_dmd->io,
179562306a36Sopenharmony_ci					     CXD2880_IO_TGT_DMD,
179662306a36Sopenharmony_ci					     0x00, 0x10);
179762306a36Sopenharmony_ci		if (ret)
179862306a36Sopenharmony_ci			return ret;
179962306a36Sopenharmony_ci
180062306a36Sopenharmony_ci		ret =
180162306a36Sopenharmony_ci		    cxd2880_io_set_reg_bits(tnr_dmd->io,
180262306a36Sopenharmony_ci					    CXD2880_IO_TGT_DMD,
180362306a36Sopenharmony_ci					    0x66, data, 0x01);
180462306a36Sopenharmony_ci	}
180562306a36Sopenharmony_ci
180662306a36Sopenharmony_ci	return ret;
180762306a36Sopenharmony_ci}
180862306a36Sopenharmony_ci
180962306a36Sopenharmony_cistatic int pid_ftr_setting(struct cxd2880_tnrdmd *tnr_dmd,
181062306a36Sopenharmony_ci			   struct cxd2880_tnrdmd_pid_ftr_cfg
181162306a36Sopenharmony_ci			   *pid_ftr_cfg)
181262306a36Sopenharmony_ci{
181362306a36Sopenharmony_ci	int i;
181462306a36Sopenharmony_ci	int ret;
181562306a36Sopenharmony_ci	u8 data[65];
181662306a36Sopenharmony_ci
181762306a36Sopenharmony_ci	if (!tnr_dmd)
181862306a36Sopenharmony_ci		return -EINVAL;
181962306a36Sopenharmony_ci
182062306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
182162306a36Sopenharmony_ci				     CXD2880_IO_TGT_DMD,
182262306a36Sopenharmony_ci				     0x00, 0x00);
182362306a36Sopenharmony_ci	if (ret)
182462306a36Sopenharmony_ci		return ret;
182562306a36Sopenharmony_ci
182662306a36Sopenharmony_ci	if (!pid_ftr_cfg)
182762306a36Sopenharmony_ci		return tnr_dmd->io->write_reg(tnr_dmd->io,
182862306a36Sopenharmony_ci					      CXD2880_IO_TGT_DMD,
182962306a36Sopenharmony_ci					      0x50, 0x02);
183062306a36Sopenharmony_ci
183162306a36Sopenharmony_ci	data[0] = pid_ftr_cfg->is_negative ? 0x01 : 0x00;
183262306a36Sopenharmony_ci
183362306a36Sopenharmony_ci	for (i = 0; i < 32; i++) {
183462306a36Sopenharmony_ci		if (pid_ftr_cfg->pid_cfg[i].is_en) {
183562306a36Sopenharmony_ci			data[1 + (i * 2)] = (pid_ftr_cfg->pid_cfg[i].pid >> 8) | 0x20;
183662306a36Sopenharmony_ci			data[2 + (i * 2)] =  pid_ftr_cfg->pid_cfg[i].pid & 0xff;
183762306a36Sopenharmony_ci		} else {
183862306a36Sopenharmony_ci			data[1 + (i * 2)] = 0x00;
183962306a36Sopenharmony_ci			data[2 + (i * 2)] = 0x00;
184062306a36Sopenharmony_ci		}
184162306a36Sopenharmony_ci	}
184262306a36Sopenharmony_ci
184362306a36Sopenharmony_ci	return tnr_dmd->io->write_regs(tnr_dmd->io,
184462306a36Sopenharmony_ci				       CXD2880_IO_TGT_DMD,
184562306a36Sopenharmony_ci				       0x50, data, 65);
184662306a36Sopenharmony_ci}
184762306a36Sopenharmony_ci
184862306a36Sopenharmony_cistatic int load_cfg_mem(struct cxd2880_tnrdmd *tnr_dmd)
184962306a36Sopenharmony_ci{
185062306a36Sopenharmony_ci	int ret;
185162306a36Sopenharmony_ci	u8 i;
185262306a36Sopenharmony_ci
185362306a36Sopenharmony_ci	if (!tnr_dmd)
185462306a36Sopenharmony_ci		return -EINVAL;
185562306a36Sopenharmony_ci
185662306a36Sopenharmony_ci	for (i = 0; i < tnr_dmd->cfg_mem_last_entry; i++) {
185762306a36Sopenharmony_ci		ret = tnr_dmd->io->write_reg(tnr_dmd->io,
185862306a36Sopenharmony_ci					     tnr_dmd->cfg_mem[i].tgt,
185962306a36Sopenharmony_ci					     0x00, tnr_dmd->cfg_mem[i].bank);
186062306a36Sopenharmony_ci		if (ret)
186162306a36Sopenharmony_ci			return ret;
186262306a36Sopenharmony_ci
186362306a36Sopenharmony_ci		ret = cxd2880_io_set_reg_bits(tnr_dmd->io,
186462306a36Sopenharmony_ci					      tnr_dmd->cfg_mem[i].tgt,
186562306a36Sopenharmony_ci					      tnr_dmd->cfg_mem[i].address,
186662306a36Sopenharmony_ci					      tnr_dmd->cfg_mem[i].value,
186762306a36Sopenharmony_ci					      tnr_dmd->cfg_mem[i].bit_mask);
186862306a36Sopenharmony_ci		if (ret)
186962306a36Sopenharmony_ci			return ret;
187062306a36Sopenharmony_ci	}
187162306a36Sopenharmony_ci
187262306a36Sopenharmony_ci	return 0;
187362306a36Sopenharmony_ci}
187462306a36Sopenharmony_ci
187562306a36Sopenharmony_cistatic int set_cfg_mem(struct cxd2880_tnrdmd *tnr_dmd,
187662306a36Sopenharmony_ci		       enum cxd2880_io_tgt tgt,
187762306a36Sopenharmony_ci		       u8 bank, u8 address, u8 value, u8 bit_mask)
187862306a36Sopenharmony_ci{
187962306a36Sopenharmony_ci	u8 i;
188062306a36Sopenharmony_ci	u8 value_stored = 0;
188162306a36Sopenharmony_ci
188262306a36Sopenharmony_ci	if (!tnr_dmd)
188362306a36Sopenharmony_ci		return -EINVAL;
188462306a36Sopenharmony_ci
188562306a36Sopenharmony_ci	for (i = 0; i < tnr_dmd->cfg_mem_last_entry; i++) {
188662306a36Sopenharmony_ci		if (value_stored == 0 &&
188762306a36Sopenharmony_ci		    tnr_dmd->cfg_mem[i].tgt == tgt &&
188862306a36Sopenharmony_ci		    tnr_dmd->cfg_mem[i].bank == bank &&
188962306a36Sopenharmony_ci		    tnr_dmd->cfg_mem[i].address == address) {
189062306a36Sopenharmony_ci			tnr_dmd->cfg_mem[i].value &= ~bit_mask;
189162306a36Sopenharmony_ci			tnr_dmd->cfg_mem[i].value |= (value & bit_mask);
189262306a36Sopenharmony_ci
189362306a36Sopenharmony_ci			tnr_dmd->cfg_mem[i].bit_mask |= bit_mask;
189462306a36Sopenharmony_ci
189562306a36Sopenharmony_ci			value_stored = 1;
189662306a36Sopenharmony_ci		}
189762306a36Sopenharmony_ci	}
189862306a36Sopenharmony_ci
189962306a36Sopenharmony_ci	if (value_stored)
190062306a36Sopenharmony_ci		return 0;
190162306a36Sopenharmony_ci
190262306a36Sopenharmony_ci	if (tnr_dmd->cfg_mem_last_entry < CXD2880_TNRDMD_MAX_CFG_MEM_COUNT) {
190362306a36Sopenharmony_ci		tnr_dmd->cfg_mem[tnr_dmd->cfg_mem_last_entry].tgt = tgt;
190462306a36Sopenharmony_ci		tnr_dmd->cfg_mem[tnr_dmd->cfg_mem_last_entry].bank = bank;
190562306a36Sopenharmony_ci		tnr_dmd->cfg_mem[tnr_dmd->cfg_mem_last_entry].address = address;
190662306a36Sopenharmony_ci		tnr_dmd->cfg_mem[tnr_dmd->cfg_mem_last_entry].value = (value & bit_mask);
190762306a36Sopenharmony_ci		tnr_dmd->cfg_mem[tnr_dmd->cfg_mem_last_entry].bit_mask = bit_mask;
190862306a36Sopenharmony_ci		tnr_dmd->cfg_mem_last_entry++;
190962306a36Sopenharmony_ci	} else {
191062306a36Sopenharmony_ci		return -ENOMEM;
191162306a36Sopenharmony_ci	}
191262306a36Sopenharmony_ci
191362306a36Sopenharmony_ci	return 0;
191462306a36Sopenharmony_ci}
191562306a36Sopenharmony_ci
191662306a36Sopenharmony_ciint cxd2880_tnrdmd_create(struct cxd2880_tnrdmd *tnr_dmd,
191762306a36Sopenharmony_ci			  struct cxd2880_io *io,
191862306a36Sopenharmony_ci			  struct cxd2880_tnrdmd_create_param
191962306a36Sopenharmony_ci			  *create_param)
192062306a36Sopenharmony_ci{
192162306a36Sopenharmony_ci	if (!tnr_dmd || !io || !create_param)
192262306a36Sopenharmony_ci		return -EINVAL;
192362306a36Sopenharmony_ci
192462306a36Sopenharmony_ci	memset(tnr_dmd, 0, sizeof(struct cxd2880_tnrdmd));
192562306a36Sopenharmony_ci
192662306a36Sopenharmony_ci	tnr_dmd->io = io;
192762306a36Sopenharmony_ci	tnr_dmd->create_param = *create_param;
192862306a36Sopenharmony_ci
192962306a36Sopenharmony_ci	tnr_dmd->diver_mode = CXD2880_TNRDMD_DIVERMODE_SINGLE;
193062306a36Sopenharmony_ci	tnr_dmd->diver_sub = NULL;
193162306a36Sopenharmony_ci
193262306a36Sopenharmony_ci	tnr_dmd->srl_ts_clk_mod_cnts = 1;
193362306a36Sopenharmony_ci	tnr_dmd->en_fef_intmtnt_base = 1;
193462306a36Sopenharmony_ci	tnr_dmd->en_fef_intmtnt_lite = 1;
193562306a36Sopenharmony_ci	tnr_dmd->rf_lvl_cmpstn = NULL;
193662306a36Sopenharmony_ci	tnr_dmd->lna_thrs_tbl_air = NULL;
193762306a36Sopenharmony_ci	tnr_dmd->lna_thrs_tbl_cable = NULL;
193862306a36Sopenharmony_ci	atomic_set(&tnr_dmd->cancel, 0);
193962306a36Sopenharmony_ci
194062306a36Sopenharmony_ci	return 0;
194162306a36Sopenharmony_ci}
194262306a36Sopenharmony_ci
194362306a36Sopenharmony_ciint cxd2880_tnrdmd_diver_create(struct cxd2880_tnrdmd
194462306a36Sopenharmony_ci				*tnr_dmd_main,
194562306a36Sopenharmony_ci				struct cxd2880_io *io_main,
194662306a36Sopenharmony_ci				struct cxd2880_tnrdmd *tnr_dmd_sub,
194762306a36Sopenharmony_ci				struct cxd2880_io *io_sub,
194862306a36Sopenharmony_ci				struct
194962306a36Sopenharmony_ci				cxd2880_tnrdmd_diver_create_param
195062306a36Sopenharmony_ci				*create_param)
195162306a36Sopenharmony_ci{
195262306a36Sopenharmony_ci	struct cxd2880_tnrdmd_create_param *main_param, *sub_param;
195362306a36Sopenharmony_ci
195462306a36Sopenharmony_ci	if (!tnr_dmd_main || !io_main || !tnr_dmd_sub || !io_sub ||
195562306a36Sopenharmony_ci	    !create_param)
195662306a36Sopenharmony_ci		return -EINVAL;
195762306a36Sopenharmony_ci
195862306a36Sopenharmony_ci	memset(tnr_dmd_main, 0, sizeof(struct cxd2880_tnrdmd));
195962306a36Sopenharmony_ci	memset(tnr_dmd_sub, 0, sizeof(struct cxd2880_tnrdmd));
196062306a36Sopenharmony_ci
196162306a36Sopenharmony_ci	main_param = &tnr_dmd_main->create_param;
196262306a36Sopenharmony_ci	sub_param = &tnr_dmd_sub->create_param;
196362306a36Sopenharmony_ci
196462306a36Sopenharmony_ci	tnr_dmd_main->io = io_main;
196562306a36Sopenharmony_ci	tnr_dmd_main->diver_mode = CXD2880_TNRDMD_DIVERMODE_MAIN;
196662306a36Sopenharmony_ci	tnr_dmd_main->diver_sub = tnr_dmd_sub;
196762306a36Sopenharmony_ci	tnr_dmd_main->create_param.en_internal_ldo =
196862306a36Sopenharmony_ci	    create_param->en_internal_ldo;
196962306a36Sopenharmony_ci
197062306a36Sopenharmony_ci	main_param->ts_output_if = create_param->ts_output_if;
197162306a36Sopenharmony_ci	main_param->xtal_share_type = CXD2880_TNRDMD_XTAL_SHARE_MASTER;
197262306a36Sopenharmony_ci	main_param->xosc_cap = create_param->xosc_cap_main;
197362306a36Sopenharmony_ci	main_param->xosc_i = create_param->xosc_i_main;
197462306a36Sopenharmony_ci	main_param->is_cxd2881gg = create_param->is_cxd2881gg;
197562306a36Sopenharmony_ci	main_param->stationary_use = create_param->stationary_use;
197662306a36Sopenharmony_ci
197762306a36Sopenharmony_ci	tnr_dmd_sub->io = io_sub;
197862306a36Sopenharmony_ci	tnr_dmd_sub->diver_mode = CXD2880_TNRDMD_DIVERMODE_SUB;
197962306a36Sopenharmony_ci	tnr_dmd_sub->diver_sub = NULL;
198062306a36Sopenharmony_ci
198162306a36Sopenharmony_ci	sub_param->en_internal_ldo = create_param->en_internal_ldo;
198262306a36Sopenharmony_ci	sub_param->ts_output_if = create_param->ts_output_if;
198362306a36Sopenharmony_ci	sub_param->xtal_share_type = CXD2880_TNRDMD_XTAL_SHARE_SLAVE;
198462306a36Sopenharmony_ci	sub_param->xosc_cap = 0;
198562306a36Sopenharmony_ci	sub_param->xosc_i = create_param->xosc_i_sub;
198662306a36Sopenharmony_ci	sub_param->is_cxd2881gg = create_param->is_cxd2881gg;
198762306a36Sopenharmony_ci	sub_param->stationary_use = create_param->stationary_use;
198862306a36Sopenharmony_ci
198962306a36Sopenharmony_ci	tnr_dmd_main->srl_ts_clk_mod_cnts = 1;
199062306a36Sopenharmony_ci	tnr_dmd_main->en_fef_intmtnt_base = 1;
199162306a36Sopenharmony_ci	tnr_dmd_main->en_fef_intmtnt_lite = 1;
199262306a36Sopenharmony_ci	tnr_dmd_main->rf_lvl_cmpstn = NULL;
199362306a36Sopenharmony_ci	tnr_dmd_main->lna_thrs_tbl_air = NULL;
199462306a36Sopenharmony_ci	tnr_dmd_main->lna_thrs_tbl_cable = NULL;
199562306a36Sopenharmony_ci
199662306a36Sopenharmony_ci	tnr_dmd_sub->srl_ts_clk_mod_cnts = 1;
199762306a36Sopenharmony_ci	tnr_dmd_sub->en_fef_intmtnt_base = 1;
199862306a36Sopenharmony_ci	tnr_dmd_sub->en_fef_intmtnt_lite = 1;
199962306a36Sopenharmony_ci	tnr_dmd_sub->rf_lvl_cmpstn = NULL;
200062306a36Sopenharmony_ci	tnr_dmd_sub->lna_thrs_tbl_air = NULL;
200162306a36Sopenharmony_ci	tnr_dmd_sub->lna_thrs_tbl_cable = NULL;
200262306a36Sopenharmony_ci
200362306a36Sopenharmony_ci	return 0;
200462306a36Sopenharmony_ci}
200562306a36Sopenharmony_ci
200662306a36Sopenharmony_ciint cxd2880_tnrdmd_init1(struct cxd2880_tnrdmd *tnr_dmd)
200762306a36Sopenharmony_ci{
200862306a36Sopenharmony_ci	int ret;
200962306a36Sopenharmony_ci
201062306a36Sopenharmony_ci	if (!tnr_dmd || tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB)
201162306a36Sopenharmony_ci		return -EINVAL;
201262306a36Sopenharmony_ci
201362306a36Sopenharmony_ci	tnr_dmd->chip_id = CXD2880_TNRDMD_CHIP_ID_UNKNOWN;
201462306a36Sopenharmony_ci	tnr_dmd->state = CXD2880_TNRDMD_STATE_UNKNOWN;
201562306a36Sopenharmony_ci	tnr_dmd->clk_mode = CXD2880_TNRDMD_CLOCKMODE_UNKNOWN;
201662306a36Sopenharmony_ci	tnr_dmd->frequency_khz = 0;
201762306a36Sopenharmony_ci	tnr_dmd->sys = CXD2880_DTV_SYS_UNKNOWN;
201862306a36Sopenharmony_ci	tnr_dmd->bandwidth = CXD2880_DTV_BW_UNKNOWN;
201962306a36Sopenharmony_ci	tnr_dmd->scan_mode = 0;
202062306a36Sopenharmony_ci	atomic_set(&tnr_dmd->cancel, 0);
202162306a36Sopenharmony_ci
202262306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) {
202362306a36Sopenharmony_ci		tnr_dmd->diver_sub->chip_id = CXD2880_TNRDMD_CHIP_ID_UNKNOWN;
202462306a36Sopenharmony_ci		tnr_dmd->diver_sub->state = CXD2880_TNRDMD_STATE_UNKNOWN;
202562306a36Sopenharmony_ci		tnr_dmd->diver_sub->clk_mode = CXD2880_TNRDMD_CLOCKMODE_UNKNOWN;
202662306a36Sopenharmony_ci		tnr_dmd->diver_sub->frequency_khz = 0;
202762306a36Sopenharmony_ci		tnr_dmd->diver_sub->sys = CXD2880_DTV_SYS_UNKNOWN;
202862306a36Sopenharmony_ci		tnr_dmd->diver_sub->bandwidth = CXD2880_DTV_BW_UNKNOWN;
202962306a36Sopenharmony_ci		tnr_dmd->diver_sub->scan_mode = 0;
203062306a36Sopenharmony_ci		atomic_set(&tnr_dmd->diver_sub->cancel, 0);
203162306a36Sopenharmony_ci	}
203262306a36Sopenharmony_ci
203362306a36Sopenharmony_ci	ret = cxd2880_tnrdmd_chip_id(tnr_dmd, &tnr_dmd->chip_id);
203462306a36Sopenharmony_ci	if (ret)
203562306a36Sopenharmony_ci		return ret;
203662306a36Sopenharmony_ci
203762306a36Sopenharmony_ci	if (!CXD2880_TNRDMD_CHIP_ID_VALID(tnr_dmd->chip_id))
203862306a36Sopenharmony_ci		return -ENOTTY;
203962306a36Sopenharmony_ci
204062306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) {
204162306a36Sopenharmony_ci		ret =
204262306a36Sopenharmony_ci		    cxd2880_tnrdmd_chip_id(tnr_dmd->diver_sub,
204362306a36Sopenharmony_ci					   &tnr_dmd->diver_sub->chip_id);
204462306a36Sopenharmony_ci		if (ret)
204562306a36Sopenharmony_ci			return ret;
204662306a36Sopenharmony_ci
204762306a36Sopenharmony_ci		if (!CXD2880_TNRDMD_CHIP_ID_VALID(tnr_dmd->diver_sub->chip_id))
204862306a36Sopenharmony_ci			return -ENOTTY;
204962306a36Sopenharmony_ci	}
205062306a36Sopenharmony_ci
205162306a36Sopenharmony_ci	ret = p_init1(tnr_dmd);
205262306a36Sopenharmony_ci	if (ret)
205362306a36Sopenharmony_ci		return ret;
205462306a36Sopenharmony_ci
205562306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) {
205662306a36Sopenharmony_ci		ret = p_init1(tnr_dmd->diver_sub);
205762306a36Sopenharmony_ci		if (ret)
205862306a36Sopenharmony_ci			return ret;
205962306a36Sopenharmony_ci	}
206062306a36Sopenharmony_ci
206162306a36Sopenharmony_ci	usleep_range(1000, 2000);
206262306a36Sopenharmony_ci
206362306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) {
206462306a36Sopenharmony_ci		ret = p_init2(tnr_dmd->diver_sub);
206562306a36Sopenharmony_ci		if (ret)
206662306a36Sopenharmony_ci			return ret;
206762306a36Sopenharmony_ci	}
206862306a36Sopenharmony_ci
206962306a36Sopenharmony_ci	ret = p_init2(tnr_dmd);
207062306a36Sopenharmony_ci	if (ret)
207162306a36Sopenharmony_ci		return ret;
207262306a36Sopenharmony_ci
207362306a36Sopenharmony_ci	usleep_range(5000, 6000);
207462306a36Sopenharmony_ci
207562306a36Sopenharmony_ci	ret = p_init3(tnr_dmd);
207662306a36Sopenharmony_ci	if (ret)
207762306a36Sopenharmony_ci		return ret;
207862306a36Sopenharmony_ci
207962306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) {
208062306a36Sopenharmony_ci		ret = p_init3(tnr_dmd->diver_sub);
208162306a36Sopenharmony_ci		if (ret)
208262306a36Sopenharmony_ci			return ret;
208362306a36Sopenharmony_ci	}
208462306a36Sopenharmony_ci
208562306a36Sopenharmony_ci	ret = rf_init1(tnr_dmd);
208662306a36Sopenharmony_ci	if (ret)
208762306a36Sopenharmony_ci		return ret;
208862306a36Sopenharmony_ci
208962306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN)
209062306a36Sopenharmony_ci		ret = rf_init1(tnr_dmd->diver_sub);
209162306a36Sopenharmony_ci
209262306a36Sopenharmony_ci	return ret;
209362306a36Sopenharmony_ci}
209462306a36Sopenharmony_ci
209562306a36Sopenharmony_ciint cxd2880_tnrdmd_init2(struct cxd2880_tnrdmd *tnr_dmd)
209662306a36Sopenharmony_ci{
209762306a36Sopenharmony_ci	u8 cpu_task_completed;
209862306a36Sopenharmony_ci	int ret;
209962306a36Sopenharmony_ci
210062306a36Sopenharmony_ci	if (!tnr_dmd)
210162306a36Sopenharmony_ci		return -EINVAL;
210262306a36Sopenharmony_ci
210362306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB)
210462306a36Sopenharmony_ci		return -EINVAL;
210562306a36Sopenharmony_ci
210662306a36Sopenharmony_ci	ret = cxd2880_tnrdmd_check_internal_cpu_status(tnr_dmd,
210762306a36Sopenharmony_ci						     &cpu_task_completed);
210862306a36Sopenharmony_ci	if (ret)
210962306a36Sopenharmony_ci		return ret;
211062306a36Sopenharmony_ci
211162306a36Sopenharmony_ci	if (!cpu_task_completed)
211262306a36Sopenharmony_ci		return -EINVAL;
211362306a36Sopenharmony_ci
211462306a36Sopenharmony_ci	ret = rf_init2(tnr_dmd);
211562306a36Sopenharmony_ci	if (ret)
211662306a36Sopenharmony_ci		return ret;
211762306a36Sopenharmony_ci
211862306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) {
211962306a36Sopenharmony_ci		ret = rf_init2(tnr_dmd->diver_sub);
212062306a36Sopenharmony_ci		if (ret)
212162306a36Sopenharmony_ci			return ret;
212262306a36Sopenharmony_ci	}
212362306a36Sopenharmony_ci
212462306a36Sopenharmony_ci	ret = load_cfg_mem(tnr_dmd);
212562306a36Sopenharmony_ci	if (ret)
212662306a36Sopenharmony_ci		return ret;
212762306a36Sopenharmony_ci
212862306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) {
212962306a36Sopenharmony_ci		ret = load_cfg_mem(tnr_dmd->diver_sub);
213062306a36Sopenharmony_ci		if (ret)
213162306a36Sopenharmony_ci			return ret;
213262306a36Sopenharmony_ci	}
213362306a36Sopenharmony_ci
213462306a36Sopenharmony_ci	tnr_dmd->state = CXD2880_TNRDMD_STATE_SLEEP;
213562306a36Sopenharmony_ci
213662306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN)
213762306a36Sopenharmony_ci		tnr_dmd->diver_sub->state = CXD2880_TNRDMD_STATE_SLEEP;
213862306a36Sopenharmony_ci
213962306a36Sopenharmony_ci	return ret;
214062306a36Sopenharmony_ci}
214162306a36Sopenharmony_ci
214262306a36Sopenharmony_ciint cxd2880_tnrdmd_check_internal_cpu_status(struct cxd2880_tnrdmd
214362306a36Sopenharmony_ci					     *tnr_dmd,
214462306a36Sopenharmony_ci					     u8 *task_completed)
214562306a36Sopenharmony_ci{
214662306a36Sopenharmony_ci	u16 cpu_status = 0;
214762306a36Sopenharmony_ci	int ret;
214862306a36Sopenharmony_ci
214962306a36Sopenharmony_ci	if (!tnr_dmd || !task_completed)
215062306a36Sopenharmony_ci		return -EINVAL;
215162306a36Sopenharmony_ci
215262306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB)
215362306a36Sopenharmony_ci		return -EINVAL;
215462306a36Sopenharmony_ci
215562306a36Sopenharmony_ci	ret = cxd2880_tnrdmd_mon_internal_cpu_status(tnr_dmd, &cpu_status);
215662306a36Sopenharmony_ci	if (ret)
215762306a36Sopenharmony_ci		return ret;
215862306a36Sopenharmony_ci
215962306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SINGLE) {
216062306a36Sopenharmony_ci		if (cpu_status == 0)
216162306a36Sopenharmony_ci			*task_completed = 1;
216262306a36Sopenharmony_ci		else
216362306a36Sopenharmony_ci			*task_completed = 0;
216462306a36Sopenharmony_ci
216562306a36Sopenharmony_ci		return 0;
216662306a36Sopenharmony_ci	}
216762306a36Sopenharmony_ci	if (cpu_status != 0) {
216862306a36Sopenharmony_ci		*task_completed = 0;
216962306a36Sopenharmony_ci		return 0;
217062306a36Sopenharmony_ci	}
217162306a36Sopenharmony_ci
217262306a36Sopenharmony_ci	ret = cxd2880_tnrdmd_mon_internal_cpu_status_sub(tnr_dmd, &cpu_status);
217362306a36Sopenharmony_ci	if (ret)
217462306a36Sopenharmony_ci		return ret;
217562306a36Sopenharmony_ci
217662306a36Sopenharmony_ci	if (cpu_status == 0)
217762306a36Sopenharmony_ci		*task_completed = 1;
217862306a36Sopenharmony_ci	else
217962306a36Sopenharmony_ci		*task_completed = 0;
218062306a36Sopenharmony_ci
218162306a36Sopenharmony_ci	return ret;
218262306a36Sopenharmony_ci}
218362306a36Sopenharmony_ci
218462306a36Sopenharmony_ciint cxd2880_tnrdmd_common_tune_setting1(struct cxd2880_tnrdmd *tnr_dmd,
218562306a36Sopenharmony_ci					enum cxd2880_dtv_sys sys,
218662306a36Sopenharmony_ci					u32 frequency_khz,
218762306a36Sopenharmony_ci					enum cxd2880_dtv_bandwidth
218862306a36Sopenharmony_ci					bandwidth, u8 one_seg_opt,
218962306a36Sopenharmony_ci					u8 one_seg_opt_shft_dir)
219062306a36Sopenharmony_ci{
219162306a36Sopenharmony_ci	u8 data;
219262306a36Sopenharmony_ci	enum cxd2880_tnrdmd_clockmode new_clk_mode =
219362306a36Sopenharmony_ci				CXD2880_TNRDMD_CLOCKMODE_A;
219462306a36Sopenharmony_ci	int shift_frequency_khz;
219562306a36Sopenharmony_ci	u8 cpu_task_completed;
219662306a36Sopenharmony_ci	int ret;
219762306a36Sopenharmony_ci
219862306a36Sopenharmony_ci	if (!tnr_dmd)
219962306a36Sopenharmony_ci		return -EINVAL;
220062306a36Sopenharmony_ci
220162306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB)
220262306a36Sopenharmony_ci		return -EINVAL;
220362306a36Sopenharmony_ci
220462306a36Sopenharmony_ci	if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP &&
220562306a36Sopenharmony_ci	    tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE)
220662306a36Sopenharmony_ci		return -EINVAL;
220762306a36Sopenharmony_ci
220862306a36Sopenharmony_ci	if (frequency_khz < 4000)
220962306a36Sopenharmony_ci		return -EINVAL;
221062306a36Sopenharmony_ci
221162306a36Sopenharmony_ci	ret = cxd2880_tnrdmd_sleep(tnr_dmd);
221262306a36Sopenharmony_ci	if (ret)
221362306a36Sopenharmony_ci		return ret;
221462306a36Sopenharmony_ci
221562306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
221662306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
221762306a36Sopenharmony_ci				     0x00,
221862306a36Sopenharmony_ci				     0x00);
221962306a36Sopenharmony_ci	if (ret)
222062306a36Sopenharmony_ci		return ret;
222162306a36Sopenharmony_ci
222262306a36Sopenharmony_ci	ret = tnr_dmd->io->read_regs(tnr_dmd->io,
222362306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
222462306a36Sopenharmony_ci				     0x2b,
222562306a36Sopenharmony_ci				     &data,
222662306a36Sopenharmony_ci				     1);
222762306a36Sopenharmony_ci	if (ret)
222862306a36Sopenharmony_ci		return ret;
222962306a36Sopenharmony_ci
223062306a36Sopenharmony_ci	switch (sys) {
223162306a36Sopenharmony_ci	case CXD2880_DTV_SYS_DVBT:
223262306a36Sopenharmony_ci		if (data == 0x00) {
223362306a36Sopenharmony_ci			ret = t_power_x(tnr_dmd, 1);
223462306a36Sopenharmony_ci			if (ret)
223562306a36Sopenharmony_ci				return ret;
223662306a36Sopenharmony_ci
223762306a36Sopenharmony_ci			if (tnr_dmd->diver_mode ==
223862306a36Sopenharmony_ci			    CXD2880_TNRDMD_DIVERMODE_MAIN) {
223962306a36Sopenharmony_ci				ret = t_power_x(tnr_dmd->diver_sub, 1);
224062306a36Sopenharmony_ci				if (ret)
224162306a36Sopenharmony_ci					return ret;
224262306a36Sopenharmony_ci			}
224362306a36Sopenharmony_ci		}
224462306a36Sopenharmony_ci		break;
224562306a36Sopenharmony_ci
224662306a36Sopenharmony_ci	case CXD2880_DTV_SYS_DVBT2:
224762306a36Sopenharmony_ci		if (data == 0x01) {
224862306a36Sopenharmony_ci			ret = t_power_x(tnr_dmd, 0);
224962306a36Sopenharmony_ci			if (ret)
225062306a36Sopenharmony_ci				return ret;
225162306a36Sopenharmony_ci
225262306a36Sopenharmony_ci			if (tnr_dmd->diver_mode ==
225362306a36Sopenharmony_ci			    CXD2880_TNRDMD_DIVERMODE_MAIN) {
225462306a36Sopenharmony_ci				ret = t_power_x(tnr_dmd->diver_sub, 0);
225562306a36Sopenharmony_ci				if (ret)
225662306a36Sopenharmony_ci					return ret;
225762306a36Sopenharmony_ci			}
225862306a36Sopenharmony_ci		}
225962306a36Sopenharmony_ci		break;
226062306a36Sopenharmony_ci
226162306a36Sopenharmony_ci	default:
226262306a36Sopenharmony_ci		return -EINVAL;
226362306a36Sopenharmony_ci	}
226462306a36Sopenharmony_ci
226562306a36Sopenharmony_ci	ret = spll_reset(tnr_dmd, new_clk_mode);
226662306a36Sopenharmony_ci	if (ret)
226762306a36Sopenharmony_ci		return ret;
226862306a36Sopenharmony_ci
226962306a36Sopenharmony_ci	tnr_dmd->clk_mode = new_clk_mode;
227062306a36Sopenharmony_ci
227162306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) {
227262306a36Sopenharmony_ci		ret = spll_reset(tnr_dmd->diver_sub, new_clk_mode);
227362306a36Sopenharmony_ci		if (ret)
227462306a36Sopenharmony_ci			return ret;
227562306a36Sopenharmony_ci
227662306a36Sopenharmony_ci		tnr_dmd->diver_sub->clk_mode = new_clk_mode;
227762306a36Sopenharmony_ci	}
227862306a36Sopenharmony_ci
227962306a36Sopenharmony_ci	ret = load_cfg_mem(tnr_dmd);
228062306a36Sopenharmony_ci	if (ret)
228162306a36Sopenharmony_ci		return ret;
228262306a36Sopenharmony_ci
228362306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) {
228462306a36Sopenharmony_ci		ret = load_cfg_mem(tnr_dmd->diver_sub);
228562306a36Sopenharmony_ci		if (ret)
228662306a36Sopenharmony_ci			return ret;
228762306a36Sopenharmony_ci	}
228862306a36Sopenharmony_ci
228962306a36Sopenharmony_ci	if (one_seg_opt) {
229062306a36Sopenharmony_ci		if (tnr_dmd->diver_mode ==
229162306a36Sopenharmony_ci		    CXD2880_TNRDMD_DIVERMODE_MAIN) {
229262306a36Sopenharmony_ci			shift_frequency_khz = 350;
229362306a36Sopenharmony_ci		} else {
229462306a36Sopenharmony_ci			if (one_seg_opt_shft_dir)
229562306a36Sopenharmony_ci				shift_frequency_khz = 350;
229662306a36Sopenharmony_ci			else
229762306a36Sopenharmony_ci				shift_frequency_khz = -350;
229862306a36Sopenharmony_ci
229962306a36Sopenharmony_ci			if (tnr_dmd->create_param.xtal_share_type ==
230062306a36Sopenharmony_ci			    CXD2880_TNRDMD_XTAL_SHARE_SLAVE)
230162306a36Sopenharmony_ci				shift_frequency_khz *= -1;
230262306a36Sopenharmony_ci		}
230362306a36Sopenharmony_ci	} else {
230462306a36Sopenharmony_ci		if (tnr_dmd->diver_mode ==
230562306a36Sopenharmony_ci		    CXD2880_TNRDMD_DIVERMODE_MAIN) {
230662306a36Sopenharmony_ci			shift_frequency_khz = 150;
230762306a36Sopenharmony_ci		} else {
230862306a36Sopenharmony_ci			switch (tnr_dmd->create_param.xtal_share_type) {
230962306a36Sopenharmony_ci			case CXD2880_TNRDMD_XTAL_SHARE_NONE:
231062306a36Sopenharmony_ci			case CXD2880_TNRDMD_XTAL_SHARE_EXTREF:
231162306a36Sopenharmony_ci			default:
231262306a36Sopenharmony_ci				shift_frequency_khz = 0;
231362306a36Sopenharmony_ci				break;
231462306a36Sopenharmony_ci			case CXD2880_TNRDMD_XTAL_SHARE_MASTER:
231562306a36Sopenharmony_ci				shift_frequency_khz = 150;
231662306a36Sopenharmony_ci				break;
231762306a36Sopenharmony_ci			case CXD2880_TNRDMD_XTAL_SHARE_SLAVE:
231862306a36Sopenharmony_ci				shift_frequency_khz = -150;
231962306a36Sopenharmony_ci				break;
232062306a36Sopenharmony_ci			}
232162306a36Sopenharmony_ci		}
232262306a36Sopenharmony_ci	}
232362306a36Sopenharmony_ci
232462306a36Sopenharmony_ci	ret =
232562306a36Sopenharmony_ci	    x_tune1(tnr_dmd, sys, frequency_khz, bandwidth,
232662306a36Sopenharmony_ci		    tnr_dmd->is_cable_input, shift_frequency_khz);
232762306a36Sopenharmony_ci	if (ret)
232862306a36Sopenharmony_ci		return ret;
232962306a36Sopenharmony_ci
233062306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) {
233162306a36Sopenharmony_ci		ret =
233262306a36Sopenharmony_ci		    x_tune1(tnr_dmd->diver_sub, sys, frequency_khz,
233362306a36Sopenharmony_ci			    bandwidth, tnr_dmd->is_cable_input,
233462306a36Sopenharmony_ci			    -shift_frequency_khz);
233562306a36Sopenharmony_ci		if (ret)
233662306a36Sopenharmony_ci			return ret;
233762306a36Sopenharmony_ci	}
233862306a36Sopenharmony_ci
233962306a36Sopenharmony_ci	usleep_range(10000, 11000);
234062306a36Sopenharmony_ci
234162306a36Sopenharmony_ci	ret =
234262306a36Sopenharmony_ci	    cxd2880_tnrdmd_check_internal_cpu_status(tnr_dmd,
234362306a36Sopenharmony_ci					     &cpu_task_completed);
234462306a36Sopenharmony_ci	if (ret)
234562306a36Sopenharmony_ci		return ret;
234662306a36Sopenharmony_ci
234762306a36Sopenharmony_ci	if (!cpu_task_completed)
234862306a36Sopenharmony_ci		return -EINVAL;
234962306a36Sopenharmony_ci
235062306a36Sopenharmony_ci	ret =
235162306a36Sopenharmony_ci	    x_tune2(tnr_dmd, bandwidth, tnr_dmd->clk_mode,
235262306a36Sopenharmony_ci		    shift_frequency_khz);
235362306a36Sopenharmony_ci	if (ret)
235462306a36Sopenharmony_ci		return ret;
235562306a36Sopenharmony_ci
235662306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) {
235762306a36Sopenharmony_ci		ret =
235862306a36Sopenharmony_ci		    x_tune2(tnr_dmd->diver_sub, bandwidth,
235962306a36Sopenharmony_ci			    tnr_dmd->diver_sub->clk_mode,
236062306a36Sopenharmony_ci			    -shift_frequency_khz);
236162306a36Sopenharmony_ci		if (ret)
236262306a36Sopenharmony_ci			return ret;
236362306a36Sopenharmony_ci	}
236462306a36Sopenharmony_ci
236562306a36Sopenharmony_ci	if (tnr_dmd->create_param.ts_output_if == CXD2880_TNRDMD_TSOUT_IF_TS) {
236662306a36Sopenharmony_ci		ret = set_ts_clk_mode_and_freq(tnr_dmd, sys);
236762306a36Sopenharmony_ci	} else {
236862306a36Sopenharmony_ci		struct cxd2880_tnrdmd_pid_ftr_cfg *pid_ftr_cfg;
236962306a36Sopenharmony_ci
237062306a36Sopenharmony_ci		if (tnr_dmd->pid_ftr_cfg_en)
237162306a36Sopenharmony_ci			pid_ftr_cfg = &tnr_dmd->pid_ftr_cfg;
237262306a36Sopenharmony_ci		else
237362306a36Sopenharmony_ci			pid_ftr_cfg = NULL;
237462306a36Sopenharmony_ci
237562306a36Sopenharmony_ci		ret = pid_ftr_setting(tnr_dmd, pid_ftr_cfg);
237662306a36Sopenharmony_ci	}
237762306a36Sopenharmony_ci
237862306a36Sopenharmony_ci	return ret;
237962306a36Sopenharmony_ci}
238062306a36Sopenharmony_ci
238162306a36Sopenharmony_ciint cxd2880_tnrdmd_common_tune_setting2(struct cxd2880_tnrdmd
238262306a36Sopenharmony_ci					*tnr_dmd,
238362306a36Sopenharmony_ci					enum cxd2880_dtv_sys sys,
238462306a36Sopenharmony_ci					u8 en_fef_intmtnt_ctrl)
238562306a36Sopenharmony_ci{
238662306a36Sopenharmony_ci	int ret;
238762306a36Sopenharmony_ci
238862306a36Sopenharmony_ci	if (!tnr_dmd)
238962306a36Sopenharmony_ci		return -EINVAL;
239062306a36Sopenharmony_ci
239162306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB)
239262306a36Sopenharmony_ci		return -EINVAL;
239362306a36Sopenharmony_ci
239462306a36Sopenharmony_ci	if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP &&
239562306a36Sopenharmony_ci	    tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE)
239662306a36Sopenharmony_ci		return -EINVAL;
239762306a36Sopenharmony_ci
239862306a36Sopenharmony_ci	ret = x_tune3(tnr_dmd, sys, en_fef_intmtnt_ctrl);
239962306a36Sopenharmony_ci	if (ret)
240062306a36Sopenharmony_ci		return ret;
240162306a36Sopenharmony_ci
240262306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) {
240362306a36Sopenharmony_ci		ret = x_tune3(tnr_dmd->diver_sub, sys, en_fef_intmtnt_ctrl);
240462306a36Sopenharmony_ci		if (ret)
240562306a36Sopenharmony_ci			return ret;
240662306a36Sopenharmony_ci		ret = x_tune4(tnr_dmd);
240762306a36Sopenharmony_ci		if (ret)
240862306a36Sopenharmony_ci			return ret;
240962306a36Sopenharmony_ci	}
241062306a36Sopenharmony_ci
241162306a36Sopenharmony_ci	return cxd2880_tnrdmd_set_ts_output(tnr_dmd, 1);
241262306a36Sopenharmony_ci}
241362306a36Sopenharmony_ci
241462306a36Sopenharmony_ciint cxd2880_tnrdmd_sleep(struct cxd2880_tnrdmd *tnr_dmd)
241562306a36Sopenharmony_ci{
241662306a36Sopenharmony_ci	int ret;
241762306a36Sopenharmony_ci
241862306a36Sopenharmony_ci	if (!tnr_dmd)
241962306a36Sopenharmony_ci		return -EINVAL;
242062306a36Sopenharmony_ci
242162306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB)
242262306a36Sopenharmony_ci		return -EINVAL;
242362306a36Sopenharmony_ci
242462306a36Sopenharmony_ci	if (tnr_dmd->state == CXD2880_TNRDMD_STATE_SLEEP)
242562306a36Sopenharmony_ci		return 0;
242662306a36Sopenharmony_ci
242762306a36Sopenharmony_ci	if (tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE)
242862306a36Sopenharmony_ci		return -EINVAL;
242962306a36Sopenharmony_ci
243062306a36Sopenharmony_ci	ret = cxd2880_tnrdmd_set_ts_output(tnr_dmd, 0);
243162306a36Sopenharmony_ci	if (ret)
243262306a36Sopenharmony_ci		return ret;
243362306a36Sopenharmony_ci
243462306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) {
243562306a36Sopenharmony_ci		ret = x_sleep1(tnr_dmd);
243662306a36Sopenharmony_ci		if (ret)
243762306a36Sopenharmony_ci			return ret;
243862306a36Sopenharmony_ci	}
243962306a36Sopenharmony_ci
244062306a36Sopenharmony_ci	ret = x_sleep2(tnr_dmd);
244162306a36Sopenharmony_ci	if (ret)
244262306a36Sopenharmony_ci		return ret;
244362306a36Sopenharmony_ci
244462306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) {
244562306a36Sopenharmony_ci		ret = x_sleep2(tnr_dmd->diver_sub);
244662306a36Sopenharmony_ci		if (ret)
244762306a36Sopenharmony_ci			return ret;
244862306a36Sopenharmony_ci	}
244962306a36Sopenharmony_ci
245062306a36Sopenharmony_ci	switch (tnr_dmd->sys) {
245162306a36Sopenharmony_ci	case CXD2880_DTV_SYS_DVBT:
245262306a36Sopenharmony_ci		ret = cxd2880_tnrdmd_dvbt_sleep_setting(tnr_dmd);
245362306a36Sopenharmony_ci		if (ret)
245462306a36Sopenharmony_ci			return ret;
245562306a36Sopenharmony_ci		break;
245662306a36Sopenharmony_ci
245762306a36Sopenharmony_ci	case CXD2880_DTV_SYS_DVBT2:
245862306a36Sopenharmony_ci		ret = cxd2880_tnrdmd_dvbt2_sleep_setting(tnr_dmd);
245962306a36Sopenharmony_ci		if (ret)
246062306a36Sopenharmony_ci			return ret;
246162306a36Sopenharmony_ci		break;
246262306a36Sopenharmony_ci
246362306a36Sopenharmony_ci	default:
246462306a36Sopenharmony_ci		return -EINVAL;
246562306a36Sopenharmony_ci	}
246662306a36Sopenharmony_ci
246762306a36Sopenharmony_ci	ret = x_sleep3(tnr_dmd);
246862306a36Sopenharmony_ci	if (ret)
246962306a36Sopenharmony_ci		return ret;
247062306a36Sopenharmony_ci
247162306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) {
247262306a36Sopenharmony_ci		ret = x_sleep3(tnr_dmd->diver_sub);
247362306a36Sopenharmony_ci		if (ret)
247462306a36Sopenharmony_ci			return ret;
247562306a36Sopenharmony_ci	}
247662306a36Sopenharmony_ci
247762306a36Sopenharmony_ci	ret = x_sleep4(tnr_dmd);
247862306a36Sopenharmony_ci	if (ret)
247962306a36Sopenharmony_ci		return ret;
248062306a36Sopenharmony_ci
248162306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) {
248262306a36Sopenharmony_ci		ret = x_sleep4(tnr_dmd->diver_sub);
248362306a36Sopenharmony_ci		if (ret)
248462306a36Sopenharmony_ci			return ret;
248562306a36Sopenharmony_ci	}
248662306a36Sopenharmony_ci
248762306a36Sopenharmony_ci	tnr_dmd->state = CXD2880_TNRDMD_STATE_SLEEP;
248862306a36Sopenharmony_ci	tnr_dmd->frequency_khz = 0;
248962306a36Sopenharmony_ci	tnr_dmd->sys = CXD2880_DTV_SYS_UNKNOWN;
249062306a36Sopenharmony_ci	tnr_dmd->bandwidth = CXD2880_DTV_BW_UNKNOWN;
249162306a36Sopenharmony_ci
249262306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) {
249362306a36Sopenharmony_ci		tnr_dmd->diver_sub->state = CXD2880_TNRDMD_STATE_SLEEP;
249462306a36Sopenharmony_ci		tnr_dmd->diver_sub->frequency_khz = 0;
249562306a36Sopenharmony_ci		tnr_dmd->diver_sub->sys = CXD2880_DTV_SYS_UNKNOWN;
249662306a36Sopenharmony_ci		tnr_dmd->diver_sub->bandwidth = CXD2880_DTV_BW_UNKNOWN;
249762306a36Sopenharmony_ci	}
249862306a36Sopenharmony_ci
249962306a36Sopenharmony_ci	return 0;
250062306a36Sopenharmony_ci}
250162306a36Sopenharmony_ci
250262306a36Sopenharmony_ciint cxd2880_tnrdmd_set_cfg(struct cxd2880_tnrdmd *tnr_dmd,
250362306a36Sopenharmony_ci			   enum cxd2880_tnrdmd_cfg_id id,
250462306a36Sopenharmony_ci			   int value)
250562306a36Sopenharmony_ci{
250662306a36Sopenharmony_ci	int ret = 0;
250762306a36Sopenharmony_ci	u8 data[2] = { 0 };
250862306a36Sopenharmony_ci	u8 need_sub_setting = 0;
250962306a36Sopenharmony_ci
251062306a36Sopenharmony_ci	if (!tnr_dmd)
251162306a36Sopenharmony_ci		return -EINVAL;
251262306a36Sopenharmony_ci
251362306a36Sopenharmony_ci	if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP &&
251462306a36Sopenharmony_ci	    tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE)
251562306a36Sopenharmony_ci		return -EINVAL;
251662306a36Sopenharmony_ci
251762306a36Sopenharmony_ci	switch (id) {
251862306a36Sopenharmony_ci	case CXD2880_TNRDMD_CFG_OUTPUT_SEL_MSB:
251962306a36Sopenharmony_ci		if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP)
252062306a36Sopenharmony_ci			return -EINVAL;
252162306a36Sopenharmony_ci
252262306a36Sopenharmony_ci		ret =
252362306a36Sopenharmony_ci		    cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
252462306a36Sopenharmony_ci							 CXD2880_IO_TGT_DMD,
252562306a36Sopenharmony_ci							 0x00, 0xc4,
252662306a36Sopenharmony_ci							 value ? 0x00 : 0x10,
252762306a36Sopenharmony_ci							 0x10);
252862306a36Sopenharmony_ci		if (ret)
252962306a36Sopenharmony_ci			return ret;
253062306a36Sopenharmony_ci		break;
253162306a36Sopenharmony_ci
253262306a36Sopenharmony_ci	case CXD2880_TNRDMD_CFG_TSVALID_ACTIVE_HI:
253362306a36Sopenharmony_ci		if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP)
253462306a36Sopenharmony_ci			return -EINVAL;
253562306a36Sopenharmony_ci
253662306a36Sopenharmony_ci		ret =
253762306a36Sopenharmony_ci		    cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
253862306a36Sopenharmony_ci							 CXD2880_IO_TGT_DMD,
253962306a36Sopenharmony_ci							 0x00, 0xc5,
254062306a36Sopenharmony_ci							 value ? 0x00 : 0x02,
254162306a36Sopenharmony_ci							 0x02);
254262306a36Sopenharmony_ci		if (ret)
254362306a36Sopenharmony_ci			return ret;
254462306a36Sopenharmony_ci		break;
254562306a36Sopenharmony_ci
254662306a36Sopenharmony_ci	case CXD2880_TNRDMD_CFG_TSSYNC_ACTIVE_HI:
254762306a36Sopenharmony_ci		if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP)
254862306a36Sopenharmony_ci			return -EINVAL;
254962306a36Sopenharmony_ci
255062306a36Sopenharmony_ci		ret =
255162306a36Sopenharmony_ci		    cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
255262306a36Sopenharmony_ci							 CXD2880_IO_TGT_DMD,
255362306a36Sopenharmony_ci							 0x00, 0xc5,
255462306a36Sopenharmony_ci							 value ? 0x00 : 0x04,
255562306a36Sopenharmony_ci							 0x04);
255662306a36Sopenharmony_ci		if (ret)
255762306a36Sopenharmony_ci			return ret;
255862306a36Sopenharmony_ci		break;
255962306a36Sopenharmony_ci
256062306a36Sopenharmony_ci	case CXD2880_TNRDMD_CFG_TSERR_ACTIVE_HI:
256162306a36Sopenharmony_ci		if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP)
256262306a36Sopenharmony_ci			return -EINVAL;
256362306a36Sopenharmony_ci
256462306a36Sopenharmony_ci		ret =
256562306a36Sopenharmony_ci		    cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
256662306a36Sopenharmony_ci							 CXD2880_IO_TGT_DMD,
256762306a36Sopenharmony_ci							 0x00, 0xcb,
256862306a36Sopenharmony_ci							 value ? 0x00 : 0x01,
256962306a36Sopenharmony_ci							 0x01);
257062306a36Sopenharmony_ci		if (ret)
257162306a36Sopenharmony_ci			return ret;
257262306a36Sopenharmony_ci		break;
257362306a36Sopenharmony_ci
257462306a36Sopenharmony_ci	case CXD2880_TNRDMD_CFG_LATCH_ON_POSEDGE:
257562306a36Sopenharmony_ci		if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP)
257662306a36Sopenharmony_ci			return -EINVAL;
257762306a36Sopenharmony_ci
257862306a36Sopenharmony_ci		ret =
257962306a36Sopenharmony_ci		    cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
258062306a36Sopenharmony_ci							 CXD2880_IO_TGT_DMD,
258162306a36Sopenharmony_ci							 0x00, 0xc5,
258262306a36Sopenharmony_ci							 value ? 0x01 : 0x00,
258362306a36Sopenharmony_ci							 0x01);
258462306a36Sopenharmony_ci		if (ret)
258562306a36Sopenharmony_ci			return ret;
258662306a36Sopenharmony_ci		break;
258762306a36Sopenharmony_ci
258862306a36Sopenharmony_ci	case CXD2880_TNRDMD_CFG_TSCLK_CONT:
258962306a36Sopenharmony_ci		if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP)
259062306a36Sopenharmony_ci			return -EINVAL;
259162306a36Sopenharmony_ci
259262306a36Sopenharmony_ci		tnr_dmd->srl_ts_clk_mod_cnts = value ? 0x01 : 0x00;
259362306a36Sopenharmony_ci		break;
259462306a36Sopenharmony_ci
259562306a36Sopenharmony_ci	case CXD2880_TNRDMD_CFG_TSCLK_MASK:
259662306a36Sopenharmony_ci		if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP)
259762306a36Sopenharmony_ci			return -EINVAL;
259862306a36Sopenharmony_ci
259962306a36Sopenharmony_ci		if (value < 0 || value > 0x1f)
260062306a36Sopenharmony_ci			return -EINVAL;
260162306a36Sopenharmony_ci
260262306a36Sopenharmony_ci		ret =
260362306a36Sopenharmony_ci		    cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
260462306a36Sopenharmony_ci							 CXD2880_IO_TGT_DMD,
260562306a36Sopenharmony_ci							 0x00, 0xc6, value,
260662306a36Sopenharmony_ci							 0x1f);
260762306a36Sopenharmony_ci		if (ret)
260862306a36Sopenharmony_ci			return ret;
260962306a36Sopenharmony_ci		break;
261062306a36Sopenharmony_ci
261162306a36Sopenharmony_ci	case CXD2880_TNRDMD_CFG_TSVALID_MASK:
261262306a36Sopenharmony_ci		if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP)
261362306a36Sopenharmony_ci			return -EINVAL;
261462306a36Sopenharmony_ci
261562306a36Sopenharmony_ci		if (value < 0 || value > 0x1f)
261662306a36Sopenharmony_ci			return -EINVAL;
261762306a36Sopenharmony_ci
261862306a36Sopenharmony_ci		ret =
261962306a36Sopenharmony_ci		    cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
262062306a36Sopenharmony_ci							 CXD2880_IO_TGT_DMD,
262162306a36Sopenharmony_ci							 0x00, 0xc8, value,
262262306a36Sopenharmony_ci							 0x1f);
262362306a36Sopenharmony_ci		if (ret)
262462306a36Sopenharmony_ci			return ret;
262562306a36Sopenharmony_ci		break;
262662306a36Sopenharmony_ci
262762306a36Sopenharmony_ci	case CXD2880_TNRDMD_CFG_TSERR_MASK:
262862306a36Sopenharmony_ci		if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP)
262962306a36Sopenharmony_ci			return -EINVAL;
263062306a36Sopenharmony_ci
263162306a36Sopenharmony_ci		if (value < 0 || value > 0x1f)
263262306a36Sopenharmony_ci			return -EINVAL;
263362306a36Sopenharmony_ci
263462306a36Sopenharmony_ci		ret =
263562306a36Sopenharmony_ci		    cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
263662306a36Sopenharmony_ci							 CXD2880_IO_TGT_DMD,
263762306a36Sopenharmony_ci							 0x00, 0xc9, value,
263862306a36Sopenharmony_ci							 0x1f);
263962306a36Sopenharmony_ci		if (ret)
264062306a36Sopenharmony_ci			return ret;
264162306a36Sopenharmony_ci		break;
264262306a36Sopenharmony_ci
264362306a36Sopenharmony_ci	case CXD2880_TNRDMD_CFG_TSERR_VALID_DIS:
264462306a36Sopenharmony_ci		if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP)
264562306a36Sopenharmony_ci			return -EINVAL;
264662306a36Sopenharmony_ci
264762306a36Sopenharmony_ci		ret =
264862306a36Sopenharmony_ci		    cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
264962306a36Sopenharmony_ci							 CXD2880_IO_TGT_DMD,
265062306a36Sopenharmony_ci							 0x00, 0x91,
265162306a36Sopenharmony_ci							 value ? 0x01 : 0x00,
265262306a36Sopenharmony_ci							 0x01);
265362306a36Sopenharmony_ci		if (ret)
265462306a36Sopenharmony_ci			return ret;
265562306a36Sopenharmony_ci		break;
265662306a36Sopenharmony_ci
265762306a36Sopenharmony_ci	case CXD2880_TNRDMD_CFG_TSPIN_CURRENT:
265862306a36Sopenharmony_ci		if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP)
265962306a36Sopenharmony_ci			return -EINVAL;
266062306a36Sopenharmony_ci
266162306a36Sopenharmony_ci		ret =
266262306a36Sopenharmony_ci		    cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
266362306a36Sopenharmony_ci							 CXD2880_IO_TGT_SYS,
266462306a36Sopenharmony_ci							 0x00, 0x51, value,
266562306a36Sopenharmony_ci							 0x3f);
266662306a36Sopenharmony_ci		if (ret)
266762306a36Sopenharmony_ci			return ret;
266862306a36Sopenharmony_ci		break;
266962306a36Sopenharmony_ci
267062306a36Sopenharmony_ci	case CXD2880_TNRDMD_CFG_TSPIN_PULLUP_MANUAL:
267162306a36Sopenharmony_ci		if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP)
267262306a36Sopenharmony_ci			return -EINVAL;
267362306a36Sopenharmony_ci
267462306a36Sopenharmony_ci		ret =
267562306a36Sopenharmony_ci		    cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
267662306a36Sopenharmony_ci							 CXD2880_IO_TGT_SYS,
267762306a36Sopenharmony_ci							 0x00, 0x50,
267862306a36Sopenharmony_ci							 value ? 0x80 : 0x00,
267962306a36Sopenharmony_ci							 0x80);
268062306a36Sopenharmony_ci		if (ret)
268162306a36Sopenharmony_ci			return ret;
268262306a36Sopenharmony_ci		break;
268362306a36Sopenharmony_ci
268462306a36Sopenharmony_ci	case CXD2880_TNRDMD_CFG_TSPIN_PULLUP:
268562306a36Sopenharmony_ci		if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP)
268662306a36Sopenharmony_ci			return -EINVAL;
268762306a36Sopenharmony_ci
268862306a36Sopenharmony_ci		ret =
268962306a36Sopenharmony_ci		    cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
269062306a36Sopenharmony_ci							 CXD2880_IO_TGT_SYS,
269162306a36Sopenharmony_ci							 0x00, 0x50, value,
269262306a36Sopenharmony_ci							 0x3f);
269362306a36Sopenharmony_ci		if (ret)
269462306a36Sopenharmony_ci			return ret;
269562306a36Sopenharmony_ci		break;
269662306a36Sopenharmony_ci
269762306a36Sopenharmony_ci	case CXD2880_TNRDMD_CFG_TSCLK_FREQ:
269862306a36Sopenharmony_ci		if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP)
269962306a36Sopenharmony_ci			return -EINVAL;
270062306a36Sopenharmony_ci
270162306a36Sopenharmony_ci		if (value < 0 || value > 1)
270262306a36Sopenharmony_ci			return -EINVAL;
270362306a36Sopenharmony_ci
270462306a36Sopenharmony_ci		tnr_dmd->srl_ts_clk_frq =
270562306a36Sopenharmony_ci		    (enum cxd2880_tnrdmd_serial_ts_clk)value;
270662306a36Sopenharmony_ci		break;
270762306a36Sopenharmony_ci
270862306a36Sopenharmony_ci	case CXD2880_TNRDMD_CFG_TSBYTECLK_MANUAL:
270962306a36Sopenharmony_ci		if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP)
271062306a36Sopenharmony_ci			return -EINVAL;
271162306a36Sopenharmony_ci
271262306a36Sopenharmony_ci		if (value < 0 || value > 0xff)
271362306a36Sopenharmony_ci			return -EINVAL;
271462306a36Sopenharmony_ci
271562306a36Sopenharmony_ci		tnr_dmd->ts_byte_clk_manual_setting = value;
271662306a36Sopenharmony_ci
271762306a36Sopenharmony_ci		break;
271862306a36Sopenharmony_ci
271962306a36Sopenharmony_ci	case CXD2880_TNRDMD_CFG_TS_PACKET_GAP:
272062306a36Sopenharmony_ci		if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP)
272162306a36Sopenharmony_ci			return -EINVAL;
272262306a36Sopenharmony_ci
272362306a36Sopenharmony_ci		if (value < 0 || value > 7)
272462306a36Sopenharmony_ci			return -EINVAL;
272562306a36Sopenharmony_ci
272662306a36Sopenharmony_ci		ret =
272762306a36Sopenharmony_ci		    cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
272862306a36Sopenharmony_ci							 CXD2880_IO_TGT_DMD,
272962306a36Sopenharmony_ci							 0x00, 0xd6, value,
273062306a36Sopenharmony_ci							 0x07);
273162306a36Sopenharmony_ci		if (ret)
273262306a36Sopenharmony_ci			return ret;
273362306a36Sopenharmony_ci
273462306a36Sopenharmony_ci		break;
273562306a36Sopenharmony_ci
273662306a36Sopenharmony_ci	case CXD2880_TNRDMD_CFG_TS_BACKWARDS_COMPATIBLE:
273762306a36Sopenharmony_ci		if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP)
273862306a36Sopenharmony_ci			return -EINVAL;
273962306a36Sopenharmony_ci
274062306a36Sopenharmony_ci		tnr_dmd->is_ts_backwards_compatible_mode = value ? 1 : 0;
274162306a36Sopenharmony_ci
274262306a36Sopenharmony_ci		break;
274362306a36Sopenharmony_ci
274462306a36Sopenharmony_ci	case CXD2880_TNRDMD_CFG_PWM_VALUE:
274562306a36Sopenharmony_ci		if (value < 0 || value > 0x1000)
274662306a36Sopenharmony_ci			return -EINVAL;
274762306a36Sopenharmony_ci
274862306a36Sopenharmony_ci		ret =
274962306a36Sopenharmony_ci		    cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
275062306a36Sopenharmony_ci							 CXD2880_IO_TGT_DMD,
275162306a36Sopenharmony_ci							 0x00, 0x22,
275262306a36Sopenharmony_ci							 value ? 0x01 : 0x00,
275362306a36Sopenharmony_ci							 0x01);
275462306a36Sopenharmony_ci		if (ret)
275562306a36Sopenharmony_ci			return ret;
275662306a36Sopenharmony_ci
275762306a36Sopenharmony_ci		data[0] = (value >> 8) & 0x1f;
275862306a36Sopenharmony_ci		data[1] = value & 0xff;
275962306a36Sopenharmony_ci
276062306a36Sopenharmony_ci		ret =
276162306a36Sopenharmony_ci		    cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
276262306a36Sopenharmony_ci							 CXD2880_IO_TGT_DMD,
276362306a36Sopenharmony_ci							 0x00, 0x23,
276462306a36Sopenharmony_ci							 data[0], 0x1f);
276562306a36Sopenharmony_ci		if (ret)
276662306a36Sopenharmony_ci			return ret;
276762306a36Sopenharmony_ci
276862306a36Sopenharmony_ci		ret =
276962306a36Sopenharmony_ci		    cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
277062306a36Sopenharmony_ci							 CXD2880_IO_TGT_DMD,
277162306a36Sopenharmony_ci							 0x00, 0x24,
277262306a36Sopenharmony_ci							 data[1], 0xff);
277362306a36Sopenharmony_ci		if (ret)
277462306a36Sopenharmony_ci			return ret;
277562306a36Sopenharmony_ci
277662306a36Sopenharmony_ci		break;
277762306a36Sopenharmony_ci
277862306a36Sopenharmony_ci	case CXD2880_TNRDMD_CFG_INTERRUPT:
277962306a36Sopenharmony_ci		data[0] = (value >> 8) & 0xff;
278062306a36Sopenharmony_ci		data[1] = value & 0xff;
278162306a36Sopenharmony_ci		ret =
278262306a36Sopenharmony_ci		    cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
278362306a36Sopenharmony_ci							 CXD2880_IO_TGT_SYS,
278462306a36Sopenharmony_ci							 0x00, 0x48, data[0],
278562306a36Sopenharmony_ci							 0xff);
278662306a36Sopenharmony_ci		if (ret)
278762306a36Sopenharmony_ci			return ret;
278862306a36Sopenharmony_ci		ret =
278962306a36Sopenharmony_ci		    cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
279062306a36Sopenharmony_ci							 CXD2880_IO_TGT_SYS,
279162306a36Sopenharmony_ci							 0x00, 0x49, data[1],
279262306a36Sopenharmony_ci							 0xff);
279362306a36Sopenharmony_ci		if (ret)
279462306a36Sopenharmony_ci			return ret;
279562306a36Sopenharmony_ci		break;
279662306a36Sopenharmony_ci
279762306a36Sopenharmony_ci	case CXD2880_TNRDMD_CFG_INTERRUPT_LOCK_SEL:
279862306a36Sopenharmony_ci		data[0] = value & 0x07;
279962306a36Sopenharmony_ci		ret =
280062306a36Sopenharmony_ci		    cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
280162306a36Sopenharmony_ci							 CXD2880_IO_TGT_SYS,
280262306a36Sopenharmony_ci							 0x00, 0x4a, data[0],
280362306a36Sopenharmony_ci							 0x07);
280462306a36Sopenharmony_ci		if (ret)
280562306a36Sopenharmony_ci			return ret;
280662306a36Sopenharmony_ci		break;
280762306a36Sopenharmony_ci
280862306a36Sopenharmony_ci	case CXD2880_TNRDMD_CFG_INTERRUPT_INV_LOCK_SEL:
280962306a36Sopenharmony_ci		data[0] = (value & 0x07) << 3;
281062306a36Sopenharmony_ci		ret =
281162306a36Sopenharmony_ci		    cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
281262306a36Sopenharmony_ci							 CXD2880_IO_TGT_SYS,
281362306a36Sopenharmony_ci							 0x00, 0x4a, data[0],
281462306a36Sopenharmony_ci							 0x38);
281562306a36Sopenharmony_ci		if (ret)
281662306a36Sopenharmony_ci			return ret;
281762306a36Sopenharmony_ci		break;
281862306a36Sopenharmony_ci
281962306a36Sopenharmony_ci	case CXD2880_TNRDMD_CFG_FIXED_CLOCKMODE:
282062306a36Sopenharmony_ci		if (value < CXD2880_TNRDMD_CLOCKMODE_UNKNOWN ||
282162306a36Sopenharmony_ci		    value > CXD2880_TNRDMD_CLOCKMODE_C)
282262306a36Sopenharmony_ci			return -EINVAL;
282362306a36Sopenharmony_ci		tnr_dmd->fixed_clk_mode = (enum cxd2880_tnrdmd_clockmode)value;
282462306a36Sopenharmony_ci		break;
282562306a36Sopenharmony_ci
282662306a36Sopenharmony_ci	case CXD2880_TNRDMD_CFG_CABLE_INPUT:
282762306a36Sopenharmony_ci		tnr_dmd->is_cable_input = value ? 1 : 0;
282862306a36Sopenharmony_ci		break;
282962306a36Sopenharmony_ci
283062306a36Sopenharmony_ci	case CXD2880_TNRDMD_CFG_DVBT2_FEF_INTERMITTENT_BASE:
283162306a36Sopenharmony_ci		tnr_dmd->en_fef_intmtnt_base = value ? 1 : 0;
283262306a36Sopenharmony_ci		break;
283362306a36Sopenharmony_ci
283462306a36Sopenharmony_ci	case CXD2880_TNRDMD_CFG_DVBT2_FEF_INTERMITTENT_LITE:
283562306a36Sopenharmony_ci		tnr_dmd->en_fef_intmtnt_lite = value ? 1 : 0;
283662306a36Sopenharmony_ci		break;
283762306a36Sopenharmony_ci
283862306a36Sopenharmony_ci	case CXD2880_TNRDMD_CFG_TS_BUF_ALMOST_EMPTY_THRS:
283962306a36Sopenharmony_ci		data[0] = (value >> 8) & 0x07;
284062306a36Sopenharmony_ci		data[1] = value & 0xff;
284162306a36Sopenharmony_ci		ret =
284262306a36Sopenharmony_ci		    cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
284362306a36Sopenharmony_ci							 CXD2880_IO_TGT_DMD,
284462306a36Sopenharmony_ci							 0x00, 0x99, data[0],
284562306a36Sopenharmony_ci							 0x07);
284662306a36Sopenharmony_ci		if (ret)
284762306a36Sopenharmony_ci			return ret;
284862306a36Sopenharmony_ci		ret =
284962306a36Sopenharmony_ci		    cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
285062306a36Sopenharmony_ci							 CXD2880_IO_TGT_DMD,
285162306a36Sopenharmony_ci							 0x00, 0x9a, data[1],
285262306a36Sopenharmony_ci							 0xff);
285362306a36Sopenharmony_ci		if (ret)
285462306a36Sopenharmony_ci			return ret;
285562306a36Sopenharmony_ci		break;
285662306a36Sopenharmony_ci
285762306a36Sopenharmony_ci	case CXD2880_TNRDMD_CFG_TS_BUF_ALMOST_FULL_THRS:
285862306a36Sopenharmony_ci		data[0] = (value >> 8) & 0x07;
285962306a36Sopenharmony_ci		data[1] = value & 0xff;
286062306a36Sopenharmony_ci		ret =
286162306a36Sopenharmony_ci		    cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
286262306a36Sopenharmony_ci							 CXD2880_IO_TGT_DMD,
286362306a36Sopenharmony_ci							 0x00, 0x9b, data[0],
286462306a36Sopenharmony_ci							 0x07);
286562306a36Sopenharmony_ci		if (ret)
286662306a36Sopenharmony_ci			return ret;
286762306a36Sopenharmony_ci		ret =
286862306a36Sopenharmony_ci		    cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
286962306a36Sopenharmony_ci							 CXD2880_IO_TGT_DMD,
287062306a36Sopenharmony_ci							 0x00, 0x9c, data[1],
287162306a36Sopenharmony_ci							 0xff);
287262306a36Sopenharmony_ci		if (ret)
287362306a36Sopenharmony_ci			return ret;
287462306a36Sopenharmony_ci		break;
287562306a36Sopenharmony_ci
287662306a36Sopenharmony_ci	case CXD2880_TNRDMD_CFG_TS_BUF_RRDY_THRS:
287762306a36Sopenharmony_ci		data[0] = (value >> 8) & 0x07;
287862306a36Sopenharmony_ci		data[1] = value & 0xff;
287962306a36Sopenharmony_ci		ret =
288062306a36Sopenharmony_ci		    cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
288162306a36Sopenharmony_ci							 CXD2880_IO_TGT_DMD,
288262306a36Sopenharmony_ci							 0x00, 0x9d, data[0],
288362306a36Sopenharmony_ci							 0x07);
288462306a36Sopenharmony_ci		if (ret)
288562306a36Sopenharmony_ci			return ret;
288662306a36Sopenharmony_ci		ret =
288762306a36Sopenharmony_ci		    cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
288862306a36Sopenharmony_ci							 CXD2880_IO_TGT_DMD,
288962306a36Sopenharmony_ci							 0x00, 0x9e, data[1],
289062306a36Sopenharmony_ci							 0xff);
289162306a36Sopenharmony_ci		if (ret)
289262306a36Sopenharmony_ci			return ret;
289362306a36Sopenharmony_ci		break;
289462306a36Sopenharmony_ci
289562306a36Sopenharmony_ci	case CXD2880_TNRDMD_CFG_BLINDTUNE_DVBT2_FIRST:
289662306a36Sopenharmony_ci		tnr_dmd->blind_tune_dvbt2_first = value ? 1 : 0;
289762306a36Sopenharmony_ci		break;
289862306a36Sopenharmony_ci
289962306a36Sopenharmony_ci	case CXD2880_TNRDMD_CFG_DVBT_BERN_PERIOD:
290062306a36Sopenharmony_ci		if (value < 0 || value > 31)
290162306a36Sopenharmony_ci			return -EINVAL;
290262306a36Sopenharmony_ci
290362306a36Sopenharmony_ci		ret =
290462306a36Sopenharmony_ci		    cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
290562306a36Sopenharmony_ci							 CXD2880_IO_TGT_DMD,
290662306a36Sopenharmony_ci							 0x10, 0x60,
290762306a36Sopenharmony_ci							 value & 0x1f, 0x1f);
290862306a36Sopenharmony_ci		if (ret)
290962306a36Sopenharmony_ci			return ret;
291062306a36Sopenharmony_ci		break;
291162306a36Sopenharmony_ci
291262306a36Sopenharmony_ci	case CXD2880_TNRDMD_CFG_DVBT_VBER_PERIOD:
291362306a36Sopenharmony_ci		if (value < 0 || value > 7)
291462306a36Sopenharmony_ci			return -EINVAL;
291562306a36Sopenharmony_ci
291662306a36Sopenharmony_ci		ret =
291762306a36Sopenharmony_ci		    cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
291862306a36Sopenharmony_ci							 CXD2880_IO_TGT_DMD,
291962306a36Sopenharmony_ci							 0x10, 0x6f,
292062306a36Sopenharmony_ci							 value & 0x07, 0x07);
292162306a36Sopenharmony_ci		if (ret)
292262306a36Sopenharmony_ci			return ret;
292362306a36Sopenharmony_ci		break;
292462306a36Sopenharmony_ci
292562306a36Sopenharmony_ci	case CXD2880_TNRDMD_CFG_DVBT2_BBER_MES:
292662306a36Sopenharmony_ci		if (value < 0 || value > 15)
292762306a36Sopenharmony_ci			return -EINVAL;
292862306a36Sopenharmony_ci
292962306a36Sopenharmony_ci		ret =
293062306a36Sopenharmony_ci		    cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
293162306a36Sopenharmony_ci							 CXD2880_IO_TGT_DMD,
293262306a36Sopenharmony_ci							 0x20, 0x72,
293362306a36Sopenharmony_ci							 value & 0x0f, 0x0f);
293462306a36Sopenharmony_ci		if (ret)
293562306a36Sopenharmony_ci			return ret;
293662306a36Sopenharmony_ci		break;
293762306a36Sopenharmony_ci
293862306a36Sopenharmony_ci	case CXD2880_TNRDMD_CFG_DVBT2_LBER_MES:
293962306a36Sopenharmony_ci		if (value < 0 || value > 15)
294062306a36Sopenharmony_ci			return -EINVAL;
294162306a36Sopenharmony_ci
294262306a36Sopenharmony_ci		ret =
294362306a36Sopenharmony_ci		    cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
294462306a36Sopenharmony_ci							 CXD2880_IO_TGT_DMD,
294562306a36Sopenharmony_ci							 0x20, 0x6f,
294662306a36Sopenharmony_ci							 value & 0x0f, 0x0f);
294762306a36Sopenharmony_ci		if (ret)
294862306a36Sopenharmony_ci			return ret;
294962306a36Sopenharmony_ci		break;
295062306a36Sopenharmony_ci
295162306a36Sopenharmony_ci	case CXD2880_TNRDMD_CFG_DVBT_PER_MES:
295262306a36Sopenharmony_ci		if (value < 0 || value > 15)
295362306a36Sopenharmony_ci			return -EINVAL;
295462306a36Sopenharmony_ci
295562306a36Sopenharmony_ci		ret =
295662306a36Sopenharmony_ci		    cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
295762306a36Sopenharmony_ci							 CXD2880_IO_TGT_DMD,
295862306a36Sopenharmony_ci							 0x10, 0x5c,
295962306a36Sopenharmony_ci							 value & 0x0f, 0x0f);
296062306a36Sopenharmony_ci		if (ret)
296162306a36Sopenharmony_ci			return ret;
296262306a36Sopenharmony_ci		break;
296362306a36Sopenharmony_ci
296462306a36Sopenharmony_ci	case CXD2880_TNRDMD_CFG_DVBT2_PER_MES:
296562306a36Sopenharmony_ci		if (value < 0 || value > 15)
296662306a36Sopenharmony_ci			return -EINVAL;
296762306a36Sopenharmony_ci
296862306a36Sopenharmony_ci		ret =
296962306a36Sopenharmony_ci		    cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
297062306a36Sopenharmony_ci							 CXD2880_IO_TGT_DMD,
297162306a36Sopenharmony_ci							 0x24, 0xdc,
297262306a36Sopenharmony_ci							 value & 0x0f, 0x0f);
297362306a36Sopenharmony_ci		if (ret)
297462306a36Sopenharmony_ci			return ret;
297562306a36Sopenharmony_ci		break;
297662306a36Sopenharmony_ci
297762306a36Sopenharmony_ci	default:
297862306a36Sopenharmony_ci		return -EINVAL;
297962306a36Sopenharmony_ci	}
298062306a36Sopenharmony_ci
298162306a36Sopenharmony_ci	if (need_sub_setting &&
298262306a36Sopenharmony_ci	    tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN)
298362306a36Sopenharmony_ci		ret = cxd2880_tnrdmd_set_cfg(tnr_dmd->diver_sub, id, value);
298462306a36Sopenharmony_ci
298562306a36Sopenharmony_ci	return ret;
298662306a36Sopenharmony_ci}
298762306a36Sopenharmony_ci
298862306a36Sopenharmony_ciint cxd2880_tnrdmd_gpio_set_cfg(struct cxd2880_tnrdmd *tnr_dmd,
298962306a36Sopenharmony_ci				u8 id,
299062306a36Sopenharmony_ci				u8 en,
299162306a36Sopenharmony_ci				enum cxd2880_tnrdmd_gpio_mode mode,
299262306a36Sopenharmony_ci				u8 open_drain, u8 invert)
299362306a36Sopenharmony_ci{
299462306a36Sopenharmony_ci	int ret;
299562306a36Sopenharmony_ci
299662306a36Sopenharmony_ci	if (!tnr_dmd)
299762306a36Sopenharmony_ci		return -EINVAL;
299862306a36Sopenharmony_ci
299962306a36Sopenharmony_ci	if (id > 2)
300062306a36Sopenharmony_ci		return -EINVAL;
300162306a36Sopenharmony_ci
300262306a36Sopenharmony_ci	if (mode > CXD2880_TNRDMD_GPIO_MODE_EEW)
300362306a36Sopenharmony_ci		return -EINVAL;
300462306a36Sopenharmony_ci
300562306a36Sopenharmony_ci	if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP &&
300662306a36Sopenharmony_ci	    tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE)
300762306a36Sopenharmony_ci		return -EINVAL;
300862306a36Sopenharmony_ci
300962306a36Sopenharmony_ci	ret =
301062306a36Sopenharmony_ci	    cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, CXD2880_IO_TGT_SYS,
301162306a36Sopenharmony_ci						 0x00, 0x40 + id, mode,
301262306a36Sopenharmony_ci						 0x0f);
301362306a36Sopenharmony_ci	if (ret)
301462306a36Sopenharmony_ci		return ret;
301562306a36Sopenharmony_ci
301662306a36Sopenharmony_ci	ret =
301762306a36Sopenharmony_ci	    cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, CXD2880_IO_TGT_SYS,
301862306a36Sopenharmony_ci						 0x00, 0x43,
301962306a36Sopenharmony_ci						 open_drain ? (1 << id) : 0,
302062306a36Sopenharmony_ci						 1 << id);
302162306a36Sopenharmony_ci	if (ret)
302262306a36Sopenharmony_ci		return ret;
302362306a36Sopenharmony_ci
302462306a36Sopenharmony_ci	ret =
302562306a36Sopenharmony_ci	    cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, CXD2880_IO_TGT_SYS,
302662306a36Sopenharmony_ci						 0x00, 0x44,
302762306a36Sopenharmony_ci						 invert ? (1 << id) : 0,
302862306a36Sopenharmony_ci						 1 << id);
302962306a36Sopenharmony_ci	if (ret)
303062306a36Sopenharmony_ci		return ret;
303162306a36Sopenharmony_ci
303262306a36Sopenharmony_ci	return cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
303362306a36Sopenharmony_ci						    CXD2880_IO_TGT_SYS,
303462306a36Sopenharmony_ci						    0x00, 0x45,
303562306a36Sopenharmony_ci						    en ? 0 : (1 << id),
303662306a36Sopenharmony_ci						    1 << id);
303762306a36Sopenharmony_ci}
303862306a36Sopenharmony_ci
303962306a36Sopenharmony_ciint cxd2880_tnrdmd_gpio_set_cfg_sub(struct cxd2880_tnrdmd *tnr_dmd,
304062306a36Sopenharmony_ci				    u8 id,
304162306a36Sopenharmony_ci				    u8 en,
304262306a36Sopenharmony_ci				    enum cxd2880_tnrdmd_gpio_mode
304362306a36Sopenharmony_ci				    mode, u8 open_drain, u8 invert)
304462306a36Sopenharmony_ci{
304562306a36Sopenharmony_ci	if (!tnr_dmd)
304662306a36Sopenharmony_ci		return -EINVAL;
304762306a36Sopenharmony_ci
304862306a36Sopenharmony_ci	if (tnr_dmd->diver_mode != CXD2880_TNRDMD_DIVERMODE_MAIN)
304962306a36Sopenharmony_ci		return -EINVAL;
305062306a36Sopenharmony_ci
305162306a36Sopenharmony_ci	return cxd2880_tnrdmd_gpio_set_cfg(tnr_dmd->diver_sub, id, en, mode,
305262306a36Sopenharmony_ci					   open_drain, invert);
305362306a36Sopenharmony_ci}
305462306a36Sopenharmony_ci
305562306a36Sopenharmony_ciint cxd2880_tnrdmd_gpio_read(struct cxd2880_tnrdmd *tnr_dmd,
305662306a36Sopenharmony_ci			     u8 id, u8 *value)
305762306a36Sopenharmony_ci{
305862306a36Sopenharmony_ci	u8 data = 0;
305962306a36Sopenharmony_ci	int ret;
306062306a36Sopenharmony_ci
306162306a36Sopenharmony_ci	if (!tnr_dmd || !value)
306262306a36Sopenharmony_ci		return -EINVAL;
306362306a36Sopenharmony_ci
306462306a36Sopenharmony_ci	if (id > 2)
306562306a36Sopenharmony_ci		return -EINVAL;
306662306a36Sopenharmony_ci
306762306a36Sopenharmony_ci	if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP &&
306862306a36Sopenharmony_ci	    tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE)
306962306a36Sopenharmony_ci		return -EINVAL;
307062306a36Sopenharmony_ci
307162306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
307262306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
307362306a36Sopenharmony_ci				     0x00, 0x0a);
307462306a36Sopenharmony_ci	if (ret)
307562306a36Sopenharmony_ci		return ret;
307662306a36Sopenharmony_ci	ret = tnr_dmd->io->read_regs(tnr_dmd->io,
307762306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
307862306a36Sopenharmony_ci				     0x20, &data, 1);
307962306a36Sopenharmony_ci	if (ret)
308062306a36Sopenharmony_ci		return ret;
308162306a36Sopenharmony_ci
308262306a36Sopenharmony_ci	*value = (data >> id) & 0x01;
308362306a36Sopenharmony_ci
308462306a36Sopenharmony_ci	return 0;
308562306a36Sopenharmony_ci}
308662306a36Sopenharmony_ci
308762306a36Sopenharmony_ciint cxd2880_tnrdmd_gpio_read_sub(struct cxd2880_tnrdmd *tnr_dmd,
308862306a36Sopenharmony_ci				 u8 id, u8 *value)
308962306a36Sopenharmony_ci{
309062306a36Sopenharmony_ci	if (!tnr_dmd)
309162306a36Sopenharmony_ci		return -EINVAL;
309262306a36Sopenharmony_ci
309362306a36Sopenharmony_ci	if (tnr_dmd->diver_mode != CXD2880_TNRDMD_DIVERMODE_MAIN)
309462306a36Sopenharmony_ci		return -EINVAL;
309562306a36Sopenharmony_ci
309662306a36Sopenharmony_ci	return cxd2880_tnrdmd_gpio_read(tnr_dmd->diver_sub, id, value);
309762306a36Sopenharmony_ci}
309862306a36Sopenharmony_ci
309962306a36Sopenharmony_ciint cxd2880_tnrdmd_gpio_write(struct cxd2880_tnrdmd *tnr_dmd,
310062306a36Sopenharmony_ci			      u8 id, u8 value)
310162306a36Sopenharmony_ci{
310262306a36Sopenharmony_ci	if (!tnr_dmd)
310362306a36Sopenharmony_ci		return -EINVAL;
310462306a36Sopenharmony_ci
310562306a36Sopenharmony_ci	if (id > 2)
310662306a36Sopenharmony_ci		return -EINVAL;
310762306a36Sopenharmony_ci
310862306a36Sopenharmony_ci	if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP &&
310962306a36Sopenharmony_ci	    tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE)
311062306a36Sopenharmony_ci		return -EINVAL;
311162306a36Sopenharmony_ci
311262306a36Sopenharmony_ci	return cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
311362306a36Sopenharmony_ci						    CXD2880_IO_TGT_SYS,
311462306a36Sopenharmony_ci						    0x00, 0x46,
311562306a36Sopenharmony_ci						    value ? (1 << id) : 0,
311662306a36Sopenharmony_ci						    1 << id);
311762306a36Sopenharmony_ci}
311862306a36Sopenharmony_ci
311962306a36Sopenharmony_ciint cxd2880_tnrdmd_gpio_write_sub(struct cxd2880_tnrdmd *tnr_dmd,
312062306a36Sopenharmony_ci				  u8 id, u8 value)
312162306a36Sopenharmony_ci{
312262306a36Sopenharmony_ci	if (!tnr_dmd)
312362306a36Sopenharmony_ci		return -EINVAL;
312462306a36Sopenharmony_ci
312562306a36Sopenharmony_ci	if (tnr_dmd->diver_mode != CXD2880_TNRDMD_DIVERMODE_MAIN)
312662306a36Sopenharmony_ci		return -EINVAL;
312762306a36Sopenharmony_ci
312862306a36Sopenharmony_ci	return cxd2880_tnrdmd_gpio_write(tnr_dmd->diver_sub, id, value);
312962306a36Sopenharmony_ci}
313062306a36Sopenharmony_ci
313162306a36Sopenharmony_ciint cxd2880_tnrdmd_interrupt_read(struct cxd2880_tnrdmd *tnr_dmd,
313262306a36Sopenharmony_ci				  u16 *value)
313362306a36Sopenharmony_ci{
313462306a36Sopenharmony_ci	int ret;
313562306a36Sopenharmony_ci	u8 data[2] = { 0 };
313662306a36Sopenharmony_ci
313762306a36Sopenharmony_ci	if (!tnr_dmd || !value)
313862306a36Sopenharmony_ci		return -EINVAL;
313962306a36Sopenharmony_ci
314062306a36Sopenharmony_ci	if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP &&
314162306a36Sopenharmony_ci	    tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE)
314262306a36Sopenharmony_ci		return -EINVAL;
314362306a36Sopenharmony_ci
314462306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
314562306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
314662306a36Sopenharmony_ci				     0x00, 0x0a);
314762306a36Sopenharmony_ci	if (ret)
314862306a36Sopenharmony_ci		return ret;
314962306a36Sopenharmony_ci	ret = tnr_dmd->io->read_regs(tnr_dmd->io,
315062306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
315162306a36Sopenharmony_ci				     0x15, data, 2);
315262306a36Sopenharmony_ci	if (ret)
315362306a36Sopenharmony_ci		return ret;
315462306a36Sopenharmony_ci
315562306a36Sopenharmony_ci	*value = (data[0] << 8) | data[1];
315662306a36Sopenharmony_ci
315762306a36Sopenharmony_ci	return 0;
315862306a36Sopenharmony_ci}
315962306a36Sopenharmony_ci
316062306a36Sopenharmony_ciint cxd2880_tnrdmd_interrupt_clear(struct cxd2880_tnrdmd *tnr_dmd,
316162306a36Sopenharmony_ci				   u16 value)
316262306a36Sopenharmony_ci{
316362306a36Sopenharmony_ci	int ret;
316462306a36Sopenharmony_ci	u8 data[2] = { 0 };
316562306a36Sopenharmony_ci
316662306a36Sopenharmony_ci	if (!tnr_dmd)
316762306a36Sopenharmony_ci		return -EINVAL;
316862306a36Sopenharmony_ci
316962306a36Sopenharmony_ci	if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP &&
317062306a36Sopenharmony_ci	    tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE)
317162306a36Sopenharmony_ci		return -EINVAL;
317262306a36Sopenharmony_ci
317362306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
317462306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
317562306a36Sopenharmony_ci				     0x00, 0x00);
317662306a36Sopenharmony_ci	if (ret)
317762306a36Sopenharmony_ci		return ret;
317862306a36Sopenharmony_ci
317962306a36Sopenharmony_ci	data[0] = (value >> 8) & 0xff;
318062306a36Sopenharmony_ci	data[1] = value & 0xff;
318162306a36Sopenharmony_ci
318262306a36Sopenharmony_ci	return tnr_dmd->io->write_regs(tnr_dmd->io,
318362306a36Sopenharmony_ci				       CXD2880_IO_TGT_SYS,
318462306a36Sopenharmony_ci				       0x3c, data, 2);
318562306a36Sopenharmony_ci}
318662306a36Sopenharmony_ci
318762306a36Sopenharmony_ciint cxd2880_tnrdmd_ts_buf_clear(struct cxd2880_tnrdmd *tnr_dmd,
318862306a36Sopenharmony_ci				u8 clear_overflow_flag,
318962306a36Sopenharmony_ci				u8 clear_underflow_flag,
319062306a36Sopenharmony_ci				u8 clear_buf)
319162306a36Sopenharmony_ci{
319262306a36Sopenharmony_ci	int ret;
319362306a36Sopenharmony_ci	u8 data[2] = { 0 };
319462306a36Sopenharmony_ci
319562306a36Sopenharmony_ci	if (!tnr_dmd)
319662306a36Sopenharmony_ci		return -EINVAL;
319762306a36Sopenharmony_ci
319862306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB)
319962306a36Sopenharmony_ci		return -EINVAL;
320062306a36Sopenharmony_ci
320162306a36Sopenharmony_ci	if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP &&
320262306a36Sopenharmony_ci	    tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE)
320362306a36Sopenharmony_ci		return -EINVAL;
320462306a36Sopenharmony_ci
320562306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
320662306a36Sopenharmony_ci				     CXD2880_IO_TGT_DMD,
320762306a36Sopenharmony_ci				     0x00, 0x00);
320862306a36Sopenharmony_ci	if (ret)
320962306a36Sopenharmony_ci		return ret;
321062306a36Sopenharmony_ci
321162306a36Sopenharmony_ci	data[0] = clear_overflow_flag ? 0x02 : 0x00;
321262306a36Sopenharmony_ci	data[0] |= clear_underflow_flag ? 0x01 : 0x00;
321362306a36Sopenharmony_ci	data[1] = clear_buf ? 0x01 : 0x00;
321462306a36Sopenharmony_ci
321562306a36Sopenharmony_ci	return tnr_dmd->io->write_regs(tnr_dmd->io,
321662306a36Sopenharmony_ci				       CXD2880_IO_TGT_DMD,
321762306a36Sopenharmony_ci				       0x9f, data, 2);
321862306a36Sopenharmony_ci}
321962306a36Sopenharmony_ci
322062306a36Sopenharmony_ciint cxd2880_tnrdmd_chip_id(struct cxd2880_tnrdmd *tnr_dmd,
322162306a36Sopenharmony_ci			   enum cxd2880_tnrdmd_chip_id *chip_id)
322262306a36Sopenharmony_ci{
322362306a36Sopenharmony_ci	int ret;
322462306a36Sopenharmony_ci	u8 data = 0;
322562306a36Sopenharmony_ci
322662306a36Sopenharmony_ci	if (!tnr_dmd || !chip_id)
322762306a36Sopenharmony_ci		return -EINVAL;
322862306a36Sopenharmony_ci
322962306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
323062306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
323162306a36Sopenharmony_ci				     0x00, 0x00);
323262306a36Sopenharmony_ci	if (ret)
323362306a36Sopenharmony_ci		return ret;
323462306a36Sopenharmony_ci	ret = tnr_dmd->io->read_regs(tnr_dmd->io,
323562306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
323662306a36Sopenharmony_ci				     0xfd, &data, 1);
323762306a36Sopenharmony_ci	if (ret)
323862306a36Sopenharmony_ci		return ret;
323962306a36Sopenharmony_ci
324062306a36Sopenharmony_ci	*chip_id = (enum cxd2880_tnrdmd_chip_id)data;
324162306a36Sopenharmony_ci
324262306a36Sopenharmony_ci	return 0;
324362306a36Sopenharmony_ci}
324462306a36Sopenharmony_ci
324562306a36Sopenharmony_ciint cxd2880_tnrdmd_set_and_save_reg_bits(struct cxd2880_tnrdmd
324662306a36Sopenharmony_ci					 *tnr_dmd,
324762306a36Sopenharmony_ci					 enum cxd2880_io_tgt tgt,
324862306a36Sopenharmony_ci					 u8 bank, u8 address,
324962306a36Sopenharmony_ci					 u8 value, u8 bit_mask)
325062306a36Sopenharmony_ci{
325162306a36Sopenharmony_ci	int ret;
325262306a36Sopenharmony_ci
325362306a36Sopenharmony_ci	if (!tnr_dmd)
325462306a36Sopenharmony_ci		return -EINVAL;
325562306a36Sopenharmony_ci
325662306a36Sopenharmony_ci	if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP &&
325762306a36Sopenharmony_ci	    tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE)
325862306a36Sopenharmony_ci		return -EINVAL;
325962306a36Sopenharmony_ci
326062306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io, tgt, 0x00, bank);
326162306a36Sopenharmony_ci	if (ret)
326262306a36Sopenharmony_ci		return ret;
326362306a36Sopenharmony_ci
326462306a36Sopenharmony_ci	ret = cxd2880_io_set_reg_bits(tnr_dmd->io,
326562306a36Sopenharmony_ci				      tgt, address, value, bit_mask);
326662306a36Sopenharmony_ci	if (ret)
326762306a36Sopenharmony_ci		return ret;
326862306a36Sopenharmony_ci
326962306a36Sopenharmony_ci	return set_cfg_mem(tnr_dmd, tgt, bank, address, value, bit_mask);
327062306a36Sopenharmony_ci}
327162306a36Sopenharmony_ci
327262306a36Sopenharmony_ciint cxd2880_tnrdmd_set_scan_mode(struct cxd2880_tnrdmd *tnr_dmd,
327362306a36Sopenharmony_ci				 enum cxd2880_dtv_sys sys,
327462306a36Sopenharmony_ci				 u8 scan_mode_end)
327562306a36Sopenharmony_ci{
327662306a36Sopenharmony_ci	if (!tnr_dmd)
327762306a36Sopenharmony_ci		return -EINVAL;
327862306a36Sopenharmony_ci
327962306a36Sopenharmony_ci	if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP &&
328062306a36Sopenharmony_ci	    tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE)
328162306a36Sopenharmony_ci		return -EINVAL;
328262306a36Sopenharmony_ci
328362306a36Sopenharmony_ci	tnr_dmd->scan_mode = scan_mode_end;
328462306a36Sopenharmony_ci
328562306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN)
328662306a36Sopenharmony_ci		return cxd2880_tnrdmd_set_scan_mode(tnr_dmd->diver_sub, sys,
328762306a36Sopenharmony_ci						    scan_mode_end);
328862306a36Sopenharmony_ci	else
328962306a36Sopenharmony_ci		return 0;
329062306a36Sopenharmony_ci}
329162306a36Sopenharmony_ci
329262306a36Sopenharmony_ciint cxd2880_tnrdmd_set_pid_ftr(struct cxd2880_tnrdmd *tnr_dmd,
329362306a36Sopenharmony_ci			       struct cxd2880_tnrdmd_pid_ftr_cfg
329462306a36Sopenharmony_ci			       *pid_ftr_cfg)
329562306a36Sopenharmony_ci{
329662306a36Sopenharmony_ci	if (!tnr_dmd)
329762306a36Sopenharmony_ci		return -EINVAL;
329862306a36Sopenharmony_ci
329962306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB)
330062306a36Sopenharmony_ci		return -EINVAL;
330162306a36Sopenharmony_ci
330262306a36Sopenharmony_ci	if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP &&
330362306a36Sopenharmony_ci	    tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE)
330462306a36Sopenharmony_ci		return -EINVAL;
330562306a36Sopenharmony_ci
330662306a36Sopenharmony_ci	if (tnr_dmd->create_param.ts_output_if == CXD2880_TNRDMD_TSOUT_IF_TS)
330762306a36Sopenharmony_ci		return -ENOTTY;
330862306a36Sopenharmony_ci
330962306a36Sopenharmony_ci	if (pid_ftr_cfg) {
331062306a36Sopenharmony_ci		tnr_dmd->pid_ftr_cfg = *pid_ftr_cfg;
331162306a36Sopenharmony_ci		tnr_dmd->pid_ftr_cfg_en = 1;
331262306a36Sopenharmony_ci	} else {
331362306a36Sopenharmony_ci		tnr_dmd->pid_ftr_cfg_en = 0;
331462306a36Sopenharmony_ci	}
331562306a36Sopenharmony_ci
331662306a36Sopenharmony_ci	if (tnr_dmd->state == CXD2880_TNRDMD_STATE_ACTIVE)
331762306a36Sopenharmony_ci		return pid_ftr_setting(tnr_dmd, pid_ftr_cfg);
331862306a36Sopenharmony_ci	else
331962306a36Sopenharmony_ci		return 0;
332062306a36Sopenharmony_ci}
332162306a36Sopenharmony_ci
332262306a36Sopenharmony_ciint cxd2880_tnrdmd_set_rf_lvl_cmpstn(struct cxd2880_tnrdmd
332362306a36Sopenharmony_ci				     *tnr_dmd,
332462306a36Sopenharmony_ci				     int (*rf_lvl_cmpstn)
332562306a36Sopenharmony_ci				     (struct cxd2880_tnrdmd *,
332662306a36Sopenharmony_ci				     int *))
332762306a36Sopenharmony_ci{
332862306a36Sopenharmony_ci	if (!tnr_dmd)
332962306a36Sopenharmony_ci		return -EINVAL;
333062306a36Sopenharmony_ci
333162306a36Sopenharmony_ci	tnr_dmd->rf_lvl_cmpstn = rf_lvl_cmpstn;
333262306a36Sopenharmony_ci
333362306a36Sopenharmony_ci	return 0;
333462306a36Sopenharmony_ci}
333562306a36Sopenharmony_ci
333662306a36Sopenharmony_ciint cxd2880_tnrdmd_set_rf_lvl_cmpstn_sub(struct cxd2880_tnrdmd
333762306a36Sopenharmony_ci					 *tnr_dmd,
333862306a36Sopenharmony_ci					 int (*rf_lvl_cmpstn)
333962306a36Sopenharmony_ci					 (struct cxd2880_tnrdmd *,
334062306a36Sopenharmony_ci					 int *))
334162306a36Sopenharmony_ci{
334262306a36Sopenharmony_ci	if (!tnr_dmd)
334362306a36Sopenharmony_ci		return -EINVAL;
334462306a36Sopenharmony_ci
334562306a36Sopenharmony_ci	if (tnr_dmd->diver_mode != CXD2880_TNRDMD_DIVERMODE_MAIN)
334662306a36Sopenharmony_ci		return -EINVAL;
334762306a36Sopenharmony_ci
334862306a36Sopenharmony_ci	return cxd2880_tnrdmd_set_rf_lvl_cmpstn(tnr_dmd->diver_sub,
334962306a36Sopenharmony_ci						rf_lvl_cmpstn);
335062306a36Sopenharmony_ci}
335162306a36Sopenharmony_ci
335262306a36Sopenharmony_ciint cxd2880_tnrdmd_set_lna_thrs(struct cxd2880_tnrdmd *tnr_dmd,
335362306a36Sopenharmony_ci				struct cxd2880_tnrdmd_lna_thrs_tbl_air
335462306a36Sopenharmony_ci				*tbl_air,
335562306a36Sopenharmony_ci				struct cxd2880_tnrdmd_lna_thrs_tbl_cable
335662306a36Sopenharmony_ci				*tbl_cable)
335762306a36Sopenharmony_ci{
335862306a36Sopenharmony_ci	if (!tnr_dmd)
335962306a36Sopenharmony_ci		return -EINVAL;
336062306a36Sopenharmony_ci
336162306a36Sopenharmony_ci	tnr_dmd->lna_thrs_tbl_air = tbl_air;
336262306a36Sopenharmony_ci	tnr_dmd->lna_thrs_tbl_cable = tbl_cable;
336362306a36Sopenharmony_ci
336462306a36Sopenharmony_ci	return 0;
336562306a36Sopenharmony_ci}
336662306a36Sopenharmony_ci
336762306a36Sopenharmony_ciint cxd2880_tnrdmd_set_lna_thrs_sub(struct cxd2880_tnrdmd *tnr_dmd,
336862306a36Sopenharmony_ci				    struct
336962306a36Sopenharmony_ci				    cxd2880_tnrdmd_lna_thrs_tbl_air
337062306a36Sopenharmony_ci				    *tbl_air,
337162306a36Sopenharmony_ci				    struct cxd2880_tnrdmd_lna_thrs_tbl_cable
337262306a36Sopenharmony_ci				    *tbl_cable)
337362306a36Sopenharmony_ci{
337462306a36Sopenharmony_ci	if (!tnr_dmd)
337562306a36Sopenharmony_ci		return -EINVAL;
337662306a36Sopenharmony_ci
337762306a36Sopenharmony_ci	if (tnr_dmd->diver_mode != CXD2880_TNRDMD_DIVERMODE_MAIN)
337862306a36Sopenharmony_ci		return -EINVAL;
337962306a36Sopenharmony_ci
338062306a36Sopenharmony_ci	return cxd2880_tnrdmd_set_lna_thrs(tnr_dmd->diver_sub,
338162306a36Sopenharmony_ci					   tbl_air, tbl_cable);
338262306a36Sopenharmony_ci}
338362306a36Sopenharmony_ci
338462306a36Sopenharmony_ciint cxd2880_tnrdmd_set_ts_pin_high_low(struct cxd2880_tnrdmd
338562306a36Sopenharmony_ci				       *tnr_dmd, u8 en, u8 value)
338662306a36Sopenharmony_ci{
338762306a36Sopenharmony_ci	int ret;
338862306a36Sopenharmony_ci
338962306a36Sopenharmony_ci	if (!tnr_dmd)
339062306a36Sopenharmony_ci		return -EINVAL;
339162306a36Sopenharmony_ci
339262306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB)
339362306a36Sopenharmony_ci		return -EINVAL;
339462306a36Sopenharmony_ci
339562306a36Sopenharmony_ci	if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP)
339662306a36Sopenharmony_ci		return -EINVAL;
339762306a36Sopenharmony_ci
339862306a36Sopenharmony_ci	if (tnr_dmd->create_param.ts_output_if != CXD2880_TNRDMD_TSOUT_IF_TS)
339962306a36Sopenharmony_ci		return -ENOTTY;
340062306a36Sopenharmony_ci
340162306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
340262306a36Sopenharmony_ci				     CXD2880_IO_TGT_SYS,
340362306a36Sopenharmony_ci				     0x00, 0x00);
340462306a36Sopenharmony_ci	if (ret)
340562306a36Sopenharmony_ci		return ret;
340662306a36Sopenharmony_ci
340762306a36Sopenharmony_ci	if (en) {
340862306a36Sopenharmony_ci		ret = tnr_dmd->io->write_reg(tnr_dmd->io,
340962306a36Sopenharmony_ci					     CXD2880_IO_TGT_SYS,
341062306a36Sopenharmony_ci					     0x50, ((value & 0x1f) | 0x80));
341162306a36Sopenharmony_ci		if (ret)
341262306a36Sopenharmony_ci			return ret;
341362306a36Sopenharmony_ci
341462306a36Sopenharmony_ci		ret = tnr_dmd->io->write_reg(tnr_dmd->io,
341562306a36Sopenharmony_ci					     CXD2880_IO_TGT_SYS,
341662306a36Sopenharmony_ci					     0x52, (value & 0x1f));
341762306a36Sopenharmony_ci	} else {
341862306a36Sopenharmony_ci		ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
341962306a36Sopenharmony_ci						  CXD2880_IO_TGT_SYS,
342062306a36Sopenharmony_ci						  set_ts_pin_seq,
342162306a36Sopenharmony_ci						  ARRAY_SIZE(set_ts_pin_seq));
342262306a36Sopenharmony_ci		if (ret)
342362306a36Sopenharmony_ci			return ret;
342462306a36Sopenharmony_ci
342562306a36Sopenharmony_ci		ret = load_cfg_mem(tnr_dmd);
342662306a36Sopenharmony_ci	}
342762306a36Sopenharmony_ci
342862306a36Sopenharmony_ci	return ret;
342962306a36Sopenharmony_ci}
343062306a36Sopenharmony_ci
343162306a36Sopenharmony_ciint cxd2880_tnrdmd_set_ts_output(struct cxd2880_tnrdmd *tnr_dmd,
343262306a36Sopenharmony_ci				 u8 en)
343362306a36Sopenharmony_ci{
343462306a36Sopenharmony_ci	int ret;
343562306a36Sopenharmony_ci
343662306a36Sopenharmony_ci	if (!tnr_dmd)
343762306a36Sopenharmony_ci		return -EINVAL;
343862306a36Sopenharmony_ci
343962306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB)
344062306a36Sopenharmony_ci		return -EINVAL;
344162306a36Sopenharmony_ci
344262306a36Sopenharmony_ci	if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP &&
344362306a36Sopenharmony_ci	    tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE)
344462306a36Sopenharmony_ci		return -EINVAL;
344562306a36Sopenharmony_ci
344662306a36Sopenharmony_ci	switch (tnr_dmd->create_param.ts_output_if) {
344762306a36Sopenharmony_ci	case CXD2880_TNRDMD_TSOUT_IF_TS:
344862306a36Sopenharmony_ci		if (en) {
344962306a36Sopenharmony_ci			ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
345062306a36Sopenharmony_ci							  CXD2880_IO_TGT_SYS,
345162306a36Sopenharmony_ci							  set_ts_output_seq1,
345262306a36Sopenharmony_ci							  ARRAY_SIZE(set_ts_output_seq1));
345362306a36Sopenharmony_ci			if (ret)
345462306a36Sopenharmony_ci				return ret;
345562306a36Sopenharmony_ci
345662306a36Sopenharmony_ci			ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
345762306a36Sopenharmony_ci							  CXD2880_IO_TGT_DMD,
345862306a36Sopenharmony_ci							  set_ts_output_seq2,
345962306a36Sopenharmony_ci							  ARRAY_SIZE(set_ts_output_seq2));
346062306a36Sopenharmony_ci			if (ret)
346162306a36Sopenharmony_ci				return ret;
346262306a36Sopenharmony_ci		} else {
346362306a36Sopenharmony_ci			ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
346462306a36Sopenharmony_ci							  CXD2880_IO_TGT_DMD,
346562306a36Sopenharmony_ci							  set_ts_output_seq3,
346662306a36Sopenharmony_ci							  ARRAY_SIZE(set_ts_output_seq3));
346762306a36Sopenharmony_ci			if (ret)
346862306a36Sopenharmony_ci				return ret;
346962306a36Sopenharmony_ci
347062306a36Sopenharmony_ci			ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
347162306a36Sopenharmony_ci							  CXD2880_IO_TGT_SYS,
347262306a36Sopenharmony_ci							  set_ts_output_seq4,
347362306a36Sopenharmony_ci							  ARRAY_SIZE(set_ts_output_seq4));
347462306a36Sopenharmony_ci			if (ret)
347562306a36Sopenharmony_ci				return ret;
347662306a36Sopenharmony_ci		}
347762306a36Sopenharmony_ci		break;
347862306a36Sopenharmony_ci
347962306a36Sopenharmony_ci	case CXD2880_TNRDMD_TSOUT_IF_SPI:
348062306a36Sopenharmony_ci		break;
348162306a36Sopenharmony_ci
348262306a36Sopenharmony_ci	case CXD2880_TNRDMD_TSOUT_IF_SDIO:
348362306a36Sopenharmony_ci		break;
348462306a36Sopenharmony_ci
348562306a36Sopenharmony_ci	default:
348662306a36Sopenharmony_ci		return -EINVAL;
348762306a36Sopenharmony_ci	}
348862306a36Sopenharmony_ci
348962306a36Sopenharmony_ci	return 0;
349062306a36Sopenharmony_ci}
349162306a36Sopenharmony_ci
349262306a36Sopenharmony_ciint slvt_freeze_reg(struct cxd2880_tnrdmd *tnr_dmd)
349362306a36Sopenharmony_ci{
349462306a36Sopenharmony_ci	u8 data;
349562306a36Sopenharmony_ci	int ret;
349662306a36Sopenharmony_ci
349762306a36Sopenharmony_ci	if (!tnr_dmd)
349862306a36Sopenharmony_ci		return -EINVAL;
349962306a36Sopenharmony_ci
350062306a36Sopenharmony_ci	switch (tnr_dmd->create_param.ts_output_if) {
350162306a36Sopenharmony_ci	case CXD2880_TNRDMD_TSOUT_IF_SPI:
350262306a36Sopenharmony_ci	case CXD2880_TNRDMD_TSOUT_IF_SDIO:
350362306a36Sopenharmony_ci
350462306a36Sopenharmony_ci		ret = tnr_dmd->io->read_regs(tnr_dmd->io,
350562306a36Sopenharmony_ci					     CXD2880_IO_TGT_DMD,
350662306a36Sopenharmony_ci					     0x00, &data, 1);
350762306a36Sopenharmony_ci		if (ret)
350862306a36Sopenharmony_ci			return ret;
350962306a36Sopenharmony_ci
351062306a36Sopenharmony_ci		break;
351162306a36Sopenharmony_ci	case CXD2880_TNRDMD_TSOUT_IF_TS:
351262306a36Sopenharmony_ci	default:
351362306a36Sopenharmony_ci		break;
351462306a36Sopenharmony_ci	}
351562306a36Sopenharmony_ci
351662306a36Sopenharmony_ci	return tnr_dmd->io->write_reg(tnr_dmd->io,
351762306a36Sopenharmony_ci				      CXD2880_IO_TGT_DMD,
351862306a36Sopenharmony_ci				      0x01, 0x01);
351962306a36Sopenharmony_ci}
3520