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

Unverified Commit 60b52ed6 authored by Bard liao's avatar Bard liao Committed by Mark Brown
Browse files

ASoC: rt5645: store eq kcontrol byte in __be



The eq parameters binary is stored in __be. However, it is unsigned short
in rt5645_eq_param_s{} which will cause incorrect type assignment. So add
struct rt5645_eq_param_s_be16{} to store the eq binary and convert it to
unsigned short in rt5645->eq_param.

Cc: Oder Chiou <oder_chiou@realtek.com>
Signed-off-by: default avatarBard liao <yung-chuan.liao@linux.intel.com>
Signed-off-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent b468f379
Loading
Loading
Loading
Loading
+16 −14
Original line number Diff line number Diff line
@@ -401,6 +401,11 @@ struct rt5645_eq_param_s {
	unsigned short val;
};

struct rt5645_eq_param_s_be16 {
	__be16 reg;
	__be16 val;
};

static const char *const rt5645_supply_names[] = {
	"avdd",
	"cpvdd",
@@ -672,8 +677,8 @@ static int rt5645_hweq_get(struct snd_kcontrol *kcontrol,
{
	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
	struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
	struct rt5645_eq_param_s *eq_param =
		(struct rt5645_eq_param_s *)ucontrol->value.bytes.data;
	struct rt5645_eq_param_s_be16 *eq_param =
		(struct rt5645_eq_param_s_be16 *)ucontrol->value.bytes.data;
	int i;

	for (i = 0; i < RT5645_HWEQ_NUM; i++) {
@@ -698,36 +703,33 @@ static int rt5645_hweq_put(struct snd_kcontrol *kcontrol,
{
	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
	struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
	struct rt5645_eq_param_s *eq_param =
		(struct rt5645_eq_param_s *)ucontrol->value.bytes.data;
	struct rt5645_eq_param_s_be16 *eq_param =
		(struct rt5645_eq_param_s_be16 *)ucontrol->value.bytes.data;
	int i;

	for (i = 0; i < RT5645_HWEQ_NUM; i++) {
		eq_param[i].reg = be16_to_cpu(eq_param[i].reg);
		eq_param[i].val = be16_to_cpu(eq_param[i].val);
		rt5645->eq_param[i].reg = be16_to_cpu(eq_param[i].reg);
		rt5645->eq_param[i].val = be16_to_cpu(eq_param[i].val);
	}

	/* The final setting of the table should be RT5645_EQ_CTRL2 */
	for (i = RT5645_HWEQ_NUM - 1; i >= 0; i--) {
		if (eq_param[i].reg == 0)
		if (rt5645->eq_param[i].reg == 0)
			continue;
		else if (eq_param[i].reg != RT5645_EQ_CTRL2)
		else if (rt5645->eq_param[i].reg != RT5645_EQ_CTRL2)
			return 0;
		else
			break;
	}

	for (i = 0; i < RT5645_HWEQ_NUM; i++) {
		if (!rt5645_validate_hweq(eq_param[i].reg) &&
			eq_param[i].reg != 0)
		if (!rt5645_validate_hweq(rt5645->eq_param[i].reg) &&
		    rt5645->eq_param[i].reg != 0)
			return 0;
		else if (eq_param[i].reg == 0)
		else if (rt5645->eq_param[i].reg == 0)
			break;
	}

	memcpy(rt5645->eq_param, eq_param,
		RT5645_HWEQ_NUM * sizeof(struct rt5645_eq_param_s));

	return 0;
}