Re: [PATCH v3 5/5] iio: adc: add viperboard adc driver

2012-11-05 Thread Jonathan Cameron
On 11/05/2012 02:48 PM, Lars Poeschel wrote:
> From: Lars Poeschel 
> 
> This adds the mfd cell to use the adc part of the Nano River Technologies
> viperboard.
> 
One utter nitpick inline (nice to clean up but totally trivial)

> Signed-off-by: Lars Poeschel 
Acked-by: Jonathan Cameron 

As there is a clear dependence on the mfd elements here this should
probably go though Samuel's tree once people are happy with the other elements.
> ---
>  drivers/iio/adc/Kconfig  |7 ++
>  drivers/iio/adc/Makefile |1 +
>  drivers/iio/adc/viperboard_adc.c |  181 
> ++
>  drivers/mfd/viperboard.c |3 +
>  include/linux/mfd/viperboard.h   |1 +
>  5 files changed, 193 insertions(+)
>  create mode 100644 drivers/iio/adc/viperboard_adc.c
> 
> diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig
> index 4927581..35ad77d 100644
> --- a/drivers/iio/adc/Kconfig
> +++ b/drivers/iio/adc/Kconfig
> @@ -60,4 +60,11 @@ config LP8788_ADC
>   help
> Say yes here to build support for TI LP8788 ADC.
>  
> +config VIPERBOARD_ADC
> + tristate "Viperboard ADC support"
> + depends on MFD_VIPERBOARD && USB
> + help
> +   Say yes here to access the ADC part of the Nano River
> +   Technologies Viperboard.
> +
>  endmenu
> diff --git a/drivers/iio/adc/Makefile b/drivers/iio/adc/Makefile
> index 900995d..4852c2e 100644
> --- a/drivers/iio/adc/Makefile
> +++ b/drivers/iio/adc/Makefile
> @@ -8,3 +8,4 @@ obj-$(CONFIG_AD7476) += ad7476.o
>  obj-$(CONFIG_AD7791) += ad7791.o
>  obj-$(CONFIG_AT91_ADC) += at91_adc.o
>  obj-$(CONFIG_LP8788_ADC) += lp8788_adc.o
> +obj-$(CONFIG_VIPERBOARD_ADC) += viperboard_adc.o
> diff --git a/drivers/iio/adc/viperboard_adc.c 
> b/drivers/iio/adc/viperboard_adc.c
> new file mode 100644
> index 000..58345c7
> --- /dev/null
> +++ b/drivers/iio/adc/viperboard_adc.c
> @@ -0,0 +1,181 @@
> +/*
> + *  Nano River Technologies viperboard iio ADC driver
IIO (told you it was a nitpick).
> + *
> + *  (C) 2012 by Lemonage GmbH
> + *  Author: Lars Poeschel 
> + *  All rights reserved.
> + *
> + *  This program is free software; you can redistribute  it and/or modify it
> + *  under  the terms of  the GNU General  Public License as published by the
> + *  Free Software Foundation;  either version 2 of the   License, or (at 
> your
> + *  option) any later version.
> + *
> + */
> +
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +
> +#include 
> +#include 
> +
> +#include 
> +
> +#define VPRBRD_ADC_CMD_GET   0x00
> +
> +struct vprbrd_adc_msg {
> + u8 cmd;
> + u8 chan;
> + u8 val;
> +} __packed;
> +
> +struct vprbrd_adc {
> + struct vprbrd *vb;
> +};
> +
> +#define VPRBRD_ADC_CHANNEL(_index) { \
> + .type = IIO_VOLTAGE,\
> + .indexed = 1,   \
> + .channel = _index,  \
> + .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT,\
> + .scan_index = _index,   \
> + .scan_type = {  \
> + .sign = 'u',\
> + .realbits = 8,  \
> + .storagebits = 8,   \
> + },  \
> +}
> +
> +static struct iio_chan_spec const vprbrd_adc_iio_channels[] = {
> + VPRBRD_ADC_CHANNEL(0),
> + VPRBRD_ADC_CHANNEL(1),
> + VPRBRD_ADC_CHANNEL(2),
> + VPRBRD_ADC_CHANNEL(3),
> +};
> +
> +static int vprbrd_iio_read_raw(struct iio_dev *iio_dev,
> + struct iio_chan_spec const *chan,
> + int *val,
> + int *val2,
> + long info)
> +{
> + int ret, error = 0;
> + struct vprbrd_adc *adc = iio_priv(iio_dev);
> + struct vprbrd *vb = adc->vb;
> + struct vprbrd_adc_msg *admsg = (struct vprbrd_adc_msg *)vb->buf;
> +
> + switch (info) {
> + case IIO_CHAN_INFO_RAW:
> + mutex_lock(>lock);
> +
> + admsg->cmd = VPRBRD_ADC_CMD_GET;
> + admsg->chan = chan->scan_index;
> + admsg->val = 0x00;
> +
> + ret = usb_control_msg(vb->usb_dev,
> + usb_sndctrlpipe(vb->usb_dev, 0), VPRBRD_USB_REQUEST_ADC,
> + VPRBRD_USB_TYPE_OUT, 0x, 0x, admsg,
> + sizeof(struct vprbrd_adc_msg), VPRBRD_USB_TIMEOUT_MS);
> + if (ret != sizeof(struct vprbrd_adc_msg)) {
> + dev_err(_dev->dev, "usb send error on adc read\n");
> + error = -EREMOTEIO;
> + }
> +
> + ret = usb_control_msg(vb->usb_dev,
> + usb_rcvctrlpipe(vb->usb_dev, 0), VPRBRD_USB_REQUEST_ADC,
> + VPRBRD_USB_TYPE_IN, 0x, 0x, admsg,
> + 

Re: [PATCH v3 5/5] iio: adc: add viperboard adc driver

2012-11-05 Thread Lars-Peter Clausen
On 11/05/2012 03:48 PM, Lars Poeschel wrote:
> From: Lars Poeschel 
> 
> This adds the mfd cell to use the adc part of the Nano River Technologies
> viperboard.
> 
> Signed-off-by: Lars Poeschel 

Looks good to me.

Reviewed-by: Lars-Peter Clausen 

If you happen to resend the series there is one tiny bit that could be
changed, but no need to resend the series just for this.

> ---
>  drivers/iio/adc/Kconfig  |7 ++
>  drivers/iio/adc/Makefile |1 +
>  drivers/iio/adc/viperboard_adc.c |  181 
> ++
>  drivers/mfd/viperboard.c |3 +
>  include/linux/mfd/viperboard.h   |1 +
>  5 files changed, 193 insertions(+)
>  create mode 100644 drivers/iio/adc/viperboard_adc.c
> 

> +
> +static int __devinit vprbrd_adc_probe(struct platform_device *pdev)
> +{
> + struct vprbrd *vb = dev_get_drvdata(pdev->dev.parent);
> + struct vprbrd_adc *adc;
> + struct iio_dev *indio_dev;
> + int ret;
> +
> + /* registering iio */
> + indio_dev = iio_device_alloc(sizeof(struct vprbrd_adc));

sizeof(*adc)

> + if (!indio_dev) {
> + dev_err(>dev, "failed allocating iio device\n");
> + return -ENOMEM;
> + }

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH v3 5/5] iio: adc: add viperboard adc driver

2012-11-05 Thread Lars Poeschel
From: Lars Poeschel 

This adds the mfd cell to use the adc part of the Nano River Technologies
viperboard.

Signed-off-by: Lars Poeschel 
---
 drivers/iio/adc/Kconfig  |7 ++
 drivers/iio/adc/Makefile |1 +
 drivers/iio/adc/viperboard_adc.c |  181 ++
 drivers/mfd/viperboard.c |3 +
 include/linux/mfd/viperboard.h   |1 +
 5 files changed, 193 insertions(+)
 create mode 100644 drivers/iio/adc/viperboard_adc.c

diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig
index 4927581..35ad77d 100644
--- a/drivers/iio/adc/Kconfig
+++ b/drivers/iio/adc/Kconfig
@@ -60,4 +60,11 @@ config LP8788_ADC
help
  Say yes here to build support for TI LP8788 ADC.
 
+config VIPERBOARD_ADC
+   tristate "Viperboard ADC support"
+   depends on MFD_VIPERBOARD && USB
+   help
+ Say yes here to access the ADC part of the Nano River
+ Technologies Viperboard.
+
 endmenu
diff --git a/drivers/iio/adc/Makefile b/drivers/iio/adc/Makefile
index 900995d..4852c2e 100644
--- a/drivers/iio/adc/Makefile
+++ b/drivers/iio/adc/Makefile
@@ -8,3 +8,4 @@ obj-$(CONFIG_AD7476) += ad7476.o
 obj-$(CONFIG_AD7791) += ad7791.o
 obj-$(CONFIG_AT91_ADC) += at91_adc.o
 obj-$(CONFIG_LP8788_ADC) += lp8788_adc.o
+obj-$(CONFIG_VIPERBOARD_ADC) += viperboard_adc.o
diff --git a/drivers/iio/adc/viperboard_adc.c b/drivers/iio/adc/viperboard_adc.c
new file mode 100644
index 000..58345c7
--- /dev/null
+++ b/drivers/iio/adc/viperboard_adc.c
@@ -0,0 +1,181 @@
+/*
+ *  Nano River Technologies viperboard iio ADC driver
+ *
+ *  (C) 2012 by Lemonage GmbH
+ *  Author: Lars Poeschel 
+ *  All rights reserved.
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the License, or (at your
+ *  option) any later version.
+ *
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include 
+
+#include 
+
+#define VPRBRD_ADC_CMD_GET 0x00
+
+struct vprbrd_adc_msg {
+   u8 cmd;
+   u8 chan;
+   u8 val;
+} __packed;
+
+struct vprbrd_adc {
+   struct vprbrd *vb;
+};
+
+#define VPRBRD_ADC_CHANNEL(_index) {   \
+   .type = IIO_VOLTAGE,\
+   .indexed = 1,   \
+   .channel = _index,  \
+   .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT,\
+   .scan_index = _index,   \
+   .scan_type = {  \
+   .sign = 'u',\
+   .realbits = 8,  \
+   .storagebits = 8,   \
+   },  \
+}
+
+static struct iio_chan_spec const vprbrd_adc_iio_channels[] = {
+   VPRBRD_ADC_CHANNEL(0),
+   VPRBRD_ADC_CHANNEL(1),
+   VPRBRD_ADC_CHANNEL(2),
+   VPRBRD_ADC_CHANNEL(3),
+};
+
+static int vprbrd_iio_read_raw(struct iio_dev *iio_dev,
+   struct iio_chan_spec const *chan,
+   int *val,
+   int *val2,
+   long info)
+{
+   int ret, error = 0;
+   struct vprbrd_adc *adc = iio_priv(iio_dev);
+   struct vprbrd *vb = adc->vb;
+   struct vprbrd_adc_msg *admsg = (struct vprbrd_adc_msg *)vb->buf;
+
+   switch (info) {
+   case IIO_CHAN_INFO_RAW:
+   mutex_lock(>lock);
+
+   admsg->cmd = VPRBRD_ADC_CMD_GET;
+   admsg->chan = chan->scan_index;
+   admsg->val = 0x00;
+
+   ret = usb_control_msg(vb->usb_dev,
+   usb_sndctrlpipe(vb->usb_dev, 0), VPRBRD_USB_REQUEST_ADC,
+   VPRBRD_USB_TYPE_OUT, 0x, 0x, admsg,
+   sizeof(struct vprbrd_adc_msg), VPRBRD_USB_TIMEOUT_MS);
+   if (ret != sizeof(struct vprbrd_adc_msg)) {
+   dev_err(_dev->dev, "usb send error on adc read\n");
+   error = -EREMOTEIO;
+   }
+
+   ret = usb_control_msg(vb->usb_dev,
+   usb_rcvctrlpipe(vb->usb_dev, 0), VPRBRD_USB_REQUEST_ADC,
+   VPRBRD_USB_TYPE_IN, 0x, 0x, admsg,
+   sizeof(struct vprbrd_adc_msg), VPRBRD_USB_TIMEOUT_MS);
+
+   *val = admsg->val;
+
+   mutex_unlock(>lock);
+
+   if (ret != sizeof(struct vprbrd_adc_msg)) {
+   dev_err(_dev->dev, "usb recv error on adc read\n");
+   error = -EREMOTEIO;
+   }
+
+   if (error)
+   goto error;
+
+   return IIO_VAL_INT;
+   default:
+   error = -EINVAL;
+   break;

[PATCH v3 5/5] iio: adc: add viperboard adc driver

2012-11-05 Thread Lars Poeschel
From: Lars Poeschel poesc...@lemonage.de

This adds the mfd cell to use the adc part of the Nano River Technologies
viperboard.

Signed-off-by: Lars Poeschel poesc...@lemonage.de
---
 drivers/iio/adc/Kconfig  |7 ++
 drivers/iio/adc/Makefile |1 +
 drivers/iio/adc/viperboard_adc.c |  181 ++
 drivers/mfd/viperboard.c |3 +
 include/linux/mfd/viperboard.h   |1 +
 5 files changed, 193 insertions(+)
 create mode 100644 drivers/iio/adc/viperboard_adc.c

diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig
index 4927581..35ad77d 100644
--- a/drivers/iio/adc/Kconfig
+++ b/drivers/iio/adc/Kconfig
@@ -60,4 +60,11 @@ config LP8788_ADC
help
  Say yes here to build support for TI LP8788 ADC.
 
+config VIPERBOARD_ADC
+   tristate Viperboard ADC support
+   depends on MFD_VIPERBOARD  USB
+   help
+ Say yes here to access the ADC part of the Nano River
+ Technologies Viperboard.
+
 endmenu
diff --git a/drivers/iio/adc/Makefile b/drivers/iio/adc/Makefile
index 900995d..4852c2e 100644
--- a/drivers/iio/adc/Makefile
+++ b/drivers/iio/adc/Makefile
@@ -8,3 +8,4 @@ obj-$(CONFIG_AD7476) += ad7476.o
 obj-$(CONFIG_AD7791) += ad7791.o
 obj-$(CONFIG_AT91_ADC) += at91_adc.o
 obj-$(CONFIG_LP8788_ADC) += lp8788_adc.o
+obj-$(CONFIG_VIPERBOARD_ADC) += viperboard_adc.o
diff --git a/drivers/iio/adc/viperboard_adc.c b/drivers/iio/adc/viperboard_adc.c
new file mode 100644
index 000..58345c7
--- /dev/null
+++ b/drivers/iio/adc/viperboard_adc.c
@@ -0,0 +1,181 @@
+/*
+ *  Nano River Technologies viperboard iio ADC driver
+ *
+ *  (C) 2012 by Lemonage GmbH
+ *  Author: Lars Poeschel poesc...@lemonage.de
+ *  All rights reserved.
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the License, or (at your
+ *  option) any later version.
+ *
+ */
+
+#include linux/kernel.h
+#include linux/errno.h
+#include linux/module.h
+#include linux/slab.h
+#include linux/types.h
+#include linux/mutex.h
+#include linux/platform_device.h
+
+#include linux/usb.h
+#include linux/iio/iio.h
+
+#include linux/mfd/viperboard.h
+
+#define VPRBRD_ADC_CMD_GET 0x00
+
+struct vprbrd_adc_msg {
+   u8 cmd;
+   u8 chan;
+   u8 val;
+} __packed;
+
+struct vprbrd_adc {
+   struct vprbrd *vb;
+};
+
+#define VPRBRD_ADC_CHANNEL(_index) {   \
+   .type = IIO_VOLTAGE,\
+   .indexed = 1,   \
+   .channel = _index,  \
+   .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT,\
+   .scan_index = _index,   \
+   .scan_type = {  \
+   .sign = 'u',\
+   .realbits = 8,  \
+   .storagebits = 8,   \
+   },  \
+}
+
+static struct iio_chan_spec const vprbrd_adc_iio_channels[] = {
+   VPRBRD_ADC_CHANNEL(0),
+   VPRBRD_ADC_CHANNEL(1),
+   VPRBRD_ADC_CHANNEL(2),
+   VPRBRD_ADC_CHANNEL(3),
+};
+
+static int vprbrd_iio_read_raw(struct iio_dev *iio_dev,
+   struct iio_chan_spec const *chan,
+   int *val,
+   int *val2,
+   long info)
+{
+   int ret, error = 0;
+   struct vprbrd_adc *adc = iio_priv(iio_dev);
+   struct vprbrd *vb = adc-vb;
+   struct vprbrd_adc_msg *admsg = (struct vprbrd_adc_msg *)vb-buf;
+
+   switch (info) {
+   case IIO_CHAN_INFO_RAW:
+   mutex_lock(vb-lock);
+
+   admsg-cmd = VPRBRD_ADC_CMD_GET;
+   admsg-chan = chan-scan_index;
+   admsg-val = 0x00;
+
+   ret = usb_control_msg(vb-usb_dev,
+   usb_sndctrlpipe(vb-usb_dev, 0), VPRBRD_USB_REQUEST_ADC,
+   VPRBRD_USB_TYPE_OUT, 0x, 0x, admsg,
+   sizeof(struct vprbrd_adc_msg), VPRBRD_USB_TIMEOUT_MS);
+   if (ret != sizeof(struct vprbrd_adc_msg)) {
+   dev_err(iio_dev-dev, usb send error on adc read\n);
+   error = -EREMOTEIO;
+   }
+
+   ret = usb_control_msg(vb-usb_dev,
+   usb_rcvctrlpipe(vb-usb_dev, 0), VPRBRD_USB_REQUEST_ADC,
+   VPRBRD_USB_TYPE_IN, 0x, 0x, admsg,
+   sizeof(struct vprbrd_adc_msg), VPRBRD_USB_TIMEOUT_MS);
+
+   *val = admsg-val;
+
+   mutex_unlock(vb-lock);
+
+   if (ret != sizeof(struct vprbrd_adc_msg)) {
+   dev_err(iio_dev-dev, usb recv error on adc read\n);
+   error = 

Re: [PATCH v3 5/5] iio: adc: add viperboard adc driver

2012-11-05 Thread Lars-Peter Clausen
On 11/05/2012 03:48 PM, Lars Poeschel wrote:
 From: Lars Poeschel poesc...@lemonage.de
 
 This adds the mfd cell to use the adc part of the Nano River Technologies
 viperboard.
 
 Signed-off-by: Lars Poeschel poesc...@lemonage.de

Looks good to me.

Reviewed-by: Lars-Peter Clausen l...@metafoo.de

If you happen to resend the series there is one tiny bit that could be
changed, but no need to resend the series just for this.

 ---
  drivers/iio/adc/Kconfig  |7 ++
  drivers/iio/adc/Makefile |1 +
  drivers/iio/adc/viperboard_adc.c |  181 
 ++
  drivers/mfd/viperboard.c |3 +
  include/linux/mfd/viperboard.h   |1 +
  5 files changed, 193 insertions(+)
  create mode 100644 drivers/iio/adc/viperboard_adc.c
 

 +
 +static int __devinit vprbrd_adc_probe(struct platform_device *pdev)
 +{
 + struct vprbrd *vb = dev_get_drvdata(pdev-dev.parent);
 + struct vprbrd_adc *adc;
 + struct iio_dev *indio_dev;
 + int ret;
 +
 + /* registering iio */
 + indio_dev = iio_device_alloc(sizeof(struct vprbrd_adc));

sizeof(*adc)

 + if (!indio_dev) {
 + dev_err(pdev-dev, failed allocating iio device\n);
 + return -ENOMEM;
 + }

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH v3 5/5] iio: adc: add viperboard adc driver

2012-11-05 Thread Jonathan Cameron
On 11/05/2012 02:48 PM, Lars Poeschel wrote:
 From: Lars Poeschel poesc...@lemonage.de
 
 This adds the mfd cell to use the adc part of the Nano River Technologies
 viperboard.
 
One utter nitpick inline (nice to clean up but totally trivial)

 Signed-off-by: Lars Poeschel poesc...@lemonage.de
Acked-by: Jonathan Cameron ji...@kernel.org

As there is a clear dependence on the mfd elements here this should
probably go though Samuel's tree once people are happy with the other elements.
 ---
  drivers/iio/adc/Kconfig  |7 ++
  drivers/iio/adc/Makefile |1 +
  drivers/iio/adc/viperboard_adc.c |  181 
 ++
  drivers/mfd/viperboard.c |3 +
  include/linux/mfd/viperboard.h   |1 +
  5 files changed, 193 insertions(+)
  create mode 100644 drivers/iio/adc/viperboard_adc.c
 
 diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig
 index 4927581..35ad77d 100644
 --- a/drivers/iio/adc/Kconfig
 +++ b/drivers/iio/adc/Kconfig
 @@ -60,4 +60,11 @@ config LP8788_ADC
   help
 Say yes here to build support for TI LP8788 ADC.
  
 +config VIPERBOARD_ADC
 + tristate Viperboard ADC support
 + depends on MFD_VIPERBOARD  USB
 + help
 +   Say yes here to access the ADC part of the Nano River
 +   Technologies Viperboard.
 +
  endmenu
 diff --git a/drivers/iio/adc/Makefile b/drivers/iio/adc/Makefile
 index 900995d..4852c2e 100644
 --- a/drivers/iio/adc/Makefile
 +++ b/drivers/iio/adc/Makefile
 @@ -8,3 +8,4 @@ obj-$(CONFIG_AD7476) += ad7476.o
  obj-$(CONFIG_AD7791) += ad7791.o
  obj-$(CONFIG_AT91_ADC) += at91_adc.o
  obj-$(CONFIG_LP8788_ADC) += lp8788_adc.o
 +obj-$(CONFIG_VIPERBOARD_ADC) += viperboard_adc.o
 diff --git a/drivers/iio/adc/viperboard_adc.c 
 b/drivers/iio/adc/viperboard_adc.c
 new file mode 100644
 index 000..58345c7
 --- /dev/null
 +++ b/drivers/iio/adc/viperboard_adc.c
 @@ -0,0 +1,181 @@
 +/*
 + *  Nano River Technologies viperboard iio ADC driver
IIO (told you it was a nitpick).
 + *
 + *  (C) 2012 by Lemonage GmbH
 + *  Author: Lars Poeschel poesc...@lemonage.de
 + *  All rights reserved.
 + *
 + *  This program is free software; you can redistribute  it and/or modify it
 + *  under  the terms of  the GNU General  Public License as published by the
 + *  Free Software Foundation;  either version 2 of the   License, or (at 
 your
 + *  option) any later version.
 + *
 + */
 +
 +#include linux/kernel.h
 +#include linux/errno.h
 +#include linux/module.h
 +#include linux/slab.h
 +#include linux/types.h
 +#include linux/mutex.h
 +#include linux/platform_device.h
 +
 +#include linux/usb.h
 +#include linux/iio/iio.h
 +
 +#include linux/mfd/viperboard.h
 +
 +#define VPRBRD_ADC_CMD_GET   0x00
 +
 +struct vprbrd_adc_msg {
 + u8 cmd;
 + u8 chan;
 + u8 val;
 +} __packed;
 +
 +struct vprbrd_adc {
 + struct vprbrd *vb;
 +};
 +
 +#define VPRBRD_ADC_CHANNEL(_index) { \
 + .type = IIO_VOLTAGE,\
 + .indexed = 1,   \
 + .channel = _index,  \
 + .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT,\
 + .scan_index = _index,   \
 + .scan_type = {  \
 + .sign = 'u',\
 + .realbits = 8,  \
 + .storagebits = 8,   \
 + },  \
 +}
 +
 +static struct iio_chan_spec const vprbrd_adc_iio_channels[] = {
 + VPRBRD_ADC_CHANNEL(0),
 + VPRBRD_ADC_CHANNEL(1),
 + VPRBRD_ADC_CHANNEL(2),
 + VPRBRD_ADC_CHANNEL(3),
 +};
 +
 +static int vprbrd_iio_read_raw(struct iio_dev *iio_dev,
 + struct iio_chan_spec const *chan,
 + int *val,
 + int *val2,
 + long info)
 +{
 + int ret, error = 0;
 + struct vprbrd_adc *adc = iio_priv(iio_dev);
 + struct vprbrd *vb = adc-vb;
 + struct vprbrd_adc_msg *admsg = (struct vprbrd_adc_msg *)vb-buf;
 +
 + switch (info) {
 + case IIO_CHAN_INFO_RAW:
 + mutex_lock(vb-lock);
 +
 + admsg-cmd = VPRBRD_ADC_CMD_GET;
 + admsg-chan = chan-scan_index;
 + admsg-val = 0x00;
 +
 + ret = usb_control_msg(vb-usb_dev,
 + usb_sndctrlpipe(vb-usb_dev, 0), VPRBRD_USB_REQUEST_ADC,
 + VPRBRD_USB_TYPE_OUT, 0x, 0x, admsg,
 + sizeof(struct vprbrd_adc_msg), VPRBRD_USB_TIMEOUT_MS);
 + if (ret != sizeof(struct vprbrd_adc_msg)) {
 + dev_err(iio_dev-dev, usb send error on adc read\n);
 + error = -EREMOTEIO;
 + }
 +
 + ret = usb_control_msg(vb-usb_dev,
 + usb_rcvctrlpipe(vb-usb_dev, 0), VPRBRD_USB_REQUEST_ADC,
 +