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

Commit e01d700c authored by Helen Koike's avatar Helen Koike Committed by Mark Brown
Browse files

ASoC: tpa6130a2: Use snd soc volsw functions



Use snd_soc_{info,get,put}_volsw instead of custom volume functions

Signed-off-by: default avatarLars-Peter Clausen <lars@metafoo.de>
[koike: port for upstream]
Signed-off-by: default avatarHelen Koike <helen.koike@collabora.co.uk>
[On N900]
Tested-By: default avatarSebastian Reichel <sre@kernel.org>
Reviewed-By: default avatarSebastian Reichel <sre@kernel.org>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent a0d5ff44
Loading
Loading
Loading
Loading
+2 −62
Original line number Diff line number Diff line
@@ -114,64 +114,6 @@ static int tpa6130a2_power(u8 power)
	return ret;
}

static int tpa6130a2_get_volsw(struct snd_kcontrol *kcontrol,
		struct snd_ctl_elem_value *ucontrol)
{
	struct soc_mixer_control *mc =
		(struct soc_mixer_control *)kcontrol->private_value;
	struct tpa6130a2_data *data;
	unsigned int reg = mc->reg;
	unsigned int shift = mc->shift;
	int max = mc->max, val;
	unsigned int mask = (1 << fls(max)) - 1;
	unsigned int invert = mc->invert;

	if (WARN_ON(!tpa6130a2_client))
		return -EINVAL;
	data = i2c_get_clientdata(tpa6130a2_client);

	mutex_lock(&data->mutex);

	regmap_read(data->regmap, reg, &val);
	ucontrol->value.integer.value[0] = (val >> shift) & mask;

	if (invert)
		ucontrol->value.integer.value[0] =
			max - ucontrol->value.integer.value[0];

	mutex_unlock(&data->mutex);
	return 0;
}

static int tpa6130a2_put_volsw(struct snd_kcontrol *kcontrol,
		struct snd_ctl_elem_value *ucontrol)
{
	struct soc_mixer_control *mc =
		(struct soc_mixer_control *)kcontrol->private_value;
	struct tpa6130a2_data *data;
	unsigned int reg = mc->reg;
	unsigned int shift = mc->shift;
	int max = mc->max;
	unsigned int mask = (1 << fls(max)) - 1;
	unsigned int invert = mc->invert;
	unsigned int val = (ucontrol->value.integer.value[0] & mask);
	bool change;

	if (WARN_ON(!tpa6130a2_client))
		return -EINVAL;
	data = i2c_get_clientdata(tpa6130a2_client);

	if (invert)
		val = max - val;

	mutex_lock(&data->mutex);
	regmap_update_bits_check(data->regmap, reg, mask << shift, val << shift,
				 &change);
	mutex_unlock(&data->mutex);

	return change;
}

/*
 * TPA6130 volume. From -59.5 to 4 dB with increasing step size when going
 * down in gain.
@@ -190,9 +132,8 @@ static const DECLARE_TLV_DB_RANGE(tpa6130_tlv,
);

static const struct snd_kcontrol_new tpa6130a2_controls[] = {
	SOC_SINGLE_EXT_TLV("Headphone Playback Volume",
	SOC_SINGLE_TLV("Headphone Playback Volume",
		       TPA6130A2_REG_VOL_MUTE, 0, 0x3f, 0,
		       tpa6130a2_get_volsw, tpa6130a2_put_volsw,
		       tpa6130_tlv),
};

@@ -203,9 +144,8 @@ static const DECLARE_TLV_DB_RANGE(tpa6140_tlv,
);

static const struct snd_kcontrol_new tpa6140a2_controls[] = {
	SOC_SINGLE_EXT_TLV("Headphone Playback Volume",
	SOC_SINGLE_TLV("Headphone Playback Volume",
		       TPA6130A2_REG_VOL_MUTE, 1, 0x1f, 0,
		       tpa6130a2_get_volsw, tpa6130a2_put_volsw,
		       tpa6140_tlv),
};