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.
Showing the changes to include (1 of 2 files). Show all
Unified · Split
| @@ -13,6 +13,8 @@ · 12 unmodified lines | ||
| 13 | 13 | struct device; |
| 14 | 14 | struct regmap; |
| 15 | 15 | struct sdca_function_data; |
| 16 | +struct snd_ctl_elem_value; | |
| 17 | +struct snd_kcontrol; | |
| 16 | 18 | struct snd_kcontrol_new; |
| 17 | 19 | struct snd_pcm_hw_params; |
| 18 | 20 | struct snd_pcm_substream; |
| @@ -23,6 +25,42 @@ struct snd_soc_dai_ops; · 4 unmodified lines | ||
| 23 | 25 | struct snd_soc_dapm_route; |
| 24 | 26 | struct snd_soc_dapm_widget; |
| 25 | 27 | |
| 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 | + | |
| 26 | 64 | int sdca_asoc_count_component(struct device *dev, struct sdca_function_data *function, |
| 27 | 65 | int *num_widgets, int *num_routes, int *num_controls, |
| 28 | 66 | int *num_dais); |
| @@ -57,5 +95,8 @@ int sdca_asoc_hw_params(struct device *dev, struct regmap *regmap, · 28 unmodified lines | ||
| 57 | 95 | struct snd_pcm_substream *substream, |
| 58 | 96 | struct snd_pcm_hw_params *params, |
| 59 | 97 | 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); | |
| 61 | 102 | #endif // __SDCA_ASOC_H__ |