static void pn547_disable_irq(struct pn547_dev *pn547_dev) { unsigned long flags; spin_lock_irqsave(&pn547_dev->irq_enabled_lock, flags); if (pn547_dev->irq_enabled) { disable_irq_nosync(pn547_get_irq_pin(pn547_dev)); disable_irq_wake(pn547_get_irq_pin(pn547_dev)); pn547_dev->irq_enabled = false; } spin_unlock_irqrestore(&pn547_dev->irq_enabled_lock, flags); }
static void pn547_disable_irq(struct pn547_dev *pn547_dev) { unsigned long flags; spin_lock_irqsave(&pn547_dev->irq_enabled_lock, flags); if (pn547_dev->irq_enabled) { disable_irq_nosync(pn547_get_irq_pin(pn547_dev)); disable_irq_wake(pn547_get_irq_pin(pn547_dev)); pn547_dev->irq_enabled = false; pr_debug(PN547_DRV_NAME ":%s disable IRQ\n", __func__); } else { pr_debug("%s IRQ is already disabled!\n", __func__); } spin_unlock_irqrestore(&pn547_dev->irq_enabled_lock, flags); }
static int pn547_probe(struct i2c_client *client, const struct i2c_device_id *id) { int ret; struct pn547_dev *pn547_dev = NULL; pn547_client = client; pr_info(PN547_DRV_NAME ": pn547_probe() start\n"); pn547_dev = kzalloc(sizeof(*pn547_dev), GFP_KERNEL); if (pn547_dev == NULL) { dev_err(&client->dev, "failed to allocate memory for module data\n"); ret = -ENOMEM; goto err_exit; } pn547_parse_dt(&client->dev, pn547_dev); pn547_dev->client = client; pr_info(PN547_DRV_NAME ":IRQ : %d\nVEN : %d\nFIRM : %d\n", pn547_dev->irq_gpio, pn547_dev->ven_gpio, pn547_dev->firm_gpio); ret = gpio_request(pn547_dev->irq_gpio, "nfc_int"); if (ret) { pr_info(PN547_DRV_NAME ":pn547_probe() : nfc_int request failed!\n"); goto err_int; } ret = gpio_request(pn547_dev->ven_gpio, "nfc_ven"); if (ret) { pr_info(PN547_DRV_NAME ":pn547_probe() : nfc_ven request failed!\n"); goto err_ven; } ret = gpio_request(pn547_dev->firm_gpio, "nfc_firm"); if (ret) { pr_info(PN547_DRV_NAME ":pn547_probe() : nfc_firm request failed!\n"); goto err_firm; } pn547_gpio_enable(pn547_dev); ret = gpio_direction_output(pn547_dev->ven_gpio,0); ret = gpio_direction_output(pn547_dev->firm_gpio,0); ret = gpio_direction_input(pn547_dev->irq_gpio); #ifdef CONFIG_LGE_NFC_USE_PMIC pn547_get_clk_source(pn547_client, pn547_dev); #endif /* init mutex and queues */ init_waitqueue_head(&pn547_dev->read_wq); mutex_init(&pn547_dev->read_mutex); spin_lock_init(&pn547_dev->irq_enabled_lock); pn547_dev->pn547_device.minor = MISC_DYNAMIC_MINOR; pn547_dev->pn547_device.name = PN547_DRV_NAME; pn547_dev->pn547_device.fops = &pn547_dev_fops; ret = misc_register(&pn547_dev->pn547_device); if (ret) { pr_err("%s : misc_register failed\n", __FILE__); goto err_misc_register; } wake_lock_init(&nfc_wake_lock, WAKE_LOCK_SUSPEND, "NFCWAKE"); /* 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); pn547_dev->irq_enabled = true; ret = request_irq(pn547_gpio_to_irq(pn547_dev), pn547_dev_irq_handler, IRQF_TRIGGER_RISING|IRQF_NO_SUSPEND, client->name, pn547_dev); if (ret) { dev_err(&client->dev, "request_irq failed\n"); goto err_request_irq_failed; } enable_irq_wake(pn547_get_irq_pin(pn547_dev)); pn547_disable_irq(pn547_dev); i2c_set_clientdata(client, pn547_dev); pr_info(PN547_DRV_NAME ": pn547_probe() end\n"); return 0; err_request_irq_failed: misc_deregister(&pn547_dev->pn547_device); err_misc_register: mutex_destroy(&pn547_dev->read_mutex); gpio_free(pn547_dev->firm_gpio); err_firm: gpio_free(pn547_dev->ven_gpio); err_ven: gpio_free(pn547_dev->irq_gpio); err_int: kfree(pn547_dev); err_exit: pr_err(PN547_DRV_NAME ": pn547_dev is null\n"); pr_err(PN547_DRV_NAME ": pn547_probe() end with error!\n"); return ret; }