asoc: upgrade aw88261 driver to v1.9.0.5
Version: 1.9.0.5 Optimize driver initialization timing Change-Id: I7cbc9e056e3afd0b4dd3471ec4fc718c71f3443b Signed-off-by: guoyf2 <guoyf2@lenovo.com> Reviewed-on: https://gerrit.mot.com/2204136 SME-Granted: SME Approvals Granted SLTApproved: Slta Waiver Tested-by: Jira Key Reviewed-by: Zhengming Yao <yaozm1@lenovo.com> Reviewed-by: Hujun Liao <liaohj@motorola.com> Submit-Approved: Jira Key
This commit is contained in:
1 parent
e8b5e9bb14
commit
93396078c5
5 files changed
+176
-109
No files matched your search
@@ -35,7 +35,7 @@
|
|||||||
#include "aw_log.h"
|
#include "aw_log.h"
|
||||||
#include "aw_dsp.h"
|
#include "aw_dsp.h"
|
||||||
|
|
||||||
#define AW882XX_DRIVER_VERSION "v1.9.0.4"
|
#define AW882XX_DRIVER_VERSION "v1.9.0.5"
|
||||||
#define AW882XX_I2C_NAME "aw882xxacf_smartpa"
|
#define AW882XX_I2C_NAME "aw882xxacf_smartpa"
|
||||||
|
|
||||||
#define AW_READ_CHIPID_RETRIES 5 /* 5 times */
|
#define AW_READ_CHIPID_RETRIES 5 /* 5 times */
|
||||||
|
|||||||
+128
-104
@@ -570,6 +570,113 @@ static char *aw_dev_get_prof_name(struct aw_device *aw_dev, int index)
|
|||||||
return 0;
|
return 0;
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
|
static int aw_dev_get_icalk(struct aw_device *aw_dev, int16_t *icalk)
|
||||||
|
{
|
||||||
|
int ret = -1;
|
||||||
|
unsigned int reg_val = 0;
|
||||||
|
uint16_t reg_icalk = 0;
|
||||||
|
uint16_t reg_icalkl = 0;
|
||||||
|
struct aw_vcalb_desc *desc = &aw_dev->vcalb_desc;
|
||||||
|
|
||||||
|
if (desc->icalkl_reg == AW_REG_NONE) {
|
||||||
|
ret = aw_dev->ops.aw_i2c_read(aw_dev, desc->icalk_reg, ®_val);
|
||||||
|
reg_icalk = (uint16_t)reg_val & (~desc->icalk_reg_mask);
|
||||||
|
} else {
|
||||||
|
ret = aw_dev->ops.aw_i2c_read(aw_dev, desc->icalk_reg, ®_val);
|
||||||
|
reg_icalk = (uint16_t)reg_val & (~desc->icalk_reg_mask);
|
||||||
|
ret = aw_dev->ops.aw_i2c_read(aw_dev, desc->icalkl_reg, ®_val);
|
||||||
|
reg_icalkl = (uint16_t)reg_val & (~desc->icalkl_reg_mask);
|
||||||
|
if (aw_dev->efuse_check == AW_EF_OR_CHECK)
|
||||||
|
reg_icalk = (reg_icalk >> desc->icalk_shift) | (reg_icalkl >> desc->icalkl_shift);
|
||||||
|
else
|
||||||
|
reg_icalk = (reg_icalk >> desc->icalk_shift) & (reg_icalkl >> desc->icalkl_shift);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (reg_icalk & (~desc->icalk_sign_mask))
|
||||||
|
reg_icalk = reg_icalk | (~desc->icalk_neg_mask);
|
||||||
|
|
||||||
|
*icalk = (int16_t)reg_icalk;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int aw_dev_get_vcalk(struct aw_device *aw_dev, int16_t *vcalk)
|
||||||
|
{
|
||||||
|
int ret = -1;
|
||||||
|
unsigned int reg_val = 0;
|
||||||
|
uint16_t reg_vcalk = 0;
|
||||||
|
uint16_t reg_vcalkl = 0;
|
||||||
|
struct aw_vcalb_desc *desc = &aw_dev->vcalb_desc;
|
||||||
|
|
||||||
|
if (desc->vcalkl_reg == AW_REG_NONE) {
|
||||||
|
ret = aw_dev->ops.aw_i2c_read(aw_dev, desc->vcalk_reg, ®_val);
|
||||||
|
reg_vcalk = (uint16_t)reg_val & (~desc->vcalk_reg_mask);
|
||||||
|
} else {
|
||||||
|
ret = aw_dev->ops.aw_i2c_read(aw_dev, desc->vcalk_reg, ®_val);
|
||||||
|
reg_vcalk = (uint16_t)reg_val & (~desc->vcalk_reg_mask);
|
||||||
|
ret = aw_dev->ops.aw_i2c_read(aw_dev, desc->vcalkl_reg, ®_val);
|
||||||
|
reg_vcalkl = (uint16_t)reg_val & (~desc->vcalkl_reg_mask);
|
||||||
|
if (aw_dev->efuse_check == AW_EF_OR_CHECK)
|
||||||
|
reg_vcalk = (reg_vcalk >> desc->vcalk_shift) | (reg_vcalkl >> desc->vcalkl_shift);
|
||||||
|
else
|
||||||
|
reg_vcalk = (reg_vcalk >> desc->vcalk_shift) & (reg_vcalkl >> desc->vcalkl_shift);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (reg_vcalk & (~desc->vcalk_sign_mask))
|
||||||
|
reg_vcalk = reg_vcalk | (~desc->vcalk_neg_mask);
|
||||||
|
|
||||||
|
*vcalk = (int16_t)reg_vcalk;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int aw_dev_set_vcalb(struct aw_device *aw_dev)
|
||||||
|
{
|
||||||
|
int ret = -1;
|
||||||
|
unsigned int reg_val;
|
||||||
|
int vcalb;
|
||||||
|
int icalk;
|
||||||
|
int vcalk;
|
||||||
|
int16_t icalk_val = 0;
|
||||||
|
int16_t vcalk_val = 0;
|
||||||
|
|
||||||
|
struct aw_vcalb_desc *desc = &aw_dev->vcalb_desc;
|
||||||
|
|
||||||
|
if (desc->icalk_reg == AW_REG_NONE || desc->vcalb_reg == AW_REG_NONE) {
|
||||||
|
aw_dev_info(aw_dev->dev, "REG None!");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = aw_dev_get_icalk(aw_dev, &icalk_val);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = aw_dev_get_vcalk(aw_dev, &vcalk_val);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
icalk = desc->cabl_base_value + desc->icalk_value_factor * icalk_val;
|
||||||
|
vcalk = desc->cabl_base_value + desc->vcalk_value_factor * vcalk_val;
|
||||||
|
if (!vcalk) {
|
||||||
|
aw_dev_err(aw_dev->dev, "vcalk is 0");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
vcalb = desc->vcal_factor * icalk / vcalk;
|
||||||
|
|
||||||
|
reg_val = (unsigned int)vcalb;
|
||||||
|
aw_dev_info(aw_dev->dev, "icalk=%d, vcalk=%d, vcalb=%d, reg_val=0x%04x",
|
||||||
|
icalk, vcalk, vcalb, reg_val);
|
||||||
|
|
||||||
|
ret = aw_dev->ops.aw_i2c_write(aw_dev, desc->vcalb_reg, reg_val);
|
||||||
|
|
||||||
|
aw_dev_info(aw_dev->dev, "done");
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*pwd enable update reg*/
|
/*pwd enable update reg*/
|
||||||
static int aw_dev_reg_fw_update(struct aw_device *aw_dev)
|
static int aw_dev_reg_fw_update(struct aw_device *aw_dev)
|
||||||
{
|
{
|
||||||
@@ -579,6 +686,7 @@ static int aw_dev_reg_fw_update(struct aw_device *aw_dev)
|
|||||||
unsigned int read_val;
|
unsigned int read_val;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
unsigned int init_volume = 0;
|
unsigned int init_volume = 0;
|
||||||
|
unsigned int efcheck_val = 0;
|
||||||
struct aw_int_desc *int_desc = &aw_dev->int_desc;
|
struct aw_int_desc *int_desc = &aw_dev->int_desc;
|
||||||
struct aw_profctrl_desc *profctrl_desc = &aw_dev->profctrl_desc;
|
struct aw_profctrl_desc *profctrl_desc = &aw_dev->profctrl_desc;
|
||||||
struct aw_bstctrl_desc *bstctrl_desc = &aw_dev->bstctrl_desc;
|
struct aw_bstctrl_desc *bstctrl_desc = &aw_dev->bstctrl_desc;
|
||||||
@@ -655,6 +763,16 @@ static int aw_dev_reg_fw_update(struct aw_device *aw_dev)
|
|||||||
reg_val |= read_val;
|
reg_val |= read_val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (reg_addr == aw_dev->efcheck_desc.reg) {
|
||||||
|
efcheck_val = reg_val & (~aw_dev->efcheck_desc.mask);
|
||||||
|
if (efcheck_val == aw_dev->efcheck_desc.or_val)
|
||||||
|
aw_dev->efuse_check = AW_EF_OR_CHECK;
|
||||||
|
else
|
||||||
|
aw_dev->efuse_check = AW_EF_AND_CHECK;
|
||||||
|
|
||||||
|
aw_dev_info(aw_dev->dev, "efuse check: %d", aw_dev->efuse_check);
|
||||||
|
}
|
||||||
|
|
||||||
if (reg_addr == aw_dev->vcalb_desc.vcalb_reg)
|
if (reg_addr == aw_dev->vcalb_desc.vcalb_reg)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@@ -667,6 +785,12 @@ static int aw_dev_reg_fw_update(struct aw_device *aw_dev)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret = aw_dev_set_vcalb(aw_dev);
|
||||||
|
if (ret < 0) {
|
||||||
|
aw_dev_err(aw_dev->dev, "can't set vcalb");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
aw_dev->ops.aw_get_volume(aw_dev, &init_volume);
|
aw_dev->ops.aw_get_volume(aw_dev, &init_volume);
|
||||||
aw_dev->volume_desc.init_volume = init_volume;
|
aw_dev->volume_desc.init_volume = init_volume;
|
||||||
|
|
||||||
@@ -789,104 +913,6 @@ static void aw_dev_mute(struct aw_device *aw_dev, bool mute)
|
|||||||
aw_dev_info(aw_dev->dev, "done");
|
aw_dev_info(aw_dev->dev, "done");
|
||||||
}
|
}
|
||||||
|
|
||||||
static int aw_dev_get_icalk(struct aw_device *aw_dev, int16_t *icalk)
|
|
||||||
{
|
|
||||||
int ret = -1;
|
|
||||||
unsigned int reg_val = 0;
|
|
||||||
uint16_t reg_icalk = 0;
|
|
||||||
uint16_t reg_icalkl = 0;
|
|
||||||
struct aw_vcalb_desc *desc = &aw_dev->vcalb_desc;
|
|
||||||
|
|
||||||
if (desc->icalkl_reg == AW_REG_NONE) {
|
|
||||||
ret = aw_dev->ops.aw_i2c_read(aw_dev, desc->icalk_reg, ®_val);
|
|
||||||
reg_icalk = (uint16_t)reg_val & (~desc->icalk_reg_mask);
|
|
||||||
} else {
|
|
||||||
ret = aw_dev->ops.aw_i2c_read(aw_dev, desc->icalk_reg, ®_val);
|
|
||||||
reg_icalk = (uint16_t)reg_val & (~desc->icalk_reg_mask);
|
|
||||||
ret = aw_dev->ops.aw_i2c_read(aw_dev, desc->icalkl_reg, ®_val);
|
|
||||||
reg_icalkl = (uint16_t)reg_val & (~desc->icalkl_reg_mask);
|
|
||||||
reg_icalk = (reg_icalk >> desc->icalk_shift) | (reg_icalkl >> desc->icalkl_shift);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (reg_icalk & (~desc->icalk_sign_mask))
|
|
||||||
reg_icalk = reg_icalk | (~desc->icalk_neg_mask);
|
|
||||||
|
|
||||||
*icalk = (int16_t)reg_icalk;
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int aw_dev_get_vcalk(struct aw_device *aw_dev, int16_t *vcalk)
|
|
||||||
{
|
|
||||||
int ret = -1;
|
|
||||||
unsigned int reg_val = 0;
|
|
||||||
uint16_t reg_vcalk = 0;
|
|
||||||
uint16_t reg_vcalkl = 0;
|
|
||||||
struct aw_vcalb_desc *desc = &aw_dev->vcalb_desc;
|
|
||||||
|
|
||||||
if (desc->vcalkl_reg == AW_REG_NONE) {
|
|
||||||
ret = aw_dev->ops.aw_i2c_read(aw_dev, desc->vcalk_reg, ®_val);
|
|
||||||
reg_vcalk = (uint16_t)reg_val & (~desc->vcalk_reg_mask);
|
|
||||||
} else {
|
|
||||||
ret = aw_dev->ops.aw_i2c_read(aw_dev, desc->vcalk_reg, ®_val);
|
|
||||||
reg_vcalk = (uint16_t)reg_val & (~desc->vcalk_reg_mask);
|
|
||||||
ret = aw_dev->ops.aw_i2c_read(aw_dev, desc->vcalkl_reg, ®_val);
|
|
||||||
reg_vcalkl = (uint16_t)reg_val & (~desc->vcalkl_reg_mask);
|
|
||||||
reg_vcalk = (reg_vcalk >> desc->vcalk_shift) | (reg_vcalkl >> desc->vcalkl_shift);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (reg_vcalk & (~desc->vcalk_sign_mask))
|
|
||||||
reg_vcalk = reg_vcalk | (~desc->vcalk_neg_mask);
|
|
||||||
|
|
||||||
*vcalk = (int16_t)reg_vcalk;
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int aw_dev_set_vcalb(struct aw_device *aw_dev)
|
|
||||||
{
|
|
||||||
int ret = -1;
|
|
||||||
unsigned int reg_val;
|
|
||||||
int vcalb;
|
|
||||||
int icalk;
|
|
||||||
int vcalk;
|
|
||||||
int16_t icalk_val = 0;
|
|
||||||
int16_t vcalk_val = 0;
|
|
||||||
|
|
||||||
struct aw_vcalb_desc *desc = &aw_dev->vcalb_desc;
|
|
||||||
|
|
||||||
if (desc->icalk_reg == AW_REG_NONE || desc->vcalb_reg == AW_REG_NONE) {
|
|
||||||
aw_dev_info(aw_dev->dev, "REG None!");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = aw_dev_get_icalk(aw_dev, &icalk_val);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
ret = aw_dev_get_vcalk(aw_dev, &vcalk_val);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
icalk = desc->cabl_base_value + desc->icalk_value_factor * icalk_val;
|
|
||||||
vcalk = desc->cabl_base_value + desc->vcalk_value_factor * vcalk_val;
|
|
||||||
if (!vcalk) {
|
|
||||||
aw_dev_err(aw_dev->dev, "vcalk is 0");
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
vcalb = desc->vcal_factor * icalk / vcalk;
|
|
||||||
|
|
||||||
reg_val = (unsigned int)vcalb;
|
|
||||||
aw_dev_info(aw_dev->dev, "icalk=%d, vcalk=%d, vcalb=%d, reg_val=0x%04x",
|
|
||||||
icalk, vcalk, vcalb, reg_val);
|
|
||||||
|
|
||||||
ret = aw_dev->ops.aw_i2c_write(aw_dev, desc->vcalb_reg, reg_val);
|
|
||||||
|
|
||||||
aw_dev_info(aw_dev->dev, "done");
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int aw_dev_get_int_status(struct aw_device *aw_dev, uint16_t *int_status)
|
int aw_dev_get_int_status(struct aw_device *aw_dev, uint16_t *int_status)
|
||||||
{
|
{
|
||||||
@@ -1186,8 +1212,6 @@ int aw_device_irq_reinit(struct aw_device *aw_dev)
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
/*update vcalb*/
|
|
||||||
aw_dev_set_vcalb(aw_dev);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -1217,10 +1241,10 @@ int aw_device_init(struct aw_device *aw_dev, struct aw_container *aw_cfg)
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
ret = aw_dev_set_vcalb(aw_dev);
|
if (aw_dev->ops.aw_frcset_check) {
|
||||||
if (ret < 0) {
|
ret = aw_dev->ops.aw_frcset_check(aw_dev);
|
||||||
aw_dev_err(aw_dev->dev, "can't set vcalb");
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
aw_dev->status = AW_DEV_PW_ON;
|
aw_dev->status = AW_DEV_PW_ON;
|
||||||
|
|||||||
@@ -28,6 +28,12 @@ enum {
|
|||||||
AW_DEV_TYPE_NONE = 1,
|
AW_DEV_TYPE_NONE = 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
enum {
|
||||||
|
AW_EF_AND_CHECK = 0,
|
||||||
|
AW_EF_OR_CHECK,
|
||||||
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
AW_DEV_CH_PRI_L = 0,
|
AW_DEV_CH_PRI_L = 0,
|
||||||
AW_DEV_CH_PRI_R = 1,
|
AW_DEV_CH_PRI_R = 1,
|
||||||
@@ -68,6 +74,7 @@ struct aw_device_ops {
|
|||||||
void (*aw_set_algo)(struct aw_device *aw_dev);
|
void (*aw_set_algo)(struct aw_device *aw_dev);
|
||||||
unsigned int (*aw_get_irq_type)(struct aw_device *aw_dev, unsigned int value);
|
unsigned int (*aw_get_irq_type)(struct aw_device *aw_dev, unsigned int value);
|
||||||
void (*aw_reg_force_set)(struct aw_device *aw_dev);
|
void (*aw_reg_force_set)(struct aw_device *aw_dev);
|
||||||
|
int (*aw_frcset_check)(struct aw_device *aw_dev);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct aw_int_desc {
|
struct aw_int_desc {
|
||||||
@@ -195,12 +202,20 @@ struct aw_container {
|
|||||||
uint8_t data[];
|
uint8_t data[];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct aw_efcheck_desc {
|
||||||
|
unsigned int reg;
|
||||||
|
unsigned int mask;
|
||||||
|
unsigned int and_val;
|
||||||
|
unsigned int or_val;
|
||||||
|
};
|
||||||
|
|
||||||
struct aw_device {
|
struct aw_device {
|
||||||
int index;
|
int index;
|
||||||
int status;
|
int status;
|
||||||
int bstcfg_enable;
|
int bstcfg_enable;
|
||||||
int frcset_en;
|
int frcset_en;
|
||||||
int bop_en;
|
int bop_en;
|
||||||
|
int efuse_check;
|
||||||
unsigned int mute_st;
|
unsigned int mute_st;
|
||||||
unsigned int amppd_st;
|
unsigned int amppd_st;
|
||||||
|
|
||||||
@@ -238,6 +253,7 @@ struct aw_device {
|
|||||||
struct aw_monitor_desc monitor_desc;
|
struct aw_monitor_desc monitor_desc;
|
||||||
struct aw_soft_rst soft_rst;
|
struct aw_soft_rst soft_rst;
|
||||||
struct aw_bop_desc bop_desc;
|
struct aw_bop_desc bop_desc;
|
||||||
|
struct aw_efcheck_desc efcheck_desc;
|
||||||
struct aw_device_ops ops;
|
struct aw_device_ops ops;
|
||||||
struct list_head list_node;
|
struct list_head list_node;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -311,6 +311,7 @@ static int aw_pid_1852_dev_init(struct aw882xx *aw882xx, int index)
|
|||||||
aw_pa->volume_desc.mute_volume = AW_PID_1852_MUTE_VOL;
|
aw_pa->volume_desc.mute_volume = AW_PID_1852_MUTE_VOL;
|
||||||
|
|
||||||
aw_pa->bop_desc.reg = AW_REG_NONE;
|
aw_pa->bop_desc.reg = AW_REG_NONE;
|
||||||
|
aw_pa->efcheck_desc.reg = AW_REG_NONE;
|
||||||
|
|
||||||
aw_pa->soft_rst.reg = AW_PID_1852_ID_REG;
|
aw_pa->soft_rst.reg = AW_PID_1852_ID_REG;
|
||||||
aw_pa->soft_rst.reg_value = AW882XX_SOFT_RESET_VALUE;
|
aw_pa->soft_rst.reg_value = AW882XX_SOFT_RESET_VALUE;
|
||||||
@@ -595,6 +596,7 @@ static int aw_pid_2013_dev_init(struct aw882xx *aw882xx, int index)
|
|||||||
aw_pa->volume_desc.mute_volume = AW_PID_2013_MUTE_VOL;
|
aw_pa->volume_desc.mute_volume = AW_PID_2013_MUTE_VOL;
|
||||||
|
|
||||||
aw_pa->bop_desc.reg = AW_REG_NONE;
|
aw_pa->bop_desc.reg = AW_REG_NONE;
|
||||||
|
aw_pa->efcheck_desc.reg = AW_REG_NONE;
|
||||||
|
|
||||||
aw_pa->soft_rst.reg = AW_PID_2013_ID_REG;
|
aw_pa->soft_rst.reg = AW_PID_2013_ID_REG;
|
||||||
aw_pa->soft_rst.reg_value = AW882XX_SOFT_RESET_VALUE;
|
aw_pa->soft_rst.reg_value = AW882XX_SOFT_RESET_VALUE;
|
||||||
@@ -851,6 +853,7 @@ static int aw_pid_2032_dev_init(struct aw882xx *aw882xx, int index)
|
|||||||
aw_pa->volume_desc.mute_volume = AW_PID_2032_MUTE_VOL;
|
aw_pa->volume_desc.mute_volume = AW_PID_2032_MUTE_VOL;
|
||||||
|
|
||||||
aw_pa->bop_desc.reg = AW_REG_NONE;
|
aw_pa->bop_desc.reg = AW_REG_NONE;
|
||||||
|
aw_pa->efcheck_desc.reg = AW_REG_NONE;
|
||||||
|
|
||||||
aw_pa->soft_rst.reg = AW_PID_2032_ID_REG;
|
aw_pa->soft_rst.reg = AW_PID_2032_ID_REG;
|
||||||
aw_pa->soft_rst.reg_value = AW882XX_SOFT_RESET_VALUE;
|
aw_pa->soft_rst.reg_value = AW882XX_SOFT_RESET_VALUE;
|
||||||
@@ -1059,6 +1062,7 @@ static int aw_pid_2055_dev_init(struct aw882xx *aw882xx, int index)
|
|||||||
aw_pa->cco_mux_desc.bypass_val = AW_PID_2055_CCO_MUX_BYPASS_VALUE;
|
aw_pa->cco_mux_desc.bypass_val = AW_PID_2055_CCO_MUX_BYPASS_VALUE;
|
||||||
|
|
||||||
aw_pa->bop_desc.reg = AW_REG_NONE;
|
aw_pa->bop_desc.reg = AW_REG_NONE;
|
||||||
|
aw_pa->efcheck_desc.reg = AW_REG_NONE;
|
||||||
|
|
||||||
aw_pa->soft_rst.reg = AW_PID_2055_ID_REG;
|
aw_pa->soft_rst.reg = AW_PID_2055_ID_REG;
|
||||||
aw_pa->soft_rst.reg_value = AW882XX_SOFT_RESET_VALUE;
|
aw_pa->soft_rst.reg_value = AW882XX_SOFT_RESET_VALUE;
|
||||||
@@ -1321,6 +1325,7 @@ static int aw_pid_2071_dev_init(struct aw882xx *aw882xx, int index)
|
|||||||
aw_pa->volume_desc.mute_volume = AW_PID_2071_MUTE_VOL;
|
aw_pa->volume_desc.mute_volume = AW_PID_2071_MUTE_VOL;
|
||||||
|
|
||||||
aw_pa->bop_desc.reg = AW_REG_NONE;
|
aw_pa->bop_desc.reg = AW_REG_NONE;
|
||||||
|
aw_pa->efcheck_desc.reg = AW_REG_NONE;
|
||||||
|
|
||||||
aw_pa->soft_rst.reg = AW_PID_2071_ID_REG;
|
aw_pa->soft_rst.reg = AW_PID_2071_ID_REG;
|
||||||
aw_pa->soft_rst.reg_value = AW882XX_SOFT_RESET_VALUE;
|
aw_pa->soft_rst.reg_value = AW882XX_SOFT_RESET_VALUE;
|
||||||
@@ -1462,11 +1467,12 @@ static unsigned int aw_pid_2113_get_irq_type(struct aw_device *aw_dev,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void aw_pid_2113_efver_check(struct aw_device *aw_dev)
|
static int aw_pid_2113_frcset_check(struct aw_device *aw_dev)
|
||||||
{
|
{
|
||||||
unsigned int reg_val = 0;
|
unsigned int reg_val = 0;
|
||||||
uint16_t temh = 0;
|
uint16_t temh = 0;
|
||||||
uint16_t teml = 0;
|
uint16_t teml = 0;
|
||||||
|
uint16_t tem = 0;
|
||||||
|
|
||||||
aw_dev->ops.aw_i2c_read(aw_dev,
|
aw_dev->ops.aw_i2c_read(aw_dev,
|
||||||
AW_PID_2113_EFRH3_REG, ®_val);
|
AW_PID_2113_EFRH3_REG, ®_val);
|
||||||
@@ -1476,13 +1482,19 @@ static void aw_pid_2113_efver_check(struct aw_device *aw_dev)
|
|||||||
AW_PID_2113_EFRL3_REG, ®_val);
|
AW_PID_2113_EFRL3_REG, ®_val);
|
||||||
teml = ((uint16_t)reg_val & (~AW_PID_2113_TEML_MASK));
|
teml = ((uint16_t)reg_val & (~AW_PID_2113_TEML_MASK));
|
||||||
|
|
||||||
if ((temh | teml) == AW_PID_2113_DEFAULT_CFG)
|
if (aw_dev->efuse_check == AW_EF_OR_CHECK)
|
||||||
|
tem = (temh | teml);
|
||||||
|
else
|
||||||
|
tem = (temh & teml);
|
||||||
|
|
||||||
|
if (tem == AW_PID_2113_DEFAULT_CFG)
|
||||||
aw_dev->frcset_en = AW_FRCSET_ENABLE;
|
aw_dev->frcset_en = AW_FRCSET_ENABLE;
|
||||||
else
|
else
|
||||||
aw_dev->frcset_en = AW_FRCSET_DISABLE;
|
aw_dev->frcset_en = AW_FRCSET_DISABLE;
|
||||||
|
|
||||||
aw_dev_info(aw_dev->dev, "tem is 0x%04x, frcset_en is %d",
|
aw_dev_info(aw_dev->dev, "tem is 0x%04x, frcset_en is %d",
|
||||||
(temh | teml), aw_dev->frcset_en);
|
tem, aw_dev->frcset_en);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void aw_pid_2113_reg_force_set(struct aw_device *aw_dev)
|
static void aw_pid_2113_reg_force_set(struct aw_device *aw_dev)
|
||||||
@@ -1556,6 +1568,7 @@ static int aw_pid_2113_dev_init(struct aw882xx *aw882xx, int index)
|
|||||||
aw_pa->ops.aw_get_reg_num = aw_pid_2113_get_reg_num;
|
aw_pa->ops.aw_get_reg_num = aw_pid_2113_get_reg_num;
|
||||||
aw_pa->ops.aw_get_irq_type = aw_pid_2113_get_irq_type;
|
aw_pa->ops.aw_get_irq_type = aw_pid_2113_get_irq_type;
|
||||||
aw_pa->ops.aw_reg_force_set = aw_pid_2113_reg_force_set;
|
aw_pa->ops.aw_reg_force_set = aw_pid_2113_reg_force_set;
|
||||||
|
aw_pa->ops.aw_frcset_check = aw_pid_2113_frcset_check;
|
||||||
|
|
||||||
aw_pa->int_desc.mask_reg = AW_PID_2113_SYSINTM_REG;
|
aw_pa->int_desc.mask_reg = AW_PID_2113_SYSINTM_REG;
|
||||||
aw_pa->int_desc.mask_default = AW_PID_2113_SYSINTM_DEFAULT;
|
aw_pa->int_desc.mask_default = AW_PID_2113_SYSINTM_DEFAULT;
|
||||||
@@ -1640,7 +1653,10 @@ static int aw_pid_2113_dev_init(struct aw882xx *aw882xx, int index)
|
|||||||
AW_PID_2113_INIT_CHECK_VALUE);
|
AW_PID_2113_INIT_CHECK_VALUE);
|
||||||
usleep_range(AW_3000_US, AW_3000_US +10);
|
usleep_range(AW_3000_US, AW_3000_US +10);
|
||||||
|
|
||||||
aw_pid_2113_efver_check(aw_pa);
|
aw_pa->efcheck_desc.reg = AW_PID_2113_DBGCTRL_REG;
|
||||||
|
aw_pa->efcheck_desc.mask = AW_PID_2113_EF_DBMD_MASK;
|
||||||
|
aw_pa->efcheck_desc.and_val = AW_PID_2113_AND_VALUE;
|
||||||
|
aw_pa->efcheck_desc.or_val = AW_PID_2113_OR_VALUE;
|
||||||
|
|
||||||
ret = aw_device_probe(aw_pa);
|
ret = aw_device_probe(aw_pa);
|
||||||
|
|
||||||
|
|||||||
@@ -2270,6 +2270,17 @@ const unsigned char aw_pid_2113_reg_access[AW_PID_2113_REG_MAX] = {
|
|||||||
|
|
||||||
|
|
||||||
/* detail information of registers end */
|
/* detail information of registers end */
|
||||||
|
|
||||||
|
|
||||||
|
/********************************************
|
||||||
|
* Efdbmd
|
||||||
|
*******************************************/
|
||||||
|
#define AW_PID_2113_EF_DBMD_MASK (0xfff7)
|
||||||
|
#define AW_PID_2113_AND_VALUE (0x0000)
|
||||||
|
#define AW_PID_2113_OR_VALUE (0x0008)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************************************
|
/********************************************
|
||||||
* Volume Coefficient
|
* Volume Coefficient
|
||||||
*******************************************/
|
*******************************************/
|
||||||
|
|||||||
Reference in new issue
Block a user