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

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
...@@ -401,6 +401,11 @@ struct rt5645_eq_param_s { ...@@ -401,6 +401,11 @@ struct rt5645_eq_param_s {
unsigned short val; unsigned short val;
}; };
struct rt5645_eq_param_s_be16 {
__be16 reg;
__be16 val;
};
static const char *const rt5645_supply_names[] = { static const char *const rt5645_supply_names[] = {
"avdd", "avdd",
"cpvdd", "cpvdd",
...@@ -672,8 +677,8 @@ static int rt5645_hweq_get(struct snd_kcontrol *kcontrol, ...@@ -672,8 +677,8 @@ static int rt5645_hweq_get(struct snd_kcontrol *kcontrol,
{ {
struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component); struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
struct rt5645_eq_param_s *eq_param = struct rt5645_eq_param_s_be16 *eq_param =
(struct rt5645_eq_param_s *)ucontrol->value.bytes.data; (struct rt5645_eq_param_s_be16 *)ucontrol->value.bytes.data;
int i; int i;
for (i = 0; i < RT5645_HWEQ_NUM; i++) { for (i = 0; i < RT5645_HWEQ_NUM; i++) {
...@@ -698,36 +703,33 @@ static int rt5645_hweq_put(struct snd_kcontrol *kcontrol, ...@@ -698,36 +703,33 @@ static int rt5645_hweq_put(struct snd_kcontrol *kcontrol,
{ {
struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component); struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
struct rt5645_eq_param_s *eq_param = struct rt5645_eq_param_s_be16 *eq_param =
(struct rt5645_eq_param_s *)ucontrol->value.bytes.data; (struct rt5645_eq_param_s_be16 *)ucontrol->value.bytes.data;
int i; int i;
for (i = 0; i < RT5645_HWEQ_NUM; i++) { for (i = 0; i < RT5645_HWEQ_NUM; i++) {
eq_param[i].reg = be16_to_cpu(eq_param[i].reg); rt5645->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].val = be16_to_cpu(eq_param[i].val);
} }
/* The final setting of the table should be RT5645_EQ_CTRL2 */ /* The final setting of the table should be RT5645_EQ_CTRL2 */
for (i = RT5645_HWEQ_NUM - 1; i >= 0; i--) { for (i = RT5645_HWEQ_NUM - 1; i >= 0; i--) {
if (eq_param[i].reg == 0) if (rt5645->eq_param[i].reg == 0)
continue; continue;
else if (eq_param[i].reg != RT5645_EQ_CTRL2) else if (rt5645->eq_param[i].reg != RT5645_EQ_CTRL2)
return 0; return 0;
else else
break; break;
} }
for (i = 0; i < RT5645_HWEQ_NUM; i++) { for (i = 0; i < RT5645_HWEQ_NUM; i++) {
if (!rt5645_validate_hweq(eq_param[i].reg) && if (!rt5645_validate_hweq(rt5645->eq_param[i].reg) &&
eq_param[i].reg != 0) rt5645->eq_param[i].reg != 0)
return 0; return 0;
else if (eq_param[i].reg == 0) else if (rt5645->eq_param[i].reg == 0)
break; break;
} }
memcpy(rt5645->eq_param, eq_param,
RT5645_HWEQ_NUM * sizeof(struct rt5645_eq_param_s));
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment