Message ID | 20230421124122.324820-3-herve.codina@bootlin.com |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp1040692vqo; Fri, 21 Apr 2023 05:50:45 -0700 (PDT) X-Google-Smtp-Source: AKy350aPjSP/z4175NP5ugjQkxk76Jh+NqWTCCKnjM156wmwJyDzWwlEDgnKHLFysoPU55xyMuIF X-Received: by 2002:a17:90b:3e8b:b0:246:c3e1:c931 with SMTP id rj11-20020a17090b3e8b00b00246c3e1c931mr4551974pjb.23.1682081445054; Fri, 21 Apr 2023 05:50:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1682081445; cv=none; d=google.com; s=arc-20160816; b=RXgWl7Arzw3XzyqJ62hLKvrqPhyWpsViNV7vR9J4vYMwAR8FPq1iiEu1B/sHnpLRJb 6ji2QcvqgxTb5DBDBw5ZlNLnCVAL6PYL7WZX28tPZCyAq/1EFp/mw24B6R5ARu7/r7wf V8ck3IWFNYSF6da3CqKbvqLhiSLM1OH4YiTq0yGbr3dD4sPL2vXmRDgzpcgIHNIdj11Q BAF5UbnSDVHD74mfKlBEDKgUXtl8Ia/8++ruMyeDY1pEFG878TFoNxRGqXylUNbucMa2 2F4oCKcRhLUxBh5UhTnDvUSptJ+0xZYRtoVqdKS/UCNn3gyKZ5aQia84LNrpHpa970Gs Zogg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=ecGQES+IctsZxeHGmbZiv99zRKwWx/U6QMun/YsCg54=; b=LTIPTRCWo2K0EBGu1AH2wEMVPXybM/4SRAc8+ZNI1bY5Hag6oiJXiJ+zZhlFgMS4tu CFRuDfKlM5giZXwm5vyNxEIfdf0y2IL+LXj7nIr70fC/1xaCSSebseDkb/t1BV/k8vzC EK/boZiqGRoV0MPmkwlqUyhhtodDaKEheoO1xZ61EwTutSaI9IyZKbEy1vOgFuy3pfrJ vVcqHZtOLLUhSooBrYz+gWoW9qLz1BEMWRTRJvCKeYCr3MfK3KxRWHKNjI7dnQeckYBc 0EFLw6l9zjvsYa3wga6WcpOAfIEMwZQ2YutloZ57cuclOUtF432RlKOl6DbCzN488UUU OZgg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@bootlin.com header.s=gm1 header.b=Y2Uy4aX0; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=bootlin.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id x62-20020a638641000000b00520a879b9cesi4326349pgd.3.2023.04.21.05.50.31; Fri, 21 Apr 2023 05:50:45 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@bootlin.com header.s=gm1 header.b=Y2Uy4aX0; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=bootlin.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231936AbjDUMme (ORCPT <rfc822;cjcooper78@gmail.com> + 99 others); Fri, 21 Apr 2023 08:42:34 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45148 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232135AbjDUMmb (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Fri, 21 Apr 2023 08:42:31 -0400 Received: from relay2-d.mail.gandi.net (relay2-d.mail.gandi.net [IPv6:2001:4b98:dc4:8::222]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BA63FD309; Fri, 21 Apr 2023 05:42:01 -0700 (PDT) Received: (Authenticated sender: herve.codina@bootlin.com) by mail.gandi.net (Postfix) with ESMTPA id 036DE40004; Fri, 21 Apr 2023 12:41:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1682080915; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ecGQES+IctsZxeHGmbZiv99zRKwWx/U6QMun/YsCg54=; b=Y2Uy4aX0fJLJin3UbJuHlp6xKyONaXP+q/4E6traJCaV4jgmMdm3TsvfcgIBmqlsoee0CF zT9VC+AnT8ScfxXu35DaKXKyN6XZvWtUjwQULTMwh1h5C0fRNf2CwmQWLmbfleahnmYjXX SiI8pO1SgPpnwt3yS6RAHsotNbZlJdp3oPLXK5KZudsMH/cQGQy27Yy5X0sWHIZ/BZMdIV h3GITU6Nxe+bCB+QzISMmVKb1l6g/nrEiMkI0RPMX6YxPeQ3ClFV9qjERP4OZmjJCKbKd9 DtCX5vjcjqW7EPRdRpqZLWwK6U9FfWcsg03OZmma3d+DiL2V/zpDZMehsrVBvw== From: Herve Codina <herve.codina@bootlin.com> To: Herve Codina <herve.codina@bootlin.com>, Liam Girdwood <lgirdwood@gmail.com>, Mark Brown <broonie@kernel.org>, Rob Herring <robh+dt@kernel.org>, Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>, Jonathan Cameron <jic23@kernel.org>, Lars-Peter Clausen <lars@metafoo.de>, Jaroslav Kysela <perex@perex.cz>, Takashi Iwai <tiwai@suse.com> Cc: alsa-devel@alsa-project.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-iio@vger.kernel.org, Christophe Leroy <christophe.leroy@csgroup.eu>, Thomas Petazzoni <thomas.petazzoni@bootlin.com> Subject: [PATCH 2/4] iio: inkern: Add a helper to query an available minimum raw value Date: Fri, 21 Apr 2023 14:41:20 +0200 Message-Id: <20230421124122.324820-3-herve.codina@bootlin.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230421124122.324820-1-herve.codina@bootlin.com> References: <20230421124122.324820-1-herve.codina@bootlin.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_LOW,SPF_HELO_NONE, SPF_PASS,T_SCC_BODY_TEXT_LINE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1763790233222601062?= X-GMAIL-MSGID: =?utf-8?q?1763790233222601062?= |
Series |
Add support for IIO devices in ASoC
|
|
Commit Message
Herve Codina
April 21, 2023, 12:41 p.m. UTC
A helper, iio_read_max_channel_raw() exists to read the available
maximum raw value of a channel but nothing similar exists to read the
available minimum raw value.
This new helper, iio_read_min_channel_raw(), fills the hole and can be
used for reading the available minimum raw value of a channel.
It is fully based on the existing iio_read_max_channel_raw().
Signed-off-by: Herve Codina <herve.codina@bootlin.com>
---
drivers/iio/inkern.c | 67 ++++++++++++++++++++++++++++++++++++
include/linux/iio/consumer.h | 11 ++++++
2 files changed, 78 insertions(+)
Comments
On Fri, 21 Apr 2023 14:41:20 +0200 Herve Codina <herve.codina@bootlin.com> wrote: > A helper, iio_read_max_channel_raw() exists to read the available > maximum raw value of a channel but nothing similar exists to read the > available minimum raw value. > > This new helper, iio_read_min_channel_raw(), fills the hole and can be > used for reading the available minimum raw value of a channel. > It is fully based on the existing iio_read_max_channel_raw(). > > Signed-off-by: Herve Codina <herve.codina@bootlin.com> Hi Herve, All the comments on this are really comments on the existing code. If you don't mind fixing the first one about checking the error code whilst you are here that would be great. Don't worry about the docs comment. There are lots of instances of that and the point is rather subtle and probably post dates this code being written. In a few cases raw doesn't mean ADC counts but rather something slightly modified... Long story for why! Jonathan > --- > drivers/iio/inkern.c | 67 ++++++++++++++++++++++++++++++++++++ > include/linux/iio/consumer.h | 11 ++++++ > 2 files changed, 78 insertions(+) > > diff --git a/drivers/iio/inkern.c b/drivers/iio/inkern.c > index 872fd5c24147..914fc69c718a 100644 > --- a/drivers/iio/inkern.c > +++ b/drivers/iio/inkern.c > @@ -912,6 +912,73 @@ int iio_read_max_channel_raw(struct iio_channel *chan, int *val) > } > EXPORT_SYMBOL_GPL(iio_read_max_channel_raw); > > +static int iio_channel_read_min(struct iio_channel *chan, > + int *val, int *val2, int *type, > + enum iio_chan_info_enum info) > +{ > + int unused; > + const int *vals; > + int length; > + int ret; > + > + if (!val2) > + val2 = &unused; > + > + ret = iio_channel_read_avail(chan, &vals, type, &length, info); Obviously this is copied from *_read_max() but look at it here... We should check for an error first with if (ret < 0) return ret; then the switch. Currently a different positive ret would result in that value being returned which would be odd. Not a problem today, but if we add other iio_avail_type enum entries in future and don't keep up with all the utility functions then a mess may result. If you agree with change and wouldn't mind adding another patch to this series tidying that up for the _max case that would be great! Otherwise I'll get to fixing that at some point but not anytime soon. > + switch (ret) { > + case IIO_AVAIL_RANGE: > + switch (*type) { > + case IIO_VAL_INT: > + *val = vals[0]; > + break; > + default: > + *val = vals[0]; > + *val2 = vals[1]; > + } > + return 0; > + > + case IIO_AVAIL_LIST: > + if (length <= 0) > + return -EINVAL; > + switch (*type) { > + case IIO_VAL_INT: > + *val = vals[--length]; > + while (length) { > + if (vals[--length] < *val) > + *val = vals[length]; > + } > + break; > + default: > + /* FIXME: learn about min for other iio values */ > + return -EINVAL; > + } > + return 0; > + > + default: > + return ret; > + } > +} > + > +int iio_read_min_channel_raw(struct iio_channel *chan, int *val) > +{ > + struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev); > + int ret; > + int type; > + > + mutex_lock(&iio_dev_opaque->info_exist_lock); > + if (!chan->indio_dev->info) { > + ret = -ENODEV; > + goto err_unlock; > + } > + > + ret = iio_channel_read_min(chan, val, NULL, &type, IIO_CHAN_INFO_RAW); > +err_unlock: > + mutex_unlock(&iio_dev_opaque->info_exist_lock); > + > + return ret; > +} > +EXPORT_SYMBOL_GPL(iio_read_min_channel_raw); > + > int iio_get_channel_type(struct iio_channel *chan, enum iio_chan_type *type) > { > struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev); > diff --git a/include/linux/iio/consumer.h b/include/linux/iio/consumer.h > index 6802596b017c..956120d8b5a3 100644 > --- a/include/linux/iio/consumer.h > +++ b/include/linux/iio/consumer.h > @@ -297,6 +297,17 @@ int iio_write_channel_raw(struct iio_channel *chan, int val); > */ > int iio_read_max_channel_raw(struct iio_channel *chan, int *val); > > +/** > + * iio_read_min_channel_raw() - read minimum available raw value from a given > + * channel, i.e. the minimum possible value. > + * @chan: The channel being queried. > + * @val: Value read back. > + * > + * Note raw reads from iio channels are in adc counts and hence > + * scale will need to be applied if standard units are required. Hmm. That comment is almost always true, but not quite. Not related to your patch but some cleanup of this documentation and pushing it down next to implementations should be done at some point. If anyone is really bored and wants to take this on that's fine. If not, another one for the todo list ;) > + */ > +int iio_read_min_channel_raw(struct iio_channel *chan, int *val); > + > /** > * iio_read_avail_channel_raw() - read available raw values from a given channel > * @chan: The channel being queried.
Hi Jonathan, On Sat, 22 Apr 2023 17:49:16 +0100 Jonathan Cameron <jic23@kernel.org> wrote: > On Fri, 21 Apr 2023 14:41:20 +0200 > Herve Codina <herve.codina@bootlin.com> wrote: > > > A helper, iio_read_max_channel_raw() exists to read the available > > maximum raw value of a channel but nothing similar exists to read the > > available minimum raw value. > > > > This new helper, iio_read_min_channel_raw(), fills the hole and can be > > used for reading the available minimum raw value of a channel. > > It is fully based on the existing iio_read_max_channel_raw(). > > > > Signed-off-by: Herve Codina <herve.codina@bootlin.com> > > Hi Herve, > > All the comments on this are really comments on the existing code. > If you don't mind fixing the first one about checking the error code whilst > you are here that would be great. Don't worry about the docs comment. > There are lots of instances of that and the point is rather subtle and probably > post dates this code being written. In a few cases raw doesn't mean ADC counts > but rather something slightly modified... Long story for why! A next iteration is already planned for this series. I will fix the 'error checking before switch()' on the iio_channel_read_min() I introduced and add a new patch (doing the same) on the existing iio_channel_read_max(). > > Jonathan > > > --- > > drivers/iio/inkern.c | 67 ++++++++++++++++++++++++++++++++++++ > > include/linux/iio/consumer.h | 11 ++++++ > > 2 files changed, 78 insertions(+) > > > > diff --git a/drivers/iio/inkern.c b/drivers/iio/inkern.c > > index 872fd5c24147..914fc69c718a 100644 > > --- a/drivers/iio/inkern.c > > +++ b/drivers/iio/inkern.c > > @@ -912,6 +912,73 @@ int iio_read_max_channel_raw(struct iio_channel *chan, int *val) > > } > > EXPORT_SYMBOL_GPL(iio_read_max_channel_raw); > > > > +static int iio_channel_read_min(struct iio_channel *chan, > > + int *val, int *val2, int *type, > > + enum iio_chan_info_enum info) > > +{ > > + int unused; > > + const int *vals; > > + int length; > > + int ret; > > + > > + if (!val2) > > + val2 = &unused; > > + > > + ret = iio_channel_read_avail(chan, &vals, type, &length, info); > Obviously this is copied from *_read_max() but look at it here... > > We should check for an error first with > if (ret < 0) > return ret; > then the switch. > > Currently a different positive ret would result in that value > being returned which would be odd. Not a problem today, but if we add other > iio_avail_type enum entries in future and don't keep up with all the > utility functions then a mess may result. > > If you agree with change and wouldn't mind adding another patch to this series > tidying that up for the _max case that would be great! Otherwise I'll get to > fixing that at some point but not anytime soon. I will do in the next iteration. > > > + switch (ret) { > > + case IIO_AVAIL_RANGE: > > + switch (*type) { > > + case IIO_VAL_INT: > > + *val = vals[0]; > > + break; > > + default: > > + *val = vals[0]; > > + *val2 = vals[1]; > > + } > > + return 0; > > + > > + case IIO_AVAIL_LIST: > > + if (length <= 0) > > + return -EINVAL; > > + switch (*type) { > > + case IIO_VAL_INT: > > + *val = vals[--length]; > > + while (length) { > > + if (vals[--length] < *val) > > + *val = vals[length]; > > + } > > + break; > > + default: > > + /* FIXME: learn about min for other iio values */ > > + return -EINVAL; > > + } > > + return 0; > > + > > + default: > > + return ret; > > + } > > +} > > + > > +int iio_read_min_channel_raw(struct iio_channel *chan, int *val) > > +{ > > + struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev); > > + int ret; > > + int type; > > + > > + mutex_lock(&iio_dev_opaque->info_exist_lock); > > + if (!chan->indio_dev->info) { > > + ret = -ENODEV; > > + goto err_unlock; > > + } > > + > > + ret = iio_channel_read_min(chan, val, NULL, &type, IIO_CHAN_INFO_RAW); > > +err_unlock: > > + mutex_unlock(&iio_dev_opaque->info_exist_lock); > > + > > + return ret; > > +} > > +EXPORT_SYMBOL_GPL(iio_read_min_channel_raw); > > + > > int iio_get_channel_type(struct iio_channel *chan, enum iio_chan_type *type) > > { > > struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev); > > diff --git a/include/linux/iio/consumer.h b/include/linux/iio/consumer.h > > index 6802596b017c..956120d8b5a3 100644 > > --- a/include/linux/iio/consumer.h > > +++ b/include/linux/iio/consumer.h > > @@ -297,6 +297,17 @@ int iio_write_channel_raw(struct iio_channel *chan, int val); > > */ > > int iio_read_max_channel_raw(struct iio_channel *chan, int *val); > > > > +/** > > + * iio_read_min_channel_raw() - read minimum available raw value from a given > > + * channel, i.e. the minimum possible value. > > + * @chan: The channel being queried. > > + * @val: Value read back. > > + * > > + * Note raw reads from iio channels are in adc counts and hence > > + * scale will need to be applied if standard units are required. > > Hmm. That comment is almost always true, but not quite. Not related to > your patch but some cleanup of this documentation and pushing it down next > to implementations should be done at some point. If anyone is really > bored and wants to take this on that's fine. If not, another one for the > todo list ;) If you are ok, I can change every where in consumer.h the following: * Note raw reads from iio channels are in adc counts and hence * scale will need to be applied if standard units required. by * Note raw reads from iio channels are not in standards units and * hence scale will need to be applied if standard units required. Also the same for raw writes: * Note raw writes to iio channels are in dac counts and hence * scale will need to be applied if standard units required. by * Note raw writes to iio channels are not in standards units and * hence scale will need to be applied if standard units required. > > > + */ > > +int iio_read_min_channel_raw(struct iio_channel *chan, int *val); > > + > > /** > > * iio_read_avail_channel_raw() - read available raw values from a given channel > > * @chan: The channel being queried. > Thanks for the review, Hervé
> > > diff --git a/include/linux/iio/consumer.h b/include/linux/iio/consumer.h > > > index 6802596b017c..956120d8b5a3 100644 > > > --- a/include/linux/iio/consumer.h > > > +++ b/include/linux/iio/consumer.h > > > @@ -297,6 +297,17 @@ int iio_write_channel_raw(struct iio_channel *chan, int val); > > > */ > > > int iio_read_max_channel_raw(struct iio_channel *chan, int *val); > > > > > > +/** > > > + * iio_read_min_channel_raw() - read minimum available raw value from a given > > > + * channel, i.e. the minimum possible value. > > > + * @chan: The channel being queried. > > > + * @val: Value read back. > > > + * > > > + * Note raw reads from iio channels are in adc counts and hence > > > + * scale will need to be applied if standard units are required. > > > > Hmm. That comment is almost always true, but not quite. Not related to > > your patch but some cleanup of this documentation and pushing it down next > > to implementations should be done at some point. If anyone is really > > bored and wants to take this on that's fine. If not, another one for the > > todo list ;) > > If you are ok, I can change every where in consumer.h the following: > * Note raw reads from iio channels are in adc counts and hence > * scale will need to be applied if standard units required. > by > * Note raw reads from iio channels are not in standards units and > * hence scale will need to be applied if standard units required. If going to the effort, we should include offset and make it clear how they are applied. * Note, if standard units are required, raw reads from iio channels * need the offset (default 0) and scale (default 1) to be applied * as (raw + offset) * scale. > > Also the same for raw writes: > * Note raw writes to iio channels are in dac counts and hence > * scale will need to be applied if standard units required. > by > * Note raw writes to iio channels are not in standards units and > * hence scale will need to be applied if standard units required. This one is more interesting because you kind of need to apply the opposite logic. Perhaps text such as. * Note that for raw writes to iio channels, if the value provided is * in standard units, the affect of the scale and offset must be removed * as (value / scale) - offset. My slight concern is that we'll spend longer arguing about these comments than we spend on the rest of the patch set. Might be worth delaying fixing the others for a separate series after this one. Jonathan > > > > > > + */ > > > +int iio_read_min_channel_raw(struct iio_channel *chan, int *val); > > > + > > > /** > > > * iio_read_avail_channel_raw() - read available raw values from a given channel > > > * @chan: The channel being queried. > > > > Thanks for the review, > Hervé >
diff --git a/drivers/iio/inkern.c b/drivers/iio/inkern.c index 872fd5c24147..914fc69c718a 100644 --- a/drivers/iio/inkern.c +++ b/drivers/iio/inkern.c @@ -912,6 +912,73 @@ int iio_read_max_channel_raw(struct iio_channel *chan, int *val) } EXPORT_SYMBOL_GPL(iio_read_max_channel_raw); +static int iio_channel_read_min(struct iio_channel *chan, + int *val, int *val2, int *type, + enum iio_chan_info_enum info) +{ + int unused; + const int *vals; + int length; + int ret; + + if (!val2) + val2 = &unused; + + ret = iio_channel_read_avail(chan, &vals, type, &length, info); + switch (ret) { + case IIO_AVAIL_RANGE: + switch (*type) { + case IIO_VAL_INT: + *val = vals[0]; + break; + default: + *val = vals[0]; + *val2 = vals[1]; + } + return 0; + + case IIO_AVAIL_LIST: + if (length <= 0) + return -EINVAL; + switch (*type) { + case IIO_VAL_INT: + *val = vals[--length]; + while (length) { + if (vals[--length] < *val) + *val = vals[length]; + } + break; + default: + /* FIXME: learn about min for other iio values */ + return -EINVAL; + } + return 0; + + default: + return ret; + } +} + +int iio_read_min_channel_raw(struct iio_channel *chan, int *val) +{ + struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev); + int ret; + int type; + + mutex_lock(&iio_dev_opaque->info_exist_lock); + if (!chan->indio_dev->info) { + ret = -ENODEV; + goto err_unlock; + } + + ret = iio_channel_read_min(chan, val, NULL, &type, IIO_CHAN_INFO_RAW); +err_unlock: + mutex_unlock(&iio_dev_opaque->info_exist_lock); + + return ret; +} +EXPORT_SYMBOL_GPL(iio_read_min_channel_raw); + int iio_get_channel_type(struct iio_channel *chan, enum iio_chan_type *type) { struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(chan->indio_dev); diff --git a/include/linux/iio/consumer.h b/include/linux/iio/consumer.h index 6802596b017c..956120d8b5a3 100644 --- a/include/linux/iio/consumer.h +++ b/include/linux/iio/consumer.h @@ -297,6 +297,17 @@ int iio_write_channel_raw(struct iio_channel *chan, int val); */ int iio_read_max_channel_raw(struct iio_channel *chan, int *val); +/** + * iio_read_min_channel_raw() - read minimum available raw value from a given + * channel, i.e. the minimum possible value. + * @chan: The channel being queried. + * @val: Value read back. + * + * Note raw reads from iio channels are in adc counts and hence + * scale will need to be applied if standard units are required. + */ +int iio_read_min_channel_raw(struct iio_channel *chan, int *val); + /** * iio_read_avail_channel_raw() - read available raw values from a given channel * @chan: The channel being queried.