staticint p_init1(struct cxd2880_tnrdmd *tnr_dmd)
{
u8 data = 0; int ret;
if (!tnr_dmd) return -EINVAL;
ret = tnr_dmd->io->write_reg(tnr_dmd->io,
CXD2880_IO_TGT_SYS,
0x00, 0x00); if (ret) return ret;
if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SINGLE ||
tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) { switch (tnr_dmd->create_param.ts_output_if) { case CXD2880_TNRDMD_TSOUT_IF_TS:
data = 0x00; break; case CXD2880_TNRDMD_TSOUT_IF_SPI:
data = 0x01; break; case CXD2880_TNRDMD_TSOUT_IF_SDIO:
data = 0x02; break; default: return -EINVAL;
}
ret = tnr_dmd->io->write_reg(tnr_dmd->io,
CXD2880_IO_TGT_SYS,
0x10, data); if (ret) return ret;
}
ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
CXD2880_IO_TGT_SYS,
p_init1_seq,
ARRAY_SIZE(p_init1_seq)); if (ret) return ret;
switch (tnr_dmd->chip_id) { case CXD2880_TNRDMD_CHIP_ID_CXD2880_ES1_0X:
data = 0x1a; break; case CXD2880_TNRDMD_CHIP_ID_CXD2880_ES1_11:
data = 0x16; break; default: return -ENOTTY;
}
ret = tnr_dmd->io->write_reg(tnr_dmd->io,
CXD2880_IO_TGT_SYS,
0x10, data); if (ret) return ret;
if (tnr_dmd->create_param.en_internal_ldo)
data = 0x01; else
data = 0x00;
ret = tnr_dmd->io->write_reg(tnr_dmd->io,
CXD2880_IO_TGT_SYS,
0x11, data); if (ret) return ret;
ret = tnr_dmd->io->write_reg(tnr_dmd->io,
CXD2880_IO_TGT_SYS,
0x13, data); if (ret) return ret;
ret = tnr_dmd->io->write_reg(tnr_dmd->io,
CXD2880_IO_TGT_SYS,
0x00, 0x00); if (ret) return ret;
ret = tnr_dmd->io->write_reg(tnr_dmd->io,
CXD2880_IO_TGT_SYS,
0x12, data); if (ret) return ret;
ret = tnr_dmd->io->write_reg(tnr_dmd->io,
CXD2880_IO_TGT_SYS,
0x00, 0x10); if (ret) return ret;
switch (tnr_dmd->chip_id) { case CXD2880_TNRDMD_CHIP_ID_CXD2880_ES1_0X:
data = 0x01; break; case CXD2880_TNRDMD_CHIP_ID_CXD2880_ES1_11:
data = 0x00; break; default: return -ENOTTY;
}
ret = tnr_dmd->io->write_reg(tnr_dmd->io,
CXD2880_IO_TGT_DMD,
0x69, data[0]); if (ret) return ret;
}
if (tnr_dmd->create_param.stationary_use) {
ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
CXD2880_IO_TGT_DMD,
x_tune2_seq4,
ARRAY_SIZE(x_tune2_seq4)); if (ret) return ret;
}
staticint load_cfg_mem(struct cxd2880_tnrdmd *tnr_dmd)
{ int ret;
u8 i;
if (!tnr_dmd) return -EINVAL;
for (i = 0; i < tnr_dmd->cfg_mem_last_entry; i++) {
ret = tnr_dmd->io->write_reg(tnr_dmd->io,
tnr_dmd->cfg_mem[i].tgt,
0x00, tnr_dmd->cfg_mem[i].bank); if (ret) return ret;
ret = cxd2880_io_set_reg_bits(tnr_dmd->io,
tnr_dmd->cfg_mem[i].tgt,
tnr_dmd->cfg_mem[i].address,
tnr_dmd->cfg_mem[i].value,
tnr_dmd->cfg_mem[i].bit_mask); if (ret) return ret;
}
ret = cxd2880_tnrdmd_chip_id(tnr_dmd, &tnr_dmd->chip_id); if (ret) return ret;
if (!CXD2880_TNRDMD_CHIP_ID_VALID(tnr_dmd->chip_id)) return -ENOTTY;
if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) {
ret =
cxd2880_tnrdmd_chip_id(tnr_dmd->diver_sub,
&tnr_dmd->diver_sub->chip_id); if (ret) return ret;
if (!CXD2880_TNRDMD_CHIP_ID_VALID(tnr_dmd->diver_sub->chip_id)) return -ENOTTY;
}
ret = p_init1(tnr_dmd); if (ret) return ret;
if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) {
ret = p_init1(tnr_dmd->diver_sub); if (ret) return ret;
}
usleep_range(1000, 2000);
if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) {
ret = p_init2(tnr_dmd->diver_sub); if (ret) return ret;
}
ret = p_init2(tnr_dmd); if (ret) return ret;
usleep_range(5000, 6000);
ret = p_init3(tnr_dmd); if (ret) return ret;
if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) {
ret = p_init3(tnr_dmd->diver_sub); if (ret) return ret;
}
ret = rf_init1(tnr_dmd); if (ret) return ret;
if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN)
ret = rf_init1(tnr_dmd->diver_sub);
return ret;
}
int cxd2880_tnrdmd_init2(struct cxd2880_tnrdmd *tnr_dmd)
{
u8 cpu_task_completed; int ret;
if (!tnr_dmd) return -EINVAL;
if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB) return -EINVAL;
ret = cxd2880_tnrdmd_check_internal_cpu_status(tnr_dmd,
&cpu_task_completed); if (ret) return ret;
if (!cpu_task_completed) return -EINVAL;
ret = rf_init2(tnr_dmd); if (ret) return ret;
if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) {
ret = rf_init2(tnr_dmd->diver_sub); if (ret) return ret;
}
ret = load_cfg_mem(tnr_dmd); if (ret) return ret;
if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) {
ret = load_cfg_mem(tnr_dmd->diver_sub); if (ret) return ret;
}
tnr_dmd->state = CXD2880_TNRDMD_STATE_SLEEP;
if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN)
tnr_dmd->diver_sub->state = CXD2880_TNRDMD_STATE_SLEEP;
return ret;
}
int cxd2880_tnrdmd_check_internal_cpu_status(struct cxd2880_tnrdmd
*tnr_dmd,
u8 *task_completed)
{
u16 cpu_status = 0; int ret;
if (!tnr_dmd || !task_completed) return -EINVAL;
if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB) return -EINVAL;
ret = cxd2880_tnrdmd_mon_internal_cpu_status(tnr_dmd, &cpu_status); if (ret) return ret;
if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SINGLE) { if (cpu_status == 0)
*task_completed = 1; else
*task_completed = 0;
int cxd2880_tnrdmd_common_tune_setting1(struct cxd2880_tnrdmd *tnr_dmd, enum cxd2880_dtv_sys sys,
u32 frequency_khz, enum cxd2880_dtv_bandwidth
bandwidth, u8 one_seg_opt,
u8 one_seg_opt_shft_dir)
{
u8 data; enum cxd2880_tnrdmd_clockmode new_clk_mode =
CXD2880_TNRDMD_CLOCKMODE_A; int shift_frequency_khz;
u8 cpu_task_completed; int ret;
if (!tnr_dmd) return -EINVAL;
if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB) return -EINVAL;
if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP &&
tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE) return -EINVAL;
if (frequency_khz < 4000) return -EINVAL;
ret = cxd2880_tnrdmd_sleep(tnr_dmd); if (ret) return ret;
ret = tnr_dmd->io->write_reg(tnr_dmd->io,
CXD2880_IO_TGT_SYS,
0x00,
0x00); if (ret) return ret;
ret = tnr_dmd->io->read_regs(tnr_dmd->io,
CXD2880_IO_TGT_SYS,
0x2b,
&data,
1); if (ret) return ret;
switch (sys) { case CXD2880_DTV_SYS_DVBT: if (data == 0x00) {
ret = t_power_x(tnr_dmd, 1); if (ret) return ret;
if (tnr_dmd->diver_mode ==
CXD2880_TNRDMD_DIVERMODE_MAIN) {
ret = t_power_x(tnr_dmd->diver_sub, 1); if (ret) return ret;
}
} break;
case CXD2880_DTV_SYS_DVBT2: if (data == 0x01) {
ret = t_power_x(tnr_dmd, 0); if (ret) return ret;
if (tnr_dmd->diver_mode ==
CXD2880_TNRDMD_DIVERMODE_MAIN) {
ret = t_power_x(tnr_dmd->diver_sub, 0); if (ret) return ret;
}
} break;
default: return -EINVAL;
}
ret = spll_reset(tnr_dmd, new_clk_mode); if (ret) return ret;
tnr_dmd->clk_mode = new_clk_mode;
if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) {
ret = spll_reset(tnr_dmd->diver_sub, new_clk_mode); if (ret) return ret;
tnr_dmd->diver_sub->clk_mode = new_clk_mode;
}
ret = load_cfg_mem(tnr_dmd); if (ret) return ret;
if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) {
ret = load_cfg_mem(tnr_dmd->diver_sub); if (ret) return ret;
}
if (one_seg_opt) { if (tnr_dmd->diver_mode ==
CXD2880_TNRDMD_DIVERMODE_MAIN) {
shift_frequency_khz = 350;
} else { if (one_seg_opt_shft_dir)
shift_frequency_khz = 350; else
shift_frequency_khz = -350;
if (tnr_dmd->create_param.xtal_share_type ==
CXD2880_TNRDMD_XTAL_SHARE_SLAVE)
shift_frequency_khz *= -1;
}
} else { if (tnr_dmd->diver_mode ==
CXD2880_TNRDMD_DIVERMODE_MAIN) {
shift_frequency_khz = 150;
} else { switch (tnr_dmd->create_param.xtal_share_type) { case CXD2880_TNRDMD_XTAL_SHARE_NONE: case CXD2880_TNRDMD_XTAL_SHARE_EXTREF: default:
shift_frequency_khz = 0; break; case CXD2880_TNRDMD_XTAL_SHARE_MASTER:
shift_frequency_khz = 150; break; case CXD2880_TNRDMD_XTAL_SHARE_SLAVE:
shift_frequency_khz = -150; break;
}
}
}
ret =
x_tune1(tnr_dmd, sys, frequency_khz, bandwidth,
tnr_dmd->is_cable_input, shift_frequency_khz); if (ret) return ret;
if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) {
ret =
x_tune1(tnr_dmd->diver_sub, sys, frequency_khz,
bandwidth, tnr_dmd->is_cable_input,
-shift_frequency_khz); if (ret) return ret;
}
usleep_range(10000, 11000);
ret =
cxd2880_tnrdmd_check_internal_cpu_status(tnr_dmd,
&cpu_task_completed); if (ret) return ret;
if (!cpu_task_completed) return -EINVAL;
ret =
x_tune2(tnr_dmd, bandwidth, tnr_dmd->clk_mode,
shift_frequency_khz); if (ret) return ret;
if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) {
ret =
x_tune2(tnr_dmd->diver_sub, bandwidth,
tnr_dmd->diver_sub->clk_mode,
-shift_frequency_khz); if (ret) return ret;
}
if (tnr_dmd->create_param.ts_output_if == CXD2880_TNRDMD_TSOUT_IF_TS) {
ret = set_ts_clk_mode_and_freq(tnr_dmd, sys);
} else { struct cxd2880_tnrdmd_pid_ftr_cfg *pid_ftr_cfg;
if (tnr_dmd->pid_ftr_cfg_en)
pid_ftr_cfg = &tnr_dmd->pid_ftr_cfg; else
pid_ftr_cfg = NULL;
ret = pid_ftr_setting(tnr_dmd, pid_ftr_cfg);
}
return ret;
}
int cxd2880_tnrdmd_common_tune_setting2(struct cxd2880_tnrdmd
*tnr_dmd, enum cxd2880_dtv_sys sys,
u8 en_fef_intmtnt_ctrl)
{ int ret;
if (!tnr_dmd) return -EINVAL;
if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB) return -EINVAL;
if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP &&
tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE) return -EINVAL;
ret = x_tune3(tnr_dmd, sys, en_fef_intmtnt_ctrl); if (ret) return ret;
if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN) {
ret = x_tune3(tnr_dmd->diver_sub, sys, en_fef_intmtnt_ctrl); if (ret) return ret;
ret = x_tune4(tnr_dmd); if (ret) return ret;
}
ret =
cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
CXD2880_IO_TGT_DMD,
0x00, 0x23,
data[0], 0x1f); if (ret) return ret;
ret =
cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
CXD2880_IO_TGT_DMD,
0x00, 0x24,
data[1], 0xff); if (ret) return ret;
break;
case CXD2880_TNRDMD_CFG_INTERRUPT:
data[0] = (value >> 8) & 0xff;
data[1] = value & 0xff;
ret =
cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
CXD2880_IO_TGT_SYS,
0x00, 0x48, data[0],
0xff); if (ret) return ret;
ret =
cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
CXD2880_IO_TGT_SYS,
0x00, 0x49, data[1],
0xff); if (ret) return ret; break;
case CXD2880_TNRDMD_CFG_INTERRUPT_LOCK_SEL:
data[0] = value & 0x07;
ret =
cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
CXD2880_IO_TGT_SYS,
0x00, 0x4a, data[0],
0x07); if (ret) return ret; break;
case CXD2880_TNRDMD_CFG_INTERRUPT_INV_LOCK_SEL:
data[0] = (value & 0x07) << 3;
ret =
cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
CXD2880_IO_TGT_SYS,
0x00, 0x4a, data[0],
0x38); if (ret) return ret; break;
case CXD2880_TNRDMD_CFG_FIXED_CLOCKMODE: if (value < CXD2880_TNRDMD_CLOCKMODE_UNKNOWN ||
value > CXD2880_TNRDMD_CLOCKMODE_C) return -EINVAL;
tnr_dmd->fixed_clk_mode = (enum cxd2880_tnrdmd_clockmode)value; break;
case CXD2880_TNRDMD_CFG_CABLE_INPUT:
tnr_dmd->is_cable_input = value ? 1 : 0; break;
case CXD2880_TNRDMD_CFG_DVBT2_FEF_INTERMITTENT_BASE:
tnr_dmd->en_fef_intmtnt_base = value ? 1 : 0; break;
case CXD2880_TNRDMD_CFG_DVBT2_FEF_INTERMITTENT_LITE:
tnr_dmd->en_fef_intmtnt_lite = value ? 1 : 0; break;
case CXD2880_TNRDMD_CFG_TS_BUF_ALMOST_EMPTY_THRS:
data[0] = (value >> 8) & 0x07;
data[1] = value & 0xff;
ret =
cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
CXD2880_IO_TGT_DMD,
0x00, 0x99, data[0],
0x07); if (ret) return ret;
ret =
cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
CXD2880_IO_TGT_DMD,
0x00, 0x9a, data[1],
0xff); if (ret) return ret; break;
case CXD2880_TNRDMD_CFG_TS_BUF_ALMOST_FULL_THRS:
data[0] = (value >> 8) & 0x07;
data[1] = value & 0xff;
ret =
cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
CXD2880_IO_TGT_DMD,
0x00, 0x9b, data[0],
0x07); if (ret) return ret;
ret =
cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
CXD2880_IO_TGT_DMD,
0x00, 0x9c, data[1],
0xff); if (ret) return ret; break;
case CXD2880_TNRDMD_CFG_TS_BUF_RRDY_THRS:
data[0] = (value >> 8) & 0x07;
data[1] = value & 0xff;
ret =
cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
CXD2880_IO_TGT_DMD,
0x00, 0x9d, data[0],
0x07); if (ret) return ret;
ret =
cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
CXD2880_IO_TGT_DMD,
0x00, 0x9e, data[1],
0xff); if (ret) return ret; break;
case CXD2880_TNRDMD_CFG_BLINDTUNE_DVBT2_FIRST:
tnr_dmd->blind_tune_dvbt2_first = value ? 1 : 0; break;
case CXD2880_TNRDMD_CFG_DVBT_BERN_PERIOD: if (value < 0 || value > 31) return -EINVAL;
ret =
cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
CXD2880_IO_TGT_DMD,
0x10, 0x60,
value & 0x1f, 0x1f); if (ret) return ret; break;
case CXD2880_TNRDMD_CFG_DVBT_VBER_PERIOD: if (value < 0 || value > 7) return -EINVAL;
ret =
cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
CXD2880_IO_TGT_DMD,
0x10, 0x6f,
value & 0x07, 0x07); if (ret) return ret; break;
case CXD2880_TNRDMD_CFG_DVBT2_BBER_MES: if (value < 0 || value > 15) return -EINVAL;
ret =
cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
CXD2880_IO_TGT_DMD,
0x20, 0x72,
value & 0x0f, 0x0f); if (ret) return ret; break;
case CXD2880_TNRDMD_CFG_DVBT2_LBER_MES: if (value < 0 || value > 15) return -EINVAL;
ret =
cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
CXD2880_IO_TGT_DMD,
0x20, 0x6f,
value & 0x0f, 0x0f); if (ret) return ret; break;
case CXD2880_TNRDMD_CFG_DVBT_PER_MES: if (value < 0 || value > 15) return -EINVAL;
ret =
cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
CXD2880_IO_TGT_DMD,
0x10, 0x5c,
value & 0x0f, 0x0f); if (ret) return ret; break;
case CXD2880_TNRDMD_CFG_DVBT2_PER_MES: if (value < 0 || value > 15) return -EINVAL;
ret =
cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd,
CXD2880_IO_TGT_DMD,
0x24, 0xdc,
value & 0x0f, 0x0f); if (ret) return ret; break;
default: return -EINVAL;
}
if (need_sub_setting &&
tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_MAIN)
ret = cxd2880_tnrdmd_set_cfg(tnr_dmd->diver_sub, id, value);
return ret;
}
int cxd2880_tnrdmd_gpio_set_cfg(struct cxd2880_tnrdmd *tnr_dmd,
u8 id,
u8 en, enum cxd2880_tnrdmd_gpio_mode mode,
u8 open_drain, u8 invert)
{ int ret;
if (!tnr_dmd) return -EINVAL;
if (id > 2) return -EINVAL;
if (mode > CXD2880_TNRDMD_GPIO_MODE_EEW) return -EINVAL;
if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP &&
tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE) return -EINVAL;
ret =
cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, CXD2880_IO_TGT_SYS,
0x00, 0x40 + id, mode,
0x0f); if (ret) return ret;
ret =
cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, CXD2880_IO_TGT_SYS,
0x00, 0x43,
open_drain ? (1 << id) : 0,
1 << id); if (ret) return ret;
ret =
cxd2880_tnrdmd_set_and_save_reg_bits(tnr_dmd, CXD2880_IO_TGT_SYS,
0x00, 0x44,
invert ? (1 << id) : 0,
1 << id); if (ret) return ret;
int cxd2880_tnrdmd_set_rf_lvl_cmpstn(struct cxd2880_tnrdmd
*tnr_dmd, int (*rf_lvl_cmpstn)
(struct cxd2880_tnrdmd *, int *))
{ if (!tnr_dmd) return -EINVAL;
tnr_dmd->rf_lvl_cmpstn = rf_lvl_cmpstn;
return 0;
}
int cxd2880_tnrdmd_set_rf_lvl_cmpstn_sub(struct cxd2880_tnrdmd
*tnr_dmd, int (*rf_lvl_cmpstn)
(struct cxd2880_tnrdmd *, int *))
{ if (!tnr_dmd) return -EINVAL;
if (tnr_dmd->diver_mode != CXD2880_TNRDMD_DIVERMODE_MAIN) return -EINVAL;
int cxd2880_tnrdmd_set_ts_pin_high_low(struct cxd2880_tnrdmd
*tnr_dmd, u8 en, u8 value)
{ int ret;
if (!tnr_dmd) return -EINVAL;
if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB) return -EINVAL;
if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP) return -EINVAL;
if (tnr_dmd->create_param.ts_output_if != CXD2880_TNRDMD_TSOUT_IF_TS) return -ENOTTY;
ret = tnr_dmd->io->write_reg(tnr_dmd->io,
CXD2880_IO_TGT_SYS,
0x00, 0x00); if (ret) return ret;
if (en) {
ret = tnr_dmd->io->write_reg(tnr_dmd->io,
CXD2880_IO_TGT_SYS,
0x50, ((value & 0x1f) | 0x80)); if (ret) return ret;
ret = tnr_dmd->io->write_reg(tnr_dmd->io,
CXD2880_IO_TGT_SYS,
0x52, (value & 0x1f));
} else {
ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
CXD2880_IO_TGT_SYS,
set_ts_pin_seq,
ARRAY_SIZE(set_ts_pin_seq)); if (ret) return ret;
ret = load_cfg_mem(tnr_dmd);
}
return ret;
}
int cxd2880_tnrdmd_set_ts_output(struct cxd2880_tnrdmd *tnr_dmd,
u8 en)
{ int ret;
if (!tnr_dmd) return -EINVAL;
if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB) return -EINVAL;
if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP &&
tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE) return -EINVAL;
switch (tnr_dmd->create_param.ts_output_if) { case CXD2880_TNRDMD_TSOUT_IF_TS: if (en) {
ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
CXD2880_IO_TGT_SYS,
set_ts_output_seq1,
ARRAY_SIZE(set_ts_output_seq1)); if (ret) return ret;
ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
CXD2880_IO_TGT_DMD,
set_ts_output_seq2,
ARRAY_SIZE(set_ts_output_seq2)); if (ret) return ret;
} else {
ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
CXD2880_IO_TGT_DMD,
set_ts_output_seq3,
ARRAY_SIZE(set_ts_output_seq3)); if (ret) return ret;
ret = cxd2880_io_write_multi_regs(tnr_dmd->io,
CXD2880_IO_TGT_SYS,
set_ts_output_seq4,
ARRAY_SIZE(set_ts_output_seq4)); if (ret) return ret;
} break;
case CXD2880_TNRDMD_TSOUT_IF_SPI: break;
case CXD2880_TNRDMD_TSOUT_IF_SDIO: break;
default: return -EINVAL;
}
return 0;
}
int slvt_freeze_reg(struct cxd2880_tnrdmd *tnr_dmd)
{
u8 data; int ret;
if (!tnr_dmd) return -EINVAL;
switch (tnr_dmd->create_param.ts_output_if) { case CXD2880_TNRDMD_TSOUT_IF_SPI: case CXD2880_TNRDMD_TSOUT_IF_SDIO:
ret = tnr_dmd->io->read_regs(tnr_dmd->io,
CXD2880_IO_TGT_DMD,
0x00, &data, 1); if (ret) return ret;
break; case CXD2880_TNRDMD_TSOUT_IF_TS: default: break;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.