xref: /OK3568_Linux_fs/kernel/include/linux/mfd/mxs-lradc.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Freescale MXS Low Resolution Analog-to-Digital Converter driver
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (c) 2012 DENX Software Engineering, GmbH.
6*4882a593Smuzhiyun  * Copyright (c) 2016 Ksenija Stanojevic <ksenija.stanojevic@gmail.com>
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  * Author: Marek Vasut <marex@denx.de>
9*4882a593Smuzhiyun  */
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #ifndef __MFD_MXS_LRADC_H
12*4882a593Smuzhiyun #define __MFD_MXS_LRADC_H
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #include <linux/bitops.h>
15*4882a593Smuzhiyun #include <linux/io.h>
16*4882a593Smuzhiyun #include <linux/stmp_device.h>
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #define LRADC_MAX_DELAY_CHANS	4
19*4882a593Smuzhiyun #define LRADC_MAX_MAPPED_CHANS	8
20*4882a593Smuzhiyun #define LRADC_MAX_TOTAL_CHANS	16
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun #define LRADC_DELAY_TIMER_HZ	2000
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #define LRADC_CTRL0				0x00
25*4882a593Smuzhiyun # define LRADC_CTRL0_MX28_TOUCH_DETECT_ENABLE	BIT(23)
26*4882a593Smuzhiyun # define LRADC_CTRL0_MX28_TOUCH_SCREEN_TYPE	BIT(22)
27*4882a593Smuzhiyun # define LRADC_CTRL0_MX28_YNNSW /* YM */	BIT(21)
28*4882a593Smuzhiyun # define LRADC_CTRL0_MX28_YPNSW /* YP */	BIT(20)
29*4882a593Smuzhiyun # define LRADC_CTRL0_MX28_YPPSW /* YP */	BIT(19)
30*4882a593Smuzhiyun # define LRADC_CTRL0_MX28_XNNSW /* XM */	BIT(18)
31*4882a593Smuzhiyun # define LRADC_CTRL0_MX28_XNPSW /* XM */	BIT(17)
32*4882a593Smuzhiyun # define LRADC_CTRL0_MX28_XPPSW /* XP */	BIT(16)
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun # define LRADC_CTRL0_MX23_TOUCH_DETECT_ENABLE	BIT(20)
35*4882a593Smuzhiyun # define LRADC_CTRL0_MX23_YM			BIT(19)
36*4882a593Smuzhiyun # define LRADC_CTRL0_MX23_XM			BIT(18)
37*4882a593Smuzhiyun # define LRADC_CTRL0_MX23_YP			BIT(17)
38*4882a593Smuzhiyun # define LRADC_CTRL0_MX23_XP			BIT(16)
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun # define LRADC_CTRL0_MX28_PLATE_MASK \
41*4882a593Smuzhiyun 		(LRADC_CTRL0_MX28_TOUCH_DETECT_ENABLE | \
42*4882a593Smuzhiyun 		LRADC_CTRL0_MX28_YNNSW | LRADC_CTRL0_MX28_YPNSW | \
43*4882a593Smuzhiyun 		LRADC_CTRL0_MX28_YPPSW | LRADC_CTRL0_MX28_XNNSW | \
44*4882a593Smuzhiyun 		LRADC_CTRL0_MX28_XNPSW | LRADC_CTRL0_MX28_XPPSW)
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun # define LRADC_CTRL0_MX23_PLATE_MASK \
47*4882a593Smuzhiyun 		(LRADC_CTRL0_MX23_TOUCH_DETECT_ENABLE | \
48*4882a593Smuzhiyun 		LRADC_CTRL0_MX23_YM | LRADC_CTRL0_MX23_XM | \
49*4882a593Smuzhiyun 		LRADC_CTRL0_MX23_YP | LRADC_CTRL0_MX23_XP)
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun #define LRADC_CTRL1				0x10
52*4882a593Smuzhiyun #define LRADC_CTRL1_TOUCH_DETECT_IRQ_EN		BIT(24)
53*4882a593Smuzhiyun #define LRADC_CTRL1_LRADC_IRQ_EN(n)		(1 << ((n) + 16))
54*4882a593Smuzhiyun #define LRADC_CTRL1_MX28_LRADC_IRQ_EN_MASK	(0x1fff << 16)
55*4882a593Smuzhiyun #define LRADC_CTRL1_MX23_LRADC_IRQ_EN_MASK	(0x01ff << 16)
56*4882a593Smuzhiyun #define LRADC_CTRL1_LRADC_IRQ_EN_OFFSET		16
57*4882a593Smuzhiyun #define LRADC_CTRL1_TOUCH_DETECT_IRQ		BIT(8)
58*4882a593Smuzhiyun #define LRADC_CTRL1_LRADC_IRQ(n)		BIT(n)
59*4882a593Smuzhiyun #define LRADC_CTRL1_MX28_LRADC_IRQ_MASK		0x1fff
60*4882a593Smuzhiyun #define LRADC_CTRL1_MX23_LRADC_IRQ_MASK		0x01ff
61*4882a593Smuzhiyun #define LRADC_CTRL1_LRADC_IRQ_OFFSET		0
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun #define LRADC_CTRL2				0x20
64*4882a593Smuzhiyun #define LRADC_CTRL2_DIVIDE_BY_TWO_OFFSET	24
65*4882a593Smuzhiyun #define LRADC_CTRL2_TEMPSENSE_PWD		BIT(15)
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun #define LRADC_STATUS				0x40
68*4882a593Smuzhiyun #define LRADC_STATUS_TOUCH_DETECT_RAW		BIT(0)
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun #define LRADC_CH(n)				(0x50 + (0x10 * (n)))
71*4882a593Smuzhiyun #define LRADC_CH_ACCUMULATE			BIT(29)
72*4882a593Smuzhiyun #define LRADC_CH_NUM_SAMPLES_MASK		(0x1f << 24)
73*4882a593Smuzhiyun #define LRADC_CH_NUM_SAMPLES_OFFSET		24
74*4882a593Smuzhiyun #define LRADC_CH_NUM_SAMPLES(x) \
75*4882a593Smuzhiyun 				((x) << LRADC_CH_NUM_SAMPLES_OFFSET)
76*4882a593Smuzhiyun #define LRADC_CH_VALUE_MASK			0x3ffff
77*4882a593Smuzhiyun #define LRADC_CH_VALUE_OFFSET			0
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun #define LRADC_DELAY(n)				(0xd0 + (0x10 * (n)))
80*4882a593Smuzhiyun #define LRADC_DELAY_TRIGGER_LRADCS_MASK		(0xffUL << 24)
81*4882a593Smuzhiyun #define LRADC_DELAY_TRIGGER_LRADCS_OFFSET	24
82*4882a593Smuzhiyun #define LRADC_DELAY_TRIGGER(x) \
83*4882a593Smuzhiyun 				(((x) << LRADC_DELAY_TRIGGER_LRADCS_OFFSET) & \
84*4882a593Smuzhiyun 				LRADC_DELAY_TRIGGER_LRADCS_MASK)
85*4882a593Smuzhiyun #define LRADC_DELAY_KICK			BIT(20)
86*4882a593Smuzhiyun #define LRADC_DELAY_TRIGGER_DELAYS_MASK		(0xf << 16)
87*4882a593Smuzhiyun #define LRADC_DELAY_TRIGGER_DELAYS_OFFSET	16
88*4882a593Smuzhiyun #define LRADC_DELAY_TRIGGER_DELAYS(x) \
89*4882a593Smuzhiyun 				(((x) << LRADC_DELAY_TRIGGER_DELAYS_OFFSET) & \
90*4882a593Smuzhiyun 				LRADC_DELAY_TRIGGER_DELAYS_MASK)
91*4882a593Smuzhiyun #define LRADC_DELAY_LOOP_COUNT_MASK		(0x1f << 11)
92*4882a593Smuzhiyun #define LRADC_DELAY_LOOP_COUNT_OFFSET		11
93*4882a593Smuzhiyun #define LRADC_DELAY_LOOP(x) \
94*4882a593Smuzhiyun 				(((x) << LRADC_DELAY_LOOP_COUNT_OFFSET) & \
95*4882a593Smuzhiyun 				LRADC_DELAY_LOOP_COUNT_MASK)
96*4882a593Smuzhiyun #define LRADC_DELAY_DELAY_MASK			0x7ff
97*4882a593Smuzhiyun #define LRADC_DELAY_DELAY_OFFSET		0
98*4882a593Smuzhiyun #define LRADC_DELAY_DELAY(x) \
99*4882a593Smuzhiyun 				(((x) << LRADC_DELAY_DELAY_OFFSET) & \
100*4882a593Smuzhiyun 				LRADC_DELAY_DELAY_MASK)
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun #define LRADC_CTRL4				0x140
103*4882a593Smuzhiyun #define LRADC_CTRL4_LRADCSELECT_MASK(n)		(0xf << ((n) * 4))
104*4882a593Smuzhiyun #define LRADC_CTRL4_LRADCSELECT_OFFSET(n)	((n) * 4)
105*4882a593Smuzhiyun #define LRADC_CTRL4_LRADCSELECT(n, x) \
106*4882a593Smuzhiyun 				(((x) << LRADC_CTRL4_LRADCSELECT_OFFSET(n)) & \
107*4882a593Smuzhiyun 				LRADC_CTRL4_LRADCSELECT_MASK(n))
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun #define LRADC_RESOLUTION			12
110*4882a593Smuzhiyun #define LRADC_SINGLE_SAMPLE_MASK		((1 << LRADC_RESOLUTION) - 1)
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun #define BUFFER_VCHANS_LIMITED		0x3f
113*4882a593Smuzhiyun #define BUFFER_VCHANS_ALL		0xff
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun 	/*
116*4882a593Smuzhiyun 	 * Certain LRADC channels are shared between touchscreen
117*4882a593Smuzhiyun 	 * and/or touch-buttons and generic LRADC block. Therefore when using
118*4882a593Smuzhiyun 	 * either of these, these channels are not available for the regular
119*4882a593Smuzhiyun 	 * sampling. The shared channels are as follows:
120*4882a593Smuzhiyun 	 *
121*4882a593Smuzhiyun 	 * CH0 -- Touch button #0
122*4882a593Smuzhiyun 	 * CH1 -- Touch button #1
123*4882a593Smuzhiyun 	 * CH2 -- Touch screen XPUL
124*4882a593Smuzhiyun 	 * CH3 -- Touch screen YPLL
125*4882a593Smuzhiyun 	 * CH4 -- Touch screen XNUL
126*4882a593Smuzhiyun 	 * CH5 -- Touch screen YNLR
127*4882a593Smuzhiyun 	 * CH6 -- Touch screen WIPER (5-wire only)
128*4882a593Smuzhiyun 	 *
129*4882a593Smuzhiyun 	 * The bit fields below represents which parts of the LRADC block are
130*4882a593Smuzhiyun 	 * switched into special mode of operation. These channels can not
131*4882a593Smuzhiyun 	 * be sampled as regular LRADC channels. The driver will refuse any
132*4882a593Smuzhiyun 	 * attempt to sample these channels.
133*4882a593Smuzhiyun 	 */
134*4882a593Smuzhiyun #define CHAN_MASK_TOUCHBUTTON		(BIT(1) | BIT(0))
135*4882a593Smuzhiyun #define CHAN_MASK_TOUCHSCREEN_4WIRE	(0xf << 2)
136*4882a593Smuzhiyun #define CHAN_MASK_TOUCHSCREEN_5WIRE	(0x1f << 2)
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun enum mxs_lradc_id {
139*4882a593Smuzhiyun 	IMX23_LRADC,
140*4882a593Smuzhiyun 	IMX28_LRADC,
141*4882a593Smuzhiyun };
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun enum mxs_lradc_ts_wires {
144*4882a593Smuzhiyun 	MXS_LRADC_TOUCHSCREEN_NONE = 0,
145*4882a593Smuzhiyun 	MXS_LRADC_TOUCHSCREEN_4WIRE,
146*4882a593Smuzhiyun 	MXS_LRADC_TOUCHSCREEN_5WIRE,
147*4882a593Smuzhiyun };
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun /**
150*4882a593Smuzhiyun  * struct mxs_lradc
151*4882a593Smuzhiyun  * @soc: soc type (IMX23 or IMX28)
152*4882a593Smuzhiyun  * @clk: 2 kHz clock for delay units
153*4882a593Smuzhiyun  * @buffer_vchans: channels that can be used during buffered capture
154*4882a593Smuzhiyun  * @touchscreen_wire: touchscreen type (4-wire or 5-wire)
155*4882a593Smuzhiyun  * @use_touchbutton: button state (on or off)
156*4882a593Smuzhiyun  */
157*4882a593Smuzhiyun struct mxs_lradc {
158*4882a593Smuzhiyun 	enum mxs_lradc_id	soc;
159*4882a593Smuzhiyun 	struct clk		*clk;
160*4882a593Smuzhiyun 	u8			buffer_vchans;
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun 	enum mxs_lradc_ts_wires	touchscreen_wire;
163*4882a593Smuzhiyun 	bool			use_touchbutton;
164*4882a593Smuzhiyun };
165*4882a593Smuzhiyun 
mxs_lradc_irq_mask(struct mxs_lradc * lradc)166*4882a593Smuzhiyun static inline u32 mxs_lradc_irq_mask(struct mxs_lradc *lradc)
167*4882a593Smuzhiyun {
168*4882a593Smuzhiyun 	switch (lradc->soc) {
169*4882a593Smuzhiyun 	case IMX23_LRADC:
170*4882a593Smuzhiyun 		return LRADC_CTRL1_MX23_LRADC_IRQ_MASK;
171*4882a593Smuzhiyun 	case IMX28_LRADC:
172*4882a593Smuzhiyun 		return LRADC_CTRL1_MX28_LRADC_IRQ_MASK;
173*4882a593Smuzhiyun 	default:
174*4882a593Smuzhiyun 		return 0;
175*4882a593Smuzhiyun 	}
176*4882a593Smuzhiyun }
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun #endif /* __MXS_LRADC_H */
179