Re: [PATCH v2 2/4] iio: adc: add STMPE ADC driver using IIO framework

2018-11-19 Thread Stefan Agner
On 19.11.2018 11:25, Philippe Schenker wrote:
> From: Stefan Agner 
> 
> This adds an ADC driver for the STMPE device using the industrial
> input/output interface. The driver supports raw reading of values.
> The driver depends on the MFD STMPE driver. If the touchscreen
> block is enabled too, only four of the 8 ADC channels are available.
> 
> Signed-off-by: Stefan Agner 
> Signed-off-by: Max Krummenacher 
> Signed-off-by: Philippe Schenker 
> ---
> 
> Changes in v2:
>  - Code formatting
>  - Move code to setup ADC to MFD device, as it is used by both drivers
>adc and touchscreen
>  - Removed unused includes
>  - Defined the macro STMPE_START_ONE_TEMP_CONV with other macros.
>  - Added new macro that defines the channel of the temperature sensor.
>Took new name for STMPE_MAX_ADC->STMPE_ADC_LAST_NR and used it throughout
>the code for better readability.
>  - Added mutex_unlock where missing.
> 
>  drivers/iio/adc/Kconfig  |   7 +
>  drivers/iio/adc/Makefile |   1 +
>  drivers/iio/adc/stmpe-adc.c  | 340 +++
>  drivers/input/touchscreen/stmpe-ts.c |  43 +---
>  drivers/mfd/Kconfig  |   3 +-
>  drivers/mfd/stmpe.c  |  84 +++
>  include/linux/mfd/stmpe.h|   6 +
>  7 files changed, 445 insertions(+), 39 deletions(-)
>  create mode 100644 drivers/iio/adc/stmpe-adc.c
> 
> diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig
> index a52fea8749a9..5d4c061d8296 100644
> --- a/drivers/iio/adc/Kconfig
> +++ b/drivers/iio/adc/Kconfig
> @@ -734,6 +734,13 @@ config STM32_DFSDM_ADC
> This driver can also be built as a module.  If so, the module
> will be called stm32-dfsdm-adc.
>  
> +config STMPE_ADC
> + tristate "STMicroelectronics STMPE ADC driver"
> + depends on (OF || COMPILE_TEST || MFD_STMPE)

I know I previously said you should add COMPILE_TEST.

However, I changed my mind. Why? Even when using COMPILE_TEST, we should
still make sure that Kconfig dependencies are such that all required
symbols for compilation are enabled! After all, COMPILE_TEST is used to
check whether the driver compiles...

Typically COMPILE_TEST is used when we restrict a config symbol to a
certain architecture/SoC (e.g. since only that SoC has the particular
IP). However, in those cases the driver still compiles, even for a
different architecture.

However, in this case compile fails if MFD_STMPE or OF is not enabled.

Hence we have no compile time optional dependency. So just use:

depends on OF && MFD_STMPE


> + help
> +   Say yes here to build support for ST Microelectronics STMPE
> +   built-in ADC block (stmpe811).
> +
>  config STX104
>   tristate "Apex Embedded Systems STX104 driver"
>   depends on PC104 && X86
> diff --git a/drivers/iio/adc/Makefile b/drivers/iio/adc/Makefile
> index a6e6a0b659e2..cba889c30bf9 100644
> --- a/drivers/iio/adc/Makefile
> +++ b/drivers/iio/adc/Makefile
> @@ -69,6 +69,7 @@ obj-$(CONFIG_STM32_ADC_CORE) += stm32-adc-core.o
>  obj-$(CONFIG_STM32_ADC) += stm32-adc.o
>  obj-$(CONFIG_STM32_DFSDM_CORE) += stm32-dfsdm-core.o
>  obj-$(CONFIG_STM32_DFSDM_ADC) += stm32-dfsdm-adc.o
> +obj-$(CONFIG_STMPE_ADC) += stmpe-adc.o
>  obj-$(CONFIG_TI_ADC081C) += ti-adc081c.o
>  obj-$(CONFIG_TI_ADC0832) += ti-adc0832.o
>  obj-$(CONFIG_TI_ADC084S021) += ti-adc084s021.o
> diff --git a/drivers/iio/adc/stmpe-adc.c b/drivers/iio/adc/stmpe-adc.c
> new file mode 100644
> index ..151f1c8f827e
> --- /dev/null
> +++ b/drivers/iio/adc/stmpe-adc.c
> @@ -0,0 +1,340 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + *  STMicroelectronics STMPE811 IIO ADC Driver
> + *
> + *  4 channel, 10/12-bit ADC
> + *
> + *  Copyright (C) 2013-2018 Toradex AG 
> + */
> +
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +
> +#define STMPE_REG_INT_STA0x0B
> +#define STMPE_REG_ADC_INT_EN 0x0E
> +#define STMPE_REG_ADC_INT_STA0x0F
> +
> +#define STMPE_REG_ADC_CTRL1  0x20
> +#define STMPE_REG_ADC_CTRL2  0x21
> +#define STMPE_REG_ADC_CAPT   0x22
> +#define STMPE_REG_ADC_DATA_CH(channel)   (0x30 + 2 * (channel))
> +
> +#define STMPE_REG_TEMP_CTRL  0x60
> +#define STMPE_TEMP_CTRL_ENABLE   BIT(0)
> +#define STMPE_TEMP_CTRL_ACQ  BIT(1)
> +#define STMPE_TEMP_CTRL_THRES_EN BIT(3)
> +#define STMPE_START_ONE_TEMP_CONV(STMPE_TEMP_CTRL_ENABLE | \
> + STMPE_TEMP_CTRL_ACQ | \
> + STMPE_TEMP_CTRL_THRES_EN)
> +#define STMPE_REG_TEMP_DATA  0x61
> +#define STMPE_REG_TEMP_TH0x63
> +#define STMPE_ADC_LAST_NR7
> +#define STMPE_TEMP_CHANNEL   (STMPE_ADC_LAST_NR + 1)
> +
> +#define STMPE_ADC_CH(channel)((1 << (channel)) & 0xff)
> +
> +#define STMPE_ADC_TIMEOUTmsecs_to_jiffies(1000)
> +

Re: [PATCH v2 2/4] iio: adc: add STMPE ADC driver using IIO framework

2018-11-19 Thread Stefan Agner
On 19.11.2018 11:25, Philippe Schenker wrote:
> From: Stefan Agner 
> 
> This adds an ADC driver for the STMPE device using the industrial
> input/output interface. The driver supports raw reading of values.
> The driver depends on the MFD STMPE driver. If the touchscreen
> block is enabled too, only four of the 8 ADC channels are available.
> 
> Signed-off-by: Stefan Agner 
> Signed-off-by: Max Krummenacher 
> Signed-off-by: Philippe Schenker 
> ---
> 
> Changes in v2:
>  - Code formatting
>  - Move code to setup ADC to MFD device, as it is used by both drivers
>adc and touchscreen
>  - Removed unused includes
>  - Defined the macro STMPE_START_ONE_TEMP_CONV with other macros.
>  - Added new macro that defines the channel of the temperature sensor.
>Took new name for STMPE_MAX_ADC->STMPE_ADC_LAST_NR and used it throughout
>the code for better readability.
>  - Added mutex_unlock where missing.
> 
>  drivers/iio/adc/Kconfig  |   7 +
>  drivers/iio/adc/Makefile |   1 +
>  drivers/iio/adc/stmpe-adc.c  | 340 +++
>  drivers/input/touchscreen/stmpe-ts.c |  43 +---
>  drivers/mfd/Kconfig  |   3 +-
>  drivers/mfd/stmpe.c  |  84 +++
>  include/linux/mfd/stmpe.h|   6 +
>  7 files changed, 445 insertions(+), 39 deletions(-)
>  create mode 100644 drivers/iio/adc/stmpe-adc.c
> 
> diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig
> index a52fea8749a9..5d4c061d8296 100644
> --- a/drivers/iio/adc/Kconfig
> +++ b/drivers/iio/adc/Kconfig
> @@ -734,6 +734,13 @@ config STM32_DFSDM_ADC
> This driver can also be built as a module.  If so, the module
> will be called stm32-dfsdm-adc.
>  
> +config STMPE_ADC
> + tristate "STMicroelectronics STMPE ADC driver"
> + depends on (OF || COMPILE_TEST || MFD_STMPE)

I know I previously said you should add COMPILE_TEST.

However, I changed my mind. Why? Even when using COMPILE_TEST, we should
still make sure that Kconfig dependencies are such that all required
symbols for compilation are enabled! After all, COMPILE_TEST is used to
check whether the driver compiles...

Typically COMPILE_TEST is used when we restrict a config symbol to a
certain architecture/SoC (e.g. since only that SoC has the particular
IP). However, in those cases the driver still compiles, even for a
different architecture.

However, in this case compile fails if MFD_STMPE or OF is not enabled.

Hence we have no compile time optional dependency. So just use:

depends on OF && MFD_STMPE


> + help
> +   Say yes here to build support for ST Microelectronics STMPE
> +   built-in ADC block (stmpe811).
> +
>  config STX104
>   tristate "Apex Embedded Systems STX104 driver"
>   depends on PC104 && X86
> diff --git a/drivers/iio/adc/Makefile b/drivers/iio/adc/Makefile
> index a6e6a0b659e2..cba889c30bf9 100644
> --- a/drivers/iio/adc/Makefile
> +++ b/drivers/iio/adc/Makefile
> @@ -69,6 +69,7 @@ obj-$(CONFIG_STM32_ADC_CORE) += stm32-adc-core.o
>  obj-$(CONFIG_STM32_ADC) += stm32-adc.o
>  obj-$(CONFIG_STM32_DFSDM_CORE) += stm32-dfsdm-core.o
>  obj-$(CONFIG_STM32_DFSDM_ADC) += stm32-dfsdm-adc.o
> +obj-$(CONFIG_STMPE_ADC) += stmpe-adc.o
>  obj-$(CONFIG_TI_ADC081C) += ti-adc081c.o
>  obj-$(CONFIG_TI_ADC0832) += ti-adc0832.o
>  obj-$(CONFIG_TI_ADC084S021) += ti-adc084s021.o
> diff --git a/drivers/iio/adc/stmpe-adc.c b/drivers/iio/adc/stmpe-adc.c
> new file mode 100644
> index ..151f1c8f827e
> --- /dev/null
> +++ b/drivers/iio/adc/stmpe-adc.c
> @@ -0,0 +1,340 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + *  STMicroelectronics STMPE811 IIO ADC Driver
> + *
> + *  4 channel, 10/12-bit ADC
> + *
> + *  Copyright (C) 2013-2018 Toradex AG 
> + */
> +
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +
> +#define STMPE_REG_INT_STA0x0B
> +#define STMPE_REG_ADC_INT_EN 0x0E
> +#define STMPE_REG_ADC_INT_STA0x0F
> +
> +#define STMPE_REG_ADC_CTRL1  0x20
> +#define STMPE_REG_ADC_CTRL2  0x21
> +#define STMPE_REG_ADC_CAPT   0x22
> +#define STMPE_REG_ADC_DATA_CH(channel)   (0x30 + 2 * (channel))
> +
> +#define STMPE_REG_TEMP_CTRL  0x60
> +#define STMPE_TEMP_CTRL_ENABLE   BIT(0)
> +#define STMPE_TEMP_CTRL_ACQ  BIT(1)
> +#define STMPE_TEMP_CTRL_THRES_EN BIT(3)
> +#define STMPE_START_ONE_TEMP_CONV(STMPE_TEMP_CTRL_ENABLE | \
> + STMPE_TEMP_CTRL_ACQ | \
> + STMPE_TEMP_CTRL_THRES_EN)
> +#define STMPE_REG_TEMP_DATA  0x61
> +#define STMPE_REG_TEMP_TH0x63
> +#define STMPE_ADC_LAST_NR7
> +#define STMPE_TEMP_CHANNEL   (STMPE_ADC_LAST_NR + 1)
> +
> +#define STMPE_ADC_CH(channel)((1 << (channel)) & 0xff)
> +
> +#define STMPE_ADC_TIMEOUTmsecs_to_jiffies(1000)
> +

[PATCH v2 2/4] iio: adc: add STMPE ADC driver using IIO framework

2018-11-19 Thread Philippe Schenker
From: Stefan Agner 

This adds an ADC driver for the STMPE device using the industrial
input/output interface. The driver supports raw reading of values.
The driver depends on the MFD STMPE driver. If the touchscreen
block is enabled too, only four of the 8 ADC channels are available.

Signed-off-by: Stefan Agner 
Signed-off-by: Max Krummenacher 
Signed-off-by: Philippe Schenker 
---

Changes in v2:
 - Code formatting
 - Move code to setup ADC to MFD device, as it is used by both drivers
   adc and touchscreen
 - Removed unused includes
 - Defined the macro STMPE_START_ONE_TEMP_CONV with other macros.
 - Added new macro that defines the channel of the temperature sensor.
   Took new name for STMPE_MAX_ADC->STMPE_ADC_LAST_NR and used it throughout
   the code for better readability.
 - Added mutex_unlock where missing.

 drivers/iio/adc/Kconfig  |   7 +
 drivers/iio/adc/Makefile |   1 +
 drivers/iio/adc/stmpe-adc.c  | 340 +++
 drivers/input/touchscreen/stmpe-ts.c |  43 +---
 drivers/mfd/Kconfig  |   3 +-
 drivers/mfd/stmpe.c  |  84 +++
 include/linux/mfd/stmpe.h|   6 +
 7 files changed, 445 insertions(+), 39 deletions(-)
 create mode 100644 drivers/iio/adc/stmpe-adc.c

diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig
index a52fea8749a9..5d4c061d8296 100644
--- a/drivers/iio/adc/Kconfig
+++ b/drivers/iio/adc/Kconfig
@@ -734,6 +734,13 @@ config STM32_DFSDM_ADC
  This driver can also be built as a module.  If so, the module
  will be called stm32-dfsdm-adc.
 
+config STMPE_ADC
+   tristate "STMicroelectronics STMPE ADC driver"
+   depends on (OF || COMPILE_TEST || MFD_STMPE)
+   help
+ Say yes here to build support for ST Microelectronics STMPE
+ built-in ADC block (stmpe811).
+
 config STX104
tristate "Apex Embedded Systems STX104 driver"
depends on PC104 && X86
diff --git a/drivers/iio/adc/Makefile b/drivers/iio/adc/Makefile
index a6e6a0b659e2..cba889c30bf9 100644
--- a/drivers/iio/adc/Makefile
+++ b/drivers/iio/adc/Makefile
@@ -69,6 +69,7 @@ obj-$(CONFIG_STM32_ADC_CORE) += stm32-adc-core.o
 obj-$(CONFIG_STM32_ADC) += stm32-adc.o
 obj-$(CONFIG_STM32_DFSDM_CORE) += stm32-dfsdm-core.o
 obj-$(CONFIG_STM32_DFSDM_ADC) += stm32-dfsdm-adc.o
+obj-$(CONFIG_STMPE_ADC) += stmpe-adc.o
 obj-$(CONFIG_TI_ADC081C) += ti-adc081c.o
 obj-$(CONFIG_TI_ADC0832) += ti-adc0832.o
 obj-$(CONFIG_TI_ADC084S021) += ti-adc084s021.o
diff --git a/drivers/iio/adc/stmpe-adc.c b/drivers/iio/adc/stmpe-adc.c
new file mode 100644
index ..151f1c8f827e
--- /dev/null
+++ b/drivers/iio/adc/stmpe-adc.c
@@ -0,0 +1,340 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ *  STMicroelectronics STMPE811 IIO ADC Driver
+ *
+ *  4 channel, 10/12-bit ADC
+ *
+ *  Copyright (C) 2013-2018 Toradex AG 
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define STMPE_REG_INT_STA  0x0B
+#define STMPE_REG_ADC_INT_EN   0x0E
+#define STMPE_REG_ADC_INT_STA  0x0F
+
+#define STMPE_REG_ADC_CTRL10x20
+#define STMPE_REG_ADC_CTRL20x21
+#define STMPE_REG_ADC_CAPT 0x22
+#define STMPE_REG_ADC_DATA_CH(channel) (0x30 + 2 * (channel))
+
+#define STMPE_REG_TEMP_CTRL0x60
+#define STMPE_TEMP_CTRL_ENABLE BIT(0)
+#define STMPE_TEMP_CTRL_ACQBIT(1)
+#define STMPE_TEMP_CTRL_THRES_EN   BIT(3)
+#define STMPE_START_ONE_TEMP_CONV  (STMPE_TEMP_CTRL_ENABLE | \
+   STMPE_TEMP_CTRL_ACQ | \
+   STMPE_TEMP_CTRL_THRES_EN)
+#define STMPE_REG_TEMP_DATA0x61
+#define STMPE_REG_TEMP_TH  0x63
+#define STMPE_ADC_LAST_NR  7
+#define STMPE_TEMP_CHANNEL (STMPE_ADC_LAST_NR + 1)
+
+#define STMPE_ADC_CH(channel)  ((1 << (channel)) & 0xff)
+
+#define STMPE_ADC_TIMEOUT  msecs_to_jiffies(1000)
+
+struct stmpe_adc {
+   struct stmpe *stmpe;
+   struct clk *clk;
+   struct device *dev;
+
+   /* We are allocating plus one for the temperature channel */
+   struct iio_chan_spec stmpe_adc_iio_channels[STMPE_ADC_LAST_NR + 2];
+
+   struct completion completion;
+
+   u8 channel;
+   u32 value;
+   u32 norequest_mask;
+};
+
+static int stmpe_read_raw(struct iio_dev *indio_dev,
+ struct iio_chan_spec const *chan,
+ int *val,
+ int *val2,
+ long mask)
+{
+   struct stmpe_adc *info = iio_priv(indio_dev);
+   long ret;
+
+   switch (mask) {
+   case IIO_CHAN_INFO_RAW:
+   case IIO_CHAN_INFO_PROCESSED:
+
+   mutex_lock(_dev->mlock);
+
+   info->channel = (u8)chan->channel;
+
+   switch (chan->type) {
+   case IIO_VOLTAGE:
+   if 

[PATCH v2 2/4] iio: adc: add STMPE ADC driver using IIO framework

2018-11-19 Thread Philippe Schenker
From: Stefan Agner 

This adds an ADC driver for the STMPE device using the industrial
input/output interface. The driver supports raw reading of values.
The driver depends on the MFD STMPE driver. If the touchscreen
block is enabled too, only four of the 8 ADC channels are available.

Signed-off-by: Stefan Agner 
Signed-off-by: Max Krummenacher 
Signed-off-by: Philippe Schenker 
---

Changes in v2:
 - Code formatting
 - Move code to setup ADC to MFD device, as it is used by both drivers
   adc and touchscreen
 - Removed unused includes
 - Defined the macro STMPE_START_ONE_TEMP_CONV with other macros.
 - Added new macro that defines the channel of the temperature sensor.
   Took new name for STMPE_MAX_ADC->STMPE_ADC_LAST_NR and used it throughout
   the code for better readability.
 - Added mutex_unlock where missing.

 drivers/iio/adc/Kconfig  |   7 +
 drivers/iio/adc/Makefile |   1 +
 drivers/iio/adc/stmpe-adc.c  | 340 +++
 drivers/input/touchscreen/stmpe-ts.c |  43 +---
 drivers/mfd/Kconfig  |   3 +-
 drivers/mfd/stmpe.c  |  84 +++
 include/linux/mfd/stmpe.h|   6 +
 7 files changed, 445 insertions(+), 39 deletions(-)
 create mode 100644 drivers/iio/adc/stmpe-adc.c

diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig
index a52fea8749a9..5d4c061d8296 100644
--- a/drivers/iio/adc/Kconfig
+++ b/drivers/iio/adc/Kconfig
@@ -734,6 +734,13 @@ config STM32_DFSDM_ADC
  This driver can also be built as a module.  If so, the module
  will be called stm32-dfsdm-adc.
 
+config STMPE_ADC
+   tristate "STMicroelectronics STMPE ADC driver"
+   depends on (OF || COMPILE_TEST || MFD_STMPE)
+   help
+ Say yes here to build support for ST Microelectronics STMPE
+ built-in ADC block (stmpe811).
+
 config STX104
tristate "Apex Embedded Systems STX104 driver"
depends on PC104 && X86
diff --git a/drivers/iio/adc/Makefile b/drivers/iio/adc/Makefile
index a6e6a0b659e2..cba889c30bf9 100644
--- a/drivers/iio/adc/Makefile
+++ b/drivers/iio/adc/Makefile
@@ -69,6 +69,7 @@ obj-$(CONFIG_STM32_ADC_CORE) += stm32-adc-core.o
 obj-$(CONFIG_STM32_ADC) += stm32-adc.o
 obj-$(CONFIG_STM32_DFSDM_CORE) += stm32-dfsdm-core.o
 obj-$(CONFIG_STM32_DFSDM_ADC) += stm32-dfsdm-adc.o
+obj-$(CONFIG_STMPE_ADC) += stmpe-adc.o
 obj-$(CONFIG_TI_ADC081C) += ti-adc081c.o
 obj-$(CONFIG_TI_ADC0832) += ti-adc0832.o
 obj-$(CONFIG_TI_ADC084S021) += ti-adc084s021.o
diff --git a/drivers/iio/adc/stmpe-adc.c b/drivers/iio/adc/stmpe-adc.c
new file mode 100644
index ..151f1c8f827e
--- /dev/null
+++ b/drivers/iio/adc/stmpe-adc.c
@@ -0,0 +1,340 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ *  STMicroelectronics STMPE811 IIO ADC Driver
+ *
+ *  4 channel, 10/12-bit ADC
+ *
+ *  Copyright (C) 2013-2018 Toradex AG 
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define STMPE_REG_INT_STA  0x0B
+#define STMPE_REG_ADC_INT_EN   0x0E
+#define STMPE_REG_ADC_INT_STA  0x0F
+
+#define STMPE_REG_ADC_CTRL10x20
+#define STMPE_REG_ADC_CTRL20x21
+#define STMPE_REG_ADC_CAPT 0x22
+#define STMPE_REG_ADC_DATA_CH(channel) (0x30 + 2 * (channel))
+
+#define STMPE_REG_TEMP_CTRL0x60
+#define STMPE_TEMP_CTRL_ENABLE BIT(0)
+#define STMPE_TEMP_CTRL_ACQBIT(1)
+#define STMPE_TEMP_CTRL_THRES_EN   BIT(3)
+#define STMPE_START_ONE_TEMP_CONV  (STMPE_TEMP_CTRL_ENABLE | \
+   STMPE_TEMP_CTRL_ACQ | \
+   STMPE_TEMP_CTRL_THRES_EN)
+#define STMPE_REG_TEMP_DATA0x61
+#define STMPE_REG_TEMP_TH  0x63
+#define STMPE_ADC_LAST_NR  7
+#define STMPE_TEMP_CHANNEL (STMPE_ADC_LAST_NR + 1)
+
+#define STMPE_ADC_CH(channel)  ((1 << (channel)) & 0xff)
+
+#define STMPE_ADC_TIMEOUT  msecs_to_jiffies(1000)
+
+struct stmpe_adc {
+   struct stmpe *stmpe;
+   struct clk *clk;
+   struct device *dev;
+
+   /* We are allocating plus one for the temperature channel */
+   struct iio_chan_spec stmpe_adc_iio_channels[STMPE_ADC_LAST_NR + 2];
+
+   struct completion completion;
+
+   u8 channel;
+   u32 value;
+   u32 norequest_mask;
+};
+
+static int stmpe_read_raw(struct iio_dev *indio_dev,
+ struct iio_chan_spec const *chan,
+ int *val,
+ int *val2,
+ long mask)
+{
+   struct stmpe_adc *info = iio_priv(indio_dev);
+   long ret;
+
+   switch (mask) {
+   case IIO_CHAN_INFO_RAW:
+   case IIO_CHAN_INFO_PROCESSED:
+
+   mutex_lock(_dev->mlock);
+
+   info->channel = (u8)chan->channel;
+
+   switch (chan->type) {
+   case IIO_VOLTAGE:
+   if