Lines Matching full:mux

15 #include <linux/mux/consumer.h>
28 struct mux { struct
38 static int iio_mux_select(struct mux *mux, int idx) in iio_mux_select() argument
40 struct mux_child *child = &mux->child[idx]; in iio_mux_select()
41 struct iio_chan_spec const *chan = &mux->chan[idx]; in iio_mux_select()
45 ret = mux_control_select(mux->control, chan->channel); in iio_mux_select()
47 mux->cached_state = -1; in iio_mux_select()
51 if (mux->cached_state == chan->channel) in iio_mux_select()
64 ret = iio_write_channel_ext_info(mux->parent, attr, in iio_mux_select()
69 mux_control_deselect(mux->control); in iio_mux_select()
70 mux->cached_state = -1; in iio_mux_select()
75 mux->cached_state = chan->channel; in iio_mux_select()
80 static void iio_mux_deselect(struct mux *mux) in iio_mux_deselect() argument
82 mux_control_deselect(mux->control); in iio_mux_deselect()
89 struct mux *mux = iio_priv(indio_dev); in mux_read_raw() local
90 int idx = chan - mux->chan; in mux_read_raw()
93 ret = iio_mux_select(mux, idx); in mux_read_raw()
99 ret = iio_read_channel_raw(mux->parent, val); in mux_read_raw()
103 ret = iio_read_channel_scale(mux->parent, val, val2); in mux_read_raw()
110 iio_mux_deselect(mux); in mux_read_raw()
120 struct mux *mux = iio_priv(indio_dev); in mux_read_avail() local
121 int idx = chan - mux->chan; in mux_read_avail()
124 ret = iio_mux_select(mux, idx); in mux_read_avail()
131 ret = iio_read_avail_channel_raw(mux->parent, vals, length); in mux_read_avail()
138 iio_mux_deselect(mux); in mux_read_avail()
147 struct mux *mux = iio_priv(indio_dev); in mux_write_raw() local
148 int idx = chan - mux->chan; in mux_write_raw()
151 ret = iio_mux_select(mux, idx); in mux_write_raw()
157 ret = iio_write_channel_raw(mux->parent, val); in mux_write_raw()
164 iio_mux_deselect(mux); in mux_write_raw()
178 struct mux *mux = iio_priv(indio_dev); in mux_read_ext_info() local
179 int idx = chan - mux->chan; in mux_read_ext_info()
182 ret = iio_mux_select(mux, idx); in mux_read_ext_info()
186 ret = iio_read_channel_ext_info(mux->parent, in mux_read_ext_info()
187 mux->ext_info[private].name, in mux_read_ext_info()
190 iio_mux_deselect(mux); in mux_read_ext_info()
200 struct mux *mux = iio_priv(indio_dev); in mux_write_ext_info() local
201 int idx = chan - mux->chan; in mux_write_ext_info()
208 ret = iio_mux_select(mux, idx); in mux_write_ext_info()
214 iio_mux_deselect(mux); in mux_write_ext_info()
220 ret = iio_write_channel_ext_info(mux->parent, in mux_write_ext_info()
221 mux->ext_info[private].name, in mux_write_ext_info()
224 iio_mux_deselect(mux); in mux_write_ext_info()
229 devm_kfree(dev, mux->child[idx].ext_info_cache[private].data); in mux_write_ext_info()
230 mux->child[idx].ext_info_cache[private].data = new; in mux_write_ext_info()
231 mux->child[idx].ext_info_cache[private].size = len; in mux_write_ext_info()
233 iio_mux_deselect(mux); in mux_write_ext_info()
238 static int mux_configure_channel(struct device *dev, struct mux *mux, in mux_configure_channel() argument
241 struct mux_child *child = &mux->child[idx]; in mux_configure_channel()
242 struct iio_chan_spec *chan = &mux->chan[idx]; in mux_configure_channel()
243 struct iio_chan_spec const *pchan = mux->parent->channel; in mux_configure_channel()
252 chan->ext_info = mux->ext_info; in mux_configure_channel()
254 ret = iio_get_channel_type(mux->parent, &chan->type); in mux_configure_channel()
268 if (state >= mux_control_states(mux->control)) { in mux_configure_channel()
275 num_ext_info = iio_get_channel_ext_info_count(mux->parent); in mux_configure_channel()
296 ret = iio_read_channel_ext_info(mux->parent, in mux_configure_channel()
297 mux->ext_info[i].name, in mux_configure_channel()
343 struct mux *mux; in mux_probe() local
364 sizeof_ext_info *= sizeof(*mux->ext_info); in mux_probe()
377 sizeof_priv = sizeof(*mux); in mux_probe()
378 sizeof_priv += sizeof(*mux->child) * children; in mux_probe()
379 sizeof_priv += sizeof(*mux->chan) * children; in mux_probe()
386 mux = iio_priv(indio_dev); in mux_probe()
387 mux->child = (struct mux_child *)(mux + 1); in mux_probe()
388 mux->chan = (struct iio_chan_spec *)(mux->child + children); in mux_probe()
392 mux->parent = parent; in mux_probe()
393 mux->cached_state = -1; in mux_probe()
398 indio_dev->channels = mux->chan; in mux_probe()
401 mux->ext_info = devm_kmemdup(dev, in mux_probe()
404 if (!mux->ext_info) in mux_probe()
407 for (i = 0; mux->ext_info[i].name; ++i) { in mux_probe()
409 mux->ext_info[i].read = mux_read_ext_info; in mux_probe()
411 mux->ext_info[i].write = mux_write_ext_info; in mux_probe()
412 mux->ext_info[i].private = i; in mux_probe()
416 mux->control = devm_mux_control_get(dev, NULL); in mux_probe()
417 if (IS_ERR(mux->control)) { in mux_probe()
418 if (PTR_ERR(mux->control) != -EPROBE_DEFER) in mux_probe()
419 dev_err(dev, "failed to get control-mux\n"); in mux_probe()
420 return PTR_ERR(mux->control); in mux_probe()
428 ret = mux_configure_channel(dev, mux, state, label, i++); in mux_probe()
443 { .compatible = "io-channel-mux" },
451 .name = "iio-mux",