2 * Copyright (C) 2010 Trusted Logic S.A.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20 #include <linux/kernel.h>
21 #include <linux/module.h>
23 #include <linux/slab.h>
24 #include <linux/init.h>
25 #include <linux/list.h>
26 #include <linux/i2c.h>
27 #include <linux/irq.h>
28 #include <linux/jiffies.h>
29 #include <linux/uaccess.h>
30 #include <linux/delay.h>
31 #include <linux/interrupt.h>
33 #include <linux/platform_device.h>
34 #include <linux/gpio.h>
35 #include <linux/miscdevice.h>
36 #include <linux/spinlock.h>
37 #include <linux/pn544.h>
39 #define MAX_BUFFER_SIZE 512
41 #define NXP_KR_READ_IRQ_MODIFY
43 #ifdef NXP_KR_READ_IRQ_MODIFY
44 static bool do_reading;
45 static bool cancle_read;
51 wait_queue_head_t read_wq;
52 struct mutex read_mutex;
53 struct i2c_client *client;
54 struct miscdevice pn544_device;
55 unsigned int ven_gpio;
56 unsigned int firm_gpio;
57 unsigned int irq_gpio;
59 spinlock_t irq_enabled_lock;
62 static void pn544_disable_irq(struct pn544_dev *pn544_dev)
66 spin_lock_irqsave(&pn544_dev->irq_enabled_lock, flags);
67 if (pn544_dev->irq_enabled) {
68 disable_irq_nosync(pn544_dev->client->irq);
69 pn544_dev->irq_enabled = false;
71 spin_unlock_irqrestore(&pn544_dev->irq_enabled_lock, flags);
74 static irqreturn_t pn544_dev_irq_handler(int irq, void *dev_id)
76 struct pn544_dev *pn544_dev = dev_id;
78 if (!gpio_get_value(pn544_dev->irq_gpio))
81 #ifdef NXP_KR_READ_IRQ_MODIFY
84 pn544_disable_irq(pn544_dev);
85 /* Wake up waiting readers */
86 wake_up(&pn544_dev->read_wq);
89 dev_info(&pn544_dev->client->dev, "pn544 : call\n");
95 static ssize_t pn544_dev_read(struct file *filp, char __user *buf,
96 size_t count, loff_t *offset)
98 struct pn544_dev *pn544_dev = filp->private_data;
99 char tmp[MAX_BUFFER_SIZE];
102 if (count > MAX_BUFFER_SIZE)
103 count = MAX_BUFFER_SIZE;
106 dev_dbg(&pn544_dev->client->dev, "%s : reading %zu bytes. irq=%s\n",
108 gpio_get_value(pn544_dev->irq_gpio) ? "1" : "0");
109 dev_info(&pn544_dev->client->dev, "pn544 : + r\n");
112 mutex_lock(&pn544_dev->read_mutex);
115 if (!gpio_get_value(pn544_dev->irq_gpio)) {
116 if (filp->f_flags & O_NONBLOCK) {
117 dev_info(&pn544_dev->client->dev, "%s : O_NONBLOCK\n",
123 pn544_dev->irq_enabled = true;
125 #ifdef NXP_KR_READ_IRQ_MODIFY
129 enable_irq(pn544_dev->client->irq);
130 if (gpio_get_value(pn544_dev->irq_gpio))
131 pn544_disable_irq(pn544_dev);
133 #ifdef NXP_KR_READ_IRQ_MODIFY
134 ret = wait_event_interruptible(pn544_dev->read_wq,
137 ret = wait_event_interruptible(pn544_dev->read_wq,
138 gpio_get_value(pn544_dev->irq_gpio));
140 pn544_disable_irq(pn544_dev);
143 dev_info(&pn544_dev->client->dev, "pn544 : h\n");
146 #ifdef NXP_KR_READ_IRQ_MODIFY
147 if (cancle_read == true) {
161 ret = i2c_master_recv(pn544_dev->client, tmp, count);
162 mutex_unlock(&pn544_dev->read_mutex);
165 dev_err(&pn544_dev->client->dev,
166 "%s: i2c_master_recv returned %d\n", __func__,
171 dev_err(&pn544_dev->client->dev,
172 "%s: received too many bytes from i2c (%d)\n",
177 if (copy_to_user(buf, tmp, ret)) {
178 dev_err(&pn544_dev->client->dev,
179 "%s : failed to copy to user space\n",
186 mutex_unlock(&pn544_dev->read_mutex);
190 static ssize_t pn544_dev_write(struct file *filp, const char __user *buf,
191 size_t count, loff_t *offset)
193 struct pn544_dev *pn544_dev;
194 char tmp[MAX_BUFFER_SIZE];
195 int ret = 0, retry = 2;
200 pn544_dev = filp->private_data;
203 dev_info(&pn544_dev->client->dev, "pn544 : + w\n");
204 for (i = 0; i < count; i++)
205 dev_info(&pn544_dev->client->dev, "buf[%d] = 0x%x\n",
209 if (count > MAX_BUFFER_SIZE)
210 count = MAX_BUFFER_SIZE;
212 if (copy_from_user(tmp, buf, count)) {
213 dev_err(&pn544_dev->client->dev,
214 "%s : failed to copy from user space\n", __func__);
218 dev_dbg(&pn544_dev->client->dev, "%s : writing %zu bytes.\n", __func__,
224 ret = i2c_master_send(pn544_dev->client, tmp, count);
227 usleep_range(6000, 10000); /* Retry, chip was in standby */
229 dev_info(&pn544_dev->client->dev, "retry = %d\n", retry);
234 dev_info(&pn544_dev->client->dev, "pn544 : - w\n");
238 dev_err(&pn544_dev->client->dev,
239 "%s : i2c_master_send returned %d, %d\n", __func__, ret, retry);
246 static int pn544_dev_open(struct inode *inode, struct file *filp)
248 struct pn544_dev *pn544_dev = container_of(filp->private_data,
252 filp->private_data = pn544_dev;
254 dev_dbg(&pn544_dev->client->dev, "%s : %d,%d\n", __func__,
255 imajor(inode), iminor(inode));
260 static long pn544_dev_ioctl(struct file *filp,
261 unsigned int cmd, unsigned long arg)
263 struct pn544_dev *pn544_dev = filp->private_data;
268 /* power on with firmware download (requires hw reset)
270 dev_info(&pn544_dev->client->dev,
271 "%s power on with firmware\n", __func__);
272 gpio_set_value(pn544_dev->ven_gpio, 1);
273 gpio_set_value(pn544_dev->firm_gpio, 1);
274 usleep_range(10000, 10000);
275 gpio_set_value(pn544_dev->ven_gpio, 0);
276 usleep_range(10000, 10000);
277 gpio_set_value(pn544_dev->ven_gpio, 1);
278 usleep_range(10000, 10000);
279 } else if (arg == 1) {
281 dev_info(&pn544_dev->client->dev, "%s power on\n",
283 gpio_set_value(pn544_dev->firm_gpio, 0);
284 gpio_set_value(pn544_dev->ven_gpio, 1);
285 usleep_range(10000, 10000);
286 } else if (arg == 0) {
288 dev_info(&pn544_dev->client->dev, "%s power off\n",
290 gpio_set_value(pn544_dev->firm_gpio, 0);
291 gpio_set_value(pn544_dev->ven_gpio, 0);
292 usleep_range(10000, 10000);
293 #ifdef NXP_KR_READ_IRQ_MODIFY
294 } else if (arg == 3) {
295 pr_info("%s Read Cancle\n", __func__);
298 wake_up(&pn544_dev->read_wq);
301 dev_err(&pn544_dev->client->dev, "%s bad arg %lu\n",
307 dev_err(&pn544_dev->client->dev, "%s bad ioctl %u\n", __func__,
315 static const struct file_operations pn544_dev_fops = {
316 .owner = THIS_MODULE,
318 .read = pn544_dev_read,
319 .write = pn544_dev_write,
320 .open = pn544_dev_open,
321 .unlocked_ioctl = pn544_dev_ioctl,
324 static int pn544_probe(struct i2c_client *client,
325 const struct i2c_device_id *id)
328 struct pn544_i2c_platform_data *platform_data;
329 struct pn544_dev *pn544_dev;
331 /*+Check the NFC Chip+*/
332 char tmp[MAX_BUFFER_SIZE] = {0, };
333 char datasizelength = 1;
334 /*-Check the NFC Chip-*/
336 platform_data = client->dev.platform_data;
338 if (platform_data == NULL) {
339 dev_err(&client->dev, "%s : nfc probe fail\n", __func__);
343 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
344 dev_err(&client->dev, "%s : need I2C_FUNC_I2C\n", __func__);
348 ret = gpio_request(platform_data->irq_gpio, "nfc_int");
351 ret = gpio_request(platform_data->ven_gpio, "nfc_ven");
354 ret = gpio_request(platform_data->firm_gpio, "nfc_firm");
358 pn544_dev = kzalloc(sizeof(*pn544_dev), GFP_KERNEL);
359 if (pn544_dev == NULL) {
360 dev_err(&client->dev,
361 "failed to allocate memory for module data\n");
366 dev_info(&client->dev, "%s : IRQ num %d\n", __func__, client->irq);
368 pn544_dev->irq_gpio = platform_data->irq_gpio;
369 pn544_dev->ven_gpio = platform_data->ven_gpio;
370 pn544_dev->firm_gpio = platform_data->firm_gpio;
371 pn544_dev->client = client;
373 /* init mutex and queues */
374 init_waitqueue_head(&pn544_dev->read_wq);
375 mutex_init(&pn544_dev->read_mutex);
376 spin_lock_init(&pn544_dev->irq_enabled_lock);
378 pn544_dev->pn544_device.minor = MISC_DYNAMIC_MINOR;
379 pn544_dev->pn544_device.name = "pn544";
380 pn544_dev->pn544_device.fops = &pn544_dev_fops;
382 ret = misc_register(&pn544_dev->pn544_device);
384 dev_err(&client->dev, "%s : misc_register failed. ret = %d\n",
386 goto err_misc_register;
389 i2c_set_clientdata(client, pn544_dev);
390 /* request irq. the irq is set whenever the chip has data available
391 * for reading. it is cleared when all data has been read.
393 dev_info(&pn544_dev->client->dev, "%s : requesting IRQ %d\n", __func__,
395 pn544_dev->irq_enabled = true;
396 ret = gpio_direction_input(pn544_dev->irq_gpio);
398 dev_err(&client->dev, "%s : gpio_direction_input failed. ret = %d\n",
400 goto err_request_irq_failed;
403 ret = request_irq(client->irq, pn544_dev_irq_handler,
404 IRQF_TRIGGER_RISING, "pn544", pn544_dev);
406 dev_err(&client->dev, "request_irq failed. ret = %d\n", ret);
407 goto err_request_irq_failed;
410 /*+Check the NFC Chip+*/
411 gpio_set_value(pn544_dev->firm_gpio, 0);
412 gpio_set_value(pn544_dev->ven_gpio, 1);
413 usleep_range(10000, 10000);
415 ret = i2c_master_recv(pn544_dev->client, tmp, datasizelength);
417 gpio_set_value(pn544_dev->firm_gpio, 0);
418 gpio_set_value(pn544_dev->ven_gpio, 0);
419 usleep_range(10000, 10000);
421 if (tmp[0] != 0x57 )/*Error Case*/
423 dev_err(&pn544_dev->client->dev, "%s : No NFC Chip!! %x\n", __func__, tmp[0]);
424 goto err_request_irq_failed;
426 /*-Check the NFC Chip-*/
428 pn544_disable_irq(pn544_dev);
429 ret = enable_irq_wake(client->irq);
431 dev_err(&client->dev, "enable_irq_wake failed. ret = %d\n",
433 goto err_renable_irq_wake;
438 err_renable_irq_wake:
439 free_irq(client->irq, pn544_dev);
440 err_request_irq_failed:
441 misc_deregister(&pn544_dev->pn544_device);
443 mutex_destroy(&pn544_dev->read_mutex);
446 gpio_free(platform_data->firm_gpio);
448 gpio_free(platform_data->ven_gpio);
450 gpio_free(platform_data->irq_gpio);
454 static int pn544_remove(struct i2c_client *client)
456 struct pn544_dev *pn544_dev;
458 pn544_dev = i2c_get_clientdata(client);
459 free_irq(client->irq, pn544_dev);
460 misc_deregister(&pn544_dev->pn544_device);
461 mutex_destroy(&pn544_dev->read_mutex);
462 gpio_free(pn544_dev->irq_gpio);
463 gpio_free(pn544_dev->ven_gpio);
464 gpio_free(pn544_dev->firm_gpio);
470 static const struct i2c_device_id pn544_id[] = {
475 static struct i2c_driver pn544_driver = {
476 .id_table = pn544_id,
477 .probe = pn544_probe,
478 .remove = pn544_remove,
480 .owner = THIS_MODULE,
486 * module load/unload record keeping
489 static int __init pn544_dev_init(void)
491 pr_info("Loading pn544 driver\n");
492 return i2c_add_driver(&pn544_driver);
494 module_init(pn544_dev_init);
496 static void __exit pn544_dev_exit(void)
498 pr_info("Unloading pn544 driver\n");
499 i2c_del_driver(&pn544_driver);
501 module_exit(pn544_dev_exit);
503 MODULE_AUTHOR("Sylvain Fonteneau");
504 MODULE_DESCRIPTION("NFC pn544 driver");
505 MODULE_LICENSE("GPL");