Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 94212ef8 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "asoc: wsa881x: Fix to set the correct volume level"

parents e43c62d5 625f5e55
Loading
Loading
Loading
Loading
+27 −3
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
/*
 * Copyright (c) 2015-2016, 2018-2020, The Linux Foundation. All rights reserved.
 * Copyright (c) 2015-2016, 2018-2021, The Linux Foundation. All rights reserved.
 */

#include <linux/clk.h>
@@ -60,6 +60,7 @@ struct wsa881x_pdata {
	int clk_cnt;
	int enable_cnt;
	int version;
	int wsa881x_id;
	struct mutex bg_lock;
	struct mutex res_lock;
	struct delayed_work ocp_ctl_work;
@@ -73,6 +74,10 @@ enum {
	WSA881X_STATUS_I2C,
};

enum {
	WSA8810,
	WSA8815,
};
#define WSA881X_OCP_CTL_TIMER_SEC 2
#define WSA881X_OCP_CTL_TEMP_CELSIUS 25
#define WSA881X_OCP_CTL_POLL_TIMER_SEC 60
@@ -101,9 +106,14 @@ static int wsa881x_i2c_addr = -1;
static int wsa881x_probing_count;
static int wsa881x_presence_count;

/* Gain value "POS_12_DB", "POS_10P5_DB", and "POS_15_DB"
 * only support on WSA8815
 */
static const char * const wsa881x_spk_pa_gain_text[] = {
"POS_13P5_DB", "POS_12_DB", "POS_10P5_DB", "POS_9_DB", "POS_7P5_DB",
"POS_6_DB", "POS_4P5_DB", "POS_3_DB", "POS_1P5_DB", "POS_0_DB"};
"POS_18_DB", "POS_16P5_DB", "POS_15_DB", "POS_13P5_DB",
"POS_12_DB", "POS_10P5_DB", "POS_9_DB", "POS_7P5_DB",
"POS_6_DB", "POS_4P5_DB", "POS_3_DB", "POS_1P5_DB",
"POS_0_DB"};

static const struct soc_enum wsa881x_spk_pa_gain_enum[] = {
		SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(wsa881x_spk_pa_gain_text),
@@ -140,6 +150,12 @@ static int wsa881x_spk_pa_gain_put(struct snd_kcontrol *kcontrol,
			 __func__, ucontrol->value.integer.value[0]);
		return -EINVAL;
	}
	if (ucontrol->value.integer.value[0] < 3 &&
			wsa881x->wsa881x_id == WSA8810) {
		dev_err(component->dev, "%s: Unsupported gain val %ld for WSA8810\n",
				__func__, ucontrol->value.integer.value[0]);
		return -EINVAL;
	}
	wsa881x->spk_pa_gain = ucontrol->value.integer.value[0];
	dev_dbg(component->dev, "%s: ucontrol->value.integer.value[0] = %ld\n",
			 __func__, ucontrol->value.integer.value[0]);
@@ -1454,6 +1470,14 @@ static int wsa881x_i2c_probe(struct i2c_client *client,
					pdata->regmap[WSA881X_DIGITAL_SLAVE],
					WSA881X_DIGITAL_SLAVE);
		}
		pdata->wsa881x_id == wsa881x_i2c_read_device(pdata,
					WSA881X_OTP_REG_0);
		if (pdata->wsa881x_id & 0x01) {
			pdata->wsa881x_id = WSA8815;
		} else {
			pdata->wsa881x_id = WSA8810;
		}
		pr_debug("%s: wsa881x_id : %d\n", __func__, pdata->wsa881x_id);
		wsa881x_presence_count++;
		wsa881x_probing_count++;
		ret = snd_soc_register_component(&client->dev,