aw88081
struct aw88081 *aw88081 = snd_soc_component_get_drvdata(codec);
ucontrol->value.integer.value[0] = aw88081->aw_pa->fade_step;
struct aw88081 *aw88081 = snd_soc_component_get_drvdata(codec);
if (aw88081->aw_pa->fade_step != value) {
aw88081->aw_pa->fade_step = value;
static void aw88081_parse_channel_dt(struct aw88081 *aw88081)
struct aw_device *aw_dev = aw88081->aw_pa;
aw88081->phase_sync = of_property_read_bool(np, "awinic,sync-flag");
static int aw88081_init(struct aw88081 *aw88081, struct i2c_client *i2c, struct regmap *regmap)
aw88081->aw_pa = aw_dev;
aw88081_parse_channel_dt(aw88081);
static int aw88081_dev_init(struct aw88081 *aw88081, struct aw_container *aw_cfg)
struct aw_device *aw_dev = aw88081->aw_pa;
ret = aw88081_dev_fw_update(aw88081);
aw88081_stop(aw88081);
static int aw88081_request_firmware_file(struct aw88081 *aw88081)
aw88081->aw_pa->fw_status = AW88081_DEV_FW_FAILED;
ret = request_firmware(&cont, AW88081_ACF_FILE, aw88081->aw_pa->dev);
dev_dbg(aw88081->aw_pa->dev, "loaded %s - size: %zu\n",
aw88081->aw_cfg = devm_kzalloc(aw88081->aw_pa->dev, cont->size + sizeof(int), GFP_KERNEL);
if (!aw88081->aw_cfg) {
aw88081->aw_cfg->len = (int)cont->size;
memcpy(aw88081->aw_cfg->data, cont->data, cont->size);
ret = aw88395_dev_load_acf_check(aw88081->aw_pa, aw88081->aw_cfg);
mutex_lock(&aw88081->lock);
ret = aw88081_dev_init(aw88081, aw88081->aw_cfg);
mutex_unlock(&aw88081->lock);
struct aw88081 *aw88081 = snd_soc_component_get_drvdata(component);
mutex_lock(&aw88081->lock);
aw88081_start(aw88081, AW88081_ASYNC_START);
aw88081_stop(aw88081);
mutex_unlock(&aw88081->lock);
struct aw88081 *aw88081 = snd_soc_component_get_drvdata(component);
INIT_DELAYED_WORK(&aw88081->start_work, aw88081_startup_work);
ret = aw88081_request_firmware_file(aw88081);
dev_err(aw88081->aw_pa->dev, "%s: request firmware failed\n", __func__);
struct aw88081 *aw88081 = snd_soc_component_get_drvdata(aw_codec);
cancel_delayed_work_sync(&aw88081->start_work);
struct aw88081 *aw88081;
aw88081 = devm_kzalloc(&i2c->dev, sizeof(*aw88081), GFP_KERNEL);
if (!aw88081)
aw88081->devtype = id->driver_data;
mutex_init(&aw88081->lock);
i2c_set_clientdata(i2c, aw88081);
switch (aw88081->devtype) {
aw88081->regmap = devm_regmap_init_i2c(i2c, regmap_config);
if (IS_ERR(aw88081->regmap))
return dev_err_probe(&i2c->dev, PTR_ERR(aw88081->regmap),
ret = aw88081_init(aw88081, i2c, aw88081->regmap);
static void aw88083_i2c_wen(struct aw88081 *aw88081, bool flag)
struct aw_device *aw_dev = aw88081->aw_pa;
if (aw88081->devtype != AW88083)
static int aw88081_reg_value_check(struct aw88081 *aw88081,
struct aw_device *aw_dev = aw88081->aw_pa;
switch (aw88081->devtype) {
static int aw88081_dev_reg_update(struct aw88081 *aw88081,
struct aw_device *aw_dev = aw88081->aw_pa;
ret = aw88081_reg_value_check(aw88081, reg_addr, ®_val);
static int aw88081_dev_fw_update(struct aw88081 *aw88081)
struct aw_device *aw_dev = aw88081->aw_pa;
ret = aw88081_dev_reg_update(aw88081, sec_desc[AW88395_DATA_TYPE_REG].data,
static int aw88081_dev_start(struct aw88081 *aw88081)
struct aw_device *aw_dev = aw88081->aw_pa;
static int aw88083_dev_start(struct aw88081 *aw88081)
struct aw_device *aw_dev = aw88081->aw_pa;
aw88083_i2c_wen(aw88081, true);
aw88083_i2c_wen(aw88081, false);
static int aw88081_device_start(struct aw88081 *aw88081)
switch (aw88081->devtype) {
ret = aw88081_dev_start(aw88081);
ret = aw88083_dev_start(aw88081);
dev_err(aw88081->aw_pa->dev, "unsupported device\n");
static int aw88081_dev_stop(struct aw88081 *aw88081)
struct aw_device *aw_dev = aw88081->aw_pa;
static int aw88083_dev_stop(struct aw88081 *aw88081)
struct aw_device *aw_dev = aw88081->aw_pa;
aw88083_i2c_wen(aw88081, true);
aw88083_i2c_wen(aw88081, false);
static int aw88081_stop(struct aw88081 *aw88081)
switch (aw88081->devtype) {
ret = aw88081_dev_stop(aw88081);
ret = aw88083_dev_stop(aw88081);
dev_err(aw88081->aw_pa->dev, "unsupported device\n");
static int aw88081_reg_update(struct aw88081 *aw88081, bool force)
struct aw_device *aw_dev = aw88081->aw_pa;
ret = aw88081_dev_fw_update(aw88081);
ret = aw88081_dev_fw_update(aw88081);
static void aw88081_start_pa(struct aw88081 *aw88081)
ret = aw88081_reg_update(aw88081, aw88081->phase_sync);
dev_err(aw88081->aw_pa->dev, "fw update failed, cnt:%d\n", i);
ret = aw88081_device_start(aw88081);
dev_err(aw88081->aw_pa->dev, "aw88081 device start failed. retry = %d", i);
dev_dbg(aw88081->aw_pa->dev, "start success\n");
struct aw88081 *aw88081 =
container_of(work, struct aw88081, start_work.work);
mutex_lock(&aw88081->lock);
aw88081_start_pa(aw88081);
mutex_unlock(&aw88081->lock);
static void aw88081_start(struct aw88081 *aw88081, bool sync_start)
if (aw88081->aw_pa->fw_status != AW88081_DEV_FW_OK)
if (aw88081->aw_pa->status == AW88081_DEV_PW_ON)
aw88081_start_pa(aw88081);
&aw88081->start_work,
struct aw88081 *aw88081 = snd_soc_component_get_drvdata(component);
struct aw_device *aw_dev = aw88081->aw_pa;
struct aw88081 *aw88081 = snd_soc_component_get_drvdata(component);
struct aw_device *aw_dev = aw88081->aw_pa;
struct aw88081 *aw88081 = snd_soc_component_get_drvdata(component);
struct aw_device *aw_dev = aw88081->aw_pa;
struct aw88081 *aw88081 = snd_soc_component_get_drvdata(component);
struct aw_device *aw_dev = aw88081->aw_pa;
struct aw88081 *aw88081 = snd_soc_component_get_drvdata(codec);
count = aw88081->aw_pa->prof_info.count;
ret = aw88081_dev_get_prof_name(aw88081->aw_pa, count, &prof_name);
struct aw88081 *aw88081 = snd_soc_component_get_drvdata(codec);
ucontrol->value.integer.value[0] = aw88081->aw_pa->prof_index;
struct aw88081 *aw88081 = snd_soc_component_get_drvdata(codec);
mutex_lock(&aw88081->lock);
ret = aw88081_dev_set_profile_index(aw88081->aw_pa, ucontrol->value.integer.value[0]);
mutex_unlock(&aw88081->lock);
if (aw88081->aw_pa->status) {
aw88081_stop(aw88081);
aw88081_start(aw88081, AW88081_SYNC_START);
mutex_unlock(&aw88081->lock);
struct aw88081 *aw88081 = snd_soc_component_get_drvdata(codec);
struct aw_volume_desc *vol_desc = &aw88081->aw_pa->volume_desc;
struct aw88081 *aw88081 = snd_soc_component_get_drvdata(codec);
struct aw_volume_desc *vol_desc = &aw88081->aw_pa->volume_desc;
aw88083_i2c_wen(aw88081, true);
aw88081_dev_set_volume(aw88081->aw_pa, vol_desc->ctl_volume);
aw88083_i2c_wen(aw88081, false);