cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

exynos_adc.c (25460B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 *  exynos_adc.c - Support for ADC in EXYNOS SoCs
      4 *
      5 *  8 ~ 10 channel, 10/12-bit ADC
      6 *
      7 *  Copyright (C) 2013 Naveen Krishna Chatradhi <ch.naveen@samsung.com>
      8 */
      9
     10#include <linux/compiler.h>
     11#include <linux/module.h>
     12#include <linux/platform_device.h>
     13#include <linux/interrupt.h>
     14#include <linux/delay.h>
     15#include <linux/errno.h>
     16#include <linux/kernel.h>
     17#include <linux/slab.h>
     18#include <linux/io.h>
     19#include <linux/clk.h>
     20#include <linux/completion.h>
     21#include <linux/of.h>
     22#include <linux/of_irq.h>
     23#include <linux/regulator/consumer.h>
     24#include <linux/of_platform.h>
     25#include <linux/err.h>
     26#include <linux/input.h>
     27
     28#include <linux/iio/iio.h>
     29#include <linux/iio/machine.h>
     30#include <linux/iio/driver.h>
     31#include <linux/mfd/syscon.h>
     32#include <linux/regmap.h>
     33
     34#include <linux/platform_data/touchscreen-s3c2410.h>
     35
     36/* S3C/EXYNOS4412/5250 ADC_V1 registers definitions */
     37#define ADC_V1_CON(x)		((x) + 0x00)
     38#define ADC_V1_TSC(x)		((x) + 0x04)
     39#define ADC_V1_DLY(x)		((x) + 0x08)
     40#define ADC_V1_DATX(x)		((x) + 0x0C)
     41#define ADC_V1_DATY(x)		((x) + 0x10)
     42#define ADC_V1_UPDN(x)		((x) + 0x14)
     43#define ADC_V1_INTCLR(x)	((x) + 0x18)
     44#define ADC_V1_MUX(x)		((x) + 0x1c)
     45#define ADC_V1_CLRINTPNDNUP(x)	((x) + 0x20)
     46
     47/* S3C2410 ADC registers definitions */
     48#define ADC_S3C2410_MUX(x)	((x) + 0x18)
     49
     50/* Future ADC_V2 registers definitions */
     51#define ADC_V2_CON1(x)		((x) + 0x00)
     52#define ADC_V2_CON2(x)		((x) + 0x04)
     53#define ADC_V2_STAT(x)		((x) + 0x08)
     54#define ADC_V2_INT_EN(x)	((x) + 0x10)
     55#define ADC_V2_INT_ST(x)	((x) + 0x14)
     56#define ADC_V2_VER(x)		((x) + 0x20)
     57
     58/* Bit definitions for ADC_V1 */
     59#define ADC_V1_CON_RES		(1u << 16)
     60#define ADC_V1_CON_PRSCEN	(1u << 14)
     61#define ADC_V1_CON_PRSCLV(x)	(((x) & 0xFF) << 6)
     62#define ADC_V1_CON_STANDBY	(1u << 2)
     63
     64/* Bit definitions for S3C2410 ADC */
     65#define ADC_S3C2410_CON_SELMUX(x) (((x) & 7) << 3)
     66#define ADC_S3C2410_DATX_MASK	0x3FF
     67#define ADC_S3C2416_CON_RES_SEL	(1u << 3)
     68
     69/* touch screen always uses channel 0 */
     70#define ADC_S3C2410_MUX_TS	0
     71
     72/* ADCTSC Register Bits */
     73#define ADC_S3C2443_TSC_UD_SEN		(1u << 8)
     74#define ADC_S3C2410_TSC_YM_SEN		(1u << 7)
     75#define ADC_S3C2410_TSC_YP_SEN		(1u << 6)
     76#define ADC_S3C2410_TSC_XM_SEN		(1u << 5)
     77#define ADC_S3C2410_TSC_XP_SEN		(1u << 4)
     78#define ADC_S3C2410_TSC_PULL_UP_DISABLE	(1u << 3)
     79#define ADC_S3C2410_TSC_AUTO_PST	(1u << 2)
     80#define ADC_S3C2410_TSC_XY_PST(x)	(((x) & 0x3) << 0)
     81
     82#define ADC_TSC_WAIT4INT (ADC_S3C2410_TSC_YM_SEN | \
     83			 ADC_S3C2410_TSC_YP_SEN | \
     84			 ADC_S3C2410_TSC_XP_SEN | \
     85			 ADC_S3C2410_TSC_XY_PST(3))
     86
     87#define ADC_TSC_AUTOPST	(ADC_S3C2410_TSC_YM_SEN | \
     88			 ADC_S3C2410_TSC_YP_SEN | \
     89			 ADC_S3C2410_TSC_XP_SEN | \
     90			 ADC_S3C2410_TSC_AUTO_PST | \
     91			 ADC_S3C2410_TSC_XY_PST(0))
     92
     93/* Bit definitions for ADC_V2 */
     94#define ADC_V2_CON1_SOFT_RESET	(1u << 2)
     95
     96#define ADC_V2_CON2_OSEL	(1u << 10)
     97#define ADC_V2_CON2_ESEL	(1u << 9)
     98#define ADC_V2_CON2_HIGHF	(1u << 8)
     99#define ADC_V2_CON2_C_TIME(x)	(((x) & 7) << 4)
    100#define ADC_V2_CON2_ACH_SEL(x)	(((x) & 0xF) << 0)
    101#define ADC_V2_CON2_ACH_MASK	0xF
    102
    103#define MAX_ADC_V2_CHANNELS		10
    104#define MAX_ADC_V1_CHANNELS		8
    105#define MAX_EXYNOS3250_ADC_CHANNELS	2
    106#define MAX_EXYNOS4212_ADC_CHANNELS	4
    107#define MAX_S5PV210_ADC_CHANNELS	10
    108
    109/* Bit definitions common for ADC_V1 and ADC_V2 */
    110#define ADC_CON_EN_START	(1u << 0)
    111#define ADC_CON_EN_START_MASK	(0x3 << 0)
    112#define ADC_DATX_PRESSED	(1u << 15)
    113#define ADC_DATX_MASK		0xFFF
    114#define ADC_DATY_MASK		0xFFF
    115
    116#define EXYNOS_ADC_TIMEOUT	(msecs_to_jiffies(100))
    117
    118#define EXYNOS_ADCV1_PHY_OFFSET	0x0718
    119#define EXYNOS_ADCV2_PHY_OFFSET	0x0720
    120
    121struct exynos_adc {
    122	struct exynos_adc_data	*data;
    123	struct device		*dev;
    124	struct input_dev	*input;
    125	void __iomem		*regs;
    126	struct regmap		*pmu_map;
    127	struct clk		*clk;
    128	struct clk		*sclk;
    129	unsigned int		irq;
    130	unsigned int		tsirq;
    131	unsigned int		delay;
    132	struct regulator	*vdd;
    133
    134	struct completion	completion;
    135
    136	u32			value;
    137	unsigned int            version;
    138
    139	bool			ts_enabled;
    140
    141	bool			read_ts;
    142	u32			ts_x;
    143	u32			ts_y;
    144
    145	/*
    146	 * Lock to protect from potential concurrent access to the
    147	 * completion callback during a manual conversion. For this driver
    148	 * a wait-callback is used to wait for the conversion result,
    149	 * so in the meantime no other read request (or conversion start)
    150	 * must be performed, otherwise it would interfere with the
    151	 * current conversion result.
    152	 */
    153	struct mutex		lock;
    154};
    155
    156struct exynos_adc_data {
    157	int num_channels;
    158	bool needs_sclk;
    159	bool needs_adc_phy;
    160	int phy_offset;
    161	u32 mask;
    162
    163	void (*init_hw)(struct exynos_adc *info);
    164	void (*exit_hw)(struct exynos_adc *info);
    165	void (*clear_irq)(struct exynos_adc *info);
    166	void (*start_conv)(struct exynos_adc *info, unsigned long addr);
    167};
    168
    169static void exynos_adc_unprepare_clk(struct exynos_adc *info)
    170{
    171	if (info->data->needs_sclk)
    172		clk_unprepare(info->sclk);
    173	clk_unprepare(info->clk);
    174}
    175
    176static int exynos_adc_prepare_clk(struct exynos_adc *info)
    177{
    178	int ret;
    179
    180	ret = clk_prepare(info->clk);
    181	if (ret) {
    182		dev_err(info->dev, "failed preparing adc clock: %d\n", ret);
    183		return ret;
    184	}
    185
    186	if (info->data->needs_sclk) {
    187		ret = clk_prepare(info->sclk);
    188		if (ret) {
    189			clk_unprepare(info->clk);
    190			dev_err(info->dev,
    191				"failed preparing sclk_adc clock: %d\n", ret);
    192			return ret;
    193		}
    194	}
    195
    196	return 0;
    197}
    198
    199static void exynos_adc_disable_clk(struct exynos_adc *info)
    200{
    201	if (info->data->needs_sclk)
    202		clk_disable(info->sclk);
    203	clk_disable(info->clk);
    204}
    205
    206static int exynos_adc_enable_clk(struct exynos_adc *info)
    207{
    208	int ret;
    209
    210	ret = clk_enable(info->clk);
    211	if (ret) {
    212		dev_err(info->dev, "failed enabling adc clock: %d\n", ret);
    213		return ret;
    214	}
    215
    216	if (info->data->needs_sclk) {
    217		ret = clk_enable(info->sclk);
    218		if (ret) {
    219			clk_disable(info->clk);
    220			dev_err(info->dev,
    221				"failed enabling sclk_adc clock: %d\n", ret);
    222			return ret;
    223		}
    224	}
    225
    226	return 0;
    227}
    228
    229static void exynos_adc_v1_init_hw(struct exynos_adc *info)
    230{
    231	u32 con1;
    232
    233	if (info->data->needs_adc_phy)
    234		regmap_write(info->pmu_map, info->data->phy_offset, 1);
    235
    236	/* set default prescaler values and Enable prescaler */
    237	con1 =  ADC_V1_CON_PRSCLV(49) | ADC_V1_CON_PRSCEN;
    238
    239	/* Enable 12-bit ADC resolution */
    240	con1 |= ADC_V1_CON_RES;
    241	writel(con1, ADC_V1_CON(info->regs));
    242
    243	/* set touchscreen delay */
    244	writel(info->delay, ADC_V1_DLY(info->regs));
    245}
    246
    247static void exynos_adc_v1_exit_hw(struct exynos_adc *info)
    248{
    249	u32 con;
    250
    251	if (info->data->needs_adc_phy)
    252		regmap_write(info->pmu_map, info->data->phy_offset, 0);
    253
    254	con = readl(ADC_V1_CON(info->regs));
    255	con |= ADC_V1_CON_STANDBY;
    256	writel(con, ADC_V1_CON(info->regs));
    257}
    258
    259static void exynos_adc_v1_clear_irq(struct exynos_adc *info)
    260{
    261	writel(1, ADC_V1_INTCLR(info->regs));
    262}
    263
    264static void exynos_adc_v1_start_conv(struct exynos_adc *info,
    265				     unsigned long addr)
    266{
    267	u32 con1;
    268
    269	writel(addr, ADC_V1_MUX(info->regs));
    270
    271	con1 = readl(ADC_V1_CON(info->regs));
    272	writel(con1 | ADC_CON_EN_START, ADC_V1_CON(info->regs));
    273}
    274
    275/* Exynos4212 and 4412 is like ADCv1 but with four channels only */
    276static const struct exynos_adc_data exynos4212_adc_data = {
    277	.num_channels	= MAX_EXYNOS4212_ADC_CHANNELS,
    278	.mask		= ADC_DATX_MASK,	/* 12 bit ADC resolution */
    279	.needs_adc_phy	= true,
    280	.phy_offset	= EXYNOS_ADCV1_PHY_OFFSET,
    281
    282	.init_hw	= exynos_adc_v1_init_hw,
    283	.exit_hw	= exynos_adc_v1_exit_hw,
    284	.clear_irq	= exynos_adc_v1_clear_irq,
    285	.start_conv	= exynos_adc_v1_start_conv,
    286};
    287
    288static const struct exynos_adc_data exynos_adc_v1_data = {
    289	.num_channels	= MAX_ADC_V1_CHANNELS,
    290	.mask		= ADC_DATX_MASK,	/* 12 bit ADC resolution */
    291	.needs_adc_phy	= true,
    292	.phy_offset	= EXYNOS_ADCV1_PHY_OFFSET,
    293
    294	.init_hw	= exynos_adc_v1_init_hw,
    295	.exit_hw	= exynos_adc_v1_exit_hw,
    296	.clear_irq	= exynos_adc_v1_clear_irq,
    297	.start_conv	= exynos_adc_v1_start_conv,
    298};
    299
    300static const struct exynos_adc_data exynos_adc_s5pv210_data = {
    301	.num_channels	= MAX_S5PV210_ADC_CHANNELS,
    302	.mask		= ADC_DATX_MASK,	/* 12 bit ADC resolution */
    303
    304	.init_hw	= exynos_adc_v1_init_hw,
    305	.exit_hw	= exynos_adc_v1_exit_hw,
    306	.clear_irq	= exynos_adc_v1_clear_irq,
    307	.start_conv	= exynos_adc_v1_start_conv,
    308};
    309
    310static void exynos_adc_s3c2416_start_conv(struct exynos_adc *info,
    311					  unsigned long addr)
    312{
    313	u32 con1;
    314
    315	/* Enable 12 bit ADC resolution */
    316	con1 = readl(ADC_V1_CON(info->regs));
    317	con1 |= ADC_S3C2416_CON_RES_SEL;
    318	writel(con1, ADC_V1_CON(info->regs));
    319
    320	/* Select channel for S3C2416 */
    321	writel(addr, ADC_S3C2410_MUX(info->regs));
    322
    323	con1 = readl(ADC_V1_CON(info->regs));
    324	writel(con1 | ADC_CON_EN_START, ADC_V1_CON(info->regs));
    325}
    326
    327static struct exynos_adc_data const exynos_adc_s3c2416_data = {
    328	.num_channels	= MAX_ADC_V1_CHANNELS,
    329	.mask		= ADC_DATX_MASK,	/* 12 bit ADC resolution */
    330
    331	.init_hw	= exynos_adc_v1_init_hw,
    332	.exit_hw	= exynos_adc_v1_exit_hw,
    333	.start_conv	= exynos_adc_s3c2416_start_conv,
    334};
    335
    336static void exynos_adc_s3c2443_start_conv(struct exynos_adc *info,
    337					  unsigned long addr)
    338{
    339	u32 con1;
    340
    341	/* Select channel for S3C2433 */
    342	writel(addr, ADC_S3C2410_MUX(info->regs));
    343
    344	con1 = readl(ADC_V1_CON(info->regs));
    345	writel(con1 | ADC_CON_EN_START, ADC_V1_CON(info->regs));
    346}
    347
    348static struct exynos_adc_data const exynos_adc_s3c2443_data = {
    349	.num_channels	= MAX_ADC_V1_CHANNELS,
    350	.mask		= ADC_S3C2410_DATX_MASK, /* 10 bit ADC resolution */
    351
    352	.init_hw	= exynos_adc_v1_init_hw,
    353	.exit_hw	= exynos_adc_v1_exit_hw,
    354	.start_conv	= exynos_adc_s3c2443_start_conv,
    355};
    356
    357static void exynos_adc_s3c64xx_start_conv(struct exynos_adc *info,
    358					  unsigned long addr)
    359{
    360	u32 con1;
    361
    362	con1 = readl(ADC_V1_CON(info->regs));
    363	con1 &= ~ADC_S3C2410_CON_SELMUX(0x7);
    364	con1 |= ADC_S3C2410_CON_SELMUX(addr);
    365	writel(con1 | ADC_CON_EN_START, ADC_V1_CON(info->regs));
    366}
    367
    368static struct exynos_adc_data const exynos_adc_s3c24xx_data = {
    369	.num_channels	= MAX_ADC_V1_CHANNELS,
    370	.mask		= ADC_S3C2410_DATX_MASK, /* 10 bit ADC resolution */
    371
    372	.init_hw	= exynos_adc_v1_init_hw,
    373	.exit_hw	= exynos_adc_v1_exit_hw,
    374	.start_conv	= exynos_adc_s3c64xx_start_conv,
    375};
    376
    377static struct exynos_adc_data const exynos_adc_s3c64xx_data = {
    378	.num_channels	= MAX_ADC_V1_CHANNELS,
    379	.mask		= ADC_DATX_MASK,	/* 12 bit ADC resolution */
    380
    381	.init_hw	= exynos_adc_v1_init_hw,
    382	.exit_hw	= exynos_adc_v1_exit_hw,
    383	.clear_irq	= exynos_adc_v1_clear_irq,
    384	.start_conv	= exynos_adc_s3c64xx_start_conv,
    385};
    386
    387static void exynos_adc_v2_init_hw(struct exynos_adc *info)
    388{
    389	u32 con1, con2;
    390
    391	if (info->data->needs_adc_phy)
    392		regmap_write(info->pmu_map, info->data->phy_offset, 1);
    393
    394	con1 = ADC_V2_CON1_SOFT_RESET;
    395	writel(con1, ADC_V2_CON1(info->regs));
    396
    397	con2 = ADC_V2_CON2_OSEL | ADC_V2_CON2_ESEL |
    398		ADC_V2_CON2_HIGHF | ADC_V2_CON2_C_TIME(0);
    399	writel(con2, ADC_V2_CON2(info->regs));
    400
    401	/* Enable interrupts */
    402	writel(1, ADC_V2_INT_EN(info->regs));
    403}
    404
    405static void exynos_adc_v2_exit_hw(struct exynos_adc *info)
    406{
    407	u32 con;
    408
    409	if (info->data->needs_adc_phy)
    410		regmap_write(info->pmu_map, info->data->phy_offset, 0);
    411
    412	con = readl(ADC_V2_CON1(info->regs));
    413	con &= ~ADC_CON_EN_START;
    414	writel(con, ADC_V2_CON1(info->regs));
    415}
    416
    417static void exynos_adc_v2_clear_irq(struct exynos_adc *info)
    418{
    419	writel(1, ADC_V2_INT_ST(info->regs));
    420}
    421
    422static void exynos_adc_v2_start_conv(struct exynos_adc *info,
    423				     unsigned long addr)
    424{
    425	u32 con1, con2;
    426
    427	con2 = readl(ADC_V2_CON2(info->regs));
    428	con2 &= ~ADC_V2_CON2_ACH_MASK;
    429	con2 |= ADC_V2_CON2_ACH_SEL(addr);
    430	writel(con2, ADC_V2_CON2(info->regs));
    431
    432	con1 = readl(ADC_V2_CON1(info->regs));
    433	writel(con1 | ADC_CON_EN_START, ADC_V2_CON1(info->regs));
    434}
    435
    436static const struct exynos_adc_data exynos_adc_v2_data = {
    437	.num_channels	= MAX_ADC_V2_CHANNELS,
    438	.mask		= ADC_DATX_MASK, /* 12 bit ADC resolution */
    439	.needs_adc_phy	= true,
    440	.phy_offset	= EXYNOS_ADCV2_PHY_OFFSET,
    441
    442	.init_hw	= exynos_adc_v2_init_hw,
    443	.exit_hw	= exynos_adc_v2_exit_hw,
    444	.clear_irq	= exynos_adc_v2_clear_irq,
    445	.start_conv	= exynos_adc_v2_start_conv,
    446};
    447
    448static const struct exynos_adc_data exynos3250_adc_data = {
    449	.num_channels	= MAX_EXYNOS3250_ADC_CHANNELS,
    450	.mask		= ADC_DATX_MASK, /* 12 bit ADC resolution */
    451	.needs_sclk	= true,
    452	.needs_adc_phy	= true,
    453	.phy_offset	= EXYNOS_ADCV1_PHY_OFFSET,
    454
    455	.init_hw	= exynos_adc_v2_init_hw,
    456	.exit_hw	= exynos_adc_v2_exit_hw,
    457	.clear_irq	= exynos_adc_v2_clear_irq,
    458	.start_conv	= exynos_adc_v2_start_conv,
    459};
    460
    461static void exynos_adc_exynos7_init_hw(struct exynos_adc *info)
    462{
    463	u32 con1, con2;
    464
    465	con1 = ADC_V2_CON1_SOFT_RESET;
    466	writel(con1, ADC_V2_CON1(info->regs));
    467
    468	con2 = readl(ADC_V2_CON2(info->regs));
    469	con2 &= ~ADC_V2_CON2_C_TIME(7);
    470	con2 |= ADC_V2_CON2_C_TIME(0);
    471	writel(con2, ADC_V2_CON2(info->regs));
    472
    473	/* Enable interrupts */
    474	writel(1, ADC_V2_INT_EN(info->regs));
    475}
    476
    477static const struct exynos_adc_data exynos7_adc_data = {
    478	.num_channels	= MAX_ADC_V1_CHANNELS,
    479	.mask		= ADC_DATX_MASK, /* 12 bit ADC resolution */
    480
    481	.init_hw	= exynos_adc_exynos7_init_hw,
    482	.exit_hw	= exynos_adc_v2_exit_hw,
    483	.clear_irq	= exynos_adc_v2_clear_irq,
    484	.start_conv	= exynos_adc_v2_start_conv,
    485};
    486
    487static const struct of_device_id exynos_adc_match[] = {
    488	{
    489		.compatible = "samsung,s3c2410-adc",
    490		.data = &exynos_adc_s3c24xx_data,
    491	}, {
    492		.compatible = "samsung,s3c2416-adc",
    493		.data = &exynos_adc_s3c2416_data,
    494	}, {
    495		.compatible = "samsung,s3c2440-adc",
    496		.data = &exynos_adc_s3c24xx_data,
    497	}, {
    498		.compatible = "samsung,s3c2443-adc",
    499		.data = &exynos_adc_s3c2443_data,
    500	}, {
    501		.compatible = "samsung,s3c6410-adc",
    502		.data = &exynos_adc_s3c64xx_data,
    503	}, {
    504		.compatible = "samsung,s5pv210-adc",
    505		.data = &exynos_adc_s5pv210_data,
    506	}, {
    507		.compatible = "samsung,exynos4212-adc",
    508		.data = &exynos4212_adc_data,
    509	}, {
    510		.compatible = "samsung,exynos-adc-v1",
    511		.data = &exynos_adc_v1_data,
    512	}, {
    513		.compatible = "samsung,exynos-adc-v2",
    514		.data = &exynos_adc_v2_data,
    515	}, {
    516		.compatible = "samsung,exynos3250-adc",
    517		.data = &exynos3250_adc_data,
    518	}, {
    519		.compatible = "samsung,exynos7-adc",
    520		.data = &exynos7_adc_data,
    521	},
    522	{},
    523};
    524MODULE_DEVICE_TABLE(of, exynos_adc_match);
    525
    526static struct exynos_adc_data *exynos_adc_get_data(struct platform_device *pdev)
    527{
    528	const struct of_device_id *match;
    529
    530	match = of_match_node(exynos_adc_match, pdev->dev.of_node);
    531	return (struct exynos_adc_data *)match->data;
    532}
    533
    534static int exynos_read_raw(struct iio_dev *indio_dev,
    535				struct iio_chan_spec const *chan,
    536				int *val,
    537				int *val2,
    538				long mask)
    539{
    540	struct exynos_adc *info = iio_priv(indio_dev);
    541	unsigned long timeout;
    542	int ret;
    543
    544	if (mask == IIO_CHAN_INFO_SCALE) {
    545		ret = regulator_get_voltage(info->vdd);
    546		if (ret < 0)
    547			return ret;
    548
    549		/* Regulator voltage is in uV, but need mV */
    550		*val = ret / 1000;
    551		*val2 = info->data->mask;
    552
    553		return IIO_VAL_FRACTIONAL;
    554	} else if (mask != IIO_CHAN_INFO_RAW) {
    555		return -EINVAL;
    556	}
    557
    558	mutex_lock(&info->lock);
    559	reinit_completion(&info->completion);
    560
    561	/* Select the channel to be used and Trigger conversion */
    562	if (info->data->start_conv)
    563		info->data->start_conv(info, chan->address);
    564
    565	timeout = wait_for_completion_timeout(&info->completion,
    566					      EXYNOS_ADC_TIMEOUT);
    567	if (timeout == 0) {
    568		dev_warn(&indio_dev->dev, "Conversion timed out! Resetting\n");
    569		if (info->data->init_hw)
    570			info->data->init_hw(info);
    571		ret = -ETIMEDOUT;
    572	} else {
    573		*val = info->value;
    574		*val2 = 0;
    575		ret = IIO_VAL_INT;
    576	}
    577
    578	mutex_unlock(&info->lock);
    579
    580	return ret;
    581}
    582
    583static int exynos_read_s3c64xx_ts(struct iio_dev *indio_dev, int *x, int *y)
    584{
    585	struct exynos_adc *info = iio_priv(indio_dev);
    586	unsigned long timeout;
    587	int ret;
    588
    589	mutex_lock(&info->lock);
    590	info->read_ts = true;
    591
    592	reinit_completion(&info->completion);
    593
    594	writel(ADC_S3C2410_TSC_PULL_UP_DISABLE | ADC_TSC_AUTOPST,
    595	       ADC_V1_TSC(info->regs));
    596
    597	/* Select the ts channel to be used and Trigger conversion */
    598	info->data->start_conv(info, ADC_S3C2410_MUX_TS);
    599
    600	timeout = wait_for_completion_timeout(&info->completion,
    601					      EXYNOS_ADC_TIMEOUT);
    602	if (timeout == 0) {
    603		dev_warn(&indio_dev->dev, "Conversion timed out! Resetting\n");
    604		if (info->data->init_hw)
    605			info->data->init_hw(info);
    606		ret = -ETIMEDOUT;
    607	} else {
    608		*x = info->ts_x;
    609		*y = info->ts_y;
    610		ret = 0;
    611	}
    612
    613	info->read_ts = false;
    614	mutex_unlock(&info->lock);
    615
    616	return ret;
    617}
    618
    619static irqreturn_t exynos_adc_isr(int irq, void *dev_id)
    620{
    621	struct exynos_adc *info = dev_id;
    622	u32 mask = info->data->mask;
    623
    624	/* Read value */
    625	if (info->read_ts) {
    626		info->ts_x = readl(ADC_V1_DATX(info->regs));
    627		info->ts_y = readl(ADC_V1_DATY(info->regs));
    628		writel(ADC_TSC_WAIT4INT | ADC_S3C2443_TSC_UD_SEN, ADC_V1_TSC(info->regs));
    629	} else {
    630		info->value = readl(ADC_V1_DATX(info->regs)) & mask;
    631	}
    632
    633	/* clear irq */
    634	if (info->data->clear_irq)
    635		info->data->clear_irq(info);
    636
    637	complete(&info->completion);
    638
    639	return IRQ_HANDLED;
    640}
    641
    642/*
    643 * Here we (ab)use a threaded interrupt handler to stay running
    644 * for as long as the touchscreen remains pressed, we report
    645 * a new event with the latest data and then sleep until the
    646 * next timer tick. This mirrors the behavior of the old
    647 * driver, with much less code.
    648 */
    649static irqreturn_t exynos_ts_isr(int irq, void *dev_id)
    650{
    651	struct exynos_adc *info = dev_id;
    652	struct iio_dev *dev = dev_get_drvdata(info->dev);
    653	u32 x, y;
    654	bool pressed;
    655	int ret;
    656
    657	while (READ_ONCE(info->ts_enabled)) {
    658		ret = exynos_read_s3c64xx_ts(dev, &x, &y);
    659		if (ret == -ETIMEDOUT)
    660			break;
    661
    662		pressed = x & y & ADC_DATX_PRESSED;
    663		if (!pressed) {
    664			input_report_key(info->input, BTN_TOUCH, 0);
    665			input_sync(info->input);
    666			break;
    667		}
    668
    669		input_report_abs(info->input, ABS_X, x & ADC_DATX_MASK);
    670		input_report_abs(info->input, ABS_Y, y & ADC_DATY_MASK);
    671		input_report_key(info->input, BTN_TOUCH, 1);
    672		input_sync(info->input);
    673
    674		usleep_range(1000, 1100);
    675	}
    676
    677	writel(0, ADC_V1_CLRINTPNDNUP(info->regs));
    678
    679	return IRQ_HANDLED;
    680}
    681
    682static int exynos_adc_reg_access(struct iio_dev *indio_dev,
    683			      unsigned reg, unsigned writeval,
    684			      unsigned *readval)
    685{
    686	struct exynos_adc *info = iio_priv(indio_dev);
    687
    688	if (readval == NULL)
    689		return -EINVAL;
    690
    691	*readval = readl(info->regs + reg);
    692
    693	return 0;
    694}
    695
    696static const struct iio_info exynos_adc_iio_info = {
    697	.read_raw = &exynos_read_raw,
    698	.debugfs_reg_access = &exynos_adc_reg_access,
    699};
    700
    701#define ADC_CHANNEL(_index, _id) {			\
    702	.type = IIO_VOLTAGE,				\
    703	.indexed = 1,					\
    704	.channel = _index,				\
    705	.address = _index,				\
    706	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),	\
    707	.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SCALE),	\
    708	.datasheet_name = _id,				\
    709}
    710
    711static const struct iio_chan_spec exynos_adc_iio_channels[] = {
    712	ADC_CHANNEL(0, "adc0"),
    713	ADC_CHANNEL(1, "adc1"),
    714	ADC_CHANNEL(2, "adc2"),
    715	ADC_CHANNEL(3, "adc3"),
    716	ADC_CHANNEL(4, "adc4"),
    717	ADC_CHANNEL(5, "adc5"),
    718	ADC_CHANNEL(6, "adc6"),
    719	ADC_CHANNEL(7, "adc7"),
    720	ADC_CHANNEL(8, "adc8"),
    721	ADC_CHANNEL(9, "adc9"),
    722};
    723
    724static int exynos_adc_remove_devices(struct device *dev, void *c)
    725{
    726	struct platform_device *pdev = to_platform_device(dev);
    727
    728	platform_device_unregister(pdev);
    729
    730	return 0;
    731}
    732
    733static int exynos_adc_ts_open(struct input_dev *dev)
    734{
    735	struct exynos_adc *info = input_get_drvdata(dev);
    736
    737	WRITE_ONCE(info->ts_enabled, true);
    738	enable_irq(info->tsirq);
    739
    740	return 0;
    741}
    742
    743static void exynos_adc_ts_close(struct input_dev *dev)
    744{
    745	struct exynos_adc *info = input_get_drvdata(dev);
    746
    747	WRITE_ONCE(info->ts_enabled, false);
    748	disable_irq(info->tsirq);
    749}
    750
    751static int exynos_adc_ts_init(struct exynos_adc *info)
    752{
    753	int ret;
    754
    755	if (info->tsirq <= 0)
    756		return -ENODEV;
    757
    758	info->input = input_allocate_device();
    759	if (!info->input)
    760		return -ENOMEM;
    761
    762	info->input->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
    763	info->input->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);
    764
    765	input_set_abs_params(info->input, ABS_X, 0, 0x3FF, 0, 0);
    766	input_set_abs_params(info->input, ABS_Y, 0, 0x3FF, 0, 0);
    767
    768	info->input->name = "S3C24xx TouchScreen";
    769	info->input->id.bustype = BUS_HOST;
    770	info->input->open = exynos_adc_ts_open;
    771	info->input->close = exynos_adc_ts_close;
    772
    773	input_set_drvdata(info->input, info);
    774
    775	ret = input_register_device(info->input);
    776	if (ret) {
    777		input_free_device(info->input);
    778		return ret;
    779	}
    780
    781	ret = request_threaded_irq(info->tsirq, NULL, exynos_ts_isr,
    782				   IRQF_ONESHOT | IRQF_NO_AUTOEN,
    783				   "touchscreen", info);
    784	if (ret)
    785		input_unregister_device(info->input);
    786
    787	return ret;
    788}
    789
    790static int exynos_adc_probe(struct platform_device *pdev)
    791{
    792	struct exynos_adc *info = NULL;
    793	struct device_node *np = pdev->dev.of_node;
    794	struct s3c2410_ts_mach_info *pdata = dev_get_platdata(&pdev->dev);
    795	struct iio_dev *indio_dev = NULL;
    796	bool has_ts = false;
    797	int ret;
    798	int irq;
    799
    800	indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(struct exynos_adc));
    801	if (!indio_dev) {
    802		dev_err(&pdev->dev, "failed allocating iio device\n");
    803		return -ENOMEM;
    804	}
    805
    806	info = iio_priv(indio_dev);
    807
    808	info->data = exynos_adc_get_data(pdev);
    809	if (!info->data) {
    810		dev_err(&pdev->dev, "failed getting exynos_adc_data\n");
    811		return -EINVAL;
    812	}
    813
    814	info->regs = devm_platform_ioremap_resource(pdev, 0);
    815	if (IS_ERR(info->regs))
    816		return PTR_ERR(info->regs);
    817
    818
    819	if (info->data->needs_adc_phy) {
    820		info->pmu_map = syscon_regmap_lookup_by_phandle(
    821					pdev->dev.of_node,
    822					"samsung,syscon-phandle");
    823		if (IS_ERR(info->pmu_map)) {
    824			dev_err(&pdev->dev, "syscon regmap lookup failed.\n");
    825			return PTR_ERR(info->pmu_map);
    826		}
    827	}
    828
    829	irq = platform_get_irq(pdev, 0);
    830	if (irq < 0)
    831		return irq;
    832	info->irq = irq;
    833
    834	irq = platform_get_irq(pdev, 1);
    835	if (irq == -EPROBE_DEFER)
    836		return irq;
    837
    838	info->tsirq = irq;
    839
    840	info->dev = &pdev->dev;
    841
    842	init_completion(&info->completion);
    843
    844	info->clk = devm_clk_get(&pdev->dev, "adc");
    845	if (IS_ERR(info->clk)) {
    846		dev_err(&pdev->dev, "failed getting clock, err = %ld\n",
    847							PTR_ERR(info->clk));
    848		return PTR_ERR(info->clk);
    849	}
    850
    851	if (info->data->needs_sclk) {
    852		info->sclk = devm_clk_get(&pdev->dev, "sclk");
    853		if (IS_ERR(info->sclk)) {
    854			dev_err(&pdev->dev,
    855				"failed getting sclk clock, err = %ld\n",
    856				PTR_ERR(info->sclk));
    857			return PTR_ERR(info->sclk);
    858		}
    859	}
    860
    861	info->vdd = devm_regulator_get(&pdev->dev, "vdd");
    862	if (IS_ERR(info->vdd))
    863		return dev_err_probe(&pdev->dev, PTR_ERR(info->vdd),
    864				     "failed getting regulator");
    865
    866	ret = regulator_enable(info->vdd);
    867	if (ret)
    868		return ret;
    869
    870	ret = exynos_adc_prepare_clk(info);
    871	if (ret)
    872		goto err_disable_reg;
    873
    874	ret = exynos_adc_enable_clk(info);
    875	if (ret)
    876		goto err_unprepare_clk;
    877
    878	platform_set_drvdata(pdev, indio_dev);
    879
    880	indio_dev->name = dev_name(&pdev->dev);
    881	indio_dev->info = &exynos_adc_iio_info;
    882	indio_dev->modes = INDIO_DIRECT_MODE;
    883	indio_dev->channels = exynos_adc_iio_channels;
    884	indio_dev->num_channels = info->data->num_channels;
    885
    886	mutex_init(&info->lock);
    887
    888	ret = request_irq(info->irq, exynos_adc_isr,
    889					0, dev_name(&pdev->dev), info);
    890	if (ret < 0) {
    891		dev_err(&pdev->dev, "failed requesting irq, irq = %d\n",
    892							info->irq);
    893		goto err_disable_clk;
    894	}
    895
    896	ret = iio_device_register(indio_dev);
    897	if (ret)
    898		goto err_irq;
    899
    900	if (info->data->init_hw)
    901		info->data->init_hw(info);
    902
    903	/* leave out any TS related code if unreachable */
    904	if (IS_REACHABLE(CONFIG_INPUT)) {
    905		has_ts = of_property_read_bool(pdev->dev.of_node,
    906					       "has-touchscreen") || pdata;
    907	}
    908
    909	if (pdata)
    910		info->delay = pdata->delay;
    911	else
    912		info->delay = 10000;
    913
    914	if (has_ts)
    915		ret = exynos_adc_ts_init(info);
    916	if (ret)
    917		goto err_iio;
    918
    919	ret = of_platform_populate(np, exynos_adc_match, NULL, &indio_dev->dev);
    920	if (ret < 0) {
    921		dev_err(&pdev->dev, "failed adding child nodes\n");
    922		goto err_of_populate;
    923	}
    924
    925	return 0;
    926
    927err_of_populate:
    928	device_for_each_child(&indio_dev->dev, NULL,
    929				exynos_adc_remove_devices);
    930	if (has_ts) {
    931		input_unregister_device(info->input);
    932		free_irq(info->tsirq, info);
    933	}
    934err_iio:
    935	iio_device_unregister(indio_dev);
    936err_irq:
    937	free_irq(info->irq, info);
    938err_disable_clk:
    939	if (info->data->exit_hw)
    940		info->data->exit_hw(info);
    941	exynos_adc_disable_clk(info);
    942err_unprepare_clk:
    943	exynos_adc_unprepare_clk(info);
    944err_disable_reg:
    945	regulator_disable(info->vdd);
    946	return ret;
    947}
    948
    949static int exynos_adc_remove(struct platform_device *pdev)
    950{
    951	struct iio_dev *indio_dev = platform_get_drvdata(pdev);
    952	struct exynos_adc *info = iio_priv(indio_dev);
    953
    954	if (IS_REACHABLE(CONFIG_INPUT) && info->input) {
    955		free_irq(info->tsirq, info);
    956		input_unregister_device(info->input);
    957	}
    958	device_for_each_child(&indio_dev->dev, NULL,
    959				exynos_adc_remove_devices);
    960	iio_device_unregister(indio_dev);
    961	free_irq(info->irq, info);
    962	if (info->data->exit_hw)
    963		info->data->exit_hw(info);
    964	exynos_adc_disable_clk(info);
    965	exynos_adc_unprepare_clk(info);
    966	regulator_disable(info->vdd);
    967
    968	return 0;
    969}
    970
    971static int exynos_adc_suspend(struct device *dev)
    972{
    973	struct iio_dev *indio_dev = dev_get_drvdata(dev);
    974	struct exynos_adc *info = iio_priv(indio_dev);
    975
    976	if (info->data->exit_hw)
    977		info->data->exit_hw(info);
    978	exynos_adc_disable_clk(info);
    979	regulator_disable(info->vdd);
    980
    981	return 0;
    982}
    983
    984static int exynos_adc_resume(struct device *dev)
    985{
    986	struct iio_dev *indio_dev = dev_get_drvdata(dev);
    987	struct exynos_adc *info = iio_priv(indio_dev);
    988	int ret;
    989
    990	ret = regulator_enable(info->vdd);
    991	if (ret)
    992		return ret;
    993
    994	ret = exynos_adc_enable_clk(info);
    995	if (ret)
    996		return ret;
    997
    998	if (info->data->init_hw)
    999		info->data->init_hw(info);
   1000
   1001	return 0;
   1002}
   1003
   1004static DEFINE_SIMPLE_DEV_PM_OPS(exynos_adc_pm_ops, exynos_adc_suspend,
   1005				exynos_adc_resume);
   1006
   1007static struct platform_driver exynos_adc_driver = {
   1008	.probe		= exynos_adc_probe,
   1009	.remove		= exynos_adc_remove,
   1010	.driver		= {
   1011		.name	= "exynos-adc",
   1012		.of_match_table = exynos_adc_match,
   1013		.pm	= pm_sleep_ptr(&exynos_adc_pm_ops),
   1014	},
   1015};
   1016
   1017module_platform_driver(exynos_adc_driver);
   1018
   1019MODULE_AUTHOR("Naveen Krishna Chatradhi <ch.naveen@samsung.com>");
   1020MODULE_DESCRIPTION("Samsung EXYNOS5 ADC driver");
   1021MODULE_LICENSE("GPL v2");