ret = iio_get_channel_type(mux->parent, &chan->type); if (ret < 0) {
dev_err(dev, "failed to get parent channel type\n"); return ret;
}
if (iio_channel_has_info(pchan, IIO_CHAN_INFO_RAW))
chan->info_mask_separate |= BIT(IIO_CHAN_INFO_RAW); if (iio_channel_has_info(pchan, IIO_CHAN_INFO_SCALE))
chan->info_mask_separate |= BIT(IIO_CHAN_INFO_SCALE);
if (iio_channel_has_available(pchan, IIO_CHAN_INFO_RAW))
chan->info_mask_separate_available |= BIT(IIO_CHAN_INFO_RAW);
if (state >= mux_control_states(mux->control)) {
dev_err(dev, "too many channels\n"); return -EINVAL;
}
chan->channel = state;
num_ext_info = iio_get_channel_ext_info_count(mux->parent); if (num_ext_info) return mux_configure_chan_ext_info(dev, mux, idx, num_ext_info);
return 0;
}
staticint mux_probe(struct platform_device *pdev)
{ struct device *dev = &pdev->dev; struct iio_dev *indio_dev; struct iio_channel *parent; struct mux *mux; constchar **labels; int all_children; int children;
u32 state; int sizeof_ext_info; int sizeof_priv; int i; int ret;
parent = devm_iio_channel_get(dev, "parent"); if (IS_ERR(parent)) return dev_err_probe(dev, PTR_ERR(parent), "failed to get parent channel\n");
sizeof_ext_info = iio_get_channel_ext_info_count(parent); if (sizeof_ext_info) {
sizeof_ext_info += 1; /* one extra entry for the sentinel */
sizeof_ext_info *= sizeof(*mux->ext_info);
}
all_children = device_property_string_array_count(dev, "channels"); if (all_children < 0) return all_children;
labels = devm_kmalloc_array(dev, all_children, sizeof(*labels), GFP_KERNEL); if (!labels) return -ENOMEM;
ret = device_property_read_string_array(dev, "channels", labels, all_children); if (ret < 0) return ret;
children = 0; for (state = 0; state < all_children; state++) { if (*labels[state])
children++;
} if (children <= 0) {
dev_err(dev, "not even a single child\n"); return -EINVAL;
}
for (i = 0; mux->ext_info[i].name; ++i) { if (parent->channel->ext_info[i].read)
mux->ext_info[i].read = mux_read_ext_info; if (parent->channel->ext_info[i].write)
mux->ext_info[i].write = mux_write_ext_info;
mux->ext_info[i].private = i;
}
}
mux->control = devm_mux_control_get(dev, NULL); if (IS_ERR(mux->control)) return dev_err_probe(dev, PTR_ERR(mux->control), "failed to get control-mux\n");
i = 0; for (state = 0; state < all_children; state++) { if (!*labels[state]) continue;
ret = mux_configure_channel(dev, mux, state, labels[state], i++); if (ret < 0) return ret;
}
ret = devm_iio_device_register(dev, indio_dev); if (ret) {
dev_err(dev, "failed to register iio device\n"); 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.