xref: /OK3568_Linux_fs/kernel/drivers/mfd/stmpe.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * ST Microelectronics MFD: stmpe's driver
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) ST-Ericsson SA 2010
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Author: Rabin Vincent <rabin.vincent@stericsson.com> for ST-Ericsson
8*4882a593Smuzhiyun  */
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include <linux/err.h>
11*4882a593Smuzhiyun #include <linux/gpio.h>
12*4882a593Smuzhiyun #include <linux/export.h>
13*4882a593Smuzhiyun #include <linux/kernel.h>
14*4882a593Smuzhiyun #include <linux/interrupt.h>
15*4882a593Smuzhiyun #include <linux/irq.h>
16*4882a593Smuzhiyun #include <linux/irqdomain.h>
17*4882a593Smuzhiyun #include <linux/of.h>
18*4882a593Smuzhiyun #include <linux/of_gpio.h>
19*4882a593Smuzhiyun #include <linux/pm.h>
20*4882a593Smuzhiyun #include <linux/slab.h>
21*4882a593Smuzhiyun #include <linux/mfd/core.h>
22*4882a593Smuzhiyun #include <linux/delay.h>
23*4882a593Smuzhiyun #include <linux/regulator/consumer.h>
24*4882a593Smuzhiyun #include "stmpe.h"
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun /**
27*4882a593Smuzhiyun  * struct stmpe_platform_data - STMPE platform data
28*4882a593Smuzhiyun  * @id: device id to distinguish between multiple STMPEs on the same board
29*4882a593Smuzhiyun  * @blocks: bitmask of blocks to enable (use STMPE_BLOCK_*)
30*4882a593Smuzhiyun  * @irq_trigger: IRQ trigger to use for the interrupt to the host
31*4882a593Smuzhiyun  * @autosleep: bool to enable/disable stmpe autosleep
32*4882a593Smuzhiyun  * @autosleep_timeout: inactivity timeout in milliseconds for autosleep
33*4882a593Smuzhiyun  * @irq_over_gpio: true if gpio is used to get irq
34*4882a593Smuzhiyun  * @irq_gpio: gpio number over which irq will be requested (significant only if
35*4882a593Smuzhiyun  *	      irq_over_gpio is true)
36*4882a593Smuzhiyun  */
37*4882a593Smuzhiyun struct stmpe_platform_data {
38*4882a593Smuzhiyun 	int id;
39*4882a593Smuzhiyun 	unsigned int blocks;
40*4882a593Smuzhiyun 	unsigned int irq_trigger;
41*4882a593Smuzhiyun 	bool autosleep;
42*4882a593Smuzhiyun 	bool irq_over_gpio;
43*4882a593Smuzhiyun 	int irq_gpio;
44*4882a593Smuzhiyun 	int autosleep_timeout;
45*4882a593Smuzhiyun };
46*4882a593Smuzhiyun 
__stmpe_enable(struct stmpe * stmpe,unsigned int blocks)47*4882a593Smuzhiyun static int __stmpe_enable(struct stmpe *stmpe, unsigned int blocks)
48*4882a593Smuzhiyun {
49*4882a593Smuzhiyun 	return stmpe->variant->enable(stmpe, blocks, true);
50*4882a593Smuzhiyun }
51*4882a593Smuzhiyun 
__stmpe_disable(struct stmpe * stmpe,unsigned int blocks)52*4882a593Smuzhiyun static int __stmpe_disable(struct stmpe *stmpe, unsigned int blocks)
53*4882a593Smuzhiyun {
54*4882a593Smuzhiyun 	return stmpe->variant->enable(stmpe, blocks, false);
55*4882a593Smuzhiyun }
56*4882a593Smuzhiyun 
__stmpe_reg_read(struct stmpe * stmpe,u8 reg)57*4882a593Smuzhiyun static int __stmpe_reg_read(struct stmpe *stmpe, u8 reg)
58*4882a593Smuzhiyun {
59*4882a593Smuzhiyun 	int ret;
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun 	ret = stmpe->ci->read_byte(stmpe, reg);
62*4882a593Smuzhiyun 	if (ret < 0)
63*4882a593Smuzhiyun 		dev_err(stmpe->dev, "failed to read reg %#x: %d\n", reg, ret);
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun 	dev_vdbg(stmpe->dev, "rd: reg %#x => data %#x\n", reg, ret);
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun 	return ret;
68*4882a593Smuzhiyun }
69*4882a593Smuzhiyun 
__stmpe_reg_write(struct stmpe * stmpe,u8 reg,u8 val)70*4882a593Smuzhiyun static int __stmpe_reg_write(struct stmpe *stmpe, u8 reg, u8 val)
71*4882a593Smuzhiyun {
72*4882a593Smuzhiyun 	int ret;
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun 	dev_vdbg(stmpe->dev, "wr: reg %#x <= %#x\n", reg, val);
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun 	ret = stmpe->ci->write_byte(stmpe, reg, val);
77*4882a593Smuzhiyun 	if (ret < 0)
78*4882a593Smuzhiyun 		dev_err(stmpe->dev, "failed to write reg %#x: %d\n", reg, ret);
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun 	return ret;
81*4882a593Smuzhiyun }
82*4882a593Smuzhiyun 
__stmpe_set_bits(struct stmpe * stmpe,u8 reg,u8 mask,u8 val)83*4882a593Smuzhiyun static int __stmpe_set_bits(struct stmpe *stmpe, u8 reg, u8 mask, u8 val)
84*4882a593Smuzhiyun {
85*4882a593Smuzhiyun 	int ret;
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun 	ret = __stmpe_reg_read(stmpe, reg);
88*4882a593Smuzhiyun 	if (ret < 0)
89*4882a593Smuzhiyun 		return ret;
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun 	ret &= ~mask;
92*4882a593Smuzhiyun 	ret |= val;
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun 	return __stmpe_reg_write(stmpe, reg, ret);
95*4882a593Smuzhiyun }
96*4882a593Smuzhiyun 
__stmpe_block_read(struct stmpe * stmpe,u8 reg,u8 length,u8 * values)97*4882a593Smuzhiyun static int __stmpe_block_read(struct stmpe *stmpe, u8 reg, u8 length,
98*4882a593Smuzhiyun 			      u8 *values)
99*4882a593Smuzhiyun {
100*4882a593Smuzhiyun 	int ret;
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun 	ret = stmpe->ci->read_block(stmpe, reg, length, values);
103*4882a593Smuzhiyun 	if (ret < 0)
104*4882a593Smuzhiyun 		dev_err(stmpe->dev, "failed to read regs %#x: %d\n", reg, ret);
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun 	dev_vdbg(stmpe->dev, "rd: reg %#x (%d) => ret %#x\n", reg, length, ret);
107*4882a593Smuzhiyun 	stmpe_dump_bytes("stmpe rd: ", values, length);
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun 	return ret;
110*4882a593Smuzhiyun }
111*4882a593Smuzhiyun 
__stmpe_block_write(struct stmpe * stmpe,u8 reg,u8 length,const u8 * values)112*4882a593Smuzhiyun static int __stmpe_block_write(struct stmpe *stmpe, u8 reg, u8 length,
113*4882a593Smuzhiyun 			const u8 *values)
114*4882a593Smuzhiyun {
115*4882a593Smuzhiyun 	int ret;
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun 	dev_vdbg(stmpe->dev, "wr: regs %#x (%d)\n", reg, length);
118*4882a593Smuzhiyun 	stmpe_dump_bytes("stmpe wr: ", values, length);
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun 	ret = stmpe->ci->write_block(stmpe, reg, length, values);
121*4882a593Smuzhiyun 	if (ret < 0)
122*4882a593Smuzhiyun 		dev_err(stmpe->dev, "failed to write regs %#x: %d\n", reg, ret);
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun 	return ret;
125*4882a593Smuzhiyun }
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun /**
128*4882a593Smuzhiyun  * stmpe_enable - enable blocks on an STMPE device
129*4882a593Smuzhiyun  * @stmpe:	Device to work on
130*4882a593Smuzhiyun  * @blocks:	Mask of blocks (enum stmpe_block values) to enable
131*4882a593Smuzhiyun  */
stmpe_enable(struct stmpe * stmpe,unsigned int blocks)132*4882a593Smuzhiyun int stmpe_enable(struct stmpe *stmpe, unsigned int blocks)
133*4882a593Smuzhiyun {
134*4882a593Smuzhiyun 	int ret;
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun 	mutex_lock(&stmpe->lock);
137*4882a593Smuzhiyun 	ret = __stmpe_enable(stmpe, blocks);
138*4882a593Smuzhiyun 	mutex_unlock(&stmpe->lock);
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun 	return ret;
141*4882a593Smuzhiyun }
142*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(stmpe_enable);
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun /**
145*4882a593Smuzhiyun  * stmpe_disable - disable blocks on an STMPE device
146*4882a593Smuzhiyun  * @stmpe:	Device to work on
147*4882a593Smuzhiyun  * @blocks:	Mask of blocks (enum stmpe_block values) to enable
148*4882a593Smuzhiyun  */
stmpe_disable(struct stmpe * stmpe,unsigned int blocks)149*4882a593Smuzhiyun int stmpe_disable(struct stmpe *stmpe, unsigned int blocks)
150*4882a593Smuzhiyun {
151*4882a593Smuzhiyun 	int ret;
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun 	mutex_lock(&stmpe->lock);
154*4882a593Smuzhiyun 	ret = __stmpe_disable(stmpe, blocks);
155*4882a593Smuzhiyun 	mutex_unlock(&stmpe->lock);
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun 	return ret;
158*4882a593Smuzhiyun }
159*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(stmpe_disable);
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun /**
162*4882a593Smuzhiyun  * stmpe_reg_read() - read a single STMPE register
163*4882a593Smuzhiyun  * @stmpe:	Device to read from
164*4882a593Smuzhiyun  * @reg:	Register to read
165*4882a593Smuzhiyun  */
stmpe_reg_read(struct stmpe * stmpe,u8 reg)166*4882a593Smuzhiyun int stmpe_reg_read(struct stmpe *stmpe, u8 reg)
167*4882a593Smuzhiyun {
168*4882a593Smuzhiyun 	int ret;
169*4882a593Smuzhiyun 
170*4882a593Smuzhiyun 	mutex_lock(&stmpe->lock);
171*4882a593Smuzhiyun 	ret = __stmpe_reg_read(stmpe, reg);
172*4882a593Smuzhiyun 	mutex_unlock(&stmpe->lock);
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun 	return ret;
175*4882a593Smuzhiyun }
176*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(stmpe_reg_read);
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun /**
179*4882a593Smuzhiyun  * stmpe_reg_write() - write a single STMPE register
180*4882a593Smuzhiyun  * @stmpe:	Device to write to
181*4882a593Smuzhiyun  * @reg:	Register to write
182*4882a593Smuzhiyun  * @val:	Value to write
183*4882a593Smuzhiyun  */
stmpe_reg_write(struct stmpe * stmpe,u8 reg,u8 val)184*4882a593Smuzhiyun int stmpe_reg_write(struct stmpe *stmpe, u8 reg, u8 val)
185*4882a593Smuzhiyun {
186*4882a593Smuzhiyun 	int ret;
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun 	mutex_lock(&stmpe->lock);
189*4882a593Smuzhiyun 	ret = __stmpe_reg_write(stmpe, reg, val);
190*4882a593Smuzhiyun 	mutex_unlock(&stmpe->lock);
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun 	return ret;
193*4882a593Smuzhiyun }
194*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(stmpe_reg_write);
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun /**
197*4882a593Smuzhiyun  * stmpe_set_bits() - set the value of a bitfield in a STMPE register
198*4882a593Smuzhiyun  * @stmpe:	Device to write to
199*4882a593Smuzhiyun  * @reg:	Register to write
200*4882a593Smuzhiyun  * @mask:	Mask of bits to set
201*4882a593Smuzhiyun  * @val:	Value to set
202*4882a593Smuzhiyun  */
stmpe_set_bits(struct stmpe * stmpe,u8 reg,u8 mask,u8 val)203*4882a593Smuzhiyun int stmpe_set_bits(struct stmpe *stmpe, u8 reg, u8 mask, u8 val)
204*4882a593Smuzhiyun {
205*4882a593Smuzhiyun 	int ret;
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun 	mutex_lock(&stmpe->lock);
208*4882a593Smuzhiyun 	ret = __stmpe_set_bits(stmpe, reg, mask, val);
209*4882a593Smuzhiyun 	mutex_unlock(&stmpe->lock);
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun 	return ret;
212*4882a593Smuzhiyun }
213*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(stmpe_set_bits);
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun /**
216*4882a593Smuzhiyun  * stmpe_block_read() - read multiple STMPE registers
217*4882a593Smuzhiyun  * @stmpe:	Device to read from
218*4882a593Smuzhiyun  * @reg:	First register
219*4882a593Smuzhiyun  * @length:	Number of registers
220*4882a593Smuzhiyun  * @values:	Buffer to write to
221*4882a593Smuzhiyun  */
stmpe_block_read(struct stmpe * stmpe,u8 reg,u8 length,u8 * values)222*4882a593Smuzhiyun int stmpe_block_read(struct stmpe *stmpe, u8 reg, u8 length, u8 *values)
223*4882a593Smuzhiyun {
224*4882a593Smuzhiyun 	int ret;
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun 	mutex_lock(&stmpe->lock);
227*4882a593Smuzhiyun 	ret = __stmpe_block_read(stmpe, reg, length, values);
228*4882a593Smuzhiyun 	mutex_unlock(&stmpe->lock);
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun 	return ret;
231*4882a593Smuzhiyun }
232*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(stmpe_block_read);
233*4882a593Smuzhiyun 
234*4882a593Smuzhiyun /**
235*4882a593Smuzhiyun  * stmpe_block_write() - write multiple STMPE registers
236*4882a593Smuzhiyun  * @stmpe:	Device to write to
237*4882a593Smuzhiyun  * @reg:	First register
238*4882a593Smuzhiyun  * @length:	Number of registers
239*4882a593Smuzhiyun  * @values:	Values to write
240*4882a593Smuzhiyun  */
stmpe_block_write(struct stmpe * stmpe,u8 reg,u8 length,const u8 * values)241*4882a593Smuzhiyun int stmpe_block_write(struct stmpe *stmpe, u8 reg, u8 length,
242*4882a593Smuzhiyun 		      const u8 *values)
243*4882a593Smuzhiyun {
244*4882a593Smuzhiyun 	int ret;
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun 	mutex_lock(&stmpe->lock);
247*4882a593Smuzhiyun 	ret = __stmpe_block_write(stmpe, reg, length, values);
248*4882a593Smuzhiyun 	mutex_unlock(&stmpe->lock);
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun 	return ret;
251*4882a593Smuzhiyun }
252*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(stmpe_block_write);
253*4882a593Smuzhiyun 
254*4882a593Smuzhiyun /**
255*4882a593Smuzhiyun  * stmpe_set_altfunc()- set the alternate function for STMPE pins
256*4882a593Smuzhiyun  * @stmpe:	Device to configure
257*4882a593Smuzhiyun  * @pins:	Bitmask of pins to affect
258*4882a593Smuzhiyun  * @block:	block to enable alternate functions for
259*4882a593Smuzhiyun  *
260*4882a593Smuzhiyun  * @pins is assumed to have a bit set for each of the bits whose alternate
261*4882a593Smuzhiyun  * function is to be changed, numbered according to the GPIOXY numbers.
262*4882a593Smuzhiyun  *
263*4882a593Smuzhiyun  * If the GPIO module is not enabled, this function automatically enables it in
264*4882a593Smuzhiyun  * order to perform the change.
265*4882a593Smuzhiyun  */
stmpe_set_altfunc(struct stmpe * stmpe,u32 pins,enum stmpe_block block)266*4882a593Smuzhiyun int stmpe_set_altfunc(struct stmpe *stmpe, u32 pins, enum stmpe_block block)
267*4882a593Smuzhiyun {
268*4882a593Smuzhiyun 	struct stmpe_variant_info *variant = stmpe->variant;
269*4882a593Smuzhiyun 	u8 regaddr = stmpe->regs[STMPE_IDX_GPAFR_U_MSB];
270*4882a593Smuzhiyun 	int af_bits = variant->af_bits;
271*4882a593Smuzhiyun 	int numregs = DIV_ROUND_UP(stmpe->num_gpios * af_bits, 8);
272*4882a593Smuzhiyun 	int mask = (1 << af_bits) - 1;
273*4882a593Smuzhiyun 	u8 regs[8];
274*4882a593Smuzhiyun 	int af, afperreg, ret;
275*4882a593Smuzhiyun 
276*4882a593Smuzhiyun 	if (!variant->get_altfunc)
277*4882a593Smuzhiyun 		return 0;
278*4882a593Smuzhiyun 
279*4882a593Smuzhiyun 	afperreg = 8 / af_bits;
280*4882a593Smuzhiyun 	mutex_lock(&stmpe->lock);
281*4882a593Smuzhiyun 
282*4882a593Smuzhiyun 	ret = __stmpe_enable(stmpe, STMPE_BLOCK_GPIO);
283*4882a593Smuzhiyun 	if (ret < 0)
284*4882a593Smuzhiyun 		goto out;
285*4882a593Smuzhiyun 
286*4882a593Smuzhiyun 	ret = __stmpe_block_read(stmpe, regaddr, numregs, regs);
287*4882a593Smuzhiyun 	if (ret < 0)
288*4882a593Smuzhiyun 		goto out;
289*4882a593Smuzhiyun 
290*4882a593Smuzhiyun 	af = variant->get_altfunc(stmpe, block);
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun 	while (pins) {
293*4882a593Smuzhiyun 		int pin = __ffs(pins);
294*4882a593Smuzhiyun 		int regoffset = numregs - (pin / afperreg) - 1;
295*4882a593Smuzhiyun 		int pos = (pin % afperreg) * (8 / afperreg);
296*4882a593Smuzhiyun 
297*4882a593Smuzhiyun 		regs[regoffset] &= ~(mask << pos);
298*4882a593Smuzhiyun 		regs[regoffset] |= af << pos;
299*4882a593Smuzhiyun 
300*4882a593Smuzhiyun 		pins &= ~(1 << pin);
301*4882a593Smuzhiyun 	}
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun 	ret = __stmpe_block_write(stmpe, regaddr, numregs, regs);
304*4882a593Smuzhiyun 
305*4882a593Smuzhiyun out:
306*4882a593Smuzhiyun 	mutex_unlock(&stmpe->lock);
307*4882a593Smuzhiyun 	return ret;
308*4882a593Smuzhiyun }
309*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(stmpe_set_altfunc);
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun /*
312*4882a593Smuzhiyun  * GPIO (all variants)
313*4882a593Smuzhiyun  */
314*4882a593Smuzhiyun 
315*4882a593Smuzhiyun static struct resource stmpe_gpio_resources[] = {
316*4882a593Smuzhiyun 	/* Start and end filled dynamically */
317*4882a593Smuzhiyun 	{
318*4882a593Smuzhiyun 		.flags	= IORESOURCE_IRQ,
319*4882a593Smuzhiyun 	},
320*4882a593Smuzhiyun };
321*4882a593Smuzhiyun 
322*4882a593Smuzhiyun static const struct mfd_cell stmpe_gpio_cell = {
323*4882a593Smuzhiyun 	.name		= "stmpe-gpio",
324*4882a593Smuzhiyun 	.of_compatible	= "st,stmpe-gpio",
325*4882a593Smuzhiyun 	.resources	= stmpe_gpio_resources,
326*4882a593Smuzhiyun 	.num_resources	= ARRAY_SIZE(stmpe_gpio_resources),
327*4882a593Smuzhiyun };
328*4882a593Smuzhiyun 
329*4882a593Smuzhiyun static const struct mfd_cell stmpe_gpio_cell_noirq = {
330*4882a593Smuzhiyun 	.name		= "stmpe-gpio",
331*4882a593Smuzhiyun 	.of_compatible	= "st,stmpe-gpio",
332*4882a593Smuzhiyun 	/* gpio cell resources consist of an irq only so no resources here */
333*4882a593Smuzhiyun };
334*4882a593Smuzhiyun 
335*4882a593Smuzhiyun /*
336*4882a593Smuzhiyun  * Keypad (1601, 2401, 2403)
337*4882a593Smuzhiyun  */
338*4882a593Smuzhiyun 
339*4882a593Smuzhiyun static struct resource stmpe_keypad_resources[] = {
340*4882a593Smuzhiyun 	{
341*4882a593Smuzhiyun 		.name	= "KEYPAD",
342*4882a593Smuzhiyun 		.flags	= IORESOURCE_IRQ,
343*4882a593Smuzhiyun 	},
344*4882a593Smuzhiyun 	{
345*4882a593Smuzhiyun 		.name	= "KEYPAD_OVER",
346*4882a593Smuzhiyun 		.flags	= IORESOURCE_IRQ,
347*4882a593Smuzhiyun 	},
348*4882a593Smuzhiyun };
349*4882a593Smuzhiyun 
350*4882a593Smuzhiyun static const struct mfd_cell stmpe_keypad_cell = {
351*4882a593Smuzhiyun 	.name		= "stmpe-keypad",
352*4882a593Smuzhiyun 	.of_compatible  = "st,stmpe-keypad",
353*4882a593Smuzhiyun 	.resources	= stmpe_keypad_resources,
354*4882a593Smuzhiyun 	.num_resources	= ARRAY_SIZE(stmpe_keypad_resources),
355*4882a593Smuzhiyun };
356*4882a593Smuzhiyun 
357*4882a593Smuzhiyun /*
358*4882a593Smuzhiyun  * PWM (1601, 2401, 2403)
359*4882a593Smuzhiyun  */
360*4882a593Smuzhiyun static struct resource stmpe_pwm_resources[] = {
361*4882a593Smuzhiyun 	{
362*4882a593Smuzhiyun 		.name	= "PWM0",
363*4882a593Smuzhiyun 		.flags	= IORESOURCE_IRQ,
364*4882a593Smuzhiyun 	},
365*4882a593Smuzhiyun 	{
366*4882a593Smuzhiyun 		.name	= "PWM1",
367*4882a593Smuzhiyun 		.flags	= IORESOURCE_IRQ,
368*4882a593Smuzhiyun 	},
369*4882a593Smuzhiyun 	{
370*4882a593Smuzhiyun 		.name	= "PWM2",
371*4882a593Smuzhiyun 		.flags	= IORESOURCE_IRQ,
372*4882a593Smuzhiyun 	},
373*4882a593Smuzhiyun };
374*4882a593Smuzhiyun 
375*4882a593Smuzhiyun static const struct mfd_cell stmpe_pwm_cell = {
376*4882a593Smuzhiyun 	.name		= "stmpe-pwm",
377*4882a593Smuzhiyun 	.of_compatible  = "st,stmpe-pwm",
378*4882a593Smuzhiyun 	.resources	= stmpe_pwm_resources,
379*4882a593Smuzhiyun 	.num_resources	= ARRAY_SIZE(stmpe_pwm_resources),
380*4882a593Smuzhiyun };
381*4882a593Smuzhiyun 
382*4882a593Smuzhiyun /*
383*4882a593Smuzhiyun  * STMPE801
384*4882a593Smuzhiyun  */
385*4882a593Smuzhiyun static const u8 stmpe801_regs[] = {
386*4882a593Smuzhiyun 	[STMPE_IDX_CHIP_ID]	= STMPE801_REG_CHIP_ID,
387*4882a593Smuzhiyun 	[STMPE_IDX_ICR_LSB]	= STMPE801_REG_SYS_CTRL,
388*4882a593Smuzhiyun 	[STMPE_IDX_GPMR_LSB]	= STMPE801_REG_GPIO_MP_STA,
389*4882a593Smuzhiyun 	[STMPE_IDX_GPSR_LSB]	= STMPE801_REG_GPIO_SET_PIN,
390*4882a593Smuzhiyun 	[STMPE_IDX_GPCR_LSB]	= STMPE801_REG_GPIO_SET_PIN,
391*4882a593Smuzhiyun 	[STMPE_IDX_GPDR_LSB]	= STMPE801_REG_GPIO_DIR,
392*4882a593Smuzhiyun 	[STMPE_IDX_IEGPIOR_LSB] = STMPE801_REG_GPIO_INT_EN,
393*4882a593Smuzhiyun 	[STMPE_IDX_ISGPIOR_MSB] = STMPE801_REG_GPIO_INT_STA,
394*4882a593Smuzhiyun 
395*4882a593Smuzhiyun };
396*4882a593Smuzhiyun 
397*4882a593Smuzhiyun static struct stmpe_variant_block stmpe801_blocks[] = {
398*4882a593Smuzhiyun 	{
399*4882a593Smuzhiyun 		.cell	= &stmpe_gpio_cell,
400*4882a593Smuzhiyun 		.irq	= 0,
401*4882a593Smuzhiyun 		.block	= STMPE_BLOCK_GPIO,
402*4882a593Smuzhiyun 	},
403*4882a593Smuzhiyun };
404*4882a593Smuzhiyun 
405*4882a593Smuzhiyun static struct stmpe_variant_block stmpe801_blocks_noirq[] = {
406*4882a593Smuzhiyun 	{
407*4882a593Smuzhiyun 		.cell	= &stmpe_gpio_cell_noirq,
408*4882a593Smuzhiyun 		.block	= STMPE_BLOCK_GPIO,
409*4882a593Smuzhiyun 	},
410*4882a593Smuzhiyun };
411*4882a593Smuzhiyun 
stmpe801_enable(struct stmpe * stmpe,unsigned int blocks,bool enable)412*4882a593Smuzhiyun static int stmpe801_enable(struct stmpe *stmpe, unsigned int blocks,
413*4882a593Smuzhiyun 			   bool enable)
414*4882a593Smuzhiyun {
415*4882a593Smuzhiyun 	if (blocks & STMPE_BLOCK_GPIO)
416*4882a593Smuzhiyun 		return 0;
417*4882a593Smuzhiyun 	else
418*4882a593Smuzhiyun 		return -EINVAL;
419*4882a593Smuzhiyun }
420*4882a593Smuzhiyun 
421*4882a593Smuzhiyun static struct stmpe_variant_info stmpe801 = {
422*4882a593Smuzhiyun 	.name		= "stmpe801",
423*4882a593Smuzhiyun 	.id_val		= STMPE801_ID,
424*4882a593Smuzhiyun 	.id_mask	= 0xffff,
425*4882a593Smuzhiyun 	.num_gpios	= 8,
426*4882a593Smuzhiyun 	.regs		= stmpe801_regs,
427*4882a593Smuzhiyun 	.blocks		= stmpe801_blocks,
428*4882a593Smuzhiyun 	.num_blocks	= ARRAY_SIZE(stmpe801_blocks),
429*4882a593Smuzhiyun 	.num_irqs	= STMPE801_NR_INTERNAL_IRQS,
430*4882a593Smuzhiyun 	.enable		= stmpe801_enable,
431*4882a593Smuzhiyun };
432*4882a593Smuzhiyun 
433*4882a593Smuzhiyun static struct stmpe_variant_info stmpe801_noirq = {
434*4882a593Smuzhiyun 	.name		= "stmpe801",
435*4882a593Smuzhiyun 	.id_val		= STMPE801_ID,
436*4882a593Smuzhiyun 	.id_mask	= 0xffff,
437*4882a593Smuzhiyun 	.num_gpios	= 8,
438*4882a593Smuzhiyun 	.regs		= stmpe801_regs,
439*4882a593Smuzhiyun 	.blocks		= stmpe801_blocks_noirq,
440*4882a593Smuzhiyun 	.num_blocks	= ARRAY_SIZE(stmpe801_blocks_noirq),
441*4882a593Smuzhiyun 	.enable		= stmpe801_enable,
442*4882a593Smuzhiyun };
443*4882a593Smuzhiyun 
444*4882a593Smuzhiyun /*
445*4882a593Smuzhiyun  * Touchscreen (STMPE811 or STMPE610)
446*4882a593Smuzhiyun  */
447*4882a593Smuzhiyun 
448*4882a593Smuzhiyun static struct resource stmpe_ts_resources[] = {
449*4882a593Smuzhiyun 	{
450*4882a593Smuzhiyun 		.name	= "TOUCH_DET",
451*4882a593Smuzhiyun 		.flags	= IORESOURCE_IRQ,
452*4882a593Smuzhiyun 	},
453*4882a593Smuzhiyun 	{
454*4882a593Smuzhiyun 		.name	= "FIFO_TH",
455*4882a593Smuzhiyun 		.flags	= IORESOURCE_IRQ,
456*4882a593Smuzhiyun 	},
457*4882a593Smuzhiyun };
458*4882a593Smuzhiyun 
459*4882a593Smuzhiyun static const struct mfd_cell stmpe_ts_cell = {
460*4882a593Smuzhiyun 	.name		= "stmpe-ts",
461*4882a593Smuzhiyun 	.of_compatible	= "st,stmpe-ts",
462*4882a593Smuzhiyun 	.resources	= stmpe_ts_resources,
463*4882a593Smuzhiyun 	.num_resources	= ARRAY_SIZE(stmpe_ts_resources),
464*4882a593Smuzhiyun };
465*4882a593Smuzhiyun 
466*4882a593Smuzhiyun /*
467*4882a593Smuzhiyun  * ADC (STMPE811)
468*4882a593Smuzhiyun  */
469*4882a593Smuzhiyun 
470*4882a593Smuzhiyun static struct resource stmpe_adc_resources[] = {
471*4882a593Smuzhiyun 	{
472*4882a593Smuzhiyun 		.name	= "STMPE_TEMP_SENS",
473*4882a593Smuzhiyun 		.flags	= IORESOURCE_IRQ,
474*4882a593Smuzhiyun 	},
475*4882a593Smuzhiyun 	{
476*4882a593Smuzhiyun 		.name	= "STMPE_ADC",
477*4882a593Smuzhiyun 		.flags	= IORESOURCE_IRQ,
478*4882a593Smuzhiyun 	},
479*4882a593Smuzhiyun };
480*4882a593Smuzhiyun 
481*4882a593Smuzhiyun static const struct mfd_cell stmpe_adc_cell = {
482*4882a593Smuzhiyun 	.name		= "stmpe-adc",
483*4882a593Smuzhiyun 	.of_compatible	= "st,stmpe-adc",
484*4882a593Smuzhiyun 	.resources	= stmpe_adc_resources,
485*4882a593Smuzhiyun 	.num_resources	= ARRAY_SIZE(stmpe_adc_resources),
486*4882a593Smuzhiyun };
487*4882a593Smuzhiyun 
488*4882a593Smuzhiyun /*
489*4882a593Smuzhiyun  * STMPE811 or STMPE610
490*4882a593Smuzhiyun  */
491*4882a593Smuzhiyun 
492*4882a593Smuzhiyun static const u8 stmpe811_regs[] = {
493*4882a593Smuzhiyun 	[STMPE_IDX_CHIP_ID]	= STMPE811_REG_CHIP_ID,
494*4882a593Smuzhiyun 	[STMPE_IDX_SYS_CTRL]	= STMPE811_REG_SYS_CTRL,
495*4882a593Smuzhiyun 	[STMPE_IDX_SYS_CTRL2]	= STMPE811_REG_SYS_CTRL2,
496*4882a593Smuzhiyun 	[STMPE_IDX_ICR_LSB]	= STMPE811_REG_INT_CTRL,
497*4882a593Smuzhiyun 	[STMPE_IDX_IER_LSB]	= STMPE811_REG_INT_EN,
498*4882a593Smuzhiyun 	[STMPE_IDX_ISR_MSB]	= STMPE811_REG_INT_STA,
499*4882a593Smuzhiyun 	[STMPE_IDX_GPMR_LSB]	= STMPE811_REG_GPIO_MP_STA,
500*4882a593Smuzhiyun 	[STMPE_IDX_GPSR_LSB]	= STMPE811_REG_GPIO_SET_PIN,
501*4882a593Smuzhiyun 	[STMPE_IDX_GPCR_LSB]	= STMPE811_REG_GPIO_CLR_PIN,
502*4882a593Smuzhiyun 	[STMPE_IDX_GPDR_LSB]	= STMPE811_REG_GPIO_DIR,
503*4882a593Smuzhiyun 	[STMPE_IDX_GPRER_LSB]	= STMPE811_REG_GPIO_RE,
504*4882a593Smuzhiyun 	[STMPE_IDX_GPFER_LSB]	= STMPE811_REG_GPIO_FE,
505*4882a593Smuzhiyun 	[STMPE_IDX_GPAFR_U_MSB]	= STMPE811_REG_GPIO_AF,
506*4882a593Smuzhiyun 	[STMPE_IDX_IEGPIOR_LSB]	= STMPE811_REG_GPIO_INT_EN,
507*4882a593Smuzhiyun 	[STMPE_IDX_ISGPIOR_MSB]	= STMPE811_REG_GPIO_INT_STA,
508*4882a593Smuzhiyun 	[STMPE_IDX_GPEDR_LSB]	= STMPE811_REG_GPIO_ED,
509*4882a593Smuzhiyun };
510*4882a593Smuzhiyun 
511*4882a593Smuzhiyun static struct stmpe_variant_block stmpe811_blocks[] = {
512*4882a593Smuzhiyun 	{
513*4882a593Smuzhiyun 		.cell	= &stmpe_gpio_cell,
514*4882a593Smuzhiyun 		.irq	= STMPE811_IRQ_GPIOC,
515*4882a593Smuzhiyun 		.block	= STMPE_BLOCK_GPIO,
516*4882a593Smuzhiyun 	},
517*4882a593Smuzhiyun 	{
518*4882a593Smuzhiyun 		.cell	= &stmpe_ts_cell,
519*4882a593Smuzhiyun 		.irq	= STMPE811_IRQ_TOUCH_DET,
520*4882a593Smuzhiyun 		.block	= STMPE_BLOCK_TOUCHSCREEN,
521*4882a593Smuzhiyun 	},
522*4882a593Smuzhiyun 	{
523*4882a593Smuzhiyun 		.cell	= &stmpe_adc_cell,
524*4882a593Smuzhiyun 		.irq	= STMPE811_IRQ_TEMP_SENS,
525*4882a593Smuzhiyun 		.block	= STMPE_BLOCK_ADC,
526*4882a593Smuzhiyun 	},
527*4882a593Smuzhiyun };
528*4882a593Smuzhiyun 
stmpe811_enable(struct stmpe * stmpe,unsigned int blocks,bool enable)529*4882a593Smuzhiyun static int stmpe811_enable(struct stmpe *stmpe, unsigned int blocks,
530*4882a593Smuzhiyun 			   bool enable)
531*4882a593Smuzhiyun {
532*4882a593Smuzhiyun 	unsigned int mask = 0;
533*4882a593Smuzhiyun 
534*4882a593Smuzhiyun 	if (blocks & STMPE_BLOCK_GPIO)
535*4882a593Smuzhiyun 		mask |= STMPE811_SYS_CTRL2_GPIO_OFF;
536*4882a593Smuzhiyun 
537*4882a593Smuzhiyun 	if (blocks & STMPE_BLOCK_ADC)
538*4882a593Smuzhiyun 		mask |= STMPE811_SYS_CTRL2_ADC_OFF;
539*4882a593Smuzhiyun 
540*4882a593Smuzhiyun 	if (blocks & STMPE_BLOCK_TOUCHSCREEN)
541*4882a593Smuzhiyun 		mask |= STMPE811_SYS_CTRL2_TSC_OFF;
542*4882a593Smuzhiyun 
543*4882a593Smuzhiyun 	return __stmpe_set_bits(stmpe, stmpe->regs[STMPE_IDX_SYS_CTRL2], mask,
544*4882a593Smuzhiyun 				enable ? 0 : mask);
545*4882a593Smuzhiyun }
546*4882a593Smuzhiyun 
stmpe811_adc_common_init(struct stmpe * stmpe)547*4882a593Smuzhiyun int stmpe811_adc_common_init(struct stmpe *stmpe)
548*4882a593Smuzhiyun {
549*4882a593Smuzhiyun 	int ret;
550*4882a593Smuzhiyun 	u8 adc_ctrl1, adc_ctrl1_mask;
551*4882a593Smuzhiyun 
552*4882a593Smuzhiyun 	adc_ctrl1 = STMPE_SAMPLE_TIME(stmpe->sample_time) |
553*4882a593Smuzhiyun 		    STMPE_MOD_12B(stmpe->mod_12b) |
554*4882a593Smuzhiyun 		    STMPE_REF_SEL(stmpe->ref_sel);
555*4882a593Smuzhiyun 	adc_ctrl1_mask = STMPE_SAMPLE_TIME(0xff) | STMPE_MOD_12B(0xff) |
556*4882a593Smuzhiyun 			 STMPE_REF_SEL(0xff);
557*4882a593Smuzhiyun 
558*4882a593Smuzhiyun 	ret = stmpe_set_bits(stmpe, STMPE811_REG_ADC_CTRL1,
559*4882a593Smuzhiyun 			adc_ctrl1_mask, adc_ctrl1);
560*4882a593Smuzhiyun 	if (ret) {
561*4882a593Smuzhiyun 		dev_err(stmpe->dev, "Could not setup ADC\n");
562*4882a593Smuzhiyun 		return ret;
563*4882a593Smuzhiyun 	}
564*4882a593Smuzhiyun 
565*4882a593Smuzhiyun 	ret = stmpe_set_bits(stmpe, STMPE811_REG_ADC_CTRL2,
566*4882a593Smuzhiyun 			STMPE_ADC_FREQ(0xff), STMPE_ADC_FREQ(stmpe->adc_freq));
567*4882a593Smuzhiyun 	if (ret) {
568*4882a593Smuzhiyun 		dev_err(stmpe->dev, "Could not setup ADC\n");
569*4882a593Smuzhiyun 		return ret;
570*4882a593Smuzhiyun 	}
571*4882a593Smuzhiyun 
572*4882a593Smuzhiyun 	return 0;
573*4882a593Smuzhiyun }
574*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(stmpe811_adc_common_init);
575*4882a593Smuzhiyun 
stmpe811_get_altfunc(struct stmpe * stmpe,enum stmpe_block block)576*4882a593Smuzhiyun static int stmpe811_get_altfunc(struct stmpe *stmpe, enum stmpe_block block)
577*4882a593Smuzhiyun {
578*4882a593Smuzhiyun 	/* 0 for touchscreen, 1 for GPIO */
579*4882a593Smuzhiyun 	return block != STMPE_BLOCK_TOUCHSCREEN;
580*4882a593Smuzhiyun }
581*4882a593Smuzhiyun 
582*4882a593Smuzhiyun static struct stmpe_variant_info stmpe811 = {
583*4882a593Smuzhiyun 	.name		= "stmpe811",
584*4882a593Smuzhiyun 	.id_val		= 0x0811,
585*4882a593Smuzhiyun 	.id_mask	= 0xffff,
586*4882a593Smuzhiyun 	.num_gpios	= 8,
587*4882a593Smuzhiyun 	.af_bits	= 1,
588*4882a593Smuzhiyun 	.regs		= stmpe811_regs,
589*4882a593Smuzhiyun 	.blocks		= stmpe811_blocks,
590*4882a593Smuzhiyun 	.num_blocks	= ARRAY_SIZE(stmpe811_blocks),
591*4882a593Smuzhiyun 	.num_irqs	= STMPE811_NR_INTERNAL_IRQS,
592*4882a593Smuzhiyun 	.enable		= stmpe811_enable,
593*4882a593Smuzhiyun 	.get_altfunc	= stmpe811_get_altfunc,
594*4882a593Smuzhiyun };
595*4882a593Smuzhiyun 
596*4882a593Smuzhiyun /* Similar to 811, except number of gpios */
597*4882a593Smuzhiyun static struct stmpe_variant_info stmpe610 = {
598*4882a593Smuzhiyun 	.name		= "stmpe610",
599*4882a593Smuzhiyun 	.id_val		= 0x0811,
600*4882a593Smuzhiyun 	.id_mask	= 0xffff,
601*4882a593Smuzhiyun 	.num_gpios	= 6,
602*4882a593Smuzhiyun 	.af_bits	= 1,
603*4882a593Smuzhiyun 	.regs		= stmpe811_regs,
604*4882a593Smuzhiyun 	.blocks		= stmpe811_blocks,
605*4882a593Smuzhiyun 	.num_blocks	= ARRAY_SIZE(stmpe811_blocks),
606*4882a593Smuzhiyun 	.num_irqs	= STMPE811_NR_INTERNAL_IRQS,
607*4882a593Smuzhiyun 	.enable		= stmpe811_enable,
608*4882a593Smuzhiyun 	.get_altfunc	= stmpe811_get_altfunc,
609*4882a593Smuzhiyun };
610*4882a593Smuzhiyun 
611*4882a593Smuzhiyun /*
612*4882a593Smuzhiyun  * STMPE1600
613*4882a593Smuzhiyun  * Compared to all others STMPE variant, LSB and MSB regs are located in this
614*4882a593Smuzhiyun  * order :	LSB   addr
615*4882a593Smuzhiyun  *		MSB   addr + 1
616*4882a593Smuzhiyun  * As there is only 2 * 8bits registers for GPMR/GPSR/IEGPIOPR, CSB index is MSB registers
617*4882a593Smuzhiyun  */
618*4882a593Smuzhiyun 
619*4882a593Smuzhiyun static const u8 stmpe1600_regs[] = {
620*4882a593Smuzhiyun 	[STMPE_IDX_CHIP_ID]	= STMPE1600_REG_CHIP_ID,
621*4882a593Smuzhiyun 	[STMPE_IDX_SYS_CTRL]	= STMPE1600_REG_SYS_CTRL,
622*4882a593Smuzhiyun 	[STMPE_IDX_ICR_LSB]	= STMPE1600_REG_SYS_CTRL,
623*4882a593Smuzhiyun 	[STMPE_IDX_GPMR_LSB]	= STMPE1600_REG_GPMR_LSB,
624*4882a593Smuzhiyun 	[STMPE_IDX_GPMR_CSB]	= STMPE1600_REG_GPMR_MSB,
625*4882a593Smuzhiyun 	[STMPE_IDX_GPSR_LSB]	= STMPE1600_REG_GPSR_LSB,
626*4882a593Smuzhiyun 	[STMPE_IDX_GPSR_CSB]	= STMPE1600_REG_GPSR_MSB,
627*4882a593Smuzhiyun 	[STMPE_IDX_GPCR_LSB]	= STMPE1600_REG_GPSR_LSB,
628*4882a593Smuzhiyun 	[STMPE_IDX_GPCR_CSB]	= STMPE1600_REG_GPSR_MSB,
629*4882a593Smuzhiyun 	[STMPE_IDX_GPDR_LSB]	= STMPE1600_REG_GPDR_LSB,
630*4882a593Smuzhiyun 	[STMPE_IDX_GPDR_CSB]	= STMPE1600_REG_GPDR_MSB,
631*4882a593Smuzhiyun 	[STMPE_IDX_IEGPIOR_LSB]	= STMPE1600_REG_IEGPIOR_LSB,
632*4882a593Smuzhiyun 	[STMPE_IDX_IEGPIOR_CSB]	= STMPE1600_REG_IEGPIOR_MSB,
633*4882a593Smuzhiyun 	[STMPE_IDX_ISGPIOR_LSB]	= STMPE1600_REG_ISGPIOR_LSB,
634*4882a593Smuzhiyun };
635*4882a593Smuzhiyun 
636*4882a593Smuzhiyun static struct stmpe_variant_block stmpe1600_blocks[] = {
637*4882a593Smuzhiyun 	{
638*4882a593Smuzhiyun 		.cell	= &stmpe_gpio_cell,
639*4882a593Smuzhiyun 		.irq	= 0,
640*4882a593Smuzhiyun 		.block	= STMPE_BLOCK_GPIO,
641*4882a593Smuzhiyun 	},
642*4882a593Smuzhiyun };
643*4882a593Smuzhiyun 
stmpe1600_enable(struct stmpe * stmpe,unsigned int blocks,bool enable)644*4882a593Smuzhiyun static int stmpe1600_enable(struct stmpe *stmpe, unsigned int blocks,
645*4882a593Smuzhiyun 			   bool enable)
646*4882a593Smuzhiyun {
647*4882a593Smuzhiyun 	if (blocks & STMPE_BLOCK_GPIO)
648*4882a593Smuzhiyun 		return 0;
649*4882a593Smuzhiyun 	else
650*4882a593Smuzhiyun 		return -EINVAL;
651*4882a593Smuzhiyun }
652*4882a593Smuzhiyun 
653*4882a593Smuzhiyun static struct stmpe_variant_info stmpe1600 = {
654*4882a593Smuzhiyun 	.name		= "stmpe1600",
655*4882a593Smuzhiyun 	.id_val		= STMPE1600_ID,
656*4882a593Smuzhiyun 	.id_mask	= 0xffff,
657*4882a593Smuzhiyun 	.num_gpios	= 16,
658*4882a593Smuzhiyun 	.af_bits	= 0,
659*4882a593Smuzhiyun 	.regs		= stmpe1600_regs,
660*4882a593Smuzhiyun 	.blocks		= stmpe1600_blocks,
661*4882a593Smuzhiyun 	.num_blocks	= ARRAY_SIZE(stmpe1600_blocks),
662*4882a593Smuzhiyun 	.num_irqs	= STMPE1600_NR_INTERNAL_IRQS,
663*4882a593Smuzhiyun 	.enable		= stmpe1600_enable,
664*4882a593Smuzhiyun };
665*4882a593Smuzhiyun 
666*4882a593Smuzhiyun /*
667*4882a593Smuzhiyun  * STMPE1601
668*4882a593Smuzhiyun  */
669*4882a593Smuzhiyun 
670*4882a593Smuzhiyun static const u8 stmpe1601_regs[] = {
671*4882a593Smuzhiyun 	[STMPE_IDX_CHIP_ID]	= STMPE1601_REG_CHIP_ID,
672*4882a593Smuzhiyun 	[STMPE_IDX_SYS_CTRL]	= STMPE1601_REG_SYS_CTRL,
673*4882a593Smuzhiyun 	[STMPE_IDX_SYS_CTRL2]	= STMPE1601_REG_SYS_CTRL2,
674*4882a593Smuzhiyun 	[STMPE_IDX_ICR_LSB]	= STMPE1601_REG_ICR_LSB,
675*4882a593Smuzhiyun 	[STMPE_IDX_IER_MSB]	= STMPE1601_REG_IER_MSB,
676*4882a593Smuzhiyun 	[STMPE_IDX_IER_LSB]	= STMPE1601_REG_IER_LSB,
677*4882a593Smuzhiyun 	[STMPE_IDX_ISR_MSB]	= STMPE1601_REG_ISR_MSB,
678*4882a593Smuzhiyun 	[STMPE_IDX_GPMR_LSB]	= STMPE1601_REG_GPIO_MP_LSB,
679*4882a593Smuzhiyun 	[STMPE_IDX_GPMR_CSB]	= STMPE1601_REG_GPIO_MP_MSB,
680*4882a593Smuzhiyun 	[STMPE_IDX_GPSR_LSB]	= STMPE1601_REG_GPIO_SET_LSB,
681*4882a593Smuzhiyun 	[STMPE_IDX_GPSR_CSB]	= STMPE1601_REG_GPIO_SET_MSB,
682*4882a593Smuzhiyun 	[STMPE_IDX_GPCR_LSB]	= STMPE1601_REG_GPIO_CLR_LSB,
683*4882a593Smuzhiyun 	[STMPE_IDX_GPCR_CSB]	= STMPE1601_REG_GPIO_CLR_MSB,
684*4882a593Smuzhiyun 	[STMPE_IDX_GPDR_LSB]	= STMPE1601_REG_GPIO_SET_DIR_LSB,
685*4882a593Smuzhiyun 	[STMPE_IDX_GPDR_CSB]	= STMPE1601_REG_GPIO_SET_DIR_MSB,
686*4882a593Smuzhiyun 	[STMPE_IDX_GPEDR_LSB]	= STMPE1601_REG_GPIO_ED_LSB,
687*4882a593Smuzhiyun 	[STMPE_IDX_GPEDR_CSB]	= STMPE1601_REG_GPIO_ED_MSB,
688*4882a593Smuzhiyun 	[STMPE_IDX_GPRER_LSB]	= STMPE1601_REG_GPIO_RE_LSB,
689*4882a593Smuzhiyun 	[STMPE_IDX_GPRER_CSB]	= STMPE1601_REG_GPIO_RE_MSB,
690*4882a593Smuzhiyun 	[STMPE_IDX_GPFER_LSB]	= STMPE1601_REG_GPIO_FE_LSB,
691*4882a593Smuzhiyun 	[STMPE_IDX_GPFER_CSB]	= STMPE1601_REG_GPIO_FE_MSB,
692*4882a593Smuzhiyun 	[STMPE_IDX_GPPUR_LSB]	= STMPE1601_REG_GPIO_PU_LSB,
693*4882a593Smuzhiyun 	[STMPE_IDX_GPAFR_U_MSB]	= STMPE1601_REG_GPIO_AF_U_MSB,
694*4882a593Smuzhiyun 	[STMPE_IDX_IEGPIOR_LSB]	= STMPE1601_REG_INT_EN_GPIO_MASK_LSB,
695*4882a593Smuzhiyun 	[STMPE_IDX_IEGPIOR_CSB]	= STMPE1601_REG_INT_EN_GPIO_MASK_MSB,
696*4882a593Smuzhiyun 	[STMPE_IDX_ISGPIOR_MSB]	= STMPE1601_REG_INT_STA_GPIO_MSB,
697*4882a593Smuzhiyun };
698*4882a593Smuzhiyun 
699*4882a593Smuzhiyun static struct stmpe_variant_block stmpe1601_blocks[] = {
700*4882a593Smuzhiyun 	{
701*4882a593Smuzhiyun 		.cell	= &stmpe_gpio_cell,
702*4882a593Smuzhiyun 		.irq	= STMPE1601_IRQ_GPIOC,
703*4882a593Smuzhiyun 		.block	= STMPE_BLOCK_GPIO,
704*4882a593Smuzhiyun 	},
705*4882a593Smuzhiyun 	{
706*4882a593Smuzhiyun 		.cell	= &stmpe_keypad_cell,
707*4882a593Smuzhiyun 		.irq	= STMPE1601_IRQ_KEYPAD,
708*4882a593Smuzhiyun 		.block	= STMPE_BLOCK_KEYPAD,
709*4882a593Smuzhiyun 	},
710*4882a593Smuzhiyun 	{
711*4882a593Smuzhiyun 		.cell	= &stmpe_pwm_cell,
712*4882a593Smuzhiyun 		.irq	= STMPE1601_IRQ_PWM0,
713*4882a593Smuzhiyun 		.block	= STMPE_BLOCK_PWM,
714*4882a593Smuzhiyun 	},
715*4882a593Smuzhiyun };
716*4882a593Smuzhiyun 
717*4882a593Smuzhiyun /* supported autosleep timeout delay (in msecs) */
718*4882a593Smuzhiyun static const int stmpe_autosleep_delay[] = {
719*4882a593Smuzhiyun 	4, 16, 32, 64, 128, 256, 512, 1024,
720*4882a593Smuzhiyun };
721*4882a593Smuzhiyun 
stmpe_round_timeout(int timeout)722*4882a593Smuzhiyun static int stmpe_round_timeout(int timeout)
723*4882a593Smuzhiyun {
724*4882a593Smuzhiyun 	int i;
725*4882a593Smuzhiyun 
726*4882a593Smuzhiyun 	for (i = 0; i < ARRAY_SIZE(stmpe_autosleep_delay); i++) {
727*4882a593Smuzhiyun 		if (stmpe_autosleep_delay[i] >= timeout)
728*4882a593Smuzhiyun 			return i;
729*4882a593Smuzhiyun 	}
730*4882a593Smuzhiyun 
731*4882a593Smuzhiyun 	/*
732*4882a593Smuzhiyun 	 * requests for delays longer than supported should not return the
733*4882a593Smuzhiyun 	 * longest supported delay
734*4882a593Smuzhiyun 	 */
735*4882a593Smuzhiyun 	return -EINVAL;
736*4882a593Smuzhiyun }
737*4882a593Smuzhiyun 
stmpe_autosleep(struct stmpe * stmpe,int autosleep_timeout)738*4882a593Smuzhiyun static int stmpe_autosleep(struct stmpe *stmpe, int autosleep_timeout)
739*4882a593Smuzhiyun {
740*4882a593Smuzhiyun 	int ret;
741*4882a593Smuzhiyun 
742*4882a593Smuzhiyun 	if (!stmpe->variant->enable_autosleep)
743*4882a593Smuzhiyun 		return -ENOSYS;
744*4882a593Smuzhiyun 
745*4882a593Smuzhiyun 	mutex_lock(&stmpe->lock);
746*4882a593Smuzhiyun 	ret = stmpe->variant->enable_autosleep(stmpe, autosleep_timeout);
747*4882a593Smuzhiyun 	mutex_unlock(&stmpe->lock);
748*4882a593Smuzhiyun 
749*4882a593Smuzhiyun 	return ret;
750*4882a593Smuzhiyun }
751*4882a593Smuzhiyun 
752*4882a593Smuzhiyun /*
753*4882a593Smuzhiyun  * Both stmpe 1601/2403 support same layout for autosleep
754*4882a593Smuzhiyun  */
stmpe1601_autosleep(struct stmpe * stmpe,int autosleep_timeout)755*4882a593Smuzhiyun static int stmpe1601_autosleep(struct stmpe *stmpe,
756*4882a593Smuzhiyun 		int autosleep_timeout)
757*4882a593Smuzhiyun {
758*4882a593Smuzhiyun 	int ret, timeout;
759*4882a593Smuzhiyun 
760*4882a593Smuzhiyun 	/* choose the best available timeout */
761*4882a593Smuzhiyun 	timeout = stmpe_round_timeout(autosleep_timeout);
762*4882a593Smuzhiyun 	if (timeout < 0) {
763*4882a593Smuzhiyun 		dev_err(stmpe->dev, "invalid timeout\n");
764*4882a593Smuzhiyun 		return timeout;
765*4882a593Smuzhiyun 	}
766*4882a593Smuzhiyun 
767*4882a593Smuzhiyun 	ret = __stmpe_set_bits(stmpe, stmpe->regs[STMPE_IDX_SYS_CTRL2],
768*4882a593Smuzhiyun 			STMPE1601_AUTOSLEEP_TIMEOUT_MASK,
769*4882a593Smuzhiyun 			timeout);
770*4882a593Smuzhiyun 	if (ret < 0)
771*4882a593Smuzhiyun 		return ret;
772*4882a593Smuzhiyun 
773*4882a593Smuzhiyun 	return __stmpe_set_bits(stmpe, stmpe->regs[STMPE_IDX_SYS_CTRL2],
774*4882a593Smuzhiyun 			STPME1601_AUTOSLEEP_ENABLE,
775*4882a593Smuzhiyun 			STPME1601_AUTOSLEEP_ENABLE);
776*4882a593Smuzhiyun }
777*4882a593Smuzhiyun 
stmpe1601_enable(struct stmpe * stmpe,unsigned int blocks,bool enable)778*4882a593Smuzhiyun static int stmpe1601_enable(struct stmpe *stmpe, unsigned int blocks,
779*4882a593Smuzhiyun 			    bool enable)
780*4882a593Smuzhiyun {
781*4882a593Smuzhiyun 	unsigned int mask = 0;
782*4882a593Smuzhiyun 
783*4882a593Smuzhiyun 	if (blocks & STMPE_BLOCK_GPIO)
784*4882a593Smuzhiyun 		mask |= STMPE1601_SYS_CTRL_ENABLE_GPIO;
785*4882a593Smuzhiyun 	else
786*4882a593Smuzhiyun 		mask &= ~STMPE1601_SYS_CTRL_ENABLE_GPIO;
787*4882a593Smuzhiyun 
788*4882a593Smuzhiyun 	if (blocks & STMPE_BLOCK_KEYPAD)
789*4882a593Smuzhiyun 		mask |= STMPE1601_SYS_CTRL_ENABLE_KPC;
790*4882a593Smuzhiyun 	else
791*4882a593Smuzhiyun 		mask &= ~STMPE1601_SYS_CTRL_ENABLE_KPC;
792*4882a593Smuzhiyun 
793*4882a593Smuzhiyun 	if (blocks & STMPE_BLOCK_PWM)
794*4882a593Smuzhiyun 		mask |= STMPE1601_SYS_CTRL_ENABLE_SPWM;
795*4882a593Smuzhiyun 	else
796*4882a593Smuzhiyun 		mask &= ~STMPE1601_SYS_CTRL_ENABLE_SPWM;
797*4882a593Smuzhiyun 
798*4882a593Smuzhiyun 	return __stmpe_set_bits(stmpe, stmpe->regs[STMPE_IDX_SYS_CTRL], mask,
799*4882a593Smuzhiyun 				enable ? mask : 0);
800*4882a593Smuzhiyun }
801*4882a593Smuzhiyun 
stmpe1601_get_altfunc(struct stmpe * stmpe,enum stmpe_block block)802*4882a593Smuzhiyun static int stmpe1601_get_altfunc(struct stmpe *stmpe, enum stmpe_block block)
803*4882a593Smuzhiyun {
804*4882a593Smuzhiyun 	switch (block) {
805*4882a593Smuzhiyun 	case STMPE_BLOCK_PWM:
806*4882a593Smuzhiyun 		return 2;
807*4882a593Smuzhiyun 
808*4882a593Smuzhiyun 	case STMPE_BLOCK_KEYPAD:
809*4882a593Smuzhiyun 		return 1;
810*4882a593Smuzhiyun 
811*4882a593Smuzhiyun 	case STMPE_BLOCK_GPIO:
812*4882a593Smuzhiyun 	default:
813*4882a593Smuzhiyun 		return 0;
814*4882a593Smuzhiyun 	}
815*4882a593Smuzhiyun }
816*4882a593Smuzhiyun 
817*4882a593Smuzhiyun static struct stmpe_variant_info stmpe1601 = {
818*4882a593Smuzhiyun 	.name		= "stmpe1601",
819*4882a593Smuzhiyun 	.id_val		= 0x0210,
820*4882a593Smuzhiyun 	.id_mask	= 0xfff0,	/* at least 0x0210 and 0x0212 */
821*4882a593Smuzhiyun 	.num_gpios	= 16,
822*4882a593Smuzhiyun 	.af_bits	= 2,
823*4882a593Smuzhiyun 	.regs		= stmpe1601_regs,
824*4882a593Smuzhiyun 	.blocks		= stmpe1601_blocks,
825*4882a593Smuzhiyun 	.num_blocks	= ARRAY_SIZE(stmpe1601_blocks),
826*4882a593Smuzhiyun 	.num_irqs	= STMPE1601_NR_INTERNAL_IRQS,
827*4882a593Smuzhiyun 	.enable		= stmpe1601_enable,
828*4882a593Smuzhiyun 	.get_altfunc	= stmpe1601_get_altfunc,
829*4882a593Smuzhiyun 	.enable_autosleep	= stmpe1601_autosleep,
830*4882a593Smuzhiyun };
831*4882a593Smuzhiyun 
832*4882a593Smuzhiyun /*
833*4882a593Smuzhiyun  * STMPE1801
834*4882a593Smuzhiyun  */
835*4882a593Smuzhiyun static const u8 stmpe1801_regs[] = {
836*4882a593Smuzhiyun 	[STMPE_IDX_CHIP_ID]	= STMPE1801_REG_CHIP_ID,
837*4882a593Smuzhiyun 	[STMPE_IDX_SYS_CTRL]	= STMPE1801_REG_SYS_CTRL,
838*4882a593Smuzhiyun 	[STMPE_IDX_ICR_LSB]	= STMPE1801_REG_INT_CTRL_LOW,
839*4882a593Smuzhiyun 	[STMPE_IDX_IER_LSB]	= STMPE1801_REG_INT_EN_MASK_LOW,
840*4882a593Smuzhiyun 	[STMPE_IDX_ISR_LSB]	= STMPE1801_REG_INT_STA_LOW,
841*4882a593Smuzhiyun 	[STMPE_IDX_GPMR_LSB]	= STMPE1801_REG_GPIO_MP_LOW,
842*4882a593Smuzhiyun 	[STMPE_IDX_GPMR_CSB]	= STMPE1801_REG_GPIO_MP_MID,
843*4882a593Smuzhiyun 	[STMPE_IDX_GPMR_MSB]	= STMPE1801_REG_GPIO_MP_HIGH,
844*4882a593Smuzhiyun 	[STMPE_IDX_GPSR_LSB]	= STMPE1801_REG_GPIO_SET_LOW,
845*4882a593Smuzhiyun 	[STMPE_IDX_GPSR_CSB]	= STMPE1801_REG_GPIO_SET_MID,
846*4882a593Smuzhiyun 	[STMPE_IDX_GPSR_MSB]	= STMPE1801_REG_GPIO_SET_HIGH,
847*4882a593Smuzhiyun 	[STMPE_IDX_GPCR_LSB]	= STMPE1801_REG_GPIO_CLR_LOW,
848*4882a593Smuzhiyun 	[STMPE_IDX_GPCR_CSB]	= STMPE1801_REG_GPIO_CLR_MID,
849*4882a593Smuzhiyun 	[STMPE_IDX_GPCR_MSB]	= STMPE1801_REG_GPIO_CLR_HIGH,
850*4882a593Smuzhiyun 	[STMPE_IDX_GPDR_LSB]	= STMPE1801_REG_GPIO_SET_DIR_LOW,
851*4882a593Smuzhiyun 	[STMPE_IDX_GPDR_CSB]	= STMPE1801_REG_GPIO_SET_DIR_MID,
852*4882a593Smuzhiyun 	[STMPE_IDX_GPDR_MSB]	= STMPE1801_REG_GPIO_SET_DIR_HIGH,
853*4882a593Smuzhiyun 	[STMPE_IDX_GPRER_LSB]	= STMPE1801_REG_GPIO_RE_LOW,
854*4882a593Smuzhiyun 	[STMPE_IDX_GPRER_CSB]	= STMPE1801_REG_GPIO_RE_MID,
855*4882a593Smuzhiyun 	[STMPE_IDX_GPRER_MSB]	= STMPE1801_REG_GPIO_RE_HIGH,
856*4882a593Smuzhiyun 	[STMPE_IDX_GPFER_LSB]	= STMPE1801_REG_GPIO_FE_LOW,
857*4882a593Smuzhiyun 	[STMPE_IDX_GPFER_CSB]	= STMPE1801_REG_GPIO_FE_MID,
858*4882a593Smuzhiyun 	[STMPE_IDX_GPFER_MSB]	= STMPE1801_REG_GPIO_FE_HIGH,
859*4882a593Smuzhiyun 	[STMPE_IDX_GPPUR_LSB]	= STMPE1801_REG_GPIO_PULL_UP_LOW,
860*4882a593Smuzhiyun 	[STMPE_IDX_IEGPIOR_LSB]	= STMPE1801_REG_INT_EN_GPIO_MASK_LOW,
861*4882a593Smuzhiyun 	[STMPE_IDX_IEGPIOR_CSB]	= STMPE1801_REG_INT_EN_GPIO_MASK_MID,
862*4882a593Smuzhiyun 	[STMPE_IDX_IEGPIOR_MSB]	= STMPE1801_REG_INT_EN_GPIO_MASK_HIGH,
863*4882a593Smuzhiyun 	[STMPE_IDX_ISGPIOR_MSB]	= STMPE1801_REG_INT_STA_GPIO_HIGH,
864*4882a593Smuzhiyun };
865*4882a593Smuzhiyun 
866*4882a593Smuzhiyun static struct stmpe_variant_block stmpe1801_blocks[] = {
867*4882a593Smuzhiyun 	{
868*4882a593Smuzhiyun 		.cell	= &stmpe_gpio_cell,
869*4882a593Smuzhiyun 		.irq	= STMPE1801_IRQ_GPIOC,
870*4882a593Smuzhiyun 		.block	= STMPE_BLOCK_GPIO,
871*4882a593Smuzhiyun 	},
872*4882a593Smuzhiyun 	{
873*4882a593Smuzhiyun 		.cell	= &stmpe_keypad_cell,
874*4882a593Smuzhiyun 		.irq	= STMPE1801_IRQ_KEYPAD,
875*4882a593Smuzhiyun 		.block	= STMPE_BLOCK_KEYPAD,
876*4882a593Smuzhiyun 	},
877*4882a593Smuzhiyun };
878*4882a593Smuzhiyun 
stmpe1801_enable(struct stmpe * stmpe,unsigned int blocks,bool enable)879*4882a593Smuzhiyun static int stmpe1801_enable(struct stmpe *stmpe, unsigned int blocks,
880*4882a593Smuzhiyun 			    bool enable)
881*4882a593Smuzhiyun {
882*4882a593Smuzhiyun 	unsigned int mask = 0;
883*4882a593Smuzhiyun 	if (blocks & STMPE_BLOCK_GPIO)
884*4882a593Smuzhiyun 		mask |= STMPE1801_MSK_INT_EN_GPIO;
885*4882a593Smuzhiyun 
886*4882a593Smuzhiyun 	if (blocks & STMPE_BLOCK_KEYPAD)
887*4882a593Smuzhiyun 		mask |= STMPE1801_MSK_INT_EN_KPC;
888*4882a593Smuzhiyun 
889*4882a593Smuzhiyun 	return __stmpe_set_bits(stmpe, STMPE1801_REG_INT_EN_MASK_LOW, mask,
890*4882a593Smuzhiyun 				enable ? mask : 0);
891*4882a593Smuzhiyun }
892*4882a593Smuzhiyun 
stmpe_reset(struct stmpe * stmpe)893*4882a593Smuzhiyun static int stmpe_reset(struct stmpe *stmpe)
894*4882a593Smuzhiyun {
895*4882a593Smuzhiyun 	u16 id_val = stmpe->variant->id_val;
896*4882a593Smuzhiyun 	unsigned long timeout;
897*4882a593Smuzhiyun 	int ret = 0;
898*4882a593Smuzhiyun 	u8 reset_bit;
899*4882a593Smuzhiyun 
900*4882a593Smuzhiyun 	if (id_val == STMPE811_ID)
901*4882a593Smuzhiyun 		/* STMPE801 and STMPE610 use bit 1 of SYS_CTRL register */
902*4882a593Smuzhiyun 		reset_bit = STMPE811_SYS_CTRL_RESET;
903*4882a593Smuzhiyun 	else
904*4882a593Smuzhiyun 		/* all other STMPE variant use bit 7 of SYS_CTRL register */
905*4882a593Smuzhiyun 		reset_bit = STMPE_SYS_CTRL_RESET;
906*4882a593Smuzhiyun 
907*4882a593Smuzhiyun 	ret = __stmpe_set_bits(stmpe, stmpe->regs[STMPE_IDX_SYS_CTRL],
908*4882a593Smuzhiyun 			       reset_bit, reset_bit);
909*4882a593Smuzhiyun 	if (ret < 0)
910*4882a593Smuzhiyun 		return ret;
911*4882a593Smuzhiyun 
912*4882a593Smuzhiyun 	msleep(10);
913*4882a593Smuzhiyun 
914*4882a593Smuzhiyun 	timeout = jiffies + msecs_to_jiffies(100);
915*4882a593Smuzhiyun 	while (time_before(jiffies, timeout)) {
916*4882a593Smuzhiyun 		ret = __stmpe_reg_read(stmpe, stmpe->regs[STMPE_IDX_SYS_CTRL]);
917*4882a593Smuzhiyun 		if (ret < 0)
918*4882a593Smuzhiyun 			return ret;
919*4882a593Smuzhiyun 		if (!(ret & reset_bit))
920*4882a593Smuzhiyun 			return 0;
921*4882a593Smuzhiyun 		usleep_range(100, 200);
922*4882a593Smuzhiyun 	}
923*4882a593Smuzhiyun 	return -EIO;
924*4882a593Smuzhiyun }
925*4882a593Smuzhiyun 
926*4882a593Smuzhiyun static struct stmpe_variant_info stmpe1801 = {
927*4882a593Smuzhiyun 	.name		= "stmpe1801",
928*4882a593Smuzhiyun 	.id_val		= STMPE1801_ID,
929*4882a593Smuzhiyun 	.id_mask	= 0xfff0,
930*4882a593Smuzhiyun 	.num_gpios	= 18,
931*4882a593Smuzhiyun 	.af_bits	= 0,
932*4882a593Smuzhiyun 	.regs		= stmpe1801_regs,
933*4882a593Smuzhiyun 	.blocks		= stmpe1801_blocks,
934*4882a593Smuzhiyun 	.num_blocks	= ARRAY_SIZE(stmpe1801_blocks),
935*4882a593Smuzhiyun 	.num_irqs	= STMPE1801_NR_INTERNAL_IRQS,
936*4882a593Smuzhiyun 	.enable		= stmpe1801_enable,
937*4882a593Smuzhiyun 	/* stmpe1801 do not have any gpio alternate function */
938*4882a593Smuzhiyun 	.get_altfunc	= NULL,
939*4882a593Smuzhiyun };
940*4882a593Smuzhiyun 
941*4882a593Smuzhiyun /*
942*4882a593Smuzhiyun  * STMPE24XX
943*4882a593Smuzhiyun  */
944*4882a593Smuzhiyun 
945*4882a593Smuzhiyun static const u8 stmpe24xx_regs[] = {
946*4882a593Smuzhiyun 	[STMPE_IDX_CHIP_ID]	= STMPE24XX_REG_CHIP_ID,
947*4882a593Smuzhiyun 	[STMPE_IDX_SYS_CTRL]	= STMPE24XX_REG_SYS_CTRL,
948*4882a593Smuzhiyun 	[STMPE_IDX_SYS_CTRL2]	= STMPE24XX_REG_SYS_CTRL2,
949*4882a593Smuzhiyun 	[STMPE_IDX_ICR_LSB]	= STMPE24XX_REG_ICR_LSB,
950*4882a593Smuzhiyun 	[STMPE_IDX_IER_MSB]	= STMPE24XX_REG_IER_MSB,
951*4882a593Smuzhiyun 	[STMPE_IDX_IER_LSB]	= STMPE24XX_REG_IER_LSB,
952*4882a593Smuzhiyun 	[STMPE_IDX_ISR_MSB]	= STMPE24XX_REG_ISR_MSB,
953*4882a593Smuzhiyun 	[STMPE_IDX_GPMR_LSB]	= STMPE24XX_REG_GPMR_LSB,
954*4882a593Smuzhiyun 	[STMPE_IDX_GPMR_CSB]	= STMPE24XX_REG_GPMR_CSB,
955*4882a593Smuzhiyun 	[STMPE_IDX_GPMR_MSB]	= STMPE24XX_REG_GPMR_MSB,
956*4882a593Smuzhiyun 	[STMPE_IDX_GPSR_LSB]	= STMPE24XX_REG_GPSR_LSB,
957*4882a593Smuzhiyun 	[STMPE_IDX_GPSR_CSB]	= STMPE24XX_REG_GPSR_CSB,
958*4882a593Smuzhiyun 	[STMPE_IDX_GPSR_MSB]	= STMPE24XX_REG_GPSR_MSB,
959*4882a593Smuzhiyun 	[STMPE_IDX_GPCR_LSB]	= STMPE24XX_REG_GPCR_LSB,
960*4882a593Smuzhiyun 	[STMPE_IDX_GPCR_CSB]	= STMPE24XX_REG_GPCR_CSB,
961*4882a593Smuzhiyun 	[STMPE_IDX_GPCR_MSB]	= STMPE24XX_REG_GPCR_MSB,
962*4882a593Smuzhiyun 	[STMPE_IDX_GPDR_LSB]	= STMPE24XX_REG_GPDR_LSB,
963*4882a593Smuzhiyun 	[STMPE_IDX_GPDR_CSB]	= STMPE24XX_REG_GPDR_CSB,
964*4882a593Smuzhiyun 	[STMPE_IDX_GPDR_MSB]	= STMPE24XX_REG_GPDR_MSB,
965*4882a593Smuzhiyun 	[STMPE_IDX_GPRER_LSB]	= STMPE24XX_REG_GPRER_LSB,
966*4882a593Smuzhiyun 	[STMPE_IDX_GPRER_CSB]	= STMPE24XX_REG_GPRER_CSB,
967*4882a593Smuzhiyun 	[STMPE_IDX_GPRER_MSB]	= STMPE24XX_REG_GPRER_MSB,
968*4882a593Smuzhiyun 	[STMPE_IDX_GPFER_LSB]	= STMPE24XX_REG_GPFER_LSB,
969*4882a593Smuzhiyun 	[STMPE_IDX_GPFER_CSB]	= STMPE24XX_REG_GPFER_CSB,
970*4882a593Smuzhiyun 	[STMPE_IDX_GPFER_MSB]	= STMPE24XX_REG_GPFER_MSB,
971*4882a593Smuzhiyun 	[STMPE_IDX_GPPUR_LSB]	= STMPE24XX_REG_GPPUR_LSB,
972*4882a593Smuzhiyun 	[STMPE_IDX_GPPDR_LSB]	= STMPE24XX_REG_GPPDR_LSB,
973*4882a593Smuzhiyun 	[STMPE_IDX_GPAFR_U_MSB]	= STMPE24XX_REG_GPAFR_U_MSB,
974*4882a593Smuzhiyun 	[STMPE_IDX_IEGPIOR_LSB]	= STMPE24XX_REG_IEGPIOR_LSB,
975*4882a593Smuzhiyun 	[STMPE_IDX_IEGPIOR_CSB]	= STMPE24XX_REG_IEGPIOR_CSB,
976*4882a593Smuzhiyun 	[STMPE_IDX_IEGPIOR_MSB]	= STMPE24XX_REG_IEGPIOR_MSB,
977*4882a593Smuzhiyun 	[STMPE_IDX_ISGPIOR_MSB]	= STMPE24XX_REG_ISGPIOR_MSB,
978*4882a593Smuzhiyun 	[STMPE_IDX_GPEDR_LSB]	= STMPE24XX_REG_GPEDR_LSB,
979*4882a593Smuzhiyun 	[STMPE_IDX_GPEDR_CSB]	= STMPE24XX_REG_GPEDR_CSB,
980*4882a593Smuzhiyun 	[STMPE_IDX_GPEDR_MSB]	= STMPE24XX_REG_GPEDR_MSB,
981*4882a593Smuzhiyun };
982*4882a593Smuzhiyun 
983*4882a593Smuzhiyun static struct stmpe_variant_block stmpe24xx_blocks[] = {
984*4882a593Smuzhiyun 	{
985*4882a593Smuzhiyun 		.cell	= &stmpe_gpio_cell,
986*4882a593Smuzhiyun 		.irq	= STMPE24XX_IRQ_GPIOC,
987*4882a593Smuzhiyun 		.block	= STMPE_BLOCK_GPIO,
988*4882a593Smuzhiyun 	},
989*4882a593Smuzhiyun 	{
990*4882a593Smuzhiyun 		.cell	= &stmpe_keypad_cell,
991*4882a593Smuzhiyun 		.irq	= STMPE24XX_IRQ_KEYPAD,
992*4882a593Smuzhiyun 		.block	= STMPE_BLOCK_KEYPAD,
993*4882a593Smuzhiyun 	},
994*4882a593Smuzhiyun 	{
995*4882a593Smuzhiyun 		.cell	= &stmpe_pwm_cell,
996*4882a593Smuzhiyun 		.irq	= STMPE24XX_IRQ_PWM0,
997*4882a593Smuzhiyun 		.block	= STMPE_BLOCK_PWM,
998*4882a593Smuzhiyun 	},
999*4882a593Smuzhiyun };
1000*4882a593Smuzhiyun 
stmpe24xx_enable(struct stmpe * stmpe,unsigned int blocks,bool enable)1001*4882a593Smuzhiyun static int stmpe24xx_enable(struct stmpe *stmpe, unsigned int blocks,
1002*4882a593Smuzhiyun 			    bool enable)
1003*4882a593Smuzhiyun {
1004*4882a593Smuzhiyun 	unsigned int mask = 0;
1005*4882a593Smuzhiyun 
1006*4882a593Smuzhiyun 	if (blocks & STMPE_BLOCK_GPIO)
1007*4882a593Smuzhiyun 		mask |= STMPE24XX_SYS_CTRL_ENABLE_GPIO;
1008*4882a593Smuzhiyun 
1009*4882a593Smuzhiyun 	if (blocks & STMPE_BLOCK_KEYPAD)
1010*4882a593Smuzhiyun 		mask |= STMPE24XX_SYS_CTRL_ENABLE_KPC;
1011*4882a593Smuzhiyun 
1012*4882a593Smuzhiyun 	return __stmpe_set_bits(stmpe, stmpe->regs[STMPE_IDX_SYS_CTRL], mask,
1013*4882a593Smuzhiyun 				enable ? mask : 0);
1014*4882a593Smuzhiyun }
1015*4882a593Smuzhiyun 
stmpe24xx_get_altfunc(struct stmpe * stmpe,enum stmpe_block block)1016*4882a593Smuzhiyun static int stmpe24xx_get_altfunc(struct stmpe *stmpe, enum stmpe_block block)
1017*4882a593Smuzhiyun {
1018*4882a593Smuzhiyun 	switch (block) {
1019*4882a593Smuzhiyun 	case STMPE_BLOCK_ROTATOR:
1020*4882a593Smuzhiyun 		return 2;
1021*4882a593Smuzhiyun 
1022*4882a593Smuzhiyun 	case STMPE_BLOCK_KEYPAD:
1023*4882a593Smuzhiyun 	case STMPE_BLOCK_PWM:
1024*4882a593Smuzhiyun 		return 1;
1025*4882a593Smuzhiyun 
1026*4882a593Smuzhiyun 	case STMPE_BLOCK_GPIO:
1027*4882a593Smuzhiyun 	default:
1028*4882a593Smuzhiyun 		return 0;
1029*4882a593Smuzhiyun 	}
1030*4882a593Smuzhiyun }
1031*4882a593Smuzhiyun 
1032*4882a593Smuzhiyun static struct stmpe_variant_info stmpe2401 = {
1033*4882a593Smuzhiyun 	.name		= "stmpe2401",
1034*4882a593Smuzhiyun 	.id_val		= 0x0101,
1035*4882a593Smuzhiyun 	.id_mask	= 0xffff,
1036*4882a593Smuzhiyun 	.num_gpios	= 24,
1037*4882a593Smuzhiyun 	.af_bits	= 2,
1038*4882a593Smuzhiyun 	.regs		= stmpe24xx_regs,
1039*4882a593Smuzhiyun 	.blocks		= stmpe24xx_blocks,
1040*4882a593Smuzhiyun 	.num_blocks	= ARRAY_SIZE(stmpe24xx_blocks),
1041*4882a593Smuzhiyun 	.num_irqs	= STMPE24XX_NR_INTERNAL_IRQS,
1042*4882a593Smuzhiyun 	.enable		= stmpe24xx_enable,
1043*4882a593Smuzhiyun 	.get_altfunc	= stmpe24xx_get_altfunc,
1044*4882a593Smuzhiyun };
1045*4882a593Smuzhiyun 
1046*4882a593Smuzhiyun static struct stmpe_variant_info stmpe2403 = {
1047*4882a593Smuzhiyun 	.name		= "stmpe2403",
1048*4882a593Smuzhiyun 	.id_val		= 0x0120,
1049*4882a593Smuzhiyun 	.id_mask	= 0xffff,
1050*4882a593Smuzhiyun 	.num_gpios	= 24,
1051*4882a593Smuzhiyun 	.af_bits	= 2,
1052*4882a593Smuzhiyun 	.regs		= stmpe24xx_regs,
1053*4882a593Smuzhiyun 	.blocks		= stmpe24xx_blocks,
1054*4882a593Smuzhiyun 	.num_blocks	= ARRAY_SIZE(stmpe24xx_blocks),
1055*4882a593Smuzhiyun 	.num_irqs	= STMPE24XX_NR_INTERNAL_IRQS,
1056*4882a593Smuzhiyun 	.enable		= stmpe24xx_enable,
1057*4882a593Smuzhiyun 	.get_altfunc	= stmpe24xx_get_altfunc,
1058*4882a593Smuzhiyun 	.enable_autosleep	= stmpe1601_autosleep, /* same as stmpe1601 */
1059*4882a593Smuzhiyun };
1060*4882a593Smuzhiyun 
1061*4882a593Smuzhiyun static struct stmpe_variant_info *stmpe_variant_info[STMPE_NBR_PARTS] = {
1062*4882a593Smuzhiyun 	[STMPE610]	= &stmpe610,
1063*4882a593Smuzhiyun 	[STMPE801]	= &stmpe801,
1064*4882a593Smuzhiyun 	[STMPE811]	= &stmpe811,
1065*4882a593Smuzhiyun 	[STMPE1600]	= &stmpe1600,
1066*4882a593Smuzhiyun 	[STMPE1601]	= &stmpe1601,
1067*4882a593Smuzhiyun 	[STMPE1801]	= &stmpe1801,
1068*4882a593Smuzhiyun 	[STMPE2401]	= &stmpe2401,
1069*4882a593Smuzhiyun 	[STMPE2403]	= &stmpe2403,
1070*4882a593Smuzhiyun };
1071*4882a593Smuzhiyun 
1072*4882a593Smuzhiyun /*
1073*4882a593Smuzhiyun  * These devices can be connected in a 'no-irq' configuration - the irq pin
1074*4882a593Smuzhiyun  * is not used and the device cannot interrupt the CPU. Here we only list
1075*4882a593Smuzhiyun  * devices which support this configuration - the driver will fail probing
1076*4882a593Smuzhiyun  * for any devices not listed here which are configured in this way.
1077*4882a593Smuzhiyun  */
1078*4882a593Smuzhiyun static struct stmpe_variant_info *stmpe_noirq_variant_info[STMPE_NBR_PARTS] = {
1079*4882a593Smuzhiyun 	[STMPE801]	= &stmpe801_noirq,
1080*4882a593Smuzhiyun };
1081*4882a593Smuzhiyun 
stmpe_irq(int irq,void * data)1082*4882a593Smuzhiyun static irqreturn_t stmpe_irq(int irq, void *data)
1083*4882a593Smuzhiyun {
1084*4882a593Smuzhiyun 	struct stmpe *stmpe = data;
1085*4882a593Smuzhiyun 	struct stmpe_variant_info *variant = stmpe->variant;
1086*4882a593Smuzhiyun 	int num = DIV_ROUND_UP(variant->num_irqs, 8);
1087*4882a593Smuzhiyun 	u8 israddr;
1088*4882a593Smuzhiyun 	u8 isr[3];
1089*4882a593Smuzhiyun 	int ret;
1090*4882a593Smuzhiyun 	int i;
1091*4882a593Smuzhiyun 
1092*4882a593Smuzhiyun 	if (variant->id_val == STMPE801_ID ||
1093*4882a593Smuzhiyun 	    variant->id_val == STMPE1600_ID) {
1094*4882a593Smuzhiyun 		int base = irq_find_mapping(stmpe->domain, 0);
1095*4882a593Smuzhiyun 
1096*4882a593Smuzhiyun 		handle_nested_irq(base);
1097*4882a593Smuzhiyun 		return IRQ_HANDLED;
1098*4882a593Smuzhiyun 	}
1099*4882a593Smuzhiyun 
1100*4882a593Smuzhiyun 	if (variant->id_val == STMPE1801_ID)
1101*4882a593Smuzhiyun 		israddr = stmpe->regs[STMPE_IDX_ISR_LSB];
1102*4882a593Smuzhiyun 	else
1103*4882a593Smuzhiyun 		israddr = stmpe->regs[STMPE_IDX_ISR_MSB];
1104*4882a593Smuzhiyun 
1105*4882a593Smuzhiyun 	ret = stmpe_block_read(stmpe, israddr, num, isr);
1106*4882a593Smuzhiyun 	if (ret < 0)
1107*4882a593Smuzhiyun 		return IRQ_NONE;
1108*4882a593Smuzhiyun 
1109*4882a593Smuzhiyun 	for (i = 0; i < num; i++) {
1110*4882a593Smuzhiyun 		int bank = num - i - 1;
1111*4882a593Smuzhiyun 		u8 status = isr[i];
1112*4882a593Smuzhiyun 		u8 clear;
1113*4882a593Smuzhiyun 
1114*4882a593Smuzhiyun 		status &= stmpe->ier[bank];
1115*4882a593Smuzhiyun 		if (!status)
1116*4882a593Smuzhiyun 			continue;
1117*4882a593Smuzhiyun 
1118*4882a593Smuzhiyun 		clear = status;
1119*4882a593Smuzhiyun 		while (status) {
1120*4882a593Smuzhiyun 			int bit = __ffs(status);
1121*4882a593Smuzhiyun 			int line = bank * 8 + bit;
1122*4882a593Smuzhiyun 			int nestedirq = irq_find_mapping(stmpe->domain, line);
1123*4882a593Smuzhiyun 
1124*4882a593Smuzhiyun 			handle_nested_irq(nestedirq);
1125*4882a593Smuzhiyun 			status &= ~(1 << bit);
1126*4882a593Smuzhiyun 		}
1127*4882a593Smuzhiyun 
1128*4882a593Smuzhiyun 		stmpe_reg_write(stmpe, israddr + i, clear);
1129*4882a593Smuzhiyun 	}
1130*4882a593Smuzhiyun 
1131*4882a593Smuzhiyun 	return IRQ_HANDLED;
1132*4882a593Smuzhiyun }
1133*4882a593Smuzhiyun 
stmpe_irq_lock(struct irq_data * data)1134*4882a593Smuzhiyun static void stmpe_irq_lock(struct irq_data *data)
1135*4882a593Smuzhiyun {
1136*4882a593Smuzhiyun 	struct stmpe *stmpe = irq_data_get_irq_chip_data(data);
1137*4882a593Smuzhiyun 
1138*4882a593Smuzhiyun 	mutex_lock(&stmpe->irq_lock);
1139*4882a593Smuzhiyun }
1140*4882a593Smuzhiyun 
stmpe_irq_sync_unlock(struct irq_data * data)1141*4882a593Smuzhiyun static void stmpe_irq_sync_unlock(struct irq_data *data)
1142*4882a593Smuzhiyun {
1143*4882a593Smuzhiyun 	struct stmpe *stmpe = irq_data_get_irq_chip_data(data);
1144*4882a593Smuzhiyun 	struct stmpe_variant_info *variant = stmpe->variant;
1145*4882a593Smuzhiyun 	int num = DIV_ROUND_UP(variant->num_irqs, 8);
1146*4882a593Smuzhiyun 	int i;
1147*4882a593Smuzhiyun 
1148*4882a593Smuzhiyun 	for (i = 0; i < num; i++) {
1149*4882a593Smuzhiyun 		u8 new = stmpe->ier[i];
1150*4882a593Smuzhiyun 		u8 old = stmpe->oldier[i];
1151*4882a593Smuzhiyun 
1152*4882a593Smuzhiyun 		if (new == old)
1153*4882a593Smuzhiyun 			continue;
1154*4882a593Smuzhiyun 
1155*4882a593Smuzhiyun 		stmpe->oldier[i] = new;
1156*4882a593Smuzhiyun 		stmpe_reg_write(stmpe, stmpe->regs[STMPE_IDX_IER_LSB + i], new);
1157*4882a593Smuzhiyun 	}
1158*4882a593Smuzhiyun 
1159*4882a593Smuzhiyun 	mutex_unlock(&stmpe->irq_lock);
1160*4882a593Smuzhiyun }
1161*4882a593Smuzhiyun 
stmpe_irq_mask(struct irq_data * data)1162*4882a593Smuzhiyun static void stmpe_irq_mask(struct irq_data *data)
1163*4882a593Smuzhiyun {
1164*4882a593Smuzhiyun 	struct stmpe *stmpe = irq_data_get_irq_chip_data(data);
1165*4882a593Smuzhiyun 	int offset = data->hwirq;
1166*4882a593Smuzhiyun 	int regoffset = offset / 8;
1167*4882a593Smuzhiyun 	int mask = 1 << (offset % 8);
1168*4882a593Smuzhiyun 
1169*4882a593Smuzhiyun 	stmpe->ier[regoffset] &= ~mask;
1170*4882a593Smuzhiyun }
1171*4882a593Smuzhiyun 
stmpe_irq_unmask(struct irq_data * data)1172*4882a593Smuzhiyun static void stmpe_irq_unmask(struct irq_data *data)
1173*4882a593Smuzhiyun {
1174*4882a593Smuzhiyun 	struct stmpe *stmpe = irq_data_get_irq_chip_data(data);
1175*4882a593Smuzhiyun 	int offset = data->hwirq;
1176*4882a593Smuzhiyun 	int regoffset = offset / 8;
1177*4882a593Smuzhiyun 	int mask = 1 << (offset % 8);
1178*4882a593Smuzhiyun 
1179*4882a593Smuzhiyun 	stmpe->ier[regoffset] |= mask;
1180*4882a593Smuzhiyun }
1181*4882a593Smuzhiyun 
1182*4882a593Smuzhiyun static struct irq_chip stmpe_irq_chip = {
1183*4882a593Smuzhiyun 	.name			= "stmpe",
1184*4882a593Smuzhiyun 	.irq_bus_lock		= stmpe_irq_lock,
1185*4882a593Smuzhiyun 	.irq_bus_sync_unlock	= stmpe_irq_sync_unlock,
1186*4882a593Smuzhiyun 	.irq_mask		= stmpe_irq_mask,
1187*4882a593Smuzhiyun 	.irq_unmask		= stmpe_irq_unmask,
1188*4882a593Smuzhiyun };
1189*4882a593Smuzhiyun 
stmpe_irq_map(struct irq_domain * d,unsigned int virq,irq_hw_number_t hwirq)1190*4882a593Smuzhiyun static int stmpe_irq_map(struct irq_domain *d, unsigned int virq,
1191*4882a593Smuzhiyun                                 irq_hw_number_t hwirq)
1192*4882a593Smuzhiyun {
1193*4882a593Smuzhiyun 	struct stmpe *stmpe = d->host_data;
1194*4882a593Smuzhiyun 	struct irq_chip *chip = NULL;
1195*4882a593Smuzhiyun 
1196*4882a593Smuzhiyun 	if (stmpe->variant->id_val != STMPE801_ID)
1197*4882a593Smuzhiyun 		chip = &stmpe_irq_chip;
1198*4882a593Smuzhiyun 
1199*4882a593Smuzhiyun 	irq_set_chip_data(virq, stmpe);
1200*4882a593Smuzhiyun 	irq_set_chip_and_handler(virq, chip, handle_edge_irq);
1201*4882a593Smuzhiyun 	irq_set_nested_thread(virq, 1);
1202*4882a593Smuzhiyun 	irq_set_noprobe(virq);
1203*4882a593Smuzhiyun 
1204*4882a593Smuzhiyun 	return 0;
1205*4882a593Smuzhiyun }
1206*4882a593Smuzhiyun 
stmpe_irq_unmap(struct irq_domain * d,unsigned int virq)1207*4882a593Smuzhiyun static void stmpe_irq_unmap(struct irq_domain *d, unsigned int virq)
1208*4882a593Smuzhiyun {
1209*4882a593Smuzhiyun 		irq_set_chip_and_handler(virq, NULL, NULL);
1210*4882a593Smuzhiyun 		irq_set_chip_data(virq, NULL);
1211*4882a593Smuzhiyun }
1212*4882a593Smuzhiyun 
1213*4882a593Smuzhiyun static const struct irq_domain_ops stmpe_irq_ops = {
1214*4882a593Smuzhiyun         .map    = stmpe_irq_map,
1215*4882a593Smuzhiyun         .unmap  = stmpe_irq_unmap,
1216*4882a593Smuzhiyun         .xlate  = irq_domain_xlate_twocell,
1217*4882a593Smuzhiyun };
1218*4882a593Smuzhiyun 
stmpe_irq_init(struct stmpe * stmpe,struct device_node * np)1219*4882a593Smuzhiyun static int stmpe_irq_init(struct stmpe *stmpe, struct device_node *np)
1220*4882a593Smuzhiyun {
1221*4882a593Smuzhiyun 	int base = 0;
1222*4882a593Smuzhiyun 	int num_irqs = stmpe->variant->num_irqs;
1223*4882a593Smuzhiyun 
1224*4882a593Smuzhiyun 	stmpe->domain = irq_domain_add_simple(np, num_irqs, base,
1225*4882a593Smuzhiyun 					      &stmpe_irq_ops, stmpe);
1226*4882a593Smuzhiyun 	if (!stmpe->domain) {
1227*4882a593Smuzhiyun 		dev_err(stmpe->dev, "Failed to create irqdomain\n");
1228*4882a593Smuzhiyun 		return -ENOSYS;
1229*4882a593Smuzhiyun 	}
1230*4882a593Smuzhiyun 
1231*4882a593Smuzhiyun 	return 0;
1232*4882a593Smuzhiyun }
1233*4882a593Smuzhiyun 
stmpe_chip_init(struct stmpe * stmpe)1234*4882a593Smuzhiyun static int stmpe_chip_init(struct stmpe *stmpe)
1235*4882a593Smuzhiyun {
1236*4882a593Smuzhiyun 	unsigned int irq_trigger = stmpe->pdata->irq_trigger;
1237*4882a593Smuzhiyun 	int autosleep_timeout = stmpe->pdata->autosleep_timeout;
1238*4882a593Smuzhiyun 	struct stmpe_variant_info *variant = stmpe->variant;
1239*4882a593Smuzhiyun 	u8 icr = 0;
1240*4882a593Smuzhiyun 	unsigned int id;
1241*4882a593Smuzhiyun 	u8 data[2];
1242*4882a593Smuzhiyun 	int ret;
1243*4882a593Smuzhiyun 
1244*4882a593Smuzhiyun 	ret = stmpe_block_read(stmpe, stmpe->regs[STMPE_IDX_CHIP_ID],
1245*4882a593Smuzhiyun 			       ARRAY_SIZE(data), data);
1246*4882a593Smuzhiyun 	if (ret < 0)
1247*4882a593Smuzhiyun 		return ret;
1248*4882a593Smuzhiyun 
1249*4882a593Smuzhiyun 	id = (data[0] << 8) | data[1];
1250*4882a593Smuzhiyun 	if ((id & variant->id_mask) != variant->id_val) {
1251*4882a593Smuzhiyun 		dev_err(stmpe->dev, "unknown chip id: %#x\n", id);
1252*4882a593Smuzhiyun 		return -EINVAL;
1253*4882a593Smuzhiyun 	}
1254*4882a593Smuzhiyun 
1255*4882a593Smuzhiyun 	dev_info(stmpe->dev, "%s detected, chip id: %#x\n", variant->name, id);
1256*4882a593Smuzhiyun 
1257*4882a593Smuzhiyun 	/* Disable all modules -- subdrivers should enable what they need. */
1258*4882a593Smuzhiyun 	ret = stmpe_disable(stmpe, ~0);
1259*4882a593Smuzhiyun 	if (ret)
1260*4882a593Smuzhiyun 		return ret;
1261*4882a593Smuzhiyun 
1262*4882a593Smuzhiyun 	ret =  stmpe_reset(stmpe);
1263*4882a593Smuzhiyun 	if (ret < 0)
1264*4882a593Smuzhiyun 		return ret;
1265*4882a593Smuzhiyun 
1266*4882a593Smuzhiyun 	if (stmpe->irq >= 0) {
1267*4882a593Smuzhiyun 		if (id == STMPE801_ID || id == STMPE1600_ID)
1268*4882a593Smuzhiyun 			icr = STMPE_SYS_CTRL_INT_EN;
1269*4882a593Smuzhiyun 		else
1270*4882a593Smuzhiyun 			icr = STMPE_ICR_LSB_GIM;
1271*4882a593Smuzhiyun 
1272*4882a593Smuzhiyun 		/* STMPE801 and STMPE1600 don't support Edge interrupts */
1273*4882a593Smuzhiyun 		if (id != STMPE801_ID && id != STMPE1600_ID) {
1274*4882a593Smuzhiyun 			if (irq_trigger == IRQF_TRIGGER_FALLING ||
1275*4882a593Smuzhiyun 					irq_trigger == IRQF_TRIGGER_RISING)
1276*4882a593Smuzhiyun 				icr |= STMPE_ICR_LSB_EDGE;
1277*4882a593Smuzhiyun 		}
1278*4882a593Smuzhiyun 
1279*4882a593Smuzhiyun 		if (irq_trigger == IRQF_TRIGGER_RISING ||
1280*4882a593Smuzhiyun 				irq_trigger == IRQF_TRIGGER_HIGH) {
1281*4882a593Smuzhiyun 			if (id == STMPE801_ID || id == STMPE1600_ID)
1282*4882a593Smuzhiyun 				icr |= STMPE_SYS_CTRL_INT_HI;
1283*4882a593Smuzhiyun 			else
1284*4882a593Smuzhiyun 				icr |= STMPE_ICR_LSB_HIGH;
1285*4882a593Smuzhiyun 		}
1286*4882a593Smuzhiyun 	}
1287*4882a593Smuzhiyun 
1288*4882a593Smuzhiyun 	if (stmpe->pdata->autosleep) {
1289*4882a593Smuzhiyun 		ret = stmpe_autosleep(stmpe, autosleep_timeout);
1290*4882a593Smuzhiyun 		if (ret)
1291*4882a593Smuzhiyun 			return ret;
1292*4882a593Smuzhiyun 	}
1293*4882a593Smuzhiyun 
1294*4882a593Smuzhiyun 	return stmpe_reg_write(stmpe, stmpe->regs[STMPE_IDX_ICR_LSB], icr);
1295*4882a593Smuzhiyun }
1296*4882a593Smuzhiyun 
stmpe_add_device(struct stmpe * stmpe,const struct mfd_cell * cell)1297*4882a593Smuzhiyun static int stmpe_add_device(struct stmpe *stmpe, const struct mfd_cell *cell)
1298*4882a593Smuzhiyun {
1299*4882a593Smuzhiyun 	return mfd_add_devices(stmpe->dev, stmpe->pdata->id, cell, 1,
1300*4882a593Smuzhiyun 			       NULL, 0, stmpe->domain);
1301*4882a593Smuzhiyun }
1302*4882a593Smuzhiyun 
stmpe_devices_init(struct stmpe * stmpe)1303*4882a593Smuzhiyun static int stmpe_devices_init(struct stmpe *stmpe)
1304*4882a593Smuzhiyun {
1305*4882a593Smuzhiyun 	struct stmpe_variant_info *variant = stmpe->variant;
1306*4882a593Smuzhiyun 	unsigned int platform_blocks = stmpe->pdata->blocks;
1307*4882a593Smuzhiyun 	int ret = -EINVAL;
1308*4882a593Smuzhiyun 	int i, j;
1309*4882a593Smuzhiyun 
1310*4882a593Smuzhiyun 	for (i = 0; i < variant->num_blocks; i++) {
1311*4882a593Smuzhiyun 		struct stmpe_variant_block *block = &variant->blocks[i];
1312*4882a593Smuzhiyun 
1313*4882a593Smuzhiyun 		if (!(platform_blocks & block->block))
1314*4882a593Smuzhiyun 			continue;
1315*4882a593Smuzhiyun 
1316*4882a593Smuzhiyun 		for (j = 0; j < block->cell->num_resources; j++) {
1317*4882a593Smuzhiyun 			struct resource *res =
1318*4882a593Smuzhiyun 				(struct resource *) &block->cell->resources[j];
1319*4882a593Smuzhiyun 
1320*4882a593Smuzhiyun 			/* Dynamically fill in a variant's IRQ. */
1321*4882a593Smuzhiyun 			if (res->flags & IORESOURCE_IRQ)
1322*4882a593Smuzhiyun 				res->start = res->end = block->irq + j;
1323*4882a593Smuzhiyun 		}
1324*4882a593Smuzhiyun 
1325*4882a593Smuzhiyun 		platform_blocks &= ~block->block;
1326*4882a593Smuzhiyun 		ret = stmpe_add_device(stmpe, block->cell);
1327*4882a593Smuzhiyun 		if (ret)
1328*4882a593Smuzhiyun 			return ret;
1329*4882a593Smuzhiyun 	}
1330*4882a593Smuzhiyun 
1331*4882a593Smuzhiyun 	if (platform_blocks)
1332*4882a593Smuzhiyun 		dev_warn(stmpe->dev,
1333*4882a593Smuzhiyun 			 "platform wants blocks (%#x) not present on variant",
1334*4882a593Smuzhiyun 			 platform_blocks);
1335*4882a593Smuzhiyun 
1336*4882a593Smuzhiyun 	return ret;
1337*4882a593Smuzhiyun }
1338*4882a593Smuzhiyun 
stmpe_of_probe(struct stmpe_platform_data * pdata,struct device_node * np)1339*4882a593Smuzhiyun static void stmpe_of_probe(struct stmpe_platform_data *pdata,
1340*4882a593Smuzhiyun 			   struct device_node *np)
1341*4882a593Smuzhiyun {
1342*4882a593Smuzhiyun 	struct device_node *child;
1343*4882a593Smuzhiyun 
1344*4882a593Smuzhiyun 	pdata->id = of_alias_get_id(np, "stmpe-i2c");
1345*4882a593Smuzhiyun 	if (pdata->id < 0)
1346*4882a593Smuzhiyun 		pdata->id = -1;
1347*4882a593Smuzhiyun 
1348*4882a593Smuzhiyun 	pdata->irq_gpio = of_get_named_gpio_flags(np, "irq-gpio", 0,
1349*4882a593Smuzhiyun 				&pdata->irq_trigger);
1350*4882a593Smuzhiyun 	if (gpio_is_valid(pdata->irq_gpio))
1351*4882a593Smuzhiyun 		pdata->irq_over_gpio = 1;
1352*4882a593Smuzhiyun 	else
1353*4882a593Smuzhiyun 		pdata->irq_trigger = IRQF_TRIGGER_NONE;
1354*4882a593Smuzhiyun 
1355*4882a593Smuzhiyun 	of_property_read_u32(np, "st,autosleep-timeout",
1356*4882a593Smuzhiyun 			&pdata->autosleep_timeout);
1357*4882a593Smuzhiyun 
1358*4882a593Smuzhiyun 	pdata->autosleep = (pdata->autosleep_timeout) ? true : false;
1359*4882a593Smuzhiyun 
1360*4882a593Smuzhiyun 	for_each_child_of_node(np, child) {
1361*4882a593Smuzhiyun 		if (of_node_name_eq(child, "stmpe_gpio")) {
1362*4882a593Smuzhiyun 			pdata->blocks |= STMPE_BLOCK_GPIO;
1363*4882a593Smuzhiyun 		} else if (of_node_name_eq(child, "stmpe_keypad")) {
1364*4882a593Smuzhiyun 			pdata->blocks |= STMPE_BLOCK_KEYPAD;
1365*4882a593Smuzhiyun 		} else if (of_node_name_eq(child, "stmpe_touchscreen")) {
1366*4882a593Smuzhiyun 			pdata->blocks |= STMPE_BLOCK_TOUCHSCREEN;
1367*4882a593Smuzhiyun 		} else if (of_node_name_eq(child, "stmpe_adc")) {
1368*4882a593Smuzhiyun 			pdata->blocks |= STMPE_BLOCK_ADC;
1369*4882a593Smuzhiyun 		} else if (of_node_name_eq(child, "stmpe_pwm")) {
1370*4882a593Smuzhiyun 			pdata->blocks |= STMPE_BLOCK_PWM;
1371*4882a593Smuzhiyun 		} else if (of_node_name_eq(child, "stmpe_rotator")) {
1372*4882a593Smuzhiyun 			pdata->blocks |= STMPE_BLOCK_ROTATOR;
1373*4882a593Smuzhiyun 		}
1374*4882a593Smuzhiyun 	}
1375*4882a593Smuzhiyun }
1376*4882a593Smuzhiyun 
1377*4882a593Smuzhiyun /* Called from client specific probe routines */
stmpe_probe(struct stmpe_client_info * ci,enum stmpe_partnum partnum)1378*4882a593Smuzhiyun int stmpe_probe(struct stmpe_client_info *ci, enum stmpe_partnum partnum)
1379*4882a593Smuzhiyun {
1380*4882a593Smuzhiyun 	struct stmpe_platform_data *pdata;
1381*4882a593Smuzhiyun 	struct device_node *np = ci->dev->of_node;
1382*4882a593Smuzhiyun 	struct stmpe *stmpe;
1383*4882a593Smuzhiyun 	int ret;
1384*4882a593Smuzhiyun 	u32 val;
1385*4882a593Smuzhiyun 
1386*4882a593Smuzhiyun 	pdata = devm_kzalloc(ci->dev, sizeof(*pdata), GFP_KERNEL);
1387*4882a593Smuzhiyun 	if (!pdata)
1388*4882a593Smuzhiyun 		return -ENOMEM;
1389*4882a593Smuzhiyun 
1390*4882a593Smuzhiyun 	stmpe_of_probe(pdata, np);
1391*4882a593Smuzhiyun 
1392*4882a593Smuzhiyun 	if (of_find_property(np, "interrupts", NULL) == NULL)
1393*4882a593Smuzhiyun 		ci->irq = -1;
1394*4882a593Smuzhiyun 
1395*4882a593Smuzhiyun 	stmpe = devm_kzalloc(ci->dev, sizeof(struct stmpe), GFP_KERNEL);
1396*4882a593Smuzhiyun 	if (!stmpe)
1397*4882a593Smuzhiyun 		return -ENOMEM;
1398*4882a593Smuzhiyun 
1399*4882a593Smuzhiyun 	mutex_init(&stmpe->irq_lock);
1400*4882a593Smuzhiyun 	mutex_init(&stmpe->lock);
1401*4882a593Smuzhiyun 
1402*4882a593Smuzhiyun 	if (!of_property_read_u32(np, "st,sample-time", &val))
1403*4882a593Smuzhiyun 		stmpe->sample_time = val;
1404*4882a593Smuzhiyun 	if (!of_property_read_u32(np, "st,mod-12b", &val))
1405*4882a593Smuzhiyun 		stmpe->mod_12b = val;
1406*4882a593Smuzhiyun 	if (!of_property_read_u32(np, "st,ref-sel", &val))
1407*4882a593Smuzhiyun 		stmpe->ref_sel = val;
1408*4882a593Smuzhiyun 	if (!of_property_read_u32(np, "st,adc-freq", &val))
1409*4882a593Smuzhiyun 		stmpe->adc_freq = val;
1410*4882a593Smuzhiyun 
1411*4882a593Smuzhiyun 	stmpe->dev = ci->dev;
1412*4882a593Smuzhiyun 	stmpe->client = ci->client;
1413*4882a593Smuzhiyun 	stmpe->pdata = pdata;
1414*4882a593Smuzhiyun 	stmpe->ci = ci;
1415*4882a593Smuzhiyun 	stmpe->partnum = partnum;
1416*4882a593Smuzhiyun 	stmpe->variant = stmpe_variant_info[partnum];
1417*4882a593Smuzhiyun 	stmpe->regs = stmpe->variant->regs;
1418*4882a593Smuzhiyun 	stmpe->num_gpios = stmpe->variant->num_gpios;
1419*4882a593Smuzhiyun 	stmpe->vcc = devm_regulator_get_optional(ci->dev, "vcc");
1420*4882a593Smuzhiyun 	if (!IS_ERR(stmpe->vcc)) {
1421*4882a593Smuzhiyun 		ret = regulator_enable(stmpe->vcc);
1422*4882a593Smuzhiyun 		if (ret)
1423*4882a593Smuzhiyun 			dev_warn(ci->dev, "failed to enable VCC supply\n");
1424*4882a593Smuzhiyun 	}
1425*4882a593Smuzhiyun 	stmpe->vio = devm_regulator_get_optional(ci->dev, "vio");
1426*4882a593Smuzhiyun 	if (!IS_ERR(stmpe->vio)) {
1427*4882a593Smuzhiyun 		ret = regulator_enable(stmpe->vio);
1428*4882a593Smuzhiyun 		if (ret)
1429*4882a593Smuzhiyun 			dev_warn(ci->dev, "failed to enable VIO supply\n");
1430*4882a593Smuzhiyun 	}
1431*4882a593Smuzhiyun 	dev_set_drvdata(stmpe->dev, stmpe);
1432*4882a593Smuzhiyun 
1433*4882a593Smuzhiyun 	if (ci->init)
1434*4882a593Smuzhiyun 		ci->init(stmpe);
1435*4882a593Smuzhiyun 
1436*4882a593Smuzhiyun 	if (pdata->irq_over_gpio) {
1437*4882a593Smuzhiyun 		ret = devm_gpio_request_one(ci->dev, pdata->irq_gpio,
1438*4882a593Smuzhiyun 				GPIOF_DIR_IN, "stmpe");
1439*4882a593Smuzhiyun 		if (ret) {
1440*4882a593Smuzhiyun 			dev_err(stmpe->dev, "failed to request IRQ GPIO: %d\n",
1441*4882a593Smuzhiyun 					ret);
1442*4882a593Smuzhiyun 			return ret;
1443*4882a593Smuzhiyun 		}
1444*4882a593Smuzhiyun 
1445*4882a593Smuzhiyun 		stmpe->irq = gpio_to_irq(pdata->irq_gpio);
1446*4882a593Smuzhiyun 	} else {
1447*4882a593Smuzhiyun 		stmpe->irq = ci->irq;
1448*4882a593Smuzhiyun 	}
1449*4882a593Smuzhiyun 
1450*4882a593Smuzhiyun 	if (stmpe->irq < 0) {
1451*4882a593Smuzhiyun 		/* use alternate variant info for no-irq mode, if supported */
1452*4882a593Smuzhiyun 		dev_info(stmpe->dev,
1453*4882a593Smuzhiyun 			"%s configured in no-irq mode by platform data\n",
1454*4882a593Smuzhiyun 			stmpe->variant->name);
1455*4882a593Smuzhiyun 		if (!stmpe_noirq_variant_info[stmpe->partnum]) {
1456*4882a593Smuzhiyun 			dev_err(stmpe->dev,
1457*4882a593Smuzhiyun 				"%s does not support no-irq mode!\n",
1458*4882a593Smuzhiyun 				stmpe->variant->name);
1459*4882a593Smuzhiyun 			return -ENODEV;
1460*4882a593Smuzhiyun 		}
1461*4882a593Smuzhiyun 		stmpe->variant = stmpe_noirq_variant_info[stmpe->partnum];
1462*4882a593Smuzhiyun 	} else if (pdata->irq_trigger == IRQF_TRIGGER_NONE) {
1463*4882a593Smuzhiyun 		pdata->irq_trigger = irq_get_trigger_type(stmpe->irq);
1464*4882a593Smuzhiyun 	}
1465*4882a593Smuzhiyun 
1466*4882a593Smuzhiyun 	ret = stmpe_chip_init(stmpe);
1467*4882a593Smuzhiyun 	if (ret)
1468*4882a593Smuzhiyun 		return ret;
1469*4882a593Smuzhiyun 
1470*4882a593Smuzhiyun 	if (stmpe->irq >= 0) {
1471*4882a593Smuzhiyun 		ret = stmpe_irq_init(stmpe, np);
1472*4882a593Smuzhiyun 		if (ret)
1473*4882a593Smuzhiyun 			return ret;
1474*4882a593Smuzhiyun 
1475*4882a593Smuzhiyun 		ret = devm_request_threaded_irq(ci->dev, stmpe->irq, NULL,
1476*4882a593Smuzhiyun 				stmpe_irq, pdata->irq_trigger | IRQF_ONESHOT,
1477*4882a593Smuzhiyun 				"stmpe", stmpe);
1478*4882a593Smuzhiyun 		if (ret) {
1479*4882a593Smuzhiyun 			dev_err(stmpe->dev, "failed to request IRQ: %d\n",
1480*4882a593Smuzhiyun 					ret);
1481*4882a593Smuzhiyun 			return ret;
1482*4882a593Smuzhiyun 		}
1483*4882a593Smuzhiyun 	}
1484*4882a593Smuzhiyun 
1485*4882a593Smuzhiyun 	ret = stmpe_devices_init(stmpe);
1486*4882a593Smuzhiyun 	if (!ret)
1487*4882a593Smuzhiyun 		return 0;
1488*4882a593Smuzhiyun 
1489*4882a593Smuzhiyun 	dev_err(stmpe->dev, "failed to add children\n");
1490*4882a593Smuzhiyun 	mfd_remove_devices(stmpe->dev);
1491*4882a593Smuzhiyun 
1492*4882a593Smuzhiyun 	return ret;
1493*4882a593Smuzhiyun }
1494*4882a593Smuzhiyun 
stmpe_remove(struct stmpe * stmpe)1495*4882a593Smuzhiyun int stmpe_remove(struct stmpe *stmpe)
1496*4882a593Smuzhiyun {
1497*4882a593Smuzhiyun 	if (!IS_ERR(stmpe->vio))
1498*4882a593Smuzhiyun 		regulator_disable(stmpe->vio);
1499*4882a593Smuzhiyun 	if (!IS_ERR(stmpe->vcc))
1500*4882a593Smuzhiyun 		regulator_disable(stmpe->vcc);
1501*4882a593Smuzhiyun 
1502*4882a593Smuzhiyun 	__stmpe_disable(stmpe, STMPE_BLOCK_ADC);
1503*4882a593Smuzhiyun 
1504*4882a593Smuzhiyun 	mfd_remove_devices(stmpe->dev);
1505*4882a593Smuzhiyun 
1506*4882a593Smuzhiyun 	return 0;
1507*4882a593Smuzhiyun }
1508*4882a593Smuzhiyun 
1509*4882a593Smuzhiyun #ifdef CONFIG_PM
stmpe_suspend(struct device * dev)1510*4882a593Smuzhiyun static int stmpe_suspend(struct device *dev)
1511*4882a593Smuzhiyun {
1512*4882a593Smuzhiyun 	struct stmpe *stmpe = dev_get_drvdata(dev);
1513*4882a593Smuzhiyun 
1514*4882a593Smuzhiyun 	if (stmpe->irq >= 0 && device_may_wakeup(dev))
1515*4882a593Smuzhiyun 		enable_irq_wake(stmpe->irq);
1516*4882a593Smuzhiyun 
1517*4882a593Smuzhiyun 	return 0;
1518*4882a593Smuzhiyun }
1519*4882a593Smuzhiyun 
stmpe_resume(struct device * dev)1520*4882a593Smuzhiyun static int stmpe_resume(struct device *dev)
1521*4882a593Smuzhiyun {
1522*4882a593Smuzhiyun 	struct stmpe *stmpe = dev_get_drvdata(dev);
1523*4882a593Smuzhiyun 
1524*4882a593Smuzhiyun 	if (stmpe->irq >= 0 && device_may_wakeup(dev))
1525*4882a593Smuzhiyun 		disable_irq_wake(stmpe->irq);
1526*4882a593Smuzhiyun 
1527*4882a593Smuzhiyun 	return 0;
1528*4882a593Smuzhiyun }
1529*4882a593Smuzhiyun 
1530*4882a593Smuzhiyun const struct dev_pm_ops stmpe_dev_pm_ops = {
1531*4882a593Smuzhiyun 	.suspend	= stmpe_suspend,
1532*4882a593Smuzhiyun 	.resume		= stmpe_resume,
1533*4882a593Smuzhiyun };
1534*4882a593Smuzhiyun #endif
1535