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