1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * File: drivers/input/keyboard/adp5588_keys.c
4*4882a593Smuzhiyun * Description: keypad driver for ADP5588 and ADP5587
5*4882a593Smuzhiyun * I2C QWERTY Keypad and IO Expander
6*4882a593Smuzhiyun * Bugs: Enter bugs at http://blackfin.uclinux.org/
7*4882a593Smuzhiyun *
8*4882a593Smuzhiyun * Copyright (C) 2008-2010 Analog Devices Inc.
9*4882a593Smuzhiyun */
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun #include <linux/module.h>
12*4882a593Smuzhiyun #include <linux/interrupt.h>
13*4882a593Smuzhiyun #include <linux/irq.h>
14*4882a593Smuzhiyun #include <linux/workqueue.h>
15*4882a593Smuzhiyun #include <linux/errno.h>
16*4882a593Smuzhiyun #include <linux/pm.h>
17*4882a593Smuzhiyun #include <linux/platform_device.h>
18*4882a593Smuzhiyun #include <linux/input.h>
19*4882a593Smuzhiyun #include <linux/i2c.h>
20*4882a593Smuzhiyun #include <linux/gpio.h>
21*4882a593Smuzhiyun #include <linux/slab.h>
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun #include <linux/platform_data/adp5588.h>
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun /* Key Event Register xy */
26*4882a593Smuzhiyun #define KEY_EV_PRESSED (1 << 7)
27*4882a593Smuzhiyun #define KEY_EV_MASK (0x7F)
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun #define KP_SEL(x) (0xFFFF >> (16 - x)) /* 2^x-1 */
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun #define KEYP_MAX_EVENT 10
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun /*
34*4882a593Smuzhiyun * Early pre 4.0 Silicon required to delay readout by at least 25ms,
35*4882a593Smuzhiyun * since the Event Counter Register updated 25ms after the interrupt
36*4882a593Smuzhiyun * asserted.
37*4882a593Smuzhiyun */
38*4882a593Smuzhiyun #define WA_DELAYED_READOUT_REVID(rev) ((rev) < 4)
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun struct adp5588_kpad {
41*4882a593Smuzhiyun struct i2c_client *client;
42*4882a593Smuzhiyun struct input_dev *input;
43*4882a593Smuzhiyun struct delayed_work work;
44*4882a593Smuzhiyun unsigned long delay;
45*4882a593Smuzhiyun unsigned short keycode[ADP5588_KEYMAPSIZE];
46*4882a593Smuzhiyun const struct adp5588_gpi_map *gpimap;
47*4882a593Smuzhiyun unsigned short gpimapsize;
48*4882a593Smuzhiyun #ifdef CONFIG_GPIOLIB
49*4882a593Smuzhiyun unsigned char gpiomap[ADP5588_MAXGPIO];
50*4882a593Smuzhiyun bool export_gpio;
51*4882a593Smuzhiyun struct gpio_chip gc;
52*4882a593Smuzhiyun struct mutex gpio_lock; /* Protect cached dir, dat_out */
53*4882a593Smuzhiyun u8 dat_out[3];
54*4882a593Smuzhiyun u8 dir[3];
55*4882a593Smuzhiyun #endif
56*4882a593Smuzhiyun };
57*4882a593Smuzhiyun
adp5588_read(struct i2c_client * client,u8 reg)58*4882a593Smuzhiyun static int adp5588_read(struct i2c_client *client, u8 reg)
59*4882a593Smuzhiyun {
60*4882a593Smuzhiyun int ret = i2c_smbus_read_byte_data(client, reg);
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun if (ret < 0)
63*4882a593Smuzhiyun dev_err(&client->dev, "Read Error\n");
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun return ret;
66*4882a593Smuzhiyun }
67*4882a593Smuzhiyun
adp5588_write(struct i2c_client * client,u8 reg,u8 val)68*4882a593Smuzhiyun static int adp5588_write(struct i2c_client *client, u8 reg, u8 val)
69*4882a593Smuzhiyun {
70*4882a593Smuzhiyun return i2c_smbus_write_byte_data(client, reg, val);
71*4882a593Smuzhiyun }
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun #ifdef CONFIG_GPIOLIB
adp5588_gpio_get_value(struct gpio_chip * chip,unsigned off)74*4882a593Smuzhiyun static int adp5588_gpio_get_value(struct gpio_chip *chip, unsigned off)
75*4882a593Smuzhiyun {
76*4882a593Smuzhiyun struct adp5588_kpad *kpad = gpiochip_get_data(chip);
77*4882a593Smuzhiyun unsigned int bank = ADP5588_BANK(kpad->gpiomap[off]);
78*4882a593Smuzhiyun unsigned int bit = ADP5588_BIT(kpad->gpiomap[off]);
79*4882a593Smuzhiyun int val;
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun mutex_lock(&kpad->gpio_lock);
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun if (kpad->dir[bank] & bit)
84*4882a593Smuzhiyun val = kpad->dat_out[bank];
85*4882a593Smuzhiyun else
86*4882a593Smuzhiyun val = adp5588_read(kpad->client, GPIO_DAT_STAT1 + bank);
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun mutex_unlock(&kpad->gpio_lock);
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun return !!(val & bit);
91*4882a593Smuzhiyun }
92*4882a593Smuzhiyun
adp5588_gpio_set_value(struct gpio_chip * chip,unsigned off,int val)93*4882a593Smuzhiyun static void adp5588_gpio_set_value(struct gpio_chip *chip,
94*4882a593Smuzhiyun unsigned off, int val)
95*4882a593Smuzhiyun {
96*4882a593Smuzhiyun struct adp5588_kpad *kpad = gpiochip_get_data(chip);
97*4882a593Smuzhiyun unsigned int bank = ADP5588_BANK(kpad->gpiomap[off]);
98*4882a593Smuzhiyun unsigned int bit = ADP5588_BIT(kpad->gpiomap[off]);
99*4882a593Smuzhiyun
100*4882a593Smuzhiyun mutex_lock(&kpad->gpio_lock);
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun if (val)
103*4882a593Smuzhiyun kpad->dat_out[bank] |= bit;
104*4882a593Smuzhiyun else
105*4882a593Smuzhiyun kpad->dat_out[bank] &= ~bit;
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun adp5588_write(kpad->client, GPIO_DAT_OUT1 + bank,
108*4882a593Smuzhiyun kpad->dat_out[bank]);
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun mutex_unlock(&kpad->gpio_lock);
111*4882a593Smuzhiyun }
112*4882a593Smuzhiyun
adp5588_gpio_direction_input(struct gpio_chip * chip,unsigned off)113*4882a593Smuzhiyun static int adp5588_gpio_direction_input(struct gpio_chip *chip, unsigned off)
114*4882a593Smuzhiyun {
115*4882a593Smuzhiyun struct adp5588_kpad *kpad = gpiochip_get_data(chip);
116*4882a593Smuzhiyun unsigned int bank = ADP5588_BANK(kpad->gpiomap[off]);
117*4882a593Smuzhiyun unsigned int bit = ADP5588_BIT(kpad->gpiomap[off]);
118*4882a593Smuzhiyun int ret;
119*4882a593Smuzhiyun
120*4882a593Smuzhiyun mutex_lock(&kpad->gpio_lock);
121*4882a593Smuzhiyun
122*4882a593Smuzhiyun kpad->dir[bank] &= ~bit;
123*4882a593Smuzhiyun ret = adp5588_write(kpad->client, GPIO_DIR1 + bank, kpad->dir[bank]);
124*4882a593Smuzhiyun
125*4882a593Smuzhiyun mutex_unlock(&kpad->gpio_lock);
126*4882a593Smuzhiyun
127*4882a593Smuzhiyun return ret;
128*4882a593Smuzhiyun }
129*4882a593Smuzhiyun
adp5588_gpio_direction_output(struct gpio_chip * chip,unsigned off,int val)130*4882a593Smuzhiyun static int adp5588_gpio_direction_output(struct gpio_chip *chip,
131*4882a593Smuzhiyun unsigned off, int val)
132*4882a593Smuzhiyun {
133*4882a593Smuzhiyun struct adp5588_kpad *kpad = gpiochip_get_data(chip);
134*4882a593Smuzhiyun unsigned int bank = ADP5588_BANK(kpad->gpiomap[off]);
135*4882a593Smuzhiyun unsigned int bit = ADP5588_BIT(kpad->gpiomap[off]);
136*4882a593Smuzhiyun int ret;
137*4882a593Smuzhiyun
138*4882a593Smuzhiyun mutex_lock(&kpad->gpio_lock);
139*4882a593Smuzhiyun
140*4882a593Smuzhiyun kpad->dir[bank] |= bit;
141*4882a593Smuzhiyun
142*4882a593Smuzhiyun if (val)
143*4882a593Smuzhiyun kpad->dat_out[bank] |= bit;
144*4882a593Smuzhiyun else
145*4882a593Smuzhiyun kpad->dat_out[bank] &= ~bit;
146*4882a593Smuzhiyun
147*4882a593Smuzhiyun ret = adp5588_write(kpad->client, GPIO_DAT_OUT1 + bank,
148*4882a593Smuzhiyun kpad->dat_out[bank]);
149*4882a593Smuzhiyun ret |= adp5588_write(kpad->client, GPIO_DIR1 + bank,
150*4882a593Smuzhiyun kpad->dir[bank]);
151*4882a593Smuzhiyun
152*4882a593Smuzhiyun mutex_unlock(&kpad->gpio_lock);
153*4882a593Smuzhiyun
154*4882a593Smuzhiyun return ret;
155*4882a593Smuzhiyun }
156*4882a593Smuzhiyun
adp5588_build_gpiomap(struct adp5588_kpad * kpad,const struct adp5588_kpad_platform_data * pdata)157*4882a593Smuzhiyun static int adp5588_build_gpiomap(struct adp5588_kpad *kpad,
158*4882a593Smuzhiyun const struct adp5588_kpad_platform_data *pdata)
159*4882a593Smuzhiyun {
160*4882a593Smuzhiyun bool pin_used[ADP5588_MAXGPIO];
161*4882a593Smuzhiyun int n_unused = 0;
162*4882a593Smuzhiyun int i;
163*4882a593Smuzhiyun
164*4882a593Smuzhiyun memset(pin_used, 0, sizeof(pin_used));
165*4882a593Smuzhiyun
166*4882a593Smuzhiyun for (i = 0; i < pdata->rows; i++)
167*4882a593Smuzhiyun pin_used[i] = true;
168*4882a593Smuzhiyun
169*4882a593Smuzhiyun for (i = 0; i < pdata->cols; i++)
170*4882a593Smuzhiyun pin_used[i + GPI_PIN_COL_BASE - GPI_PIN_BASE] = true;
171*4882a593Smuzhiyun
172*4882a593Smuzhiyun for (i = 0; i < kpad->gpimapsize; i++)
173*4882a593Smuzhiyun pin_used[kpad->gpimap[i].pin - GPI_PIN_BASE] = true;
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun for (i = 0; i < ADP5588_MAXGPIO; i++)
176*4882a593Smuzhiyun if (!pin_used[i])
177*4882a593Smuzhiyun kpad->gpiomap[n_unused++] = i;
178*4882a593Smuzhiyun
179*4882a593Smuzhiyun return n_unused;
180*4882a593Smuzhiyun }
181*4882a593Smuzhiyun
adp5588_gpio_add(struct adp5588_kpad * kpad)182*4882a593Smuzhiyun static int adp5588_gpio_add(struct adp5588_kpad *kpad)
183*4882a593Smuzhiyun {
184*4882a593Smuzhiyun struct device *dev = &kpad->client->dev;
185*4882a593Smuzhiyun const struct adp5588_kpad_platform_data *pdata = dev_get_platdata(dev);
186*4882a593Smuzhiyun const struct adp5588_gpio_platform_data *gpio_data = pdata->gpio_data;
187*4882a593Smuzhiyun int i, error;
188*4882a593Smuzhiyun
189*4882a593Smuzhiyun if (!gpio_data)
190*4882a593Smuzhiyun return 0;
191*4882a593Smuzhiyun
192*4882a593Smuzhiyun kpad->gc.ngpio = adp5588_build_gpiomap(kpad, pdata);
193*4882a593Smuzhiyun if (kpad->gc.ngpio == 0) {
194*4882a593Smuzhiyun dev_info(dev, "No unused gpios left to export\n");
195*4882a593Smuzhiyun return 0;
196*4882a593Smuzhiyun }
197*4882a593Smuzhiyun
198*4882a593Smuzhiyun kpad->export_gpio = true;
199*4882a593Smuzhiyun
200*4882a593Smuzhiyun kpad->gc.direction_input = adp5588_gpio_direction_input;
201*4882a593Smuzhiyun kpad->gc.direction_output = adp5588_gpio_direction_output;
202*4882a593Smuzhiyun kpad->gc.get = adp5588_gpio_get_value;
203*4882a593Smuzhiyun kpad->gc.set = adp5588_gpio_set_value;
204*4882a593Smuzhiyun kpad->gc.can_sleep = 1;
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun kpad->gc.base = gpio_data->gpio_start;
207*4882a593Smuzhiyun kpad->gc.label = kpad->client->name;
208*4882a593Smuzhiyun kpad->gc.owner = THIS_MODULE;
209*4882a593Smuzhiyun kpad->gc.names = gpio_data->names;
210*4882a593Smuzhiyun
211*4882a593Smuzhiyun mutex_init(&kpad->gpio_lock);
212*4882a593Smuzhiyun
213*4882a593Smuzhiyun error = gpiochip_add_data(&kpad->gc, kpad);
214*4882a593Smuzhiyun if (error) {
215*4882a593Smuzhiyun dev_err(dev, "gpiochip_add failed, err: %d\n", error);
216*4882a593Smuzhiyun return error;
217*4882a593Smuzhiyun }
218*4882a593Smuzhiyun
219*4882a593Smuzhiyun for (i = 0; i <= ADP5588_BANK(ADP5588_MAXGPIO); i++) {
220*4882a593Smuzhiyun kpad->dat_out[i] = adp5588_read(kpad->client,
221*4882a593Smuzhiyun GPIO_DAT_OUT1 + i);
222*4882a593Smuzhiyun kpad->dir[i] = adp5588_read(kpad->client, GPIO_DIR1 + i);
223*4882a593Smuzhiyun }
224*4882a593Smuzhiyun
225*4882a593Smuzhiyun if (gpio_data->setup) {
226*4882a593Smuzhiyun error = gpio_data->setup(kpad->client,
227*4882a593Smuzhiyun kpad->gc.base, kpad->gc.ngpio,
228*4882a593Smuzhiyun gpio_data->context);
229*4882a593Smuzhiyun if (error)
230*4882a593Smuzhiyun dev_warn(dev, "setup failed, %d\n", error);
231*4882a593Smuzhiyun }
232*4882a593Smuzhiyun
233*4882a593Smuzhiyun return 0;
234*4882a593Smuzhiyun }
235*4882a593Smuzhiyun
adp5588_gpio_remove(struct adp5588_kpad * kpad)236*4882a593Smuzhiyun static void adp5588_gpio_remove(struct adp5588_kpad *kpad)
237*4882a593Smuzhiyun {
238*4882a593Smuzhiyun struct device *dev = &kpad->client->dev;
239*4882a593Smuzhiyun const struct adp5588_kpad_platform_data *pdata = dev_get_platdata(dev);
240*4882a593Smuzhiyun const struct adp5588_gpio_platform_data *gpio_data = pdata->gpio_data;
241*4882a593Smuzhiyun int error;
242*4882a593Smuzhiyun
243*4882a593Smuzhiyun if (!kpad->export_gpio)
244*4882a593Smuzhiyun return;
245*4882a593Smuzhiyun
246*4882a593Smuzhiyun if (gpio_data->teardown) {
247*4882a593Smuzhiyun error = gpio_data->teardown(kpad->client,
248*4882a593Smuzhiyun kpad->gc.base, kpad->gc.ngpio,
249*4882a593Smuzhiyun gpio_data->context);
250*4882a593Smuzhiyun if (error)
251*4882a593Smuzhiyun dev_warn(dev, "teardown failed %d\n", error);
252*4882a593Smuzhiyun }
253*4882a593Smuzhiyun
254*4882a593Smuzhiyun gpiochip_remove(&kpad->gc);
255*4882a593Smuzhiyun }
256*4882a593Smuzhiyun #else
adp5588_gpio_add(struct adp5588_kpad * kpad)257*4882a593Smuzhiyun static inline int adp5588_gpio_add(struct adp5588_kpad *kpad)
258*4882a593Smuzhiyun {
259*4882a593Smuzhiyun return 0;
260*4882a593Smuzhiyun }
261*4882a593Smuzhiyun
adp5588_gpio_remove(struct adp5588_kpad * kpad)262*4882a593Smuzhiyun static inline void adp5588_gpio_remove(struct adp5588_kpad *kpad)
263*4882a593Smuzhiyun {
264*4882a593Smuzhiyun }
265*4882a593Smuzhiyun #endif
266*4882a593Smuzhiyun
adp5588_report_events(struct adp5588_kpad * kpad,int ev_cnt)267*4882a593Smuzhiyun static void adp5588_report_events(struct adp5588_kpad *kpad, int ev_cnt)
268*4882a593Smuzhiyun {
269*4882a593Smuzhiyun int i, j;
270*4882a593Smuzhiyun
271*4882a593Smuzhiyun for (i = 0; i < ev_cnt; i++) {
272*4882a593Smuzhiyun int key = adp5588_read(kpad->client, Key_EVENTA + i);
273*4882a593Smuzhiyun int key_val = key & KEY_EV_MASK;
274*4882a593Smuzhiyun
275*4882a593Smuzhiyun if (key_val >= GPI_PIN_BASE && key_val <= GPI_PIN_END) {
276*4882a593Smuzhiyun for (j = 0; j < kpad->gpimapsize; j++) {
277*4882a593Smuzhiyun if (key_val == kpad->gpimap[j].pin) {
278*4882a593Smuzhiyun input_report_switch(kpad->input,
279*4882a593Smuzhiyun kpad->gpimap[j].sw_evt,
280*4882a593Smuzhiyun key & KEY_EV_PRESSED);
281*4882a593Smuzhiyun break;
282*4882a593Smuzhiyun }
283*4882a593Smuzhiyun }
284*4882a593Smuzhiyun } else {
285*4882a593Smuzhiyun input_report_key(kpad->input,
286*4882a593Smuzhiyun kpad->keycode[key_val - 1],
287*4882a593Smuzhiyun key & KEY_EV_PRESSED);
288*4882a593Smuzhiyun }
289*4882a593Smuzhiyun }
290*4882a593Smuzhiyun }
291*4882a593Smuzhiyun
adp5588_work(struct work_struct * work)292*4882a593Smuzhiyun static void adp5588_work(struct work_struct *work)
293*4882a593Smuzhiyun {
294*4882a593Smuzhiyun struct adp5588_kpad *kpad = container_of(work,
295*4882a593Smuzhiyun struct adp5588_kpad, work.work);
296*4882a593Smuzhiyun struct i2c_client *client = kpad->client;
297*4882a593Smuzhiyun int status, ev_cnt;
298*4882a593Smuzhiyun
299*4882a593Smuzhiyun status = adp5588_read(client, INT_STAT);
300*4882a593Smuzhiyun
301*4882a593Smuzhiyun if (status & ADP5588_OVR_FLOW_INT) /* Unlikely and should never happen */
302*4882a593Smuzhiyun dev_err(&client->dev, "Event Overflow Error\n");
303*4882a593Smuzhiyun
304*4882a593Smuzhiyun if (status & ADP5588_KE_INT) {
305*4882a593Smuzhiyun ev_cnt = adp5588_read(client, KEY_LCK_EC_STAT) & ADP5588_KEC;
306*4882a593Smuzhiyun if (ev_cnt) {
307*4882a593Smuzhiyun adp5588_report_events(kpad, ev_cnt);
308*4882a593Smuzhiyun input_sync(kpad->input);
309*4882a593Smuzhiyun }
310*4882a593Smuzhiyun }
311*4882a593Smuzhiyun adp5588_write(client, INT_STAT, status); /* Status is W1C */
312*4882a593Smuzhiyun }
313*4882a593Smuzhiyun
adp5588_irq(int irq,void * handle)314*4882a593Smuzhiyun static irqreturn_t adp5588_irq(int irq, void *handle)
315*4882a593Smuzhiyun {
316*4882a593Smuzhiyun struct adp5588_kpad *kpad = handle;
317*4882a593Smuzhiyun
318*4882a593Smuzhiyun /*
319*4882a593Smuzhiyun * use keventd context to read the event fifo registers
320*4882a593Smuzhiyun * Schedule readout at least 25ms after notification for
321*4882a593Smuzhiyun * REVID < 4
322*4882a593Smuzhiyun */
323*4882a593Smuzhiyun
324*4882a593Smuzhiyun schedule_delayed_work(&kpad->work, kpad->delay);
325*4882a593Smuzhiyun
326*4882a593Smuzhiyun return IRQ_HANDLED;
327*4882a593Smuzhiyun }
328*4882a593Smuzhiyun
adp5588_setup(struct i2c_client * client)329*4882a593Smuzhiyun static int adp5588_setup(struct i2c_client *client)
330*4882a593Smuzhiyun {
331*4882a593Smuzhiyun const struct adp5588_kpad_platform_data *pdata =
332*4882a593Smuzhiyun dev_get_platdata(&client->dev);
333*4882a593Smuzhiyun const struct adp5588_gpio_platform_data *gpio_data = pdata->gpio_data;
334*4882a593Smuzhiyun int i, ret;
335*4882a593Smuzhiyun unsigned char evt_mode1 = 0, evt_mode2 = 0, evt_mode3 = 0;
336*4882a593Smuzhiyun
337*4882a593Smuzhiyun ret = adp5588_write(client, KP_GPIO1, KP_SEL(pdata->rows));
338*4882a593Smuzhiyun ret |= adp5588_write(client, KP_GPIO2, KP_SEL(pdata->cols) & 0xFF);
339*4882a593Smuzhiyun ret |= adp5588_write(client, KP_GPIO3, KP_SEL(pdata->cols) >> 8);
340*4882a593Smuzhiyun
341*4882a593Smuzhiyun if (pdata->en_keylock) {
342*4882a593Smuzhiyun ret |= adp5588_write(client, UNLOCK1, pdata->unlock_key1);
343*4882a593Smuzhiyun ret |= adp5588_write(client, UNLOCK2, pdata->unlock_key2);
344*4882a593Smuzhiyun ret |= adp5588_write(client, KEY_LCK_EC_STAT, ADP5588_K_LCK_EN);
345*4882a593Smuzhiyun }
346*4882a593Smuzhiyun
347*4882a593Smuzhiyun for (i = 0; i < KEYP_MAX_EVENT; i++)
348*4882a593Smuzhiyun ret |= adp5588_read(client, Key_EVENTA);
349*4882a593Smuzhiyun
350*4882a593Smuzhiyun for (i = 0; i < pdata->gpimapsize; i++) {
351*4882a593Smuzhiyun unsigned short pin = pdata->gpimap[i].pin;
352*4882a593Smuzhiyun
353*4882a593Smuzhiyun if (pin <= GPI_PIN_ROW_END) {
354*4882a593Smuzhiyun evt_mode1 |= (1 << (pin - GPI_PIN_ROW_BASE));
355*4882a593Smuzhiyun } else {
356*4882a593Smuzhiyun evt_mode2 |= ((1 << (pin - GPI_PIN_COL_BASE)) & 0xFF);
357*4882a593Smuzhiyun evt_mode3 |= ((1 << (pin - GPI_PIN_COL_BASE)) >> 8);
358*4882a593Smuzhiyun }
359*4882a593Smuzhiyun }
360*4882a593Smuzhiyun
361*4882a593Smuzhiyun if (pdata->gpimapsize) {
362*4882a593Smuzhiyun ret |= adp5588_write(client, GPI_EM1, evt_mode1);
363*4882a593Smuzhiyun ret |= adp5588_write(client, GPI_EM2, evt_mode2);
364*4882a593Smuzhiyun ret |= adp5588_write(client, GPI_EM3, evt_mode3);
365*4882a593Smuzhiyun }
366*4882a593Smuzhiyun
367*4882a593Smuzhiyun if (gpio_data) {
368*4882a593Smuzhiyun for (i = 0; i <= ADP5588_BANK(ADP5588_MAXGPIO); i++) {
369*4882a593Smuzhiyun int pull_mask = gpio_data->pullup_dis_mask;
370*4882a593Smuzhiyun
371*4882a593Smuzhiyun ret |= adp5588_write(client, GPIO_PULL1 + i,
372*4882a593Smuzhiyun (pull_mask >> (8 * i)) & 0xFF);
373*4882a593Smuzhiyun }
374*4882a593Smuzhiyun }
375*4882a593Smuzhiyun
376*4882a593Smuzhiyun ret |= adp5588_write(client, INT_STAT,
377*4882a593Smuzhiyun ADP5588_CMP2_INT | ADP5588_CMP1_INT |
378*4882a593Smuzhiyun ADP5588_OVR_FLOW_INT | ADP5588_K_LCK_INT |
379*4882a593Smuzhiyun ADP5588_GPI_INT | ADP5588_KE_INT); /* Status is W1C */
380*4882a593Smuzhiyun
381*4882a593Smuzhiyun ret |= adp5588_write(client, CFG, ADP5588_INT_CFG |
382*4882a593Smuzhiyun ADP5588_OVR_FLOW_IEN |
383*4882a593Smuzhiyun ADP5588_KE_IEN);
384*4882a593Smuzhiyun
385*4882a593Smuzhiyun if (ret < 0) {
386*4882a593Smuzhiyun dev_err(&client->dev, "Write Error\n");
387*4882a593Smuzhiyun return ret;
388*4882a593Smuzhiyun }
389*4882a593Smuzhiyun
390*4882a593Smuzhiyun return 0;
391*4882a593Smuzhiyun }
392*4882a593Smuzhiyun
adp5588_report_switch_state(struct adp5588_kpad * kpad)393*4882a593Smuzhiyun static void adp5588_report_switch_state(struct adp5588_kpad *kpad)
394*4882a593Smuzhiyun {
395*4882a593Smuzhiyun int gpi_stat1 = adp5588_read(kpad->client, GPIO_DAT_STAT1);
396*4882a593Smuzhiyun int gpi_stat2 = adp5588_read(kpad->client, GPIO_DAT_STAT2);
397*4882a593Smuzhiyun int gpi_stat3 = adp5588_read(kpad->client, GPIO_DAT_STAT3);
398*4882a593Smuzhiyun int gpi_stat_tmp, pin_loc;
399*4882a593Smuzhiyun int i;
400*4882a593Smuzhiyun
401*4882a593Smuzhiyun for (i = 0; i < kpad->gpimapsize; i++) {
402*4882a593Smuzhiyun unsigned short pin = kpad->gpimap[i].pin;
403*4882a593Smuzhiyun
404*4882a593Smuzhiyun if (pin <= GPI_PIN_ROW_END) {
405*4882a593Smuzhiyun gpi_stat_tmp = gpi_stat1;
406*4882a593Smuzhiyun pin_loc = pin - GPI_PIN_ROW_BASE;
407*4882a593Smuzhiyun } else if ((pin - GPI_PIN_COL_BASE) < 8) {
408*4882a593Smuzhiyun gpi_stat_tmp = gpi_stat2;
409*4882a593Smuzhiyun pin_loc = pin - GPI_PIN_COL_BASE;
410*4882a593Smuzhiyun } else {
411*4882a593Smuzhiyun gpi_stat_tmp = gpi_stat3;
412*4882a593Smuzhiyun pin_loc = pin - GPI_PIN_COL_BASE - 8;
413*4882a593Smuzhiyun }
414*4882a593Smuzhiyun
415*4882a593Smuzhiyun if (gpi_stat_tmp < 0) {
416*4882a593Smuzhiyun dev_err(&kpad->client->dev,
417*4882a593Smuzhiyun "Can't read GPIO_DAT_STAT switch %d default to OFF\n",
418*4882a593Smuzhiyun pin);
419*4882a593Smuzhiyun gpi_stat_tmp = 0;
420*4882a593Smuzhiyun }
421*4882a593Smuzhiyun
422*4882a593Smuzhiyun input_report_switch(kpad->input,
423*4882a593Smuzhiyun kpad->gpimap[i].sw_evt,
424*4882a593Smuzhiyun !(gpi_stat_tmp & (1 << pin_loc)));
425*4882a593Smuzhiyun }
426*4882a593Smuzhiyun
427*4882a593Smuzhiyun input_sync(kpad->input);
428*4882a593Smuzhiyun }
429*4882a593Smuzhiyun
430*4882a593Smuzhiyun
adp5588_probe(struct i2c_client * client,const struct i2c_device_id * id)431*4882a593Smuzhiyun static int adp5588_probe(struct i2c_client *client,
432*4882a593Smuzhiyun const struct i2c_device_id *id)
433*4882a593Smuzhiyun {
434*4882a593Smuzhiyun struct adp5588_kpad *kpad;
435*4882a593Smuzhiyun const struct adp5588_kpad_platform_data *pdata =
436*4882a593Smuzhiyun dev_get_platdata(&client->dev);
437*4882a593Smuzhiyun struct input_dev *input;
438*4882a593Smuzhiyun unsigned int revid;
439*4882a593Smuzhiyun int ret, i;
440*4882a593Smuzhiyun int error;
441*4882a593Smuzhiyun
442*4882a593Smuzhiyun if (!i2c_check_functionality(client->adapter,
443*4882a593Smuzhiyun I2C_FUNC_SMBUS_BYTE_DATA)) {
444*4882a593Smuzhiyun dev_err(&client->dev, "SMBUS Byte Data not Supported\n");
445*4882a593Smuzhiyun return -EIO;
446*4882a593Smuzhiyun }
447*4882a593Smuzhiyun
448*4882a593Smuzhiyun if (!pdata) {
449*4882a593Smuzhiyun dev_err(&client->dev, "no platform data?\n");
450*4882a593Smuzhiyun return -EINVAL;
451*4882a593Smuzhiyun }
452*4882a593Smuzhiyun
453*4882a593Smuzhiyun if (!pdata->rows || !pdata->cols || !pdata->keymap) {
454*4882a593Smuzhiyun dev_err(&client->dev, "no rows, cols or keymap from pdata\n");
455*4882a593Smuzhiyun return -EINVAL;
456*4882a593Smuzhiyun }
457*4882a593Smuzhiyun
458*4882a593Smuzhiyun if (pdata->keymapsize != ADP5588_KEYMAPSIZE) {
459*4882a593Smuzhiyun dev_err(&client->dev, "invalid keymapsize\n");
460*4882a593Smuzhiyun return -EINVAL;
461*4882a593Smuzhiyun }
462*4882a593Smuzhiyun
463*4882a593Smuzhiyun if (!pdata->gpimap && pdata->gpimapsize) {
464*4882a593Smuzhiyun dev_err(&client->dev, "invalid gpimap from pdata\n");
465*4882a593Smuzhiyun return -EINVAL;
466*4882a593Smuzhiyun }
467*4882a593Smuzhiyun
468*4882a593Smuzhiyun if (pdata->gpimapsize > ADP5588_GPIMAPSIZE_MAX) {
469*4882a593Smuzhiyun dev_err(&client->dev, "invalid gpimapsize\n");
470*4882a593Smuzhiyun return -EINVAL;
471*4882a593Smuzhiyun }
472*4882a593Smuzhiyun
473*4882a593Smuzhiyun for (i = 0; i < pdata->gpimapsize; i++) {
474*4882a593Smuzhiyun unsigned short pin = pdata->gpimap[i].pin;
475*4882a593Smuzhiyun
476*4882a593Smuzhiyun if (pin < GPI_PIN_BASE || pin > GPI_PIN_END) {
477*4882a593Smuzhiyun dev_err(&client->dev, "invalid gpi pin data\n");
478*4882a593Smuzhiyun return -EINVAL;
479*4882a593Smuzhiyun }
480*4882a593Smuzhiyun
481*4882a593Smuzhiyun if (pin <= GPI_PIN_ROW_END) {
482*4882a593Smuzhiyun if (pin - GPI_PIN_ROW_BASE + 1 <= pdata->rows) {
483*4882a593Smuzhiyun dev_err(&client->dev, "invalid gpi row data\n");
484*4882a593Smuzhiyun return -EINVAL;
485*4882a593Smuzhiyun }
486*4882a593Smuzhiyun } else {
487*4882a593Smuzhiyun if (pin - GPI_PIN_COL_BASE + 1 <= pdata->cols) {
488*4882a593Smuzhiyun dev_err(&client->dev, "invalid gpi col data\n");
489*4882a593Smuzhiyun return -EINVAL;
490*4882a593Smuzhiyun }
491*4882a593Smuzhiyun }
492*4882a593Smuzhiyun }
493*4882a593Smuzhiyun
494*4882a593Smuzhiyun if (!client->irq) {
495*4882a593Smuzhiyun dev_err(&client->dev, "no IRQ?\n");
496*4882a593Smuzhiyun return -EINVAL;
497*4882a593Smuzhiyun }
498*4882a593Smuzhiyun
499*4882a593Smuzhiyun kpad = kzalloc(sizeof(*kpad), GFP_KERNEL);
500*4882a593Smuzhiyun input = input_allocate_device();
501*4882a593Smuzhiyun if (!kpad || !input) {
502*4882a593Smuzhiyun error = -ENOMEM;
503*4882a593Smuzhiyun goto err_free_mem;
504*4882a593Smuzhiyun }
505*4882a593Smuzhiyun
506*4882a593Smuzhiyun kpad->client = client;
507*4882a593Smuzhiyun kpad->input = input;
508*4882a593Smuzhiyun INIT_DELAYED_WORK(&kpad->work, adp5588_work);
509*4882a593Smuzhiyun
510*4882a593Smuzhiyun ret = adp5588_read(client, DEV_ID);
511*4882a593Smuzhiyun if (ret < 0) {
512*4882a593Smuzhiyun error = ret;
513*4882a593Smuzhiyun goto err_free_mem;
514*4882a593Smuzhiyun }
515*4882a593Smuzhiyun
516*4882a593Smuzhiyun revid = (u8) ret & ADP5588_DEVICE_ID_MASK;
517*4882a593Smuzhiyun if (WA_DELAYED_READOUT_REVID(revid))
518*4882a593Smuzhiyun kpad->delay = msecs_to_jiffies(30);
519*4882a593Smuzhiyun
520*4882a593Smuzhiyun input->name = client->name;
521*4882a593Smuzhiyun input->phys = "adp5588-keys/input0";
522*4882a593Smuzhiyun input->dev.parent = &client->dev;
523*4882a593Smuzhiyun
524*4882a593Smuzhiyun input_set_drvdata(input, kpad);
525*4882a593Smuzhiyun
526*4882a593Smuzhiyun input->id.bustype = BUS_I2C;
527*4882a593Smuzhiyun input->id.vendor = 0x0001;
528*4882a593Smuzhiyun input->id.product = 0x0001;
529*4882a593Smuzhiyun input->id.version = revid;
530*4882a593Smuzhiyun
531*4882a593Smuzhiyun input->keycodesize = sizeof(kpad->keycode[0]);
532*4882a593Smuzhiyun input->keycodemax = pdata->keymapsize;
533*4882a593Smuzhiyun input->keycode = kpad->keycode;
534*4882a593Smuzhiyun
535*4882a593Smuzhiyun memcpy(kpad->keycode, pdata->keymap,
536*4882a593Smuzhiyun pdata->keymapsize * input->keycodesize);
537*4882a593Smuzhiyun
538*4882a593Smuzhiyun kpad->gpimap = pdata->gpimap;
539*4882a593Smuzhiyun kpad->gpimapsize = pdata->gpimapsize;
540*4882a593Smuzhiyun
541*4882a593Smuzhiyun /* setup input device */
542*4882a593Smuzhiyun __set_bit(EV_KEY, input->evbit);
543*4882a593Smuzhiyun
544*4882a593Smuzhiyun if (pdata->repeat)
545*4882a593Smuzhiyun __set_bit(EV_REP, input->evbit);
546*4882a593Smuzhiyun
547*4882a593Smuzhiyun for (i = 0; i < input->keycodemax; i++)
548*4882a593Smuzhiyun if (kpad->keycode[i] <= KEY_MAX)
549*4882a593Smuzhiyun __set_bit(kpad->keycode[i], input->keybit);
550*4882a593Smuzhiyun __clear_bit(KEY_RESERVED, input->keybit);
551*4882a593Smuzhiyun
552*4882a593Smuzhiyun if (kpad->gpimapsize)
553*4882a593Smuzhiyun __set_bit(EV_SW, input->evbit);
554*4882a593Smuzhiyun for (i = 0; i < kpad->gpimapsize; i++)
555*4882a593Smuzhiyun __set_bit(kpad->gpimap[i].sw_evt, input->swbit);
556*4882a593Smuzhiyun
557*4882a593Smuzhiyun error = input_register_device(input);
558*4882a593Smuzhiyun if (error) {
559*4882a593Smuzhiyun dev_err(&client->dev, "unable to register input device\n");
560*4882a593Smuzhiyun goto err_free_mem;
561*4882a593Smuzhiyun }
562*4882a593Smuzhiyun
563*4882a593Smuzhiyun error = request_irq(client->irq, adp5588_irq,
564*4882a593Smuzhiyun IRQF_TRIGGER_FALLING,
565*4882a593Smuzhiyun client->dev.driver->name, kpad);
566*4882a593Smuzhiyun if (error) {
567*4882a593Smuzhiyun dev_err(&client->dev, "irq %d busy?\n", client->irq);
568*4882a593Smuzhiyun goto err_unreg_dev;
569*4882a593Smuzhiyun }
570*4882a593Smuzhiyun
571*4882a593Smuzhiyun error = adp5588_setup(client);
572*4882a593Smuzhiyun if (error)
573*4882a593Smuzhiyun goto err_free_irq;
574*4882a593Smuzhiyun
575*4882a593Smuzhiyun if (kpad->gpimapsize)
576*4882a593Smuzhiyun adp5588_report_switch_state(kpad);
577*4882a593Smuzhiyun
578*4882a593Smuzhiyun error = adp5588_gpio_add(kpad);
579*4882a593Smuzhiyun if (error)
580*4882a593Smuzhiyun goto err_free_irq;
581*4882a593Smuzhiyun
582*4882a593Smuzhiyun device_init_wakeup(&client->dev, 1);
583*4882a593Smuzhiyun i2c_set_clientdata(client, kpad);
584*4882a593Smuzhiyun
585*4882a593Smuzhiyun dev_info(&client->dev, "Rev.%d keypad, irq %d\n", revid, client->irq);
586*4882a593Smuzhiyun return 0;
587*4882a593Smuzhiyun
588*4882a593Smuzhiyun err_free_irq:
589*4882a593Smuzhiyun free_irq(client->irq, kpad);
590*4882a593Smuzhiyun cancel_delayed_work_sync(&kpad->work);
591*4882a593Smuzhiyun err_unreg_dev:
592*4882a593Smuzhiyun input_unregister_device(input);
593*4882a593Smuzhiyun input = NULL;
594*4882a593Smuzhiyun err_free_mem:
595*4882a593Smuzhiyun input_free_device(input);
596*4882a593Smuzhiyun kfree(kpad);
597*4882a593Smuzhiyun
598*4882a593Smuzhiyun return error;
599*4882a593Smuzhiyun }
600*4882a593Smuzhiyun
adp5588_remove(struct i2c_client * client)601*4882a593Smuzhiyun static int adp5588_remove(struct i2c_client *client)
602*4882a593Smuzhiyun {
603*4882a593Smuzhiyun struct adp5588_kpad *kpad = i2c_get_clientdata(client);
604*4882a593Smuzhiyun
605*4882a593Smuzhiyun adp5588_write(client, CFG, 0);
606*4882a593Smuzhiyun free_irq(client->irq, kpad);
607*4882a593Smuzhiyun cancel_delayed_work_sync(&kpad->work);
608*4882a593Smuzhiyun input_unregister_device(kpad->input);
609*4882a593Smuzhiyun adp5588_gpio_remove(kpad);
610*4882a593Smuzhiyun kfree(kpad);
611*4882a593Smuzhiyun
612*4882a593Smuzhiyun return 0;
613*4882a593Smuzhiyun }
614*4882a593Smuzhiyun
615*4882a593Smuzhiyun #ifdef CONFIG_PM
adp5588_suspend(struct device * dev)616*4882a593Smuzhiyun static int adp5588_suspend(struct device *dev)
617*4882a593Smuzhiyun {
618*4882a593Smuzhiyun struct adp5588_kpad *kpad = dev_get_drvdata(dev);
619*4882a593Smuzhiyun struct i2c_client *client = kpad->client;
620*4882a593Smuzhiyun
621*4882a593Smuzhiyun disable_irq(client->irq);
622*4882a593Smuzhiyun cancel_delayed_work_sync(&kpad->work);
623*4882a593Smuzhiyun
624*4882a593Smuzhiyun if (device_may_wakeup(&client->dev))
625*4882a593Smuzhiyun enable_irq_wake(client->irq);
626*4882a593Smuzhiyun
627*4882a593Smuzhiyun return 0;
628*4882a593Smuzhiyun }
629*4882a593Smuzhiyun
adp5588_resume(struct device * dev)630*4882a593Smuzhiyun static int adp5588_resume(struct device *dev)
631*4882a593Smuzhiyun {
632*4882a593Smuzhiyun struct adp5588_kpad *kpad = dev_get_drvdata(dev);
633*4882a593Smuzhiyun struct i2c_client *client = kpad->client;
634*4882a593Smuzhiyun
635*4882a593Smuzhiyun if (device_may_wakeup(&client->dev))
636*4882a593Smuzhiyun disable_irq_wake(client->irq);
637*4882a593Smuzhiyun
638*4882a593Smuzhiyun enable_irq(client->irq);
639*4882a593Smuzhiyun
640*4882a593Smuzhiyun return 0;
641*4882a593Smuzhiyun }
642*4882a593Smuzhiyun
643*4882a593Smuzhiyun static const struct dev_pm_ops adp5588_dev_pm_ops = {
644*4882a593Smuzhiyun .suspend = adp5588_suspend,
645*4882a593Smuzhiyun .resume = adp5588_resume,
646*4882a593Smuzhiyun };
647*4882a593Smuzhiyun #endif
648*4882a593Smuzhiyun
649*4882a593Smuzhiyun static const struct i2c_device_id adp5588_id[] = {
650*4882a593Smuzhiyun { "adp5588-keys", 0 },
651*4882a593Smuzhiyun { "adp5587-keys", 0 },
652*4882a593Smuzhiyun { }
653*4882a593Smuzhiyun };
654*4882a593Smuzhiyun MODULE_DEVICE_TABLE(i2c, adp5588_id);
655*4882a593Smuzhiyun
656*4882a593Smuzhiyun static struct i2c_driver adp5588_driver = {
657*4882a593Smuzhiyun .driver = {
658*4882a593Smuzhiyun .name = KBUILD_MODNAME,
659*4882a593Smuzhiyun #ifdef CONFIG_PM
660*4882a593Smuzhiyun .pm = &adp5588_dev_pm_ops,
661*4882a593Smuzhiyun #endif
662*4882a593Smuzhiyun },
663*4882a593Smuzhiyun .probe = adp5588_probe,
664*4882a593Smuzhiyun .remove = adp5588_remove,
665*4882a593Smuzhiyun .id_table = adp5588_id,
666*4882a593Smuzhiyun };
667*4882a593Smuzhiyun
668*4882a593Smuzhiyun module_i2c_driver(adp5588_driver);
669*4882a593Smuzhiyun
670*4882a593Smuzhiyun MODULE_LICENSE("GPL");
671*4882a593Smuzhiyun MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
672*4882a593Smuzhiyun MODULE_DESCRIPTION("ADP5588/87 Keypad driver");
673