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.
218 lines
5.4 KiB
218 lines
5.4 KiB
/*
|
|
* Copyright (c) Hisilicon Technologies Co., Ltd.. 2019-2020. All rights reserved.
|
|
* Description: amp common device api
|
|
* Author: audio
|
|
* Create: 2019-12-30
|
|
*/
|
|
|
|
#include "drv_amp_common.h"
|
|
#include "osal_ext.h"
|
|
#include "soc_errno.h"
|
|
#include "drv_amp_debug.h"
|
|
#include "drv_proc_ext.h"
|
|
|
|
#include "drv_amp_osal.h"
|
|
#include "linux/huanglong/securec.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif /* __cplusplus */
|
|
|
|
#define AMP_INIT_INTERVAL 65 /* delay 65ms */
|
|
|
|
static td_s32 amp_pull_gpio(const amp_ctrl_gpio *gpio, td_bool dir)
|
|
{
|
|
td_s32 ret;
|
|
td_u32 value;
|
|
|
|
ret = amp_osal_gpio_set_direction(gpio);
|
|
if (ret != TD_SUCCESS) {
|
|
soc_err_print_call_fun_err(amp_osal_gpio_set_direction, ret);
|
|
return ret;
|
|
}
|
|
|
|
osal_msleep(1);
|
|
|
|
value = ((dir == TD_TRUE) ? gpio->value : !gpio->value);
|
|
ret = amp_osal_gpio_write_bit(gpio, value);
|
|
if (ret != TD_SUCCESS) {
|
|
soc_err_print_call_fun_err(amp_osal_gpio_write_bit, ret);
|
|
return ret;
|
|
}
|
|
|
|
return TD_SUCCESS;
|
|
}
|
|
|
|
td_void drv_amp_dev_hw_mute(const amp_platform_device *dev, td_bool mute)
|
|
{
|
|
td_s32 ret;
|
|
if (dev == TD_NULL) {
|
|
return;
|
|
}
|
|
|
|
soc_warn_print_u32(dev->mute_gpio.group);
|
|
soc_warn_print_u32(dev->mute_gpio.bit);
|
|
soc_warn_print_u32(dev->mute_gpio.value);
|
|
soc_warn_print_u32(dev->mute_gpio.polarity);
|
|
soc_warn_print_u32(mute);
|
|
|
|
if ((dev->mute_gpio.group == GPIO_INVALID) && (dev->mute_gpio.bit == GPIO_INVALID)) {
|
|
soc_log_warn("devid(%d) no need set mute_gpio", dev->dev_id);
|
|
return;
|
|
}
|
|
|
|
ret = amp_pull_gpio(&dev->mute_gpio, mute);
|
|
if (ret != TD_SUCCESS) {
|
|
soc_err_print_call_fun_err(amp_pull_gpio, ret);
|
|
return;
|
|
}
|
|
|
|
osal_msleep(1);
|
|
}
|
|
|
|
td_void drv_amp_dev_hw_reset(const amp_platform_device *dev, td_bool reset)
|
|
{
|
|
td_s32 ret;
|
|
if (dev == TD_NULL) {
|
|
return;
|
|
}
|
|
|
|
soc_warn_print_u32(dev->reset_gpio.group);
|
|
soc_warn_print_u32(dev->reset_gpio.bit);
|
|
soc_warn_print_u32(dev->mute_gpio.value);
|
|
soc_warn_print_u32(dev->reset_gpio.polarity);
|
|
soc_warn_print_u32(reset);
|
|
|
|
if ((dev->reset_gpio.group == GPIO_INVALID) && (dev->reset_gpio.bit == GPIO_INVALID)) {
|
|
soc_log_warn("devid(%d) no need set reset_gpio", dev->dev_id);
|
|
return;
|
|
}
|
|
|
|
ret = amp_pull_gpio(&dev->reset_gpio, reset);
|
|
if (ret != TD_SUCCESS) {
|
|
soc_err_print_call_fun_err(amp_pull_gpio, ret);
|
|
return;
|
|
}
|
|
|
|
osal_msleep(AMP_INIT_INTERVAL);
|
|
}
|
|
|
|
td_void drv_amp_dev_write_reg_map(const amp_platform_device *dev,
|
|
drv_amp_reg_map *reg_map)
|
|
{
|
|
td_s32 ret;
|
|
td_u32 addr;
|
|
td_u32 size;
|
|
td_u8 delay_ms;
|
|
td_u8 *reg = TD_NULL;
|
|
|
|
if (dev == TD_NULL) {
|
|
return;
|
|
}
|
|
|
|
while (1) {
|
|
if ((reg_map == TD_NULL) || (reg_map->addr == ENDTBL_FLAG)) {
|
|
return;
|
|
}
|
|
|
|
addr = reg_map->addr;
|
|
reg = reg_map->reg;
|
|
size = reg_map->size;
|
|
delay_ms = reg_map->delay_ms;
|
|
ret = amp_osal_i2c_write(&dev->i2c, addr, reg, size);
|
|
if (ret != TD_SUCCESS) {
|
|
soc_err_print_call_fun_err(amp_osal_i2c_write, ret);
|
|
return;
|
|
}
|
|
|
|
if (delay_ms != 0) {
|
|
osal_msleep(delay_ms);
|
|
}
|
|
|
|
reg_map++;
|
|
}
|
|
}
|
|
|
|
static td_void add_line_to_row_tail(td_u32 space_len, td_void *file)
|
|
{
|
|
td_u32 i = 0;
|
|
for (i = 0; i < space_len - 1; i++) {
|
|
if (file == TD_NULL) {
|
|
osal_proc_echo(" ");
|
|
} else {
|
|
osal_seq_printf(file, " ");
|
|
}
|
|
}
|
|
if (file == TD_NULL) {
|
|
osal_proc_echo("%s\n", "|");
|
|
} else {
|
|
osal_seq_printf(file, "%s\n", "|");
|
|
}
|
|
}
|
|
|
|
|
|
td_void drv_amp_dev_dump_reg_map(const amp_platform_device *dev, td_void *file,
|
|
const drv_amp_reg_map *reg_map)
|
|
{
|
|
td_u32 i;
|
|
td_s32 ret;
|
|
td_u32 addr;
|
|
td_u32 size;
|
|
td_u8 reg[AMP_REG_SIZE_MAX];
|
|
td_u32 space_len;
|
|
|
|
if (dev == TD_NULL) {
|
|
return;
|
|
}
|
|
|
|
if (file == TD_NULL) {
|
|
osal_proc_echo("%-4s | %-4s | %-108s |\n",
|
|
"addr", "size", "value");
|
|
} else {
|
|
osal_seq_printf(file, "%-4s | %-4s | %-108s |\n",
|
|
"addr", "size", "value");
|
|
}
|
|
|
|
while (1) {
|
|
if ((reg_map == TD_NULL) || (reg_map->addr == ENDTBL_FLAG)) {
|
|
return;
|
|
}
|
|
|
|
addr = reg_map->addr;
|
|
size = reg_map->size;
|
|
if ((size > AMP_REG_SIZE_MAX) || (size == 0)) {
|
|
return;
|
|
}
|
|
|
|
memset_s(reg, AMP_REG_SIZE_MAX, 0, sizeof(reg));
|
|
|
|
ret = amp_osal_i2c_read(&dev->i2c, addr, reg, size);
|
|
if (ret != TD_SUCCESS) {
|
|
soc_err_print_call_fun_err(amp_osal_i2c_read, ret);
|
|
return;
|
|
}
|
|
|
|
if (file == TD_NULL) {
|
|
osal_proc_echo("0x%02x | %-4d | ", addr, size);
|
|
for (i = 0; i < size; i++) {
|
|
osal_proc_echo("0x%02x ", reg[i]);
|
|
}
|
|
} else {
|
|
osal_proc_print(file, "0x%02x | %-4d | ", addr, size);
|
|
for (i = 0; i < size; i++) {
|
|
osal_seq_printf(file, "0x%02x ", reg[i]);
|
|
}
|
|
}
|
|
space_len = LINE_LENGTH - 14 - size * 5; /* 14 is addr & size len, 5 is len of value */
|
|
add_line_to_row_tail(space_len, file);
|
|
|
|
reg_map++;
|
|
}
|
|
}
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif /* __cplusplus */
|
|
|