History

ASoC: SDCA: Export Q7.8 volume control helpers

Export the Q7.8 volume control helpers to allow reuse by other ASoC drivers. These functions handle 16-bit signed Q7.8 fixed-point format values for volume controls. Changes include: - Rename q78_get_volsw to sdca_asoc_q78_get_volsw - Rename q78_put_volsw to sdca_asoc_q78_put_volsw - Add a convenience macro SDCA_SINGLE_Q78_TLV and SDCA_DOUBLE_Q78_TLV for creating mixer controls This allows other ASoC drivers to easily implement controls using the Q7.8 fixed-point format without duplicating code.

Niranjan H Y committed 7 months ago

Commit ba2a0e81 parent 04cc4762 files · +50 −7Browse files

Showing the changes to include (1 of 2 files). Show all

Unified · Split

include/sound/sdca_asoc.h+42−1
@@ -13,6 +13,8 @@ · 12 unmodified lines
1313 struct device;
1414 struct regmap;
1515 struct sdca_function_data;
16+struct snd_ctl_elem_value;
17+struct snd_kcontrol;
1618 struct snd_kcontrol_new;
1719 struct snd_pcm_hw_params;
1820 struct snd_pcm_substream;
@@ -23,6 +25,42 @@ struct snd_soc_dai_ops; · 4 unmodified lines
2325 struct snd_soc_dapm_route;
2426 struct snd_soc_dapm_widget;
2527
28+/* convenient macro to handle the mono volume in 7.8 fixed format representation */
29+#define SDCA_SINGLE_Q78_TLV(xname, xreg, xmin, xmax, xstep, tlv_array) \
30+{ \
31+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
32+ .name = (xname), \
33+ .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | SNDRV_CTL_ELEM_ACCESS_READWRITE, \
34+ .tlv.p = (tlv_array), \
35+ .info = snd_soc_info_volsw, \
36+ .get = sdca_asoc_q78_get_volsw, \
37+ .put = sdca_asoc_q78_put_volsw, \
38+ .private_value = (unsigned long)&(struct soc_mixer_control) { \
39+ .reg = (xreg), .rreg = (xreg), \
40+ .min = (xmin), .max = (xmax), \
41+ .shift = (xstep), .rshift = (xstep), \
42+ .sign_bit = 15 \
43+ } \
44+}
45+
46+/* convenient macro for stereo volume in 7.8 fixed format with separate registers for L/R */
47+#define SDCA_DOUBLE_Q78_TLV(xname, xreg_l, xreg_r, xmin, xmax, xstep, tlv_array) \
48+{ \
49+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
50+ .name = (xname), \
51+ .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | SNDRV_CTL_ELEM_ACCESS_READWRITE, \
52+ .tlv.p = (tlv_array), \
53+ .info = snd_soc_info_volsw, \
54+ .get = sdca_asoc_q78_get_volsw, \
55+ .put = sdca_asoc_q78_put_volsw, \
56+ .private_value = (unsigned long)&(struct soc_mixer_control) { \
57+ .reg = (xreg_l), .rreg = (xreg_r), \
58+ .min = (xmin), .max = (xmax), \
59+ .shift = (xstep), .rshift = (xstep), \
60+ .sign_bit = 15 \
61+ } \
62+}
63+
2664 int sdca_asoc_count_component(struct device *dev, struct sdca_function_data *function,
2765 int *num_widgets, int *num_routes, int *num_controls,
2866 int *num_dais);
@@ -57,5 +95,8 @@ int sdca_asoc_hw_params(struct device *dev, struct regmap *regmap, · 28 unmodified lines
5795 struct snd_pcm_substream *substream,
5896 struct snd_pcm_hw_params *params,
5997 struct snd_soc_dai *dai);
60−
98+int sdca_asoc_q78_put_volsw(struct snd_kcontrol *kcontrol,
99+ struct snd_ctl_elem_value *ucontrol);
100+int sdca_asoc_q78_get_volsw(struct snd_kcontrol *kcontrol,
101+ struct snd_ctl_elem_value *ucontrol);
61102 #endif // __SDCA_ASOC_H__