static int __pn544_kread(void *dev, unsigned int length) { struct pn544_dev *pn544_dev = NULL; char tmp[MAX_BUFFER_SIZE]; int ret = 0; int irq_gpio_val = 0; if(dev != NULL) pn544_dev = (struct pn544_dev*)dev; mutex_lock(&pn544_dev->read_mutex); irq_gpio_val = gpio_get_value(pn544_dev->irq_gpio); dprintk(PN544_DRV_NAME ":IRQ GPIO = %d\n", irq_gpio_val); if (irq_gpio_val == 0) { pn544_dev->irq_enabled = true; #ifdef READ_IRQ_MODIFY do_reading=0;//DY_TEST #endif enable_irq_wake(pn544_get_irq_pin(pn544_dev)); enable_irq(pn544_get_irq_pin(pn544_dev)); #ifdef READ_IRQ_MODIFY ret = wait_event_interruptible(pn544_dev->read_wq, do_reading); #else ret = wait_event_interruptible(pn544_dev->read_wq, gpio_get_value(pn544_dev->irq_gpio)); #endif pn544_disable_irq(pn544_dev); if(ret){ mutex_unlock(&pn544_dev->read_mutex); goto fail; } } memset(tmp, 0x00, MAX_BUFFER_SIZE); ret = i2c_master_recv(pn544_dev->client, tmp, length); while(tmp[0]==0x51&&tmp[1]==0xFF&&tmp[2]==0xFF){ ret = i2c_master_recv(pn544_dev->client, tmp, length); printk("%s read retry!\n", __func__); } mutex_unlock(&pn544_dev->read_mutex); printk("%s: read data : 0x%X 0x%X 0x%X 0x%X\n", __func__, tmp[0], tmp[1], tmp[2], tmp[3]); if (ret < 0) { dprintk("%s: i2c_master_recv returned %d\n", __func__, ret); return ret; } if (ret > length) { pr_err("%s: received too many bytes from i2c (%d)\n", __func__, ret); return -EIO; } fail: return ret; }
static void pn544_disable_irq(struct pn544_dev *pn544_dev) { unsigned long flags; spin_lock_irqsave(&pn544_dev->irq_enabled_lock, flags); if (pn544_dev->irq_enabled) { disable_irq_nosync(pn544_get_irq_pin(pn544_dev)); // #if !defined(CONFIG_LGE_NFC_HW_QCT_MSM8660)&&!defined(CONFIG_LGE_NFC_HW_QCT_MSM8255) disable_irq_wake(pn544_get_irq_pin(pn544_dev)); #endif pn544_dev->irq_enabled = false; } spin_unlock_irqrestore(&pn544_dev->irq_enabled_lock, flags); }
static void pn544_disable_irq(struct pn544_dev *pn544_dev) { unsigned long flags; spin_lock_irqsave(&pn544_dev->irq_enabled_lock, flags); if (pn544_dev->irq_enabled) { disable_irq_nosync(pn544_get_irq_pin(pn544_dev)); // 20120831, [email protected] Fix to irq interrupt in sleep mode. #if !defined(CONFIG_LGE_NFC_HW_QCT_MSM8660) && !defined(CONFIG_LGE_NFC_HW_QCT_MSM8255) disable_irq_wake(pn544_get_irq_pin(pn544_dev)); #endif pn544_dev->irq_enabled = false; } spin_unlock_irqrestore(&pn544_dev->irq_enabled_lock, flags); }
static void pn544_disable_irq(struct pn544_dev *pn544_dev) { unsigned long flags; spin_lock_irqsave(&pn544_dev->irq_enabled_lock, flags); if (pn544_dev->irq_enabled) { disable_irq_nosync(pn544_get_irq_pin(pn544_dev)); // // // disable_irq_wake(pn544_get_irq_pin(pn544_dev)); //#endif pn544_dev->irq_enabled = false; } spin_unlock_irqrestore(&pn544_dev->irq_enabled_lock, flags); }
static int pn544_probe(struct i2c_client *client, const struct i2c_device_id *id) { int ret; struct pn544_i2c_platform_data *platform_data; struct pn544_dev *pn544_dev = NULL; dprintk(PN544_DRV_NAME ": pn544_probe() start\n"); pn544_client = client; platform_data = client->dev.platform_data; if (platform_data == NULL) { pr_err("%s : nfc probe fail\n", __func__); return -ENODEV; } if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { pr_err("%s : need I2C_FUNC_I2C\n", __func__); return -ENODEV; } ret = gpio_request(platform_data->irq_gpio, "nfc_int"); if (ret) { dprintk(PN544_DRV_NAME ":pn544_probe() : nfc_int request failed!\n"); return -ENODEV; } ret = gpio_request(platform_data->ven_gpio, "nfc_ven"); if (ret) { dprintk(PN544_DRV_NAME ":pn544_probe() : nfc_ven request failed!\n"); goto err_ven; } ret = gpio_request(platform_data->firm_gpio, "nfc_firm"); if (ret) { dprintk(PN544_DRV_NAME ":pn544_probe() : nfc_firm request failed!\n"); goto err_firm; } pn544_dev = kzalloc(sizeof(*pn544_dev), GFP_KERNEL); if (pn544_dev == NULL) { dev_err(&client->dev, "failed to allocate memory for module data\n"); ret = -ENOMEM; goto err_exit; } pn544_dev->irq_gpio = platform_data->irq_gpio; pn544_dev->ven_gpio = platform_data->ven_gpio; pn544_dev->firm_gpio = platform_data->firm_gpio; pn544_dev->client = client; dprintk(PN544_DRV_NAME ":IRQ : %d\nVEN : %d\nFIRM : %d\n", pn544_dev->irq_gpio, pn544_dev->ven_gpio, pn544_dev->firm_gpio); pn544_gpio_enable(pn544_dev); ret = gpio_direction_output(platform_data->ven_gpio,1); ret = gpio_direction_output(platform_data->firm_gpio,0); ret = gpio_direction_input(platform_data->irq_gpio); /* init mutex and queues */ init_waitqueue_head(&pn544_dev->read_wq); mutex_init(&pn544_dev->read_mutex); spin_lock_init(&pn544_dev->irq_enabled_lock); pn544_dev->pn544_device.minor = MISC_DYNAMIC_MINOR; pn544_dev->pn544_device.name = PN544_DRV_NAME; pn544_dev->pn544_device.fops = &pn544_dev_fops; ret = misc_register(&pn544_dev->pn544_device); if (ret) { pr_err("%s : misc_register failed\n", __FILE__); goto err_misc_register; } /* request irq. the irq is set whenever the chip has data available * for reading. it is cleared when all data has been read. */ pr_info("%s : requesting IRQ %d\n", __func__, client->irq); pn544_dev->irq_enabled = true; ret = request_irq(pn544_gpio_to_irq(pn544_dev), pn544_dev_irq_handler, IRQF_TRIGGER_HIGH, client->name, pn544_dev); if (ret) { dev_err(&client->dev, "request_irq failed\n"); goto err_request_irq_failed; } #if !defined(LGE_NFC_HW_QCT_MSM8660)&&!defined(CONFIG_LGE_NFC_HW_QCT_MSM8255) enable_irq_wake(pn544_get_irq_pin(pn544_dev)); #endif pn544_disable_irq(pn544_dev); i2c_set_clientdata(client, pn544_dev); dprintk(PN544_DRV_NAME ": pn544_probe() end\n"); /* */ #ifdef CONFIG_LGE_NFC_MULTICORE_FASTBOOT { struct task_struct *th; th = kthread_create(pn544_factory_standby_set_thread, NULL, "pn544_factory_standby"); if (IS_ERR(th)) { ret = PTR_ERR(th); goto err_request_irq_failed; } wake_up_process(th); } #else pn544_factory_standby_set(); #endif /* */ return 0; err_request_irq_failed: misc_deregister(&pn544_dev->pn544_device); err_misc_register: mutex_destroy(&pn544_dev->read_mutex); kfree(pn544_dev); err_firm: gpio_free(pn544_dev->firm_gpio); err_ven: gpio_free(pn544_dev->ven_gpio); // err_exit: pr_err(PN544_DRV_NAME ": pn544_dev is null\n"); pr_err(PN544_DRV_NAME ": pn544_probe() end with error!\n"); return ret; }
static ssize_t pn544_dev_read(struct file *filp, char __user *buf, size_t count, loff_t *offset) { struct pn544_dev *pn544_dev = filp->private_data; static char tmp[MAX_BUFFER_SIZE]; int ret; int irq_gpio_val = 0; if (count > MAX_BUFFER_SIZE) count = MAX_BUFFER_SIZE; pr_debug("%s : reading %zu bytes.\n", __func__, count); mutex_lock(&pn544_dev->read_mutex); if (!stReadIntFlag) { irq_gpio_val = gpio_get_value(pn544_dev->irq_gpio); dprintk(PN544_DRV_NAME ":IRQ GPIO = %d\n", irq_gpio_val); if (irq_gpio_val == 0) { if (filp->f_flags & O_NONBLOCK) { pr_err(PN544_DRV_NAME ":f_falg has O_NONBLOCK. EAGAIN!\n"); ret = -EAGAIN; goto fail; } pn544_dev->irq_enabled = true; #ifdef LGE_NFC_READ_IRQ_MODIFY do_reading=0;//DY_TEST #endif // #if !defined(LGE_NFC_HW_QCT_MSM8660) enable_irq_wake(pn544_get_irq_pin(pn544_dev)); #endif enable_irq(pn544_get_irq_pin(pn544_dev)); #ifdef LGE_NFC_READ_IRQ_MODIFY ret = wait_event_interruptible(pn544_dev->read_wq, do_reading); #else ret = wait_event_interruptible(pn544_dev->read_wq, gpio_get_value(pn544_dev->irq_gpio)); #endif pn544_disable_irq(pn544_dev); //dprintk(PN544_DRV_NAME ":wait_event_interruptible : %d\n", ret); #ifdef LGE_NFC_READ_IRQ_MODIFY //DY_TEST if(cancle_read == true) { cancle_read = false; ret = -1; goto fail; } #endif if (ret) goto fail; } } /* Read data */ memset(tmp, 0x00, MAX_BUFFER_SIZE); ret = i2c_master_recv(pn544_dev->client, tmp, count); mutex_unlock(&pn544_dev->read_mutex); if (ret < 0) { pr_err("%s: i2c_master_recv returned %d\n", __func__, ret); return ret; } if (ret > count) { pr_err("%s: received too many bytes from i2c (%d)\n", __func__, ret); return -EIO; } if (copy_to_user(buf, tmp, ret)) { pr_warning("%s : failed to copy to user space\n", __func__); return -EFAULT; } return ret; fail: mutex_unlock(&pn544_dev->read_mutex); return ret; }