162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci/*
462306a36Sopenharmony_ci * Copyright (c) 2008 MtekVision Co., Ltd.
562306a36Sopenharmony_ci *	Kwangwoo Lee <kwlee@mtekvision.com>
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Using code from:
862306a36Sopenharmony_ci *  - ads7846.c
962306a36Sopenharmony_ci *	Copyright (c) 2005 David Brownell
1062306a36Sopenharmony_ci *	Copyright (c) 2006 Nokia Corporation
1162306a36Sopenharmony_ci *  - corgi_ts.c
1262306a36Sopenharmony_ci *	Copyright (C) 2004-2005 Richard Purdie
1362306a36Sopenharmony_ci *  - omap_ts.[hc], ads7846.h, ts_osk.c
1462306a36Sopenharmony_ci *	Copyright (C) 2002 MontaVista Software
1562306a36Sopenharmony_ci *	Copyright (C) 2004 Texas Instruments
1662306a36Sopenharmony_ci *	Copyright (C) 2005 Dirk Behme
1762306a36Sopenharmony_ci */
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci#ifndef _TSC2007_H
2062306a36Sopenharmony_ci#define _TSC2007_H
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_cistruct gpio_desc;
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci#define TSC2007_MEASURE_TEMP0		(0x0 << 4)
2562306a36Sopenharmony_ci#define TSC2007_MEASURE_AUX		(0x2 << 4)
2662306a36Sopenharmony_ci#define TSC2007_MEASURE_TEMP1		(0x4 << 4)
2762306a36Sopenharmony_ci#define TSC2007_ACTIVATE_XN		(0x8 << 4)
2862306a36Sopenharmony_ci#define TSC2007_ACTIVATE_YN		(0x9 << 4)
2962306a36Sopenharmony_ci#define TSC2007_ACTIVATE_YP_XN		(0xa << 4)
3062306a36Sopenharmony_ci#define TSC2007_SETUP			(0xb << 4)
3162306a36Sopenharmony_ci#define TSC2007_MEASURE_X		(0xc << 4)
3262306a36Sopenharmony_ci#define TSC2007_MEASURE_Y		(0xd << 4)
3362306a36Sopenharmony_ci#define TSC2007_MEASURE_Z1		(0xe << 4)
3462306a36Sopenharmony_ci#define TSC2007_MEASURE_Z2		(0xf << 4)
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci#define TSC2007_POWER_OFF_IRQ_EN	(0x0 << 2)
3762306a36Sopenharmony_ci#define TSC2007_ADC_ON_IRQ_DIS0		(0x1 << 2)
3862306a36Sopenharmony_ci#define TSC2007_ADC_OFF_IRQ_EN		(0x2 << 2)
3962306a36Sopenharmony_ci#define TSC2007_ADC_ON_IRQ_DIS1		(0x3 << 2)
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci#define TSC2007_12BIT			(0x0 << 1)
4262306a36Sopenharmony_ci#define TSC2007_8BIT			(0x1 << 1)
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci#define MAX_12BIT			((1 << 12) - 1)
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci#define ADC_ON_12BIT	(TSC2007_12BIT | TSC2007_ADC_ON_IRQ_DIS0)
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci#define READ_Y		(ADC_ON_12BIT | TSC2007_MEASURE_Y)
4962306a36Sopenharmony_ci#define READ_Z1		(ADC_ON_12BIT | TSC2007_MEASURE_Z1)
5062306a36Sopenharmony_ci#define READ_Z2		(ADC_ON_12BIT | TSC2007_MEASURE_Z2)
5162306a36Sopenharmony_ci#define READ_X		(ADC_ON_12BIT | TSC2007_MEASURE_X)
5262306a36Sopenharmony_ci#define PWRDOWN		(TSC2007_12BIT | TSC2007_POWER_OFF_IRQ_EN)
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_cistruct ts_event {
5562306a36Sopenharmony_ci	u16	x;
5662306a36Sopenharmony_ci	u16	y;
5762306a36Sopenharmony_ci	u16	z1, z2;
5862306a36Sopenharmony_ci};
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_cistruct tsc2007 {
6162306a36Sopenharmony_ci	struct input_dev	*input;
6262306a36Sopenharmony_ci	char			phys[32];
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci	struct i2c_client	*client;
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci	u16			model;
6762306a36Sopenharmony_ci	u16			x_plate_ohms;
6862306a36Sopenharmony_ci	u16			max_rt;
6962306a36Sopenharmony_ci	unsigned long		poll_period; /* in jiffies */
7062306a36Sopenharmony_ci	int			fuzzx;
7162306a36Sopenharmony_ci	int			fuzzy;
7262306a36Sopenharmony_ci	int			fuzzz;
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci	struct gpio_desc	*gpiod;
7562306a36Sopenharmony_ci	int			irq;
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci	wait_queue_head_t	wait;
7862306a36Sopenharmony_ci	bool			stopped;
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci	int			(*get_pendown_state)(struct device *);
8162306a36Sopenharmony_ci	void			(*clear_penirq)(void);
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci	struct mutex		mlock;
8462306a36Sopenharmony_ci};
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ciint tsc2007_xfer(struct tsc2007 *tsc, u8 cmd);
8762306a36Sopenharmony_ciu32 tsc2007_calculate_resistance(struct tsc2007 *tsc, struct ts_event *tc);
8862306a36Sopenharmony_cibool tsc2007_is_pen_down(struct tsc2007 *ts);
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_TOUCHSCREEN_TSC2007_IIO)
9162306a36Sopenharmony_ci/* defined in tsc2007_iio.c */
9262306a36Sopenharmony_ciint tsc2007_iio_configure(struct tsc2007 *ts);
9362306a36Sopenharmony_ci#else
9462306a36Sopenharmony_cistatic inline int tsc2007_iio_configure(struct tsc2007 *ts)
9562306a36Sopenharmony_ci{
9662306a36Sopenharmony_ci	return 0;
9762306a36Sopenharmony_ci}
9862306a36Sopenharmony_ci#endif /* CONFIG_TOUCHSCREEN_TSC2007_IIO */
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_ci#endif /* _TSC2007_H */
101