You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

175 lines
3.9 KiB

/*
* Copyright (c) Hisilicon Technologies Co., Ltd. 2019-2021. All rights reserved.
* Description: LNBH25 driver
* Author: Hisilicon
* Created: 2019-10-11
*/
#include "lnbh25.h"
#include "drv_lnbctrl.h"
#include "drv_fe_time.h"
td_s32 lnbh25_init(td_u32 port, td_u8 i2c_channel, td_u8 dev_addr)
{
td_s32 ret;
lnbctrl_dev_param* param = NULL;
soc_log_dbg("port %d, I2C %d, addr 0x%x.\n", port, i2c_channel, dev_addr);
param = lnbctrl_queue_get(port);
if (param == NULL) {
param = lnbctrl_queue_insert(port, i2c_channel, dev_addr);
if (param == NULL) {
return SOC_ERR_FRONTEND_FAILED_ALLOC_MEM;
}
}
if (!param->inited) {
/* Ext 22K */
ret = lnb_write_byte(port, 0x3, 0x05);
if (ret != TD_SUCCESS) {
soc_log_err("LNBH25 %d init failed\n", port);
return ret;
}
/* 13V */
lnb_write_byte(port, 0x2, 0x01);
if (ret != TD_SUCCESS) {
soc_log_err("LNBH25 %d init failed\n", port);
return ret;
}
tuner_mdelay(10); /* 10:delay */
param->lnb_out = FRONTEND_LNB_OUT_13V;
param->inited = TD_TRUE;
}
return TD_SUCCESS;
}
td_s32 lnbh25_deinit(td_u32 port)
{
td_u8 reg_addr;
lnbctrl_dev_param *param;
param = lnbctrl_queue_get(port);
if (param == TD_NULL) {
return TD_SUCCESS;
}
for (reg_addr = 0x2; reg_addr <= 0x5; reg_addr++) {
lnb_write_byte(port, reg_addr, 0);
}
if (param->inited) {
param->inited = TD_FALSE;
}
lnbctrl_queue_remove(port);
return TD_SUCCESS;
}
static td_u8 lnbh25_get_vsel(frontend_lnb_out_level out)
{
td_u8 vsel = 0;
switch (out) {
/* 13.00V: b 0001 */
case FRONTEND_LNB_OUT_13V:
vsel = 0x1;
break;
/* 14.00V: b 0100 */
case FRONTEND_LNB_OUT_14V:
vsel = 0x4;
break;
/* 18.15V: b 1000 */
case FRONTEND_LNB_OUT_18V:
vsel = 0x8;
break;
/* 19.15V: b 1011 */
case FRONTEND_LNB_OUT_19V:
vsel = 0xb;
break;
/* 0V: b 00000 */
case FRONTEND_LNB_OUT_0V:
default:
vsel = 0x0;
break;
}
return vsel;
}
td_s32 lnbh25_set_lnb_out(td_u32 port, frontend_lnb_out_level out)
{
lnbctrl_dev_param *param = NULL;
td_u8 reg_value = 0;
td_u8 vsel;
param = lnbctrl_queue_get(port);
if (param == TD_NULL) {
return TD_FAILURE;
}
if (!param->inited) {
soc_log_err("lnbh25 %d not init.\n", port);
return TD_FAILURE;
}
vsel = lnbh25_get_vsel(out);
lnb_read_byte(port, 0x2, &reg_value);
reg_value &= 0xf0;
reg_value |= vsel;
lnb_write_byte(port, 0x2, reg_value);
param->lnb_out = out;
return TD_SUCCESS;
}
td_s32 lnbh25_standby(td_u32 port, td_u32 standby)
{
lnbctrl_dev_param* param;
param = lnbctrl_queue_get(port);
if (param == TD_NULL) {
return TD_FAILURE;
}
/* If standby, power off */
if (standby == 1) {
return lnbh25_set_lnb_out(port, FRONTEND_LNB_OUT_0V);
}
return TD_SUCCESS;
}
td_s32 lnbh25_set_ten(td_u32 port, td_bool enable)
{
lnbctrl_dev_param *param = NULL;
td_u8 reg_value = 0;
param = lnbctrl_queue_get(port);
if (param == TD_NULL) {
return TD_FAILURE;
}
lnb_read_byte(port, 0x3, &reg_value);
if (enable) {
reg_value |= 0x1 << 0;
} else {
reg_value &= ~(0x1 << 0);
}
lnb_write_byte(port, 0x3, reg_value);
return TD_SUCCESS;
}
td_s32 drv_fe_adp_lnbh25_regist_func(drv_fe_lnb_ops *lnb_ops)
{
drv_fe_check_pointer(lnb_ops);
lnb_ops->init = lnbh25_init;
lnb_ops->deinit = lnbh25_deinit;
lnb_ops->standby = lnbh25_standby;
lnb_ops->set_lnb_out = lnbh25_set_lnb_out;
lnb_ops->i2c_read_byte = lnb_read_byte;
lnb_ops->i2c_write_byte = lnb_write_byte;
return TD_SUCCESS;
}