2 * Touchkey driver for Freescale MPR121 Controllor
4 * Copyright (C) 2011 Freescale Semiconductor, Inc.
5 * Author: Zhang Jiejing <jiejing.zhang@freescale.com>
7 * Based on mcs_touchkey.c
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation.
15 #include <linux/module.h>
16 #include <linux/init.h>
17 #include <linux/input.h>
18 #include <linux/i2c.h>
19 #include <linux/slab.h>
20 #include <linux/delay.h>
21 #include <linux/bitops.h>
22 #include <linux/interrupt.h>
23 #include <linux/i2c/mpr121_touchkey.h>
25 /* Register definitions */
26 #define ELE_TOUCH_STATUS_0_ADDR 0x0
27 #define ELE_TOUCH_STATUS_1_ADDR 0X1
28 #define MHD_RISING_ADDR 0x2b
29 #define NHD_RISING_ADDR 0x2c
30 #define NCL_RISING_ADDR 0x2d
31 #define FDL_RISING_ADDR 0x2e
32 #define MHD_FALLING_ADDR 0x2f
33 #define NHD_FALLING_ADDR 0x30
34 #define NCL_FALLING_ADDR 0x31
35 #define FDL_FALLING_ADDR 0x32
36 #define ELE0_TOUCH_THRESHOLD_ADDR 0x41
37 #define ELE0_RELEASE_THRESHOLD_ADDR 0x42
38 #define AFE_CONF_ADDR 0x5c
39 #define FILTER_CONF_ADDR 0x5d
42 * ELECTRODE_CONF_ADDR: This register configures the number of
43 * enabled capacitance sensing inputs and its run/suspend mode.
45 #define ELECTRODE_CONF_ADDR 0x5e
46 #define ELECTRODE_CONF_QUICK_CHARGE 0x80
47 #define AUTO_CONFIG_CTRL_ADDR 0x7b
48 #define AUTO_CONFIG_USL_ADDR 0x7d
49 #define AUTO_CONFIG_LSL_ADDR 0x7e
50 #define AUTO_CONFIG_TL_ADDR 0x7f
52 /* Threshold of touch/release trigger */
53 #define TOUCH_THRESHOLD 0x08
54 #define RELEASE_THRESHOLD 0x05
55 /* Masks for touch and release triggers */
56 #define TOUCH_STATUS_MASK 0xfff
57 /* MPR121 has 12 keys */
58 #define MPR121_MAX_KEY_COUNT 12
60 struct mpr121_touchkey
{
61 struct i2c_client
*client
;
62 struct input_dev
*input_dev
;
64 unsigned int statusbits
;
65 unsigned int keycount
;
66 u16 keycodes
[MPR121_MAX_KEY_COUNT
];
69 struct mpr121_init_register
{
74 static const struct mpr121_init_register init_reg_table
[] = {
75 { MHD_RISING_ADDR
, 0x1 },
76 { NHD_RISING_ADDR
, 0x1 },
77 { MHD_FALLING_ADDR
, 0x1 },
78 { NHD_FALLING_ADDR
, 0x1 },
79 { NCL_FALLING_ADDR
, 0xff },
80 { FDL_FALLING_ADDR
, 0x02 },
81 { FILTER_CONF_ADDR
, 0x04 },
82 { AFE_CONF_ADDR
, 0x0b },
83 { AUTO_CONFIG_CTRL_ADDR
, 0x0b },
86 static irqreturn_t
mpr_touchkey_interrupt(int irq
, void *dev_id
)
88 struct mpr121_touchkey
*mpr121
= dev_id
;
89 struct i2c_client
*client
= mpr121
->client
;
90 struct input_dev
*input
= mpr121
->input_dev
;
91 unsigned long bit_changed
;
95 reg
= i2c_smbus_read_byte_data(client
, ELE_TOUCH_STATUS_1_ADDR
);
97 dev_err(&client
->dev
, "i2c read error [%d]\n", reg
);
102 reg
|= i2c_smbus_read_byte_data(client
, ELE_TOUCH_STATUS_0_ADDR
);
104 dev_err(&client
->dev
, "i2c read error [%d]\n", reg
);
108 reg
&= TOUCH_STATUS_MASK
;
109 /* use old press bit to figure out which bit changed */
110 bit_changed
= reg
^ mpr121
->statusbits
;
111 mpr121
->statusbits
= reg
;
112 for_each_set_bit(key_num
, &bit_changed
, mpr121
->keycount
) {
113 unsigned int key_val
, pressed
;
115 pressed
= reg
& BIT(key_num
);
116 key_val
= mpr121
->keycodes
[key_num
];
118 input_event(input
, EV_MSC
, MSC_SCAN
, key_num
);
119 input_report_key(input
, key_val
, pressed
);
121 dev_dbg(&client
->dev
, "key %d %d %s\n", key_num
, key_val
,
122 pressed
? "pressed" : "released");
131 static int mpr121_phys_init(const struct mpr121_platform_data
*pdata
,
132 struct mpr121_touchkey
*mpr121
,
133 struct i2c_client
*client
)
135 const struct mpr121_init_register
*reg
;
136 unsigned char usl
, lsl
, tl
, eleconf
;
139 /* Set up touch/release threshold for ele0-ele11 */
140 for (i
= 0; i
<= MPR121_MAX_KEY_COUNT
; i
++) {
141 t
= ELE0_TOUCH_THRESHOLD_ADDR
+ (i
* 2);
142 ret
= i2c_smbus_write_byte_data(client
, t
, TOUCH_THRESHOLD
);
145 ret
= i2c_smbus_write_byte_data(client
, t
+ 1,
151 /* Set up init register */
152 for (i
= 0; i
< ARRAY_SIZE(init_reg_table
); i
++) {
153 reg
= &init_reg_table
[i
];
154 ret
= i2c_smbus_write_byte_data(client
, reg
->addr
, reg
->val
);
161 * Capacitance on sensing input varies and needs to be compensated.
162 * The internal MPR121-auto-configuration can do this if it's
163 * registers are set properly (based on pdata->vdd_uv).
165 vdd
= pdata
->vdd_uv
/ 1000;
166 usl
= ((vdd
- 700) * 256) / vdd
;
167 lsl
= (usl
* 65) / 100;
168 tl
= (usl
* 90) / 100;
169 ret
= i2c_smbus_write_byte_data(client
, AUTO_CONFIG_USL_ADDR
, usl
);
170 ret
|= i2c_smbus_write_byte_data(client
, AUTO_CONFIG_LSL_ADDR
, lsl
);
171 ret
|= i2c_smbus_write_byte_data(client
, AUTO_CONFIG_TL_ADDR
, tl
);
174 * Quick charge bit will let the capacitive charge to ready
175 * state quickly, or the buttons may not function after system
178 eleconf
= mpr121
->keycount
| ELECTRODE_CONF_QUICK_CHARGE
;
179 ret
|= i2c_smbus_write_byte_data(client
, ELECTRODE_CONF_ADDR
,
184 dev_dbg(&client
->dev
, "set up with %x keys.\n", mpr121
->keycount
);
189 dev_err(&client
->dev
, "i2c write error: %d\n", ret
);
193 static int mpr_touchkey_probe(struct i2c_client
*client
,
194 const struct i2c_device_id
*id
)
196 const struct mpr121_platform_data
*pdata
= client
->dev
.platform_data
;
197 struct mpr121_touchkey
*mpr121
;
198 struct input_dev
*input_dev
;
203 dev_err(&client
->dev
, "no platform data defined\n");
207 if (!pdata
->keymap
|| !pdata
->keymap_size
) {
208 dev_err(&client
->dev
, "missing keymap data\n");
212 if (pdata
->keymap_size
> MPR121_MAX_KEY_COUNT
) {
213 dev_err(&client
->dev
, "too many keys defined\n");
218 dev_err(&client
->dev
, "irq number should not be zero\n");
222 mpr121
= kzalloc(sizeof(struct mpr121_touchkey
), GFP_KERNEL
);
223 input_dev
= input_allocate_device();
224 if (!mpr121
|| !input_dev
) {
225 dev_err(&client
->dev
, "Failed to allocate memory\n");
230 mpr121
->client
= client
;
231 mpr121
->input_dev
= input_dev
;
232 mpr121
->keycount
= pdata
->keymap_size
;
234 input_dev
->name
= "Freescale MPR121 Touchkey";
235 input_dev
->id
.bustype
= BUS_I2C
;
236 input_dev
->dev
.parent
= &client
->dev
;
237 input_dev
->evbit
[0] = BIT_MASK(EV_KEY
) | BIT_MASK(EV_REP
);
238 input_set_capability(input_dev
, EV_MSC
, MSC_SCAN
);
240 input_dev
->keycode
= mpr121
->keycodes
;
241 input_dev
->keycodesize
= sizeof(mpr121
->keycodes
[0]);
242 input_dev
->keycodemax
= mpr121
->keycount
;
244 for (i
= 0; i
< pdata
->keymap_size
; i
++) {
245 input_set_capability(input_dev
, EV_KEY
, pdata
->keymap
[i
]);
246 mpr121
->keycodes
[i
] = pdata
->keymap
[i
];
249 error
= mpr121_phys_init(pdata
, mpr121
, client
);
251 dev_err(&client
->dev
, "Failed to init register\n");
255 error
= request_threaded_irq(client
->irq
, NULL
,
256 mpr_touchkey_interrupt
,
257 IRQF_TRIGGER_FALLING
| IRQF_ONESHOT
,
258 client
->dev
.driver
->name
, mpr121
);
260 dev_err(&client
->dev
, "Failed to register interrupt\n");
264 error
= input_register_device(input_dev
);
268 i2c_set_clientdata(client
, mpr121
);
269 device_init_wakeup(&client
->dev
, pdata
->wakeup
);
274 free_irq(client
->irq
, mpr121
);
276 input_free_device(input_dev
);
281 static int mpr_touchkey_remove(struct i2c_client
*client
)
283 struct mpr121_touchkey
*mpr121
= i2c_get_clientdata(client
);
285 free_irq(client
->irq
, mpr121
);
286 input_unregister_device(mpr121
->input_dev
);
292 #ifdef CONFIG_PM_SLEEP
293 static int mpr_suspend(struct device
*dev
)
295 struct i2c_client
*client
= to_i2c_client(dev
);
297 if (device_may_wakeup(&client
->dev
))
298 enable_irq_wake(client
->irq
);
300 i2c_smbus_write_byte_data(client
, ELECTRODE_CONF_ADDR
, 0x00);
305 static int mpr_resume(struct device
*dev
)
307 struct i2c_client
*client
= to_i2c_client(dev
);
308 struct mpr121_touchkey
*mpr121
= i2c_get_clientdata(client
);
310 if (device_may_wakeup(&client
->dev
))
311 disable_irq_wake(client
->irq
);
313 i2c_smbus_write_byte_data(client
, ELECTRODE_CONF_ADDR
,
320 static SIMPLE_DEV_PM_OPS(mpr121_touchkey_pm_ops
, mpr_suspend
, mpr_resume
);
322 static const struct i2c_device_id mpr121_id
[] = {
323 { "mpr121_touchkey", 0 },
326 MODULE_DEVICE_TABLE(i2c
, mpr121_id
);
328 static struct i2c_driver mpr_touchkey_driver
= {
331 .owner
= THIS_MODULE
,
332 .pm
= &mpr121_touchkey_pm_ops
,
334 .id_table
= mpr121_id
,
335 .probe
= mpr_touchkey_probe
,
336 .remove
= mpr_touchkey_remove
,
339 module_i2c_driver(mpr_touchkey_driver
);
341 MODULE_LICENSE("GPL");
342 MODULE_AUTHOR("Zhang Jiejing <jiejing.zhang@freescale.com>");
343 MODULE_DESCRIPTION("Touch Key driver for Freescale MPR121 Chip");