162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * cxd2880_tnrdmd_dvbt2.c
462306a36Sopenharmony_ci * Sony CXD2880 DVB-T2/T tuner + demodulator driver
562306a36Sopenharmony_ci * control functions for DVB-T2
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
1262306a36Sopenharmony_ci#include "cxd2880_tnrdmd_dvbt2.h"
1362306a36Sopenharmony_ci#include "cxd2880_tnrdmd_dvbt2_mon.h"
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_cistatic const struct cxd2880_reg_value tune_dmd_setting_seq1[] = {
1662306a36Sopenharmony_ci	{0x00, 0x00}, {0x31, 0x02},
1762306a36Sopenharmony_ci};
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_cistatic const struct cxd2880_reg_value tune_dmd_setting_seq2[] = {
2062306a36Sopenharmony_ci	{0x00, 0x04}, {0x5d, 0x0b},
2162306a36Sopenharmony_ci};
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_cistatic int x_tune_dvbt2_demod_setting(struct cxd2880_tnrdmd
2462306a36Sopenharmony_ci				      *tnr_dmd,
2562306a36Sopenharmony_ci				      enum cxd2880_dtv_bandwidth
2662306a36Sopenharmony_ci				      bandwidth,
2762306a36Sopenharmony_ci				      enum cxd2880_tnrdmd_clockmode
2862306a36Sopenharmony_ci				      clk_mode)
2962306a36Sopenharmony_ci{
3062306a36Sopenharmony_ci	static const u8 tsif_settings[2] = { 0x01, 0x01 };
3162306a36Sopenharmony_ci	static const u8 init_settings[14] = {
3262306a36Sopenharmony_ci		0x07, 0x06, 0x01, 0xf0,	0x00, 0x00, 0x04, 0xb0, 0x00, 0x00,
3362306a36Sopenharmony_ci		0x09, 0x9c, 0x0e, 0x4c
3462306a36Sopenharmony_ci	};
3562306a36Sopenharmony_ci	static const u8 clk_mode_settings_a1[9] = {
3662306a36Sopenharmony_ci		0x52, 0x49, 0x2c, 0x51,	0x51, 0x3d, 0x15, 0x29, 0x0c
3762306a36Sopenharmony_ci	};
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci	static const u8 clk_mode_settings_b1[9] = {
4062306a36Sopenharmony_ci		0x5d, 0x55, 0x32, 0x5c,	0x5c, 0x45, 0x17, 0x2e, 0x0d
4162306a36Sopenharmony_ci	};
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci	static const u8 clk_mode_settings_c1[9] = {
4462306a36Sopenharmony_ci		0x60, 0x00, 0x34, 0x5e,	0x5e, 0x47, 0x18, 0x2f, 0x0e
4562306a36Sopenharmony_ci	};
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci	static const u8 clk_mode_settings_a2[13] = {
4862306a36Sopenharmony_ci		0x04, 0xe7, 0x94, 0x92,	0x09, 0xcf, 0x7e, 0xd0, 0x49,
4962306a36Sopenharmony_ci		0xcd, 0xcd, 0x1f, 0x5b
5062306a36Sopenharmony_ci	};
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci	static const u8 clk_mode_settings_b2[13] = {
5362306a36Sopenharmony_ci		0x05, 0x90, 0x27, 0x55,	0x0b, 0x20, 0x8f, 0xd6, 0xea,
5462306a36Sopenharmony_ci		0xc8, 0xc8, 0x23, 0x91
5562306a36Sopenharmony_ci	};
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci	static const u8 clk_mode_settings_c2[13] = {
5862306a36Sopenharmony_ci		0x05, 0xb8, 0xd8, 0x00,	0x0b, 0x72, 0x93, 0xf3, 0x00,
5962306a36Sopenharmony_ci		0xcd, 0xcd, 0x24, 0x95
6062306a36Sopenharmony_ci	};
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci	static const u8 clk_mode_settings_a3[5] = {
6362306a36Sopenharmony_ci		0x0b, 0x6a, 0xc9, 0x03, 0x33
6462306a36Sopenharmony_ci	};
6562306a36Sopenharmony_ci	static const u8 clk_mode_settings_b3[5] = {
6662306a36Sopenharmony_ci		0x01, 0x02, 0xe4, 0x03, 0x39
6762306a36Sopenharmony_ci	};
6862306a36Sopenharmony_ci	static const u8 clk_mode_settings_c3[5] = {
6962306a36Sopenharmony_ci		0x01, 0x02, 0xeb, 0x03, 0x3b
7062306a36Sopenharmony_ci	};
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci	static const u8 gtdofst[2] = { 0x3f, 0xff };
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci	static const u8 bw8_gtdofst_a[2] = { 0x19, 0xd2 };
7562306a36Sopenharmony_ci	static const u8 bw8_nomi_ac[6] = { 0x15, 0x00, 0x00, 0x00, 0x00, 0x00 };
7662306a36Sopenharmony_ci	static const u8 bw8_nomi_b[6] = { 0x14, 0x6a, 0xaa, 0xaa, 0xab, 0x00 };
7762306a36Sopenharmony_ci	static const u8 bw8_sst_a[2] = { 0x06, 0x2a };
7862306a36Sopenharmony_ci	static const u8 bw8_sst_b[2] = { 0x06, 0x29 };
7962306a36Sopenharmony_ci	static const u8 bw8_sst_c[2] = { 0x06, 0x28 };
8062306a36Sopenharmony_ci	static const u8 bw8_mrc_a[9] = {
8162306a36Sopenharmony_ci		0x28, 0x00, 0x50, 0x00, 0x60, 0x00, 0x00, 0x90, 0x00
8262306a36Sopenharmony_ci	};
8362306a36Sopenharmony_ci	static const u8 bw8_mrc_b[9] = {
8462306a36Sopenharmony_ci		0x2d, 0x5e, 0x5a, 0xbd, 0x6c, 0xe3, 0x00, 0xa3, 0x55
8562306a36Sopenharmony_ci	};
8662306a36Sopenharmony_ci	static const u8 bw8_mrc_c[9] = {
8762306a36Sopenharmony_ci		0x2e, 0xaa, 0x5d, 0x55, 0x70, 0x00, 0x00, 0xa8, 0x00
8862306a36Sopenharmony_ci	};
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci	static const u8 bw7_nomi_ac[6] = { 0x18, 0x00, 0x00, 0x00, 0x00, 0x00 };
9162306a36Sopenharmony_ci	static const u8 bw7_nomi_b[6] = { 0x17, 0x55, 0x55, 0x55, 0x55, 0x00 };
9262306a36Sopenharmony_ci	static const u8 bw7_sst_a[2] = { 0x06, 0x23 };
9362306a36Sopenharmony_ci	static const u8 bw7_sst_b[2] = { 0x06, 0x22 };
9462306a36Sopenharmony_ci	static const u8 bw7_sst_c[2] = { 0x06, 0x21 };
9562306a36Sopenharmony_ci	static const u8 bw7_mrc_a[9] = {
9662306a36Sopenharmony_ci		0x2d, 0xb6, 0x5b, 0x6d,	0x6d, 0xb6, 0x00, 0xa4, 0x92
9762306a36Sopenharmony_ci	};
9862306a36Sopenharmony_ci	static const u8 bw7_mrc_b[9] = {
9962306a36Sopenharmony_ci		0x33, 0xda, 0x67, 0xb4,	0x7c, 0x71, 0x00, 0xba, 0xaa
10062306a36Sopenharmony_ci	};
10162306a36Sopenharmony_ci	static const u8 bw7_mrc_c[9] = {
10262306a36Sopenharmony_ci		0x35, 0x55, 0x6a, 0xaa,	0x80, 0x00, 0x00, 0xc0, 0x00
10362306a36Sopenharmony_ci	};
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci	static const u8 bw6_nomi_ac[6] = { 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00 };
10662306a36Sopenharmony_ci	static const u8 bw6_nomi_b[6] = { 0x1b, 0x38, 0xe3, 0x8e, 0x39, 0x00 };
10762306a36Sopenharmony_ci	static const u8 bw6_sst_a[2] = { 0x06, 0x1c };
10862306a36Sopenharmony_ci	static const u8 bw6_sst_b[2] = { 0x06, 0x1b };
10962306a36Sopenharmony_ci	static const u8 bw6_sst_c[2] = { 0x06, 0x1a };
11062306a36Sopenharmony_ci	static const u8 bw6_mrc_a[9] = {
11162306a36Sopenharmony_ci		0x35, 0x55, 0x6a, 0xaa, 0x80, 0x00, 0x00, 0xc0, 0x00
11262306a36Sopenharmony_ci	};
11362306a36Sopenharmony_ci	static const u8 bw6_mrc_b[9] = {
11462306a36Sopenharmony_ci		0x3c, 0x7e, 0x78, 0xfc,	0x91, 0x2f, 0x00, 0xd9, 0xc7
11562306a36Sopenharmony_ci	};
11662306a36Sopenharmony_ci	static const u8 bw6_mrc_c[9] = {
11762306a36Sopenharmony_ci		0x3e, 0x38, 0x7c, 0x71,	0x95, 0x55, 0x00, 0xdf, 0xff
11862306a36Sopenharmony_ci	};
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ci	static const u8 bw5_nomi_ac[6] = { 0x21, 0x99, 0x99, 0x99, 0x9a, 0x00 };
12162306a36Sopenharmony_ci	static const u8 bw5_nomi_b[6] = { 0x20, 0xaa, 0xaa, 0xaa, 0xab, 0x00 };
12262306a36Sopenharmony_ci	static const u8 bw5_sst_a[2] = { 0x06, 0x15 };
12362306a36Sopenharmony_ci	static const u8 bw5_sst_b[2] = { 0x06, 0x15 };
12462306a36Sopenharmony_ci	static const u8 bw5_sst_c[2] = { 0x06, 0x14 };
12562306a36Sopenharmony_ci	static const u8 bw5_mrc_a[9] = {
12662306a36Sopenharmony_ci		0x40, 0x00, 0x6a, 0xaa, 0x80, 0x00, 0x00, 0xe6, 0x66
12762306a36Sopenharmony_ci	};
12862306a36Sopenharmony_ci	static const u8 bw5_mrc_b[9] = {
12962306a36Sopenharmony_ci		0x48, 0x97, 0x78, 0xfc, 0x91, 0x2f, 0x01, 0x05, 0x55
13062306a36Sopenharmony_ci	};
13162306a36Sopenharmony_ci	static const u8 bw5_mrc_c[9] = {
13262306a36Sopenharmony_ci		0x4a, 0xaa, 0x7c, 0x71, 0x95, 0x55, 0x01, 0x0c, 0xcc
13362306a36Sopenharmony_ci	};
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_ci	static const u8 bw1_7_nomi_a[6] = {
13662306a36Sopenharmony_ci		0x68, 0x0f, 0xa2, 0x32, 0xcf, 0x03
13762306a36Sopenharmony_ci	};
13862306a36Sopenharmony_ci	static const u8 bw1_7_nomi_c[6] = {
13962306a36Sopenharmony_ci		0x68, 0x0f, 0xa2, 0x32, 0xcf, 0x03
14062306a36Sopenharmony_ci	};
14162306a36Sopenharmony_ci	static const u8 bw1_7_nomi_b[6] = {
14262306a36Sopenharmony_ci		0x65, 0x2b, 0xa4, 0xcd, 0xd8, 0x03
14362306a36Sopenharmony_ci	};
14462306a36Sopenharmony_ci	static const u8 bw1_7_sst_a[2] = { 0x06, 0x0c };
14562306a36Sopenharmony_ci	static const u8 bw1_7_sst_b[2] = { 0x06, 0x0c };
14662306a36Sopenharmony_ci	static const u8 bw1_7_sst_c[2] = { 0x06, 0x0b };
14762306a36Sopenharmony_ci	static const u8 bw1_7_mrc_a[9] = {
14862306a36Sopenharmony_ci		0x40, 0x00, 0x6a, 0xaa,	0x80, 0x00, 0x02, 0xc9, 0x8f
14962306a36Sopenharmony_ci	};
15062306a36Sopenharmony_ci	static const u8 bw1_7_mrc_b[9] = {
15162306a36Sopenharmony_ci		0x48, 0x97, 0x78, 0xfc, 0x91, 0x2f, 0x03, 0x29, 0x5d
15262306a36Sopenharmony_ci	};
15362306a36Sopenharmony_ci	static const u8 bw1_7_mrc_c[9] = {
15462306a36Sopenharmony_ci		0x4a, 0xaa, 0x7c, 0x71,	0x95, 0x55, 0x03, 0x40, 0x7d
15562306a36Sopenharmony_ci	};
15662306a36Sopenharmony_ci
15762306a36Sopenharmony_ci	const u8 *data = NULL;
15862306a36Sopenharmony_ci	const u8 *data2 = NULL;
15962306a36Sopenharmony_ci	const u8 *data3 = NULL;
16062306a36Sopenharmony_ci	int ret;
16162306a36Sopenharmony_ci
16262306a36Sopenharmony_ci	if (!tnr_dmd)
16362306a36Sopenharmony_ci		return -EINVAL;
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_ci	ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
16662306a36Sopenharmony_ci					  CXD2880_IO_TGT_SYS,
16762306a36Sopenharmony_ci					  tune_dmd_setting_seq1,
16862306a36Sopenharmony_ci					  ARRAY_SIZE(tune_dmd_setting_seq1));
16962306a36Sopenharmony_ci	if (ret)
17062306a36Sopenharmony_ci		return ret;
17162306a36Sopenharmony_ci
17262306a36Sopenharmony_ci	ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
17362306a36Sopenharmony_ci					  CXD2880_IO_TGT_DMD,
17462306a36Sopenharmony_ci					  tune_dmd_setting_seq2,
17562306a36Sopenharmony_ci					  ARRAY_SIZE(tune_dmd_setting_seq2));
17662306a36Sopenharmony_ci	if (ret)
17762306a36Sopenharmony_ci		return ret;
17862306a36Sopenharmony_ci
17962306a36Sopenharmony_ci	if (tnr_dmd->diver_mode != CXD2880_TNRDMD_DIVERMODE_SUB) {
18062306a36Sopenharmony_ci		ret = tnr_dmd->io->write_reg(tnr_dmd->io,
18162306a36Sopenharmony_ci					     CXD2880_IO_TGT_DMD,
18262306a36Sopenharmony_ci					     0x00, 0x00);
18362306a36Sopenharmony_ci		if (ret)
18462306a36Sopenharmony_ci			return ret;
18562306a36Sopenharmony_ci
18662306a36Sopenharmony_ci		ret = tnr_dmd->io->write_regs(tnr_dmd->io,
18762306a36Sopenharmony_ci					      CXD2880_IO_TGT_DMD,
18862306a36Sopenharmony_ci					      0xce, tsif_settings, 2);
18962306a36Sopenharmony_ci		if (ret)
19062306a36Sopenharmony_ci			return ret;
19162306a36Sopenharmony_ci	}
19262306a36Sopenharmony_ci
19362306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
19462306a36Sopenharmony_ci				     CXD2880_IO_TGT_DMD,
19562306a36Sopenharmony_ci				     0x00, 0x20);
19662306a36Sopenharmony_ci	if (ret)
19762306a36Sopenharmony_ci		return ret;
19862306a36Sopenharmony_ci
19962306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
20062306a36Sopenharmony_ci				     CXD2880_IO_TGT_DMD,
20162306a36Sopenharmony_ci				     0x8a, init_settings[0]);
20262306a36Sopenharmony_ci	if (ret)
20362306a36Sopenharmony_ci		return ret;
20462306a36Sopenharmony_ci
20562306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
20662306a36Sopenharmony_ci				     CXD2880_IO_TGT_DMD,
20762306a36Sopenharmony_ci				     0x90, init_settings[1]);
20862306a36Sopenharmony_ci	if (ret)
20962306a36Sopenharmony_ci		return ret;
21062306a36Sopenharmony_ci
21162306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
21262306a36Sopenharmony_ci				     CXD2880_IO_TGT_DMD,
21362306a36Sopenharmony_ci				     0x00, 0x25);
21462306a36Sopenharmony_ci	if (ret)
21562306a36Sopenharmony_ci		return ret;
21662306a36Sopenharmony_ci
21762306a36Sopenharmony_ci	ret = tnr_dmd->io->write_regs(tnr_dmd->io,
21862306a36Sopenharmony_ci				      CXD2880_IO_TGT_DMD,
21962306a36Sopenharmony_ci				      0xf0, &init_settings[2], 2);
22062306a36Sopenharmony_ci	if (ret)
22162306a36Sopenharmony_ci		return ret;
22262306a36Sopenharmony_ci
22362306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
22462306a36Sopenharmony_ci				     CXD2880_IO_TGT_DMD,
22562306a36Sopenharmony_ci				     0x00, 0x2a);
22662306a36Sopenharmony_ci	if (ret)
22762306a36Sopenharmony_ci		return ret;
22862306a36Sopenharmony_ci
22962306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
23062306a36Sopenharmony_ci				     CXD2880_IO_TGT_DMD,
23162306a36Sopenharmony_ci				     0xdc, init_settings[4]);
23262306a36Sopenharmony_ci	if (ret)
23362306a36Sopenharmony_ci		return ret;
23462306a36Sopenharmony_ci
23562306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
23662306a36Sopenharmony_ci				     CXD2880_IO_TGT_DMD,
23762306a36Sopenharmony_ci				     0xde, init_settings[5]);
23862306a36Sopenharmony_ci	if (ret)
23962306a36Sopenharmony_ci		return ret;
24062306a36Sopenharmony_ci
24162306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
24262306a36Sopenharmony_ci				     CXD2880_IO_TGT_DMD,
24362306a36Sopenharmony_ci				     0x00, 0x2d);
24462306a36Sopenharmony_ci	if (ret)
24562306a36Sopenharmony_ci		return ret;
24662306a36Sopenharmony_ci
24762306a36Sopenharmony_ci	ret = tnr_dmd->io->write_regs(tnr_dmd->io,
24862306a36Sopenharmony_ci				      CXD2880_IO_TGT_DMD,
24962306a36Sopenharmony_ci				      0x73, &init_settings[6], 4);
25062306a36Sopenharmony_ci	if (ret)
25162306a36Sopenharmony_ci		return ret;
25262306a36Sopenharmony_ci
25362306a36Sopenharmony_ci	ret = tnr_dmd->io->write_regs(tnr_dmd->io,
25462306a36Sopenharmony_ci				      CXD2880_IO_TGT_DMD,
25562306a36Sopenharmony_ci				      0x8f, &init_settings[10], 4);
25662306a36Sopenharmony_ci	if (ret)
25762306a36Sopenharmony_ci		return ret;
25862306a36Sopenharmony_ci
25962306a36Sopenharmony_ci	switch (clk_mode) {
26062306a36Sopenharmony_ci	case CXD2880_TNRDMD_CLOCKMODE_A:
26162306a36Sopenharmony_ci		data = clk_mode_settings_a1;
26262306a36Sopenharmony_ci		data2 = clk_mode_settings_a2;
26362306a36Sopenharmony_ci		data3 = clk_mode_settings_a3;
26462306a36Sopenharmony_ci		break;
26562306a36Sopenharmony_ci	case CXD2880_TNRDMD_CLOCKMODE_B:
26662306a36Sopenharmony_ci		data = clk_mode_settings_b1;
26762306a36Sopenharmony_ci		data2 = clk_mode_settings_b2;
26862306a36Sopenharmony_ci		data3 = clk_mode_settings_b3;
26962306a36Sopenharmony_ci		break;
27062306a36Sopenharmony_ci	case CXD2880_TNRDMD_CLOCKMODE_C:
27162306a36Sopenharmony_ci		data = clk_mode_settings_c1;
27262306a36Sopenharmony_ci		data2 = clk_mode_settings_c2;
27362306a36Sopenharmony_ci		data3 = clk_mode_settings_c3;
27462306a36Sopenharmony_ci		break;
27562306a36Sopenharmony_ci	default:
27662306a36Sopenharmony_ci		return -EINVAL;
27762306a36Sopenharmony_ci	}
27862306a36Sopenharmony_ci
27962306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
28062306a36Sopenharmony_ci				     CXD2880_IO_TGT_DMD,
28162306a36Sopenharmony_ci				     0x00, 0x04);
28262306a36Sopenharmony_ci	if (ret)
28362306a36Sopenharmony_ci		return ret;
28462306a36Sopenharmony_ci
28562306a36Sopenharmony_ci	ret = tnr_dmd->io->write_regs(tnr_dmd->io,
28662306a36Sopenharmony_ci				      CXD2880_IO_TGT_DMD,
28762306a36Sopenharmony_ci				      0x1d, &data[0], 3);
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_DMD,
29362306a36Sopenharmony_ci				     0x22, data[3]);
29462306a36Sopenharmony_ci	if (ret)
29562306a36Sopenharmony_ci		return ret;
29662306a36Sopenharmony_ci
29762306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
29862306a36Sopenharmony_ci				     CXD2880_IO_TGT_DMD,
29962306a36Sopenharmony_ci				     0x24, data[4]);
30062306a36Sopenharmony_ci	if (ret)
30162306a36Sopenharmony_ci		return ret;
30262306a36Sopenharmony_ci
30362306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
30462306a36Sopenharmony_ci				     CXD2880_IO_TGT_DMD,
30562306a36Sopenharmony_ci				     0x26, data[5]);
30662306a36Sopenharmony_ci	if (ret)
30762306a36Sopenharmony_ci		return ret;
30862306a36Sopenharmony_ci
30962306a36Sopenharmony_ci	ret = tnr_dmd->io->write_regs(tnr_dmd->io,
31062306a36Sopenharmony_ci				      CXD2880_IO_TGT_DMD,
31162306a36Sopenharmony_ci				      0x29, &data[6], 2);
31262306a36Sopenharmony_ci	if (ret)
31362306a36Sopenharmony_ci		return ret;
31462306a36Sopenharmony_ci
31562306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
31662306a36Sopenharmony_ci				     CXD2880_IO_TGT_DMD,
31762306a36Sopenharmony_ci				     0x2d, data[8]);
31862306a36Sopenharmony_ci	if (ret)
31962306a36Sopenharmony_ci		return ret;
32062306a36Sopenharmony_ci
32162306a36Sopenharmony_ci	if (tnr_dmd->diver_mode != CXD2880_TNRDMD_DIVERMODE_SUB) {
32262306a36Sopenharmony_ci		ret = tnr_dmd->io->write_regs(tnr_dmd->io,
32362306a36Sopenharmony_ci					      CXD2880_IO_TGT_DMD,
32462306a36Sopenharmony_ci					      0x2e, &data2[0], 6);
32562306a36Sopenharmony_ci		if (ret)
32662306a36Sopenharmony_ci			return ret;
32762306a36Sopenharmony_ci
32862306a36Sopenharmony_ci		ret = tnr_dmd->io->write_regs(tnr_dmd->io,
32962306a36Sopenharmony_ci					      CXD2880_IO_TGT_DMD,
33062306a36Sopenharmony_ci					      0x35, &data2[6], 7);
33162306a36Sopenharmony_ci		if (ret)
33262306a36Sopenharmony_ci			return ret;
33362306a36Sopenharmony_ci	}
33462306a36Sopenharmony_ci
33562306a36Sopenharmony_ci	ret = tnr_dmd->io->write_regs(tnr_dmd->io,
33662306a36Sopenharmony_ci				      CXD2880_IO_TGT_DMD,
33762306a36Sopenharmony_ci				      0x3c, &data3[0], 2);
33862306a36Sopenharmony_ci	if (ret)
33962306a36Sopenharmony_ci		return ret;
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_ci	ret = tnr_dmd->io->write_regs(tnr_dmd->io,
34262306a36Sopenharmony_ci				      CXD2880_IO_TGT_DMD,
34362306a36Sopenharmony_ci				      0x56, &data3[2], 3);
34462306a36Sopenharmony_ci	if (ret)
34562306a36Sopenharmony_ci		return ret;
34662306a36Sopenharmony_ci
34762306a36Sopenharmony_ci	switch (bandwidth) {
34862306a36Sopenharmony_ci	case CXD2880_DTV_BW_8_MHZ:
34962306a36Sopenharmony_ci		switch (clk_mode) {
35062306a36Sopenharmony_ci		case CXD2880_TNRDMD_CLOCKMODE_A:
35162306a36Sopenharmony_ci		case CXD2880_TNRDMD_CLOCKMODE_C:
35262306a36Sopenharmony_ci			data = bw8_nomi_ac;
35362306a36Sopenharmony_ci			break;
35462306a36Sopenharmony_ci		case CXD2880_TNRDMD_CLOCKMODE_B:
35562306a36Sopenharmony_ci			data = bw8_nomi_b;
35662306a36Sopenharmony_ci			break;
35762306a36Sopenharmony_ci		default:
35862306a36Sopenharmony_ci			return -EINVAL;
35962306a36Sopenharmony_ci		}
36062306a36Sopenharmony_ci
36162306a36Sopenharmony_ci		ret = tnr_dmd->io->write_regs(tnr_dmd->io,
36262306a36Sopenharmony_ci					      CXD2880_IO_TGT_DMD,
36362306a36Sopenharmony_ci					      0x10, data, 6);
36462306a36Sopenharmony_ci		if (ret)
36562306a36Sopenharmony_ci			return ret;
36662306a36Sopenharmony_ci
36762306a36Sopenharmony_ci		ret = tnr_dmd->io->write_reg(tnr_dmd->io,
36862306a36Sopenharmony_ci					     CXD2880_IO_TGT_DMD,
36962306a36Sopenharmony_ci					     0x4a, 0x00);
37062306a36Sopenharmony_ci		if (ret)
37162306a36Sopenharmony_ci			return ret;
37262306a36Sopenharmony_ci
37362306a36Sopenharmony_ci		switch (clk_mode) {
37462306a36Sopenharmony_ci		case CXD2880_TNRDMD_CLOCKMODE_A:
37562306a36Sopenharmony_ci			data = bw8_gtdofst_a;
37662306a36Sopenharmony_ci			break;
37762306a36Sopenharmony_ci		case CXD2880_TNRDMD_CLOCKMODE_B:
37862306a36Sopenharmony_ci		case CXD2880_TNRDMD_CLOCKMODE_C:
37962306a36Sopenharmony_ci			data = gtdofst;
38062306a36Sopenharmony_ci			break;
38162306a36Sopenharmony_ci		default:
38262306a36Sopenharmony_ci			return -EINVAL;
38362306a36Sopenharmony_ci		}
38462306a36Sopenharmony_ci
38562306a36Sopenharmony_ci		ret = tnr_dmd->io->write_regs(tnr_dmd->io,
38662306a36Sopenharmony_ci					      CXD2880_IO_TGT_DMD,
38762306a36Sopenharmony_ci					      0x19, data, 2);
38862306a36Sopenharmony_ci		if (ret)
38962306a36Sopenharmony_ci			return ret;
39062306a36Sopenharmony_ci
39162306a36Sopenharmony_ci		switch (clk_mode) {
39262306a36Sopenharmony_ci		case CXD2880_TNRDMD_CLOCKMODE_A:
39362306a36Sopenharmony_ci			data = bw8_sst_a;
39462306a36Sopenharmony_ci			break;
39562306a36Sopenharmony_ci		case CXD2880_TNRDMD_CLOCKMODE_B:
39662306a36Sopenharmony_ci			data = bw8_sst_b;
39762306a36Sopenharmony_ci			break;
39862306a36Sopenharmony_ci		case CXD2880_TNRDMD_CLOCKMODE_C:
39962306a36Sopenharmony_ci			data = bw8_sst_c;
40062306a36Sopenharmony_ci			break;
40162306a36Sopenharmony_ci		default:
40262306a36Sopenharmony_ci			return -EINVAL;
40362306a36Sopenharmony_ci		}
40462306a36Sopenharmony_ci
40562306a36Sopenharmony_ci		ret = tnr_dmd->io->write_regs(tnr_dmd->io,
40662306a36Sopenharmony_ci					      CXD2880_IO_TGT_DMD,
40762306a36Sopenharmony_ci					      0x1b, data, 2);
40862306a36Sopenharmony_ci		if (ret)
40962306a36Sopenharmony_ci			return ret;
41062306a36Sopenharmony_ci
41162306a36Sopenharmony_ci		if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) {
41262306a36Sopenharmony_ci			switch (clk_mode) {
41362306a36Sopenharmony_ci			case CXD2880_TNRDMD_CLOCKMODE_A:
41462306a36Sopenharmony_ci				data = bw8_mrc_a;
41562306a36Sopenharmony_ci				break;
41662306a36Sopenharmony_ci			case CXD2880_TNRDMD_CLOCKMODE_B:
41762306a36Sopenharmony_ci				data = bw8_mrc_b;
41862306a36Sopenharmony_ci				break;
41962306a36Sopenharmony_ci			case CXD2880_TNRDMD_CLOCKMODE_C:
42062306a36Sopenharmony_ci				data = bw8_mrc_c;
42162306a36Sopenharmony_ci				break;
42262306a36Sopenharmony_ci			default:
42362306a36Sopenharmony_ci				return -EINVAL;
42462306a36Sopenharmony_ci			}
42562306a36Sopenharmony_ci
42662306a36Sopenharmony_ci			ret = tnr_dmd->io->write_regs(tnr_dmd->io,
42762306a36Sopenharmony_ci						      CXD2880_IO_TGT_DMD,
42862306a36Sopenharmony_ci						      0x4b, data, 9);
42962306a36Sopenharmony_ci			if (ret)
43062306a36Sopenharmony_ci				return ret;
43162306a36Sopenharmony_ci		}
43262306a36Sopenharmony_ci		break;
43362306a36Sopenharmony_ci
43462306a36Sopenharmony_ci	case CXD2880_DTV_BW_7_MHZ:
43562306a36Sopenharmony_ci		switch (clk_mode) {
43662306a36Sopenharmony_ci		case CXD2880_TNRDMD_CLOCKMODE_A:
43762306a36Sopenharmony_ci		case CXD2880_TNRDMD_CLOCKMODE_C:
43862306a36Sopenharmony_ci			data = bw7_nomi_ac;
43962306a36Sopenharmony_ci			break;
44062306a36Sopenharmony_ci		case CXD2880_TNRDMD_CLOCKMODE_B:
44162306a36Sopenharmony_ci			data = bw7_nomi_b;
44262306a36Sopenharmony_ci			break;
44362306a36Sopenharmony_ci		default:
44462306a36Sopenharmony_ci			return -EINVAL;
44562306a36Sopenharmony_ci		}
44662306a36Sopenharmony_ci
44762306a36Sopenharmony_ci		ret = tnr_dmd->io->write_regs(tnr_dmd->io,
44862306a36Sopenharmony_ci					      CXD2880_IO_TGT_DMD,
44962306a36Sopenharmony_ci					      0x10, data, 6);
45062306a36Sopenharmony_ci		if (ret)
45162306a36Sopenharmony_ci			return ret;
45262306a36Sopenharmony_ci
45362306a36Sopenharmony_ci		ret = tnr_dmd->io->write_reg(tnr_dmd->io,
45462306a36Sopenharmony_ci					     CXD2880_IO_TGT_DMD,
45562306a36Sopenharmony_ci					     0x4a, 0x02);
45662306a36Sopenharmony_ci		if (ret)
45762306a36Sopenharmony_ci			return ret;
45862306a36Sopenharmony_ci
45962306a36Sopenharmony_ci		ret = tnr_dmd->io->write_regs(tnr_dmd->io,
46062306a36Sopenharmony_ci					      CXD2880_IO_TGT_DMD,
46162306a36Sopenharmony_ci					      0x19, gtdofst, 2);
46262306a36Sopenharmony_ci		if (ret)
46362306a36Sopenharmony_ci			return ret;
46462306a36Sopenharmony_ci
46562306a36Sopenharmony_ci		switch (clk_mode) {
46662306a36Sopenharmony_ci		case CXD2880_TNRDMD_CLOCKMODE_A:
46762306a36Sopenharmony_ci			data = bw7_sst_a;
46862306a36Sopenharmony_ci			break;
46962306a36Sopenharmony_ci		case CXD2880_TNRDMD_CLOCKMODE_B:
47062306a36Sopenharmony_ci			data = bw7_sst_b;
47162306a36Sopenharmony_ci			break;
47262306a36Sopenharmony_ci		case CXD2880_TNRDMD_CLOCKMODE_C:
47362306a36Sopenharmony_ci			data = bw7_sst_c;
47462306a36Sopenharmony_ci			break;
47562306a36Sopenharmony_ci		default:
47662306a36Sopenharmony_ci			return -EINVAL;
47762306a36Sopenharmony_ci		}
47862306a36Sopenharmony_ci
47962306a36Sopenharmony_ci		ret = tnr_dmd->io->write_regs(tnr_dmd->io,
48062306a36Sopenharmony_ci					      CXD2880_IO_TGT_DMD,
48162306a36Sopenharmony_ci					      0x1b, data, 2);
48262306a36Sopenharmony_ci		if (ret)
48362306a36Sopenharmony_ci			return ret;
48462306a36Sopenharmony_ci
48562306a36Sopenharmony_ci		if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) {
48662306a36Sopenharmony_ci			switch (clk_mode) {
48762306a36Sopenharmony_ci			case CXD2880_TNRDMD_CLOCKMODE_A:
48862306a36Sopenharmony_ci				data = bw7_mrc_a;
48962306a36Sopenharmony_ci				break;
49062306a36Sopenharmony_ci			case CXD2880_TNRDMD_CLOCKMODE_B:
49162306a36Sopenharmony_ci				data = bw7_mrc_b;
49262306a36Sopenharmony_ci				break;
49362306a36Sopenharmony_ci			case CXD2880_TNRDMD_CLOCKMODE_C:
49462306a36Sopenharmony_ci				data = bw7_mrc_c;
49562306a36Sopenharmony_ci				break;
49662306a36Sopenharmony_ci			default:
49762306a36Sopenharmony_ci				return -EINVAL;
49862306a36Sopenharmony_ci			}
49962306a36Sopenharmony_ci
50062306a36Sopenharmony_ci			ret = tnr_dmd->io->write_regs(tnr_dmd->io,
50162306a36Sopenharmony_ci						      CXD2880_IO_TGT_DMD,
50262306a36Sopenharmony_ci						      0x4b, data, 9);
50362306a36Sopenharmony_ci			if (ret)
50462306a36Sopenharmony_ci				return ret;
50562306a36Sopenharmony_ci		}
50662306a36Sopenharmony_ci		break;
50762306a36Sopenharmony_ci
50862306a36Sopenharmony_ci	case CXD2880_DTV_BW_6_MHZ:
50962306a36Sopenharmony_ci		switch (clk_mode) {
51062306a36Sopenharmony_ci		case CXD2880_TNRDMD_CLOCKMODE_A:
51162306a36Sopenharmony_ci		case CXD2880_TNRDMD_CLOCKMODE_C:
51262306a36Sopenharmony_ci			data = bw6_nomi_ac;
51362306a36Sopenharmony_ci			break;
51462306a36Sopenharmony_ci		case CXD2880_TNRDMD_CLOCKMODE_B:
51562306a36Sopenharmony_ci			data = bw6_nomi_b;
51662306a36Sopenharmony_ci			break;
51762306a36Sopenharmony_ci		default:
51862306a36Sopenharmony_ci			return -EINVAL;
51962306a36Sopenharmony_ci		}
52062306a36Sopenharmony_ci
52162306a36Sopenharmony_ci		ret = tnr_dmd->io->write_regs(tnr_dmd->io,
52262306a36Sopenharmony_ci					      CXD2880_IO_TGT_DMD,
52362306a36Sopenharmony_ci					      0x10, data, 6);
52462306a36Sopenharmony_ci		if (ret)
52562306a36Sopenharmony_ci			return ret;
52662306a36Sopenharmony_ci
52762306a36Sopenharmony_ci		ret = tnr_dmd->io->write_reg(tnr_dmd->io,
52862306a36Sopenharmony_ci					     CXD2880_IO_TGT_DMD,
52962306a36Sopenharmony_ci					     0x4a, 0x04);
53062306a36Sopenharmony_ci		if (ret)
53162306a36Sopenharmony_ci			return ret;
53262306a36Sopenharmony_ci
53362306a36Sopenharmony_ci		ret = tnr_dmd->io->write_regs(tnr_dmd->io,
53462306a36Sopenharmony_ci					      CXD2880_IO_TGT_DMD,
53562306a36Sopenharmony_ci					      0x19, gtdofst, 2);
53662306a36Sopenharmony_ci		if (ret)
53762306a36Sopenharmony_ci			return ret;
53862306a36Sopenharmony_ci
53962306a36Sopenharmony_ci		switch (clk_mode) {
54062306a36Sopenharmony_ci		case CXD2880_TNRDMD_CLOCKMODE_A:
54162306a36Sopenharmony_ci			data = bw6_sst_a;
54262306a36Sopenharmony_ci			break;
54362306a36Sopenharmony_ci		case CXD2880_TNRDMD_CLOCKMODE_B:
54462306a36Sopenharmony_ci			data = bw6_sst_b;
54562306a36Sopenharmony_ci			break;
54662306a36Sopenharmony_ci		case CXD2880_TNRDMD_CLOCKMODE_C:
54762306a36Sopenharmony_ci			data = bw6_sst_c;
54862306a36Sopenharmony_ci			break;
54962306a36Sopenharmony_ci		default:
55062306a36Sopenharmony_ci			return -EINVAL;
55162306a36Sopenharmony_ci		}
55262306a36Sopenharmony_ci
55362306a36Sopenharmony_ci		ret = tnr_dmd->io->write_regs(tnr_dmd->io,
55462306a36Sopenharmony_ci					      CXD2880_IO_TGT_DMD,
55562306a36Sopenharmony_ci					      0x1b, data, 2);
55662306a36Sopenharmony_ci		if (ret)
55762306a36Sopenharmony_ci			return ret;
55862306a36Sopenharmony_ci
55962306a36Sopenharmony_ci		if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) {
56062306a36Sopenharmony_ci			switch (clk_mode) {
56162306a36Sopenharmony_ci			case CXD2880_TNRDMD_CLOCKMODE_A:
56262306a36Sopenharmony_ci				data = bw6_mrc_a;
56362306a36Sopenharmony_ci				break;
56462306a36Sopenharmony_ci			case CXD2880_TNRDMD_CLOCKMODE_B:
56562306a36Sopenharmony_ci				data = bw6_mrc_b;
56662306a36Sopenharmony_ci				break;
56762306a36Sopenharmony_ci			case CXD2880_TNRDMD_CLOCKMODE_C:
56862306a36Sopenharmony_ci				data = bw6_mrc_c;
56962306a36Sopenharmony_ci				break;
57062306a36Sopenharmony_ci			default:
57162306a36Sopenharmony_ci				return -EINVAL;
57262306a36Sopenharmony_ci			}
57362306a36Sopenharmony_ci
57462306a36Sopenharmony_ci			ret = tnr_dmd->io->write_regs(tnr_dmd->io,
57562306a36Sopenharmony_ci						      CXD2880_IO_TGT_DMD,
57662306a36Sopenharmony_ci						      0x4b, data, 9);
57762306a36Sopenharmony_ci			if (ret)
57862306a36Sopenharmony_ci				return ret;
57962306a36Sopenharmony_ci		}
58062306a36Sopenharmony_ci		break;
58162306a36Sopenharmony_ci
58262306a36Sopenharmony_ci	case CXD2880_DTV_BW_5_MHZ:
58362306a36Sopenharmony_ci		switch (clk_mode) {
58462306a36Sopenharmony_ci		case CXD2880_TNRDMD_CLOCKMODE_A:
58562306a36Sopenharmony_ci		case CXD2880_TNRDMD_CLOCKMODE_C:
58662306a36Sopenharmony_ci			data = bw5_nomi_ac;
58762306a36Sopenharmony_ci			break;
58862306a36Sopenharmony_ci		case CXD2880_TNRDMD_CLOCKMODE_B:
58962306a36Sopenharmony_ci			data = bw5_nomi_b;
59062306a36Sopenharmony_ci			break;
59162306a36Sopenharmony_ci		default:
59262306a36Sopenharmony_ci			return -EINVAL;
59362306a36Sopenharmony_ci		}
59462306a36Sopenharmony_ci
59562306a36Sopenharmony_ci		ret = tnr_dmd->io->write_regs(tnr_dmd->io,
59662306a36Sopenharmony_ci					      CXD2880_IO_TGT_DMD,
59762306a36Sopenharmony_ci					      0x10, data, 6);
59862306a36Sopenharmony_ci		if (ret)
59962306a36Sopenharmony_ci			return ret;
60062306a36Sopenharmony_ci
60162306a36Sopenharmony_ci		ret = tnr_dmd->io->write_reg(tnr_dmd->io,
60262306a36Sopenharmony_ci					     CXD2880_IO_TGT_DMD,
60362306a36Sopenharmony_ci					     0x4a, 0x06);
60462306a36Sopenharmony_ci		if (ret)
60562306a36Sopenharmony_ci			return ret;
60662306a36Sopenharmony_ci
60762306a36Sopenharmony_ci		ret = tnr_dmd->io->write_regs(tnr_dmd->io,
60862306a36Sopenharmony_ci					      CXD2880_IO_TGT_DMD,
60962306a36Sopenharmony_ci					      0x19, gtdofst, 2);
61062306a36Sopenharmony_ci		if (ret)
61162306a36Sopenharmony_ci			return ret;
61262306a36Sopenharmony_ci
61362306a36Sopenharmony_ci		switch (clk_mode) {
61462306a36Sopenharmony_ci		case CXD2880_TNRDMD_CLOCKMODE_A:
61562306a36Sopenharmony_ci			data = bw5_sst_a;
61662306a36Sopenharmony_ci			break;
61762306a36Sopenharmony_ci		case CXD2880_TNRDMD_CLOCKMODE_B:
61862306a36Sopenharmony_ci			data = bw5_sst_b;
61962306a36Sopenharmony_ci			break;
62062306a36Sopenharmony_ci		case CXD2880_TNRDMD_CLOCKMODE_C:
62162306a36Sopenharmony_ci			data = bw5_sst_c;
62262306a36Sopenharmony_ci			break;
62362306a36Sopenharmony_ci		default:
62462306a36Sopenharmony_ci			return -EINVAL;
62562306a36Sopenharmony_ci		}
62662306a36Sopenharmony_ci
62762306a36Sopenharmony_ci		ret = tnr_dmd->io->write_regs(tnr_dmd->io,
62862306a36Sopenharmony_ci					      CXD2880_IO_TGT_DMD,
62962306a36Sopenharmony_ci					      0x1b, data, 2);
63062306a36Sopenharmony_ci		if (ret)
63162306a36Sopenharmony_ci			return ret;
63262306a36Sopenharmony_ci
63362306a36Sopenharmony_ci		if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) {
63462306a36Sopenharmony_ci			switch (clk_mode) {
63562306a36Sopenharmony_ci			case CXD2880_TNRDMD_CLOCKMODE_A:
63662306a36Sopenharmony_ci				data = bw5_mrc_a;
63762306a36Sopenharmony_ci				break;
63862306a36Sopenharmony_ci			case CXD2880_TNRDMD_CLOCKMODE_B:
63962306a36Sopenharmony_ci				data = bw5_mrc_b;
64062306a36Sopenharmony_ci				break;
64162306a36Sopenharmony_ci			case CXD2880_TNRDMD_CLOCKMODE_C:
64262306a36Sopenharmony_ci				data = bw5_mrc_c;
64362306a36Sopenharmony_ci				break;
64462306a36Sopenharmony_ci			default:
64562306a36Sopenharmony_ci				return -EINVAL;
64662306a36Sopenharmony_ci			}
64762306a36Sopenharmony_ci
64862306a36Sopenharmony_ci			ret = tnr_dmd->io->write_regs(tnr_dmd->io,
64962306a36Sopenharmony_ci						      CXD2880_IO_TGT_DMD,
65062306a36Sopenharmony_ci						      0x4b, data, 9);
65162306a36Sopenharmony_ci			if (ret)
65262306a36Sopenharmony_ci				return ret;
65362306a36Sopenharmony_ci		}
65462306a36Sopenharmony_ci		break;
65562306a36Sopenharmony_ci
65662306a36Sopenharmony_ci	case CXD2880_DTV_BW_1_7_MHZ:
65762306a36Sopenharmony_ci
65862306a36Sopenharmony_ci		switch (clk_mode) {
65962306a36Sopenharmony_ci		case CXD2880_TNRDMD_CLOCKMODE_A:
66062306a36Sopenharmony_ci			data = bw1_7_nomi_a;
66162306a36Sopenharmony_ci			break;
66262306a36Sopenharmony_ci		case CXD2880_TNRDMD_CLOCKMODE_C:
66362306a36Sopenharmony_ci			data = bw1_7_nomi_c;
66462306a36Sopenharmony_ci			break;
66562306a36Sopenharmony_ci		case CXD2880_TNRDMD_CLOCKMODE_B:
66662306a36Sopenharmony_ci			data = bw1_7_nomi_b;
66762306a36Sopenharmony_ci			break;
66862306a36Sopenharmony_ci		default:
66962306a36Sopenharmony_ci			return -EINVAL;
67062306a36Sopenharmony_ci		}
67162306a36Sopenharmony_ci
67262306a36Sopenharmony_ci		ret = tnr_dmd->io->write_regs(tnr_dmd->io,
67362306a36Sopenharmony_ci					      CXD2880_IO_TGT_DMD,
67462306a36Sopenharmony_ci					      0x10, data, 6);
67562306a36Sopenharmony_ci		if (ret)
67662306a36Sopenharmony_ci			return ret;
67762306a36Sopenharmony_ci
67862306a36Sopenharmony_ci		ret = tnr_dmd->io->write_reg(tnr_dmd->io,
67962306a36Sopenharmony_ci					     CXD2880_IO_TGT_DMD,
68062306a36Sopenharmony_ci					     0x4a, 0x03);
68162306a36Sopenharmony_ci		if (ret)
68262306a36Sopenharmony_ci			return ret;
68362306a36Sopenharmony_ci
68462306a36Sopenharmony_ci		ret = tnr_dmd->io->write_regs(tnr_dmd->io,
68562306a36Sopenharmony_ci					      CXD2880_IO_TGT_DMD,
68662306a36Sopenharmony_ci					      0x19, gtdofst, 2);
68762306a36Sopenharmony_ci		if (ret)
68862306a36Sopenharmony_ci			return ret;
68962306a36Sopenharmony_ci
69062306a36Sopenharmony_ci		switch (clk_mode) {
69162306a36Sopenharmony_ci		case CXD2880_TNRDMD_CLOCKMODE_A:
69262306a36Sopenharmony_ci			data = bw1_7_sst_a;
69362306a36Sopenharmony_ci			break;
69462306a36Sopenharmony_ci		case CXD2880_TNRDMD_CLOCKMODE_B:
69562306a36Sopenharmony_ci			data = bw1_7_sst_b;
69662306a36Sopenharmony_ci			break;
69762306a36Sopenharmony_ci		case CXD2880_TNRDMD_CLOCKMODE_C:
69862306a36Sopenharmony_ci			data = bw1_7_sst_c;
69962306a36Sopenharmony_ci			break;
70062306a36Sopenharmony_ci		default:
70162306a36Sopenharmony_ci			return -EINVAL;
70262306a36Sopenharmony_ci		}
70362306a36Sopenharmony_ci
70462306a36Sopenharmony_ci		ret = tnr_dmd->io->write_regs(tnr_dmd->io,
70562306a36Sopenharmony_ci					      CXD2880_IO_TGT_DMD,
70662306a36Sopenharmony_ci					      0x1b, data, 2);
70762306a36Sopenharmony_ci		if (ret)
70862306a36Sopenharmony_ci			return ret;
70962306a36Sopenharmony_ci
71062306a36Sopenharmony_ci		if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) {
71162306a36Sopenharmony_ci			switch (clk_mode) {
71262306a36Sopenharmony_ci			case CXD2880_TNRDMD_CLOCKMODE_A:
71362306a36Sopenharmony_ci				data = bw1_7_mrc_a;
71462306a36Sopenharmony_ci				break;
71562306a36Sopenharmony_ci			case CXD2880_TNRDMD_CLOCKMODE_B:
71662306a36Sopenharmony_ci				data = bw1_7_mrc_b;
71762306a36Sopenharmony_ci				break;
71862306a36Sopenharmony_ci			case CXD2880_TNRDMD_CLOCKMODE_C:
71962306a36Sopenharmony_ci				data = bw1_7_mrc_c;
72062306a36Sopenharmony_ci				break;
72162306a36Sopenharmony_ci			default:
72262306a36Sopenharmony_ci				return -EINVAL;
72362306a36Sopenharmony_ci			}
72462306a36Sopenharmony_ci
72562306a36Sopenharmony_ci			ret = tnr_dmd->io->write_regs(tnr_dmd->io,
72662306a36Sopenharmony_ci						      CXD2880_IO_TGT_DMD,
72762306a36Sopenharmony_ci						      0x4b, data, 9);
72862306a36Sopenharmony_ci			if (ret)
72962306a36Sopenharmony_ci				return ret;
73062306a36Sopenharmony_ci		}
73162306a36Sopenharmony_ci		break;
73262306a36Sopenharmony_ci
73362306a36Sopenharmony_ci	default:
73462306a36Sopenharmony_ci		return -EINVAL;
73562306a36Sopenharmony_ci	}
73662306a36Sopenharmony_ci
73762306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
73862306a36Sopenharmony_ci				     CXD2880_IO_TGT_DMD,
73962306a36Sopenharmony_ci				     0x00, 0x00);
74062306a36Sopenharmony_ci	if (ret)
74162306a36Sopenharmony_ci		return ret;
74262306a36Sopenharmony_ci
74362306a36Sopenharmony_ci	return tnr_dmd->io->write_reg(tnr_dmd->io,
74462306a36Sopenharmony_ci				      CXD2880_IO_TGT_DMD,
74562306a36Sopenharmony_ci				      0xfd, 0x01);
74662306a36Sopenharmony_ci}
74762306a36Sopenharmony_ci
74862306a36Sopenharmony_cistatic int x_sleep_dvbt2_demod_setting(struct cxd2880_tnrdmd
74962306a36Sopenharmony_ci				       *tnr_dmd)
75062306a36Sopenharmony_ci{
75162306a36Sopenharmony_ci	static const u8 difint_clip[] = {
75262306a36Sopenharmony_ci		0, 1, 0, 2, 0, 4, 0, 8, 0, 16, 0, 32
75362306a36Sopenharmony_ci	};
75462306a36Sopenharmony_ci	int ret = 0;
75562306a36Sopenharmony_ci
75662306a36Sopenharmony_ci	if (!tnr_dmd)
75762306a36Sopenharmony_ci		return -EINVAL;
75862306a36Sopenharmony_ci
75962306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) {
76062306a36Sopenharmony_ci		ret = tnr_dmd->io->write_reg(tnr_dmd->io,
76162306a36Sopenharmony_ci					     CXD2880_IO_TGT_DMD,
76262306a36Sopenharmony_ci					     0x00, 0x1d);
76362306a36Sopenharmony_ci		if (ret)
76462306a36Sopenharmony_ci			return ret;
76562306a36Sopenharmony_ci
76662306a36Sopenharmony_ci		ret = tnr_dmd->io->write_regs(tnr_dmd->io,
76762306a36Sopenharmony_ci					      CXD2880_IO_TGT_DMD,
76862306a36Sopenharmony_ci					      0x47, difint_clip, 12);
76962306a36Sopenharmony_ci	}
77062306a36Sopenharmony_ci
77162306a36Sopenharmony_ci	return ret;
77262306a36Sopenharmony_ci}
77362306a36Sopenharmony_ci
77462306a36Sopenharmony_cistatic int dvbt2_set_profile(struct cxd2880_tnrdmd *tnr_dmd,
77562306a36Sopenharmony_ci			     enum cxd2880_dvbt2_profile profile)
77662306a36Sopenharmony_ci{
77762306a36Sopenharmony_ci	u8 t2_mode_tune_mode = 0;
77862306a36Sopenharmony_ci	u8 seq_not2_dtime = 0;
77962306a36Sopenharmony_ci	u8 dtime1 = 0;
78062306a36Sopenharmony_ci	u8 dtime2 = 0;
78162306a36Sopenharmony_ci	int ret;
78262306a36Sopenharmony_ci
78362306a36Sopenharmony_ci	if (!tnr_dmd)
78462306a36Sopenharmony_ci		return -EINVAL;
78562306a36Sopenharmony_ci
78662306a36Sopenharmony_ci	switch (tnr_dmd->clk_mode) {
78762306a36Sopenharmony_ci	case CXD2880_TNRDMD_CLOCKMODE_A:
78862306a36Sopenharmony_ci		dtime1 = 0x27;
78962306a36Sopenharmony_ci		dtime2 = 0x0c;
79062306a36Sopenharmony_ci		break;
79162306a36Sopenharmony_ci	case CXD2880_TNRDMD_CLOCKMODE_B:
79262306a36Sopenharmony_ci		dtime1 = 0x2c;
79362306a36Sopenharmony_ci		dtime2 = 0x0d;
79462306a36Sopenharmony_ci		break;
79562306a36Sopenharmony_ci	case CXD2880_TNRDMD_CLOCKMODE_C:
79662306a36Sopenharmony_ci		dtime1 = 0x2e;
79762306a36Sopenharmony_ci		dtime2 = 0x0e;
79862306a36Sopenharmony_ci		break;
79962306a36Sopenharmony_ci	default:
80062306a36Sopenharmony_ci		return -EINVAL;
80162306a36Sopenharmony_ci	}
80262306a36Sopenharmony_ci
80362306a36Sopenharmony_ci	switch (profile) {
80462306a36Sopenharmony_ci	case CXD2880_DVBT2_PROFILE_BASE:
80562306a36Sopenharmony_ci		t2_mode_tune_mode = 0x01;
80662306a36Sopenharmony_ci		seq_not2_dtime = dtime2;
80762306a36Sopenharmony_ci		break;
80862306a36Sopenharmony_ci
80962306a36Sopenharmony_ci	case CXD2880_DVBT2_PROFILE_LITE:
81062306a36Sopenharmony_ci		t2_mode_tune_mode = 0x05;
81162306a36Sopenharmony_ci		seq_not2_dtime = dtime1;
81262306a36Sopenharmony_ci		break;
81362306a36Sopenharmony_ci
81462306a36Sopenharmony_ci	case CXD2880_DVBT2_PROFILE_ANY:
81562306a36Sopenharmony_ci		t2_mode_tune_mode = 0x00;
81662306a36Sopenharmony_ci		seq_not2_dtime = dtime1;
81762306a36Sopenharmony_ci		break;
81862306a36Sopenharmony_ci
81962306a36Sopenharmony_ci	default:
82062306a36Sopenharmony_ci		return -EINVAL;
82162306a36Sopenharmony_ci	}
82262306a36Sopenharmony_ci
82362306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
82462306a36Sopenharmony_ci				     CXD2880_IO_TGT_DMD,
82562306a36Sopenharmony_ci				     0x00, 0x2e);
82662306a36Sopenharmony_ci	if (ret)
82762306a36Sopenharmony_ci		return ret;
82862306a36Sopenharmony_ci
82962306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
83062306a36Sopenharmony_ci				     CXD2880_IO_TGT_DMD,
83162306a36Sopenharmony_ci				     0x10, t2_mode_tune_mode);
83262306a36Sopenharmony_ci	if (ret)
83362306a36Sopenharmony_ci		return ret;
83462306a36Sopenharmony_ci
83562306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
83662306a36Sopenharmony_ci				     CXD2880_IO_TGT_DMD,
83762306a36Sopenharmony_ci				     0x00, 0x04);
83862306a36Sopenharmony_ci	if (ret)
83962306a36Sopenharmony_ci		return ret;
84062306a36Sopenharmony_ci
84162306a36Sopenharmony_ci	return tnr_dmd->io->write_reg(tnr_dmd->io,
84262306a36Sopenharmony_ci				      CXD2880_IO_TGT_DMD,
84362306a36Sopenharmony_ci				      0x2c, seq_not2_dtime);
84462306a36Sopenharmony_ci}
84562306a36Sopenharmony_ci
84662306a36Sopenharmony_ciint cxd2880_tnrdmd_dvbt2_tune1(struct cxd2880_tnrdmd *tnr_dmd,
84762306a36Sopenharmony_ci			       struct cxd2880_dvbt2_tune_param
84862306a36Sopenharmony_ci			       *tune_param)
84962306a36Sopenharmony_ci{
85062306a36Sopenharmony_ci	int ret;
85162306a36Sopenharmony_ci
85262306a36Sopenharmony_ci	if (!tnr_dmd || !tune_param)
85362306a36Sopenharmony_ci		return -EINVAL;
85462306a36Sopenharmony_ci
85562306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB)
85662306a36Sopenharmony_ci		return -EINVAL;
85762306a36Sopenharmony_ci
85862306a36Sopenharmony_ci	if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP &&
85962306a36Sopenharmony_ci	    tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE)
86062306a36Sopenharmony_ci		return -EINVAL;
86162306a36Sopenharmony_ci
86262306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN &&
86362306a36Sopenharmony_ci	    tune_param->profile == CXD2880_DVBT2_PROFILE_ANY)
86462306a36Sopenharmony_ci		return -ENOTTY;
86562306a36Sopenharmony_ci
86662306a36Sopenharmony_ci	ret =
86762306a36Sopenharmony_ci	    cxd2880_tnrdmd_common_tune_setting1(tnr_dmd, CXD2880_DTV_SYS_DVBT2,
86862306a36Sopenharmony_ci						tune_param->center_freq_khz,
86962306a36Sopenharmony_ci						tune_param->bandwidth, 0, 0);
87062306a36Sopenharmony_ci	if (ret)
87162306a36Sopenharmony_ci		return ret;
87262306a36Sopenharmony_ci
87362306a36Sopenharmony_ci	ret =
87462306a36Sopenharmony_ci	    x_tune_dvbt2_demod_setting(tnr_dmd, tune_param->bandwidth,
87562306a36Sopenharmony_ci				       tnr_dmd->clk_mode);
87662306a36Sopenharmony_ci	if (ret)
87762306a36Sopenharmony_ci		return ret;
87862306a36Sopenharmony_ci
87962306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) {
88062306a36Sopenharmony_ci		ret =
88162306a36Sopenharmony_ci		    x_tune_dvbt2_demod_setting(tnr_dmd->diver_sub,
88262306a36Sopenharmony_ci					       tune_param->bandwidth,
88362306a36Sopenharmony_ci					       tnr_dmd->diver_sub->clk_mode);
88462306a36Sopenharmony_ci		if (ret)
88562306a36Sopenharmony_ci			return ret;
88662306a36Sopenharmony_ci	}
88762306a36Sopenharmony_ci
88862306a36Sopenharmony_ci	ret = dvbt2_set_profile(tnr_dmd, tune_param->profile);
88962306a36Sopenharmony_ci	if (ret)
89062306a36Sopenharmony_ci		return ret;
89162306a36Sopenharmony_ci
89262306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) {
89362306a36Sopenharmony_ci		ret =
89462306a36Sopenharmony_ci		    dvbt2_set_profile(tnr_dmd->diver_sub, tune_param->profile);
89562306a36Sopenharmony_ci		if (ret)
89662306a36Sopenharmony_ci			return ret;
89762306a36Sopenharmony_ci	}
89862306a36Sopenharmony_ci
89962306a36Sopenharmony_ci	if (tune_param->data_plp_id == CXD2880_DVBT2_TUNE_PARAM_PLPID_AUTO)
90062306a36Sopenharmony_ci		ret = cxd2880_tnrdmd_dvbt2_set_plp_cfg(tnr_dmd, 1, 0);
90162306a36Sopenharmony_ci	else
90262306a36Sopenharmony_ci		ret =
90362306a36Sopenharmony_ci		    cxd2880_tnrdmd_dvbt2_set_plp_cfg(tnr_dmd, 0,
90462306a36Sopenharmony_ci					     (u8)(tune_param->data_plp_id));
90562306a36Sopenharmony_ci
90662306a36Sopenharmony_ci	return ret;
90762306a36Sopenharmony_ci}
90862306a36Sopenharmony_ci
90962306a36Sopenharmony_ciint cxd2880_tnrdmd_dvbt2_tune2(struct cxd2880_tnrdmd *tnr_dmd,
91062306a36Sopenharmony_ci			       struct cxd2880_dvbt2_tune_param
91162306a36Sopenharmony_ci			       *tune_param)
91262306a36Sopenharmony_ci{
91362306a36Sopenharmony_ci	u8 en_fef_intmtnt_ctrl = 1;
91462306a36Sopenharmony_ci	int ret;
91562306a36Sopenharmony_ci
91662306a36Sopenharmony_ci	if (!tnr_dmd || !tune_param)
91762306a36Sopenharmony_ci		return -EINVAL;
91862306a36Sopenharmony_ci
91962306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB)
92062306a36Sopenharmony_ci		return -EINVAL;
92162306a36Sopenharmony_ci
92262306a36Sopenharmony_ci	if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP &&
92362306a36Sopenharmony_ci	    tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE)
92462306a36Sopenharmony_ci		return -EINVAL;
92562306a36Sopenharmony_ci
92662306a36Sopenharmony_ci	switch (tune_param->profile) {
92762306a36Sopenharmony_ci	case CXD2880_DVBT2_PROFILE_BASE:
92862306a36Sopenharmony_ci		en_fef_intmtnt_ctrl = tnr_dmd->en_fef_intmtnt_base;
92962306a36Sopenharmony_ci		break;
93062306a36Sopenharmony_ci	case CXD2880_DVBT2_PROFILE_LITE:
93162306a36Sopenharmony_ci		en_fef_intmtnt_ctrl = tnr_dmd->en_fef_intmtnt_lite;
93262306a36Sopenharmony_ci		break;
93362306a36Sopenharmony_ci	case CXD2880_DVBT2_PROFILE_ANY:
93462306a36Sopenharmony_ci		if (tnr_dmd->en_fef_intmtnt_base &&
93562306a36Sopenharmony_ci		    tnr_dmd->en_fef_intmtnt_lite)
93662306a36Sopenharmony_ci			en_fef_intmtnt_ctrl = 1;
93762306a36Sopenharmony_ci		else
93862306a36Sopenharmony_ci			en_fef_intmtnt_ctrl = 0;
93962306a36Sopenharmony_ci		break;
94062306a36Sopenharmony_ci	default:
94162306a36Sopenharmony_ci		return -EINVAL;
94262306a36Sopenharmony_ci	}
94362306a36Sopenharmony_ci
94462306a36Sopenharmony_ci	ret =
94562306a36Sopenharmony_ci	    cxd2880_tnrdmd_common_tune_setting2(tnr_dmd,
94662306a36Sopenharmony_ci						CXD2880_DTV_SYS_DVBT2,
94762306a36Sopenharmony_ci						en_fef_intmtnt_ctrl);
94862306a36Sopenharmony_ci	if (ret)
94962306a36Sopenharmony_ci		return ret;
95062306a36Sopenharmony_ci
95162306a36Sopenharmony_ci	tnr_dmd->state = CXD2880_TNRDMD_STATE_ACTIVE;
95262306a36Sopenharmony_ci	tnr_dmd->frequency_khz = tune_param->center_freq_khz;
95362306a36Sopenharmony_ci	tnr_dmd->sys = CXD2880_DTV_SYS_DVBT2;
95462306a36Sopenharmony_ci	tnr_dmd->bandwidth = tune_param->bandwidth;
95562306a36Sopenharmony_ci
95662306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) {
95762306a36Sopenharmony_ci		tnr_dmd->diver_sub->state = CXD2880_TNRDMD_STATE_ACTIVE;
95862306a36Sopenharmony_ci		tnr_dmd->diver_sub->frequency_khz = tune_param->center_freq_khz;
95962306a36Sopenharmony_ci		tnr_dmd->diver_sub->sys = CXD2880_DTV_SYS_DVBT2;
96062306a36Sopenharmony_ci		tnr_dmd->diver_sub->bandwidth = tune_param->bandwidth;
96162306a36Sopenharmony_ci	}
96262306a36Sopenharmony_ci
96362306a36Sopenharmony_ci	return 0;
96462306a36Sopenharmony_ci}
96562306a36Sopenharmony_ci
96662306a36Sopenharmony_ciint cxd2880_tnrdmd_dvbt2_sleep_setting(struct cxd2880_tnrdmd
96762306a36Sopenharmony_ci				       *tnr_dmd)
96862306a36Sopenharmony_ci{
96962306a36Sopenharmony_ci	int ret;
97062306a36Sopenharmony_ci
97162306a36Sopenharmony_ci	if (!tnr_dmd)
97262306a36Sopenharmony_ci		return -EINVAL;
97362306a36Sopenharmony_ci
97462306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB)
97562306a36Sopenharmony_ci		return -EINVAL;
97662306a36Sopenharmony_ci
97762306a36Sopenharmony_ci	if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP &&
97862306a36Sopenharmony_ci	    tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE)
97962306a36Sopenharmony_ci		return -EINVAL;
98062306a36Sopenharmony_ci
98162306a36Sopenharmony_ci	ret = x_sleep_dvbt2_demod_setting(tnr_dmd);
98262306a36Sopenharmony_ci	if (ret)
98362306a36Sopenharmony_ci		return ret;
98462306a36Sopenharmony_ci
98562306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN)
98662306a36Sopenharmony_ci		ret = x_sleep_dvbt2_demod_setting(tnr_dmd->diver_sub);
98762306a36Sopenharmony_ci
98862306a36Sopenharmony_ci	return ret;
98962306a36Sopenharmony_ci}
99062306a36Sopenharmony_ci
99162306a36Sopenharmony_ciint cxd2880_tnrdmd_dvbt2_check_demod_lock(struct cxd2880_tnrdmd
99262306a36Sopenharmony_ci					  *tnr_dmd,
99362306a36Sopenharmony_ci					  enum
99462306a36Sopenharmony_ci					  cxd2880_tnrdmd_lock_result
99562306a36Sopenharmony_ci					  *lock)
99662306a36Sopenharmony_ci{
99762306a36Sopenharmony_ci	int ret;
99862306a36Sopenharmony_ci
99962306a36Sopenharmony_ci	u8 sync_stat = 0;
100062306a36Sopenharmony_ci	u8 ts_lock = 0;
100162306a36Sopenharmony_ci	u8 unlock_detected = 0;
100262306a36Sopenharmony_ci	u8 unlock_detected_sub = 0;
100362306a36Sopenharmony_ci
100462306a36Sopenharmony_ci	if (!tnr_dmd || !lock)
100562306a36Sopenharmony_ci		return -EINVAL;
100662306a36Sopenharmony_ci
100762306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB)
100862306a36Sopenharmony_ci		return -EINVAL;
100962306a36Sopenharmony_ci
101062306a36Sopenharmony_ci	if (tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE)
101162306a36Sopenharmony_ci		return -EINVAL;
101262306a36Sopenharmony_ci
101362306a36Sopenharmony_ci	ret =
101462306a36Sopenharmony_ci	    cxd2880_tnrdmd_dvbt2_mon_sync_stat(tnr_dmd, &sync_stat, &ts_lock,
101562306a36Sopenharmony_ci					       &unlock_detected);
101662306a36Sopenharmony_ci	if (ret)
101762306a36Sopenharmony_ci		return ret;
101862306a36Sopenharmony_ci
101962306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SINGLE) {
102062306a36Sopenharmony_ci		if (sync_stat == 6)
102162306a36Sopenharmony_ci			*lock = CXD2880_TNRDMD_LOCK_RESULT_LOCKED;
102262306a36Sopenharmony_ci		else if (unlock_detected)
102362306a36Sopenharmony_ci			*lock = CXD2880_TNRDMD_LOCK_RESULT_UNLOCKED;
102462306a36Sopenharmony_ci		else
102562306a36Sopenharmony_ci			*lock = CXD2880_TNRDMD_LOCK_RESULT_NOTDETECT;
102662306a36Sopenharmony_ci
102762306a36Sopenharmony_ci		return 0;
102862306a36Sopenharmony_ci	}
102962306a36Sopenharmony_ci
103062306a36Sopenharmony_ci	if (sync_stat == 6) {
103162306a36Sopenharmony_ci		*lock = CXD2880_TNRDMD_LOCK_RESULT_LOCKED;
103262306a36Sopenharmony_ci		return 0;
103362306a36Sopenharmony_ci	}
103462306a36Sopenharmony_ci
103562306a36Sopenharmony_ci	ret =
103662306a36Sopenharmony_ci	    cxd2880_tnrdmd_dvbt2_mon_sync_stat_sub(tnr_dmd, &sync_stat,
103762306a36Sopenharmony_ci						   &unlock_detected_sub);
103862306a36Sopenharmony_ci	if (ret)
103962306a36Sopenharmony_ci		return ret;
104062306a36Sopenharmony_ci
104162306a36Sopenharmony_ci	if (sync_stat == 6)
104262306a36Sopenharmony_ci		*lock = CXD2880_TNRDMD_LOCK_RESULT_LOCKED;
104362306a36Sopenharmony_ci	else if (unlock_detected && unlock_detected_sub)
104462306a36Sopenharmony_ci		*lock = CXD2880_TNRDMD_LOCK_RESULT_UNLOCKED;
104562306a36Sopenharmony_ci	else
104662306a36Sopenharmony_ci		*lock = CXD2880_TNRDMD_LOCK_RESULT_NOTDETECT;
104762306a36Sopenharmony_ci
104862306a36Sopenharmony_ci	return 0;
104962306a36Sopenharmony_ci}
105062306a36Sopenharmony_ci
105162306a36Sopenharmony_ciint cxd2880_tnrdmd_dvbt2_check_ts_lock(struct cxd2880_tnrdmd
105262306a36Sopenharmony_ci				       *tnr_dmd,
105362306a36Sopenharmony_ci				       enum
105462306a36Sopenharmony_ci				       cxd2880_tnrdmd_lock_result
105562306a36Sopenharmony_ci				       *lock)
105662306a36Sopenharmony_ci{
105762306a36Sopenharmony_ci	int ret;
105862306a36Sopenharmony_ci
105962306a36Sopenharmony_ci	u8 sync_stat = 0;
106062306a36Sopenharmony_ci	u8 ts_lock = 0;
106162306a36Sopenharmony_ci	u8 unlock_detected = 0;
106262306a36Sopenharmony_ci	u8 unlock_detected_sub = 0;
106362306a36Sopenharmony_ci
106462306a36Sopenharmony_ci	if (!tnr_dmd || !lock)
106562306a36Sopenharmony_ci		return -EINVAL;
106662306a36Sopenharmony_ci
106762306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB)
106862306a36Sopenharmony_ci		return -EINVAL;
106962306a36Sopenharmony_ci
107062306a36Sopenharmony_ci	if (tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE)
107162306a36Sopenharmony_ci		return -EINVAL;
107262306a36Sopenharmony_ci
107362306a36Sopenharmony_ci	ret =
107462306a36Sopenharmony_ci	    cxd2880_tnrdmd_dvbt2_mon_sync_stat(tnr_dmd, &sync_stat, &ts_lock,
107562306a36Sopenharmony_ci					       &unlock_detected);
107662306a36Sopenharmony_ci	if (ret)
107762306a36Sopenharmony_ci		return ret;
107862306a36Sopenharmony_ci
107962306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SINGLE) {
108062306a36Sopenharmony_ci		if (ts_lock)
108162306a36Sopenharmony_ci			*lock = CXD2880_TNRDMD_LOCK_RESULT_LOCKED;
108262306a36Sopenharmony_ci		else if (unlock_detected)
108362306a36Sopenharmony_ci			*lock = CXD2880_TNRDMD_LOCK_RESULT_UNLOCKED;
108462306a36Sopenharmony_ci		else
108562306a36Sopenharmony_ci			*lock = CXD2880_TNRDMD_LOCK_RESULT_NOTDETECT;
108662306a36Sopenharmony_ci
108762306a36Sopenharmony_ci		return 0;
108862306a36Sopenharmony_ci	}
108962306a36Sopenharmony_ci
109062306a36Sopenharmony_ci	if (ts_lock) {
109162306a36Sopenharmony_ci		*lock = CXD2880_TNRDMD_LOCK_RESULT_LOCKED;
109262306a36Sopenharmony_ci		return 0;
109362306a36Sopenharmony_ci	} else if (!unlock_detected) {
109462306a36Sopenharmony_ci		*lock = CXD2880_TNRDMD_LOCK_RESULT_NOTDETECT;
109562306a36Sopenharmony_ci		return 0;
109662306a36Sopenharmony_ci	}
109762306a36Sopenharmony_ci
109862306a36Sopenharmony_ci	ret =
109962306a36Sopenharmony_ci	    cxd2880_tnrdmd_dvbt2_mon_sync_stat_sub(tnr_dmd, &sync_stat,
110062306a36Sopenharmony_ci						   &unlock_detected_sub);
110162306a36Sopenharmony_ci	if (ret)
110262306a36Sopenharmony_ci		return ret;
110362306a36Sopenharmony_ci
110462306a36Sopenharmony_ci	if (unlock_detected && unlock_detected_sub)
110562306a36Sopenharmony_ci		*lock = CXD2880_TNRDMD_LOCK_RESULT_UNLOCKED;
110662306a36Sopenharmony_ci	else
110762306a36Sopenharmony_ci		*lock = CXD2880_TNRDMD_LOCK_RESULT_NOTDETECT;
110862306a36Sopenharmony_ci
110962306a36Sopenharmony_ci	return 0;
111062306a36Sopenharmony_ci}
111162306a36Sopenharmony_ci
111262306a36Sopenharmony_ciint cxd2880_tnrdmd_dvbt2_set_plp_cfg(struct cxd2880_tnrdmd
111362306a36Sopenharmony_ci				     *tnr_dmd, u8 auto_plp,
111462306a36Sopenharmony_ci				     u8 plp_id)
111562306a36Sopenharmony_ci{
111662306a36Sopenharmony_ci	int ret;
111762306a36Sopenharmony_ci
111862306a36Sopenharmony_ci	if (!tnr_dmd)
111962306a36Sopenharmony_ci		return -EINVAL;
112062306a36Sopenharmony_ci
112162306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB)
112262306a36Sopenharmony_ci		return -EINVAL;
112362306a36Sopenharmony_ci
112462306a36Sopenharmony_ci	if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP &&
112562306a36Sopenharmony_ci	    tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE)
112662306a36Sopenharmony_ci		return -EINVAL;
112762306a36Sopenharmony_ci
112862306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
112962306a36Sopenharmony_ci				     CXD2880_IO_TGT_DMD,
113062306a36Sopenharmony_ci				     0x00, 0x23);
113162306a36Sopenharmony_ci	if (ret)
113262306a36Sopenharmony_ci		return ret;
113362306a36Sopenharmony_ci
113462306a36Sopenharmony_ci	if (!auto_plp) {
113562306a36Sopenharmony_ci		ret = tnr_dmd->io->write_reg(tnr_dmd->io,
113662306a36Sopenharmony_ci					     CXD2880_IO_TGT_DMD,
113762306a36Sopenharmony_ci					     0xaf, plp_id);
113862306a36Sopenharmony_ci		if (ret)
113962306a36Sopenharmony_ci			return ret;
114062306a36Sopenharmony_ci	}
114162306a36Sopenharmony_ci
114262306a36Sopenharmony_ci	return tnr_dmd->io->write_reg(tnr_dmd->io,
114362306a36Sopenharmony_ci				      CXD2880_IO_TGT_DMD,
114462306a36Sopenharmony_ci				      0xad, auto_plp ? 0x00 : 0x01);
114562306a36Sopenharmony_ci}
114662306a36Sopenharmony_ci
114762306a36Sopenharmony_ciint cxd2880_tnrdmd_dvbt2_diver_fef_setting(struct cxd2880_tnrdmd
114862306a36Sopenharmony_ci					   *tnr_dmd)
114962306a36Sopenharmony_ci{
115062306a36Sopenharmony_ci	struct cxd2880_dvbt2_ofdm ofdm;
115162306a36Sopenharmony_ci	static const u8 data[] = { 0, 8, 0, 16, 0, 32, 0, 64, 0, 128, 1, 0};
115262306a36Sopenharmony_ci	int ret;
115362306a36Sopenharmony_ci
115462306a36Sopenharmony_ci	if (!tnr_dmd)
115562306a36Sopenharmony_ci		return -EINVAL;
115662306a36Sopenharmony_ci
115762306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB)
115862306a36Sopenharmony_ci		return -EINVAL;
115962306a36Sopenharmony_ci
116062306a36Sopenharmony_ci	if (tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE)
116162306a36Sopenharmony_ci		return -EINVAL;
116262306a36Sopenharmony_ci
116362306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SINGLE)
116462306a36Sopenharmony_ci		return 0;
116562306a36Sopenharmony_ci
116662306a36Sopenharmony_ci	ret = cxd2880_tnrdmd_dvbt2_mon_ofdm(tnr_dmd, &ofdm);
116762306a36Sopenharmony_ci	if (ret)
116862306a36Sopenharmony_ci		return ret;
116962306a36Sopenharmony_ci
117062306a36Sopenharmony_ci	if (!ofdm.mixed)
117162306a36Sopenharmony_ci		return 0;
117262306a36Sopenharmony_ci
117362306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
117462306a36Sopenharmony_ci				     CXD2880_IO_TGT_DMD,
117562306a36Sopenharmony_ci				     0x00, 0x1d);
117662306a36Sopenharmony_ci	if (ret)
117762306a36Sopenharmony_ci		return ret;
117862306a36Sopenharmony_ci
117962306a36Sopenharmony_ci	return tnr_dmd->io->write_regs(tnr_dmd->io,
118062306a36Sopenharmony_ci				       CXD2880_IO_TGT_DMD,
118162306a36Sopenharmony_ci				       0x47, data, 12);
118262306a36Sopenharmony_ci}
118362306a36Sopenharmony_ci
118462306a36Sopenharmony_ciint cxd2880_tnrdmd_dvbt2_check_l1post_valid(struct cxd2880_tnrdmd
118562306a36Sopenharmony_ci					    *tnr_dmd,
118662306a36Sopenharmony_ci					    u8 *l1_post_valid)
118762306a36Sopenharmony_ci{
118862306a36Sopenharmony_ci	int ret;
118962306a36Sopenharmony_ci
119062306a36Sopenharmony_ci	u8 data;
119162306a36Sopenharmony_ci
119262306a36Sopenharmony_ci	if (!tnr_dmd || !l1_post_valid)
119362306a36Sopenharmony_ci		return -EINVAL;
119462306a36Sopenharmony_ci
119562306a36Sopenharmony_ci	if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB)
119662306a36Sopenharmony_ci		return -EINVAL;
119762306a36Sopenharmony_ci
119862306a36Sopenharmony_ci	if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP &&
119962306a36Sopenharmony_ci	    tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE)
120062306a36Sopenharmony_ci		return -EINVAL;
120162306a36Sopenharmony_ci
120262306a36Sopenharmony_ci	ret = tnr_dmd->io->write_reg(tnr_dmd->io,
120362306a36Sopenharmony_ci				     CXD2880_IO_TGT_DMD,
120462306a36Sopenharmony_ci				     0x00, 0x0b);
120562306a36Sopenharmony_ci	if (ret)
120662306a36Sopenharmony_ci		return ret;
120762306a36Sopenharmony_ci
120862306a36Sopenharmony_ci	ret = tnr_dmd->io->read_regs(tnr_dmd->io,
120962306a36Sopenharmony_ci				     CXD2880_IO_TGT_DMD,
121062306a36Sopenharmony_ci				     0x86, &data, 1);
121162306a36Sopenharmony_ci	if (ret)
121262306a36Sopenharmony_ci		return ret;
121362306a36Sopenharmony_ci
121462306a36Sopenharmony_ci	*l1_post_valid = data & 0x01;
121562306a36Sopenharmony_ci
121662306a36Sopenharmony_ci	return ret;
121762306a36Sopenharmony_ci}
1218