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
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, ®_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, ®_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;
|
|
}
|
|
|