diff options
Diffstat (limited to 'sound/soc/sdca/sdca_asoc.c')
| -rw-r--r-- | sound/soc/sdca/sdca_asoc.c | 89 |
1 files changed, 16 insertions, 73 deletions
diff --git a/sound/soc/sdca/sdca_asoc.c b/sound/soc/sdca/sdca_asoc.c index c493ec530cc5..2d328bbb95b9 100644 --- a/sound/soc/sdca/sdca_asoc.c +++ b/sound/soc/sdca/sdca_asoc.c @@ -115,50 +115,6 @@ int sdca_asoc_count_component(struct device *dev, struct sdca_function_data *fun } EXPORT_SYMBOL_NS(sdca_asoc_count_component, "SND_SOC_SDCA"); -static const char *get_terminal_name(enum sdca_terminal_type type) -{ - switch (type) { - case SDCA_TERM_TYPE_LINEIN_STEREO: - return SDCA_TERM_TYPE_LINEIN_STEREO_NAME; - case SDCA_TERM_TYPE_LINEIN_FRONT_LR: - return SDCA_TERM_TYPE_LINEIN_FRONT_LR_NAME; - case SDCA_TERM_TYPE_LINEIN_CENTER_LFE: - return SDCA_TERM_TYPE_LINEIN_CENTER_LFE_NAME; - case SDCA_TERM_TYPE_LINEIN_SURROUND_LR: - return SDCA_TERM_TYPE_LINEIN_SURROUND_LR_NAME; - case SDCA_TERM_TYPE_LINEIN_REAR_LR: - return SDCA_TERM_TYPE_LINEIN_REAR_LR_NAME; - case SDCA_TERM_TYPE_LINEOUT_STEREO: - return SDCA_TERM_TYPE_LINEOUT_STEREO_NAME; - case SDCA_TERM_TYPE_LINEOUT_FRONT_LR: - return SDCA_TERM_TYPE_LINEOUT_FRONT_LR_NAME; - case SDCA_TERM_TYPE_LINEOUT_CENTER_LFE: - return SDCA_TERM_TYPE_LINEOUT_CENTER_LFE_NAME; - case SDCA_TERM_TYPE_LINEOUT_SURROUND_LR: - return SDCA_TERM_TYPE_LINEOUT_SURROUND_LR_NAME; - case SDCA_TERM_TYPE_LINEOUT_REAR_LR: - return SDCA_TERM_TYPE_LINEOUT_REAR_LR_NAME; - case SDCA_TERM_TYPE_MIC_JACK: - return SDCA_TERM_TYPE_MIC_JACK_NAME; - case SDCA_TERM_TYPE_STEREO_JACK: - return SDCA_TERM_TYPE_STEREO_JACK_NAME; - case SDCA_TERM_TYPE_FRONT_LR_JACK: - return SDCA_TERM_TYPE_FRONT_LR_JACK_NAME; - case SDCA_TERM_TYPE_CENTER_LFE_JACK: - return SDCA_TERM_TYPE_CENTER_LFE_JACK_NAME; - case SDCA_TERM_TYPE_SURROUND_LR_JACK: - return SDCA_TERM_TYPE_SURROUND_LR_JACK_NAME; - case SDCA_TERM_TYPE_REAR_LR_JACK: - return SDCA_TERM_TYPE_REAR_LR_JACK_NAME; - case SDCA_TERM_TYPE_HEADPHONE_JACK: - return SDCA_TERM_TYPE_HEADPHONE_JACK_NAME; - case SDCA_TERM_TYPE_HEADSET_JACK: - return SDCA_TERM_TYPE_HEADSET_JACK_NAME; - default: - return NULL; - } -} - static int entity_early_parse_ge(struct device *dev, struct sdca_function_data *function, struct sdca_entity *entity) @@ -217,7 +173,7 @@ static int entity_early_parse_ge(struct device *dev, type = sdca_range(range, SDCA_SELECTED_MODE_TERM_TYPE, i); values[i + 3] = sdca_range(range, SDCA_SELECTED_MODE_INDEX, i); - texts[i + 3] = get_terminal_name(type); + texts[i + 3] = sdca_find_terminal_name(type); if (!texts[i + 3]) { dev_err(dev, "%s: unrecognised terminal type: %#x\n", entity->label, type); @@ -337,7 +293,7 @@ static int entity_parse_ot(struct device *dev, static int entity_pde_event(struct snd_soc_dapm_widget *widget, struct snd_kcontrol *kctl, int event) { - struct snd_soc_component *component = widget->dapm->component; + struct snd_soc_component *component = snd_soc_dapm_to_component(widget->dapm); struct sdca_entity *entity = widget->priv; static const int polls = 100; unsigned int reg, val; @@ -499,7 +455,7 @@ static int entity_parse_su_device(struct device *dev, return -EINVAL; } - add_route(route, entity->label, get_terminal_name(term), + add_route(route, entity->label, sdca_find_terminal_name(term), entity->sources[affected->val - 1]->label); } } @@ -655,7 +611,7 @@ static int entity_parse_mu(struct device *dev, static int entity_cs_event(struct snd_soc_dapm_widget *widget, struct snd_kcontrol *kctl, int event) { - struct snd_soc_component *component = widget->dapm->component; + struct snd_soc_component *component = snd_soc_dapm_to_component(widget->dapm); struct sdca_entity *entity = widget->priv; if (!component) @@ -795,7 +751,6 @@ static int control_limit_kctl(struct device *dev, struct sdca_control_range *range; int min, max, step; unsigned int *tlv; - int shift; if (control->type != SDCA_CTL_DATATYPE_Q7P8DB) return 0; @@ -814,37 +769,22 @@ static int control_limit_kctl(struct device *dev, min = sign_extend32(min, control->nbits - 1); max = sign_extend32(max, control->nbits - 1); - /* - * FIXME: Only support power of 2 step sizes as this can be supported - * by a simple shift. - */ - if (hweight32(step) != 1) { - dev_err(dev, "%s: %s: currently unsupported step size\n", - entity->label, control->label); - return -EINVAL; - } - - /* - * The SDCA volumes are in steps of 1/256th of a dB, a step down of - * 64 (shift of 6) gives 1/4dB. 1/4dB is the smallest unit that is also - * representable in the ALSA TLVs which are in 1/100ths of a dB. - */ - shift = max(ffs(step) - 1, 6); - tlv = devm_kcalloc(dev, 4, sizeof(*tlv), GFP_KERNEL); if (!tlv) return -ENOMEM; - tlv[0] = SNDRV_CTL_TLVT_DB_SCALE; + tlv[0] = SNDRV_CTL_TLVT_DB_MINMAX; tlv[1] = 2 * sizeof(*tlv); tlv[2] = (min * 100) >> 8; - tlv[3] = ((1 << shift) * 100) >> 8; + tlv[3] = (max * 100) >> 8; + + step = (step * 100) >> 8; - mc->min = min >> shift; - mc->max = max >> shift; - mc->shift = shift; - mc->rshift = shift; - mc->sign_bit = 15 - shift; + mc->min = ((int)tlv[2] / step); + mc->max = ((int)tlv[3] / step); + mc->shift = step; + mc->sign_bit = 15; + mc->sdca_q78 = 1; kctl->tlv.p = tlv; kctl->access |= SNDRV_CTL_ELEM_ACCESS_TLV_READ; @@ -902,6 +842,9 @@ static int populate_control(struct device *dev, mc->min = 0; mc->max = clamp((0x1ull << control->nbits) - 1, 0, type_max(mc->max)); + if (SDCA_CTL_TYPE(entity->type, control->sel) == SDCA_CTL_TYPE_S(FU, MUTE)) + mc->invert = true; + (*kctl)->name = control_name; (*kctl)->private_value = (unsigned long)mc; (*kctl)->iface = SNDRV_CTL_ELEM_IFACE_MIXER; |
