Loading asoc/codecs/wsa881x-analog.c +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> Loading Loading @@ -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; Loading @@ -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 Loading Loading @@ -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), Loading Loading @@ -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]); Loading Loading @@ -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, Loading Loading
asoc/codecs/wsa881x-analog.c +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> Loading Loading @@ -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; Loading @@ -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 Loading Loading @@ -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), Loading Loading @@ -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]); Loading Loading @@ -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, Loading