staticint audio_iio_aux_get_volsw(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
{ struct audio_iio_aux_chan *chan = (struct audio_iio_aux_chan *)kcontrol->private_value; int max = chan->max; int min = chan->min; bool invert_range = chan->is_invert_range; int ret; int val;
ret = iio_read_channel_raw(chan->iio_chan, &val); if (ret < 0) return ret;
ucontrol->value.integer.value[0] = val - min; if (invert_range)
ucontrol->value.integer.value[0] = max - ucontrol->value.integer.value[0];
return0;
}
staticint audio_iio_aux_put_volsw(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
{ struct audio_iio_aux_chan *chan = (struct audio_iio_aux_chan *)kcontrol->private_value; int max = chan->max; int min = chan->min; bool invert_range = chan->is_invert_range; int val; int ret; int tmp;
val = ucontrol->value.integer.value[0]; if (val < 0) return -EINVAL; if (val > max - min) return -EINVAL;
val = val + min; if (invert_range)
val = max - val;
ret = iio_read_channel_raw(chan->iio_chan, &tmp); if (ret < 0) return ret;
if (tmp == val) return0;
ret = iio_write_channel_raw(chan->iio_chan, val); if (ret) return ret;
staticint audio_iio_aux_component_probe(struct snd_soc_component *component)
{ struct audio_iio_aux *iio_aux = snd_soc_component_get_drvdata(component); struct audio_iio_aux_chan *chan; int ret; int i;
for (i = 0; i < iio_aux->num_chans; i++) {
chan = iio_aux->chans + i;
ret = iio_read_max_channel_raw(chan->iio_chan, &chan->max); if (ret) return dev_err_probe(component->dev, ret, "chan[%d] %s: Cannot get max raw value\n",
i, chan->name);
ret = iio_read_min_channel_raw(chan->iio_chan, &chan->min); if (ret) return dev_err_probe(component->dev, ret, "chan[%d] %s: Cannot get min raw value\n",
i, chan->name);
if (chan->min > chan->max) { /* *Thisshouldneverhappenbuttoavoidanycheck *later,justswapvaluesheretoensurethatthe *minimumvalueislowerthanthemaximumvalue.
*/
dev_dbg(component->dev, "chan[%d] %s: Swap min and max\n",
i, chan->name);
swap(chan->min, chan->max);
}
/* Set initial value */
ret = iio_write_channel_raw(chan->iio_chan,
chan->is_invert_range ? chan->max : chan->min); if (ret) return dev_err_probe(component->dev, ret, "chan[%d] %s: Cannot set initial value\n",
i, chan->name);
ret = audio_iio_aux_add_controls(component, chan); if (ret) return ret;
ret = audio_iio_aux_add_dapms(component, chan); if (ret) return ret;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.