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)
> +
>