• Home
  • Raw
  • Download

Lines Matching +full:pn544 +full:- +full:i2c

1 // SPDX-License-Identifier: GPL-2.0-or-later
12 #include <linux/i2c.h>
34 /* Only pn548, pn547 and pn544 are supported */
35 #define CHIP "pn544"
67 spin_lock_irqsave(&pn54x_dev->irq_enabled_lock, flags); in pn54x_disable_irq()
68 if (pn54x_dev->irq_enabled) { in pn54x_disable_irq()
69 disable_irq_nosync(pn54x_dev->client->irq); in pn54x_disable_irq()
70 pn54x_dev->irq_enabled = false; in pn54x_disable_irq()
72 spin_unlock_irqrestore(&pn54x_dev->irq_enabled_lock, flags); in pn54x_disable_irq()
82 wake_up(&pn54x_dev->read_wq); in pn54x_dev_irq_handler()
95 /* -- if the regulators were specified, they're required */ in pn544_enable()
96 if (dev->pvdd_reg) { in pn544_enable()
97 r = regulator_enable(dev->pvdd_reg); in pn544_enable()
103 if (dev->vbat_reg != NULL) { in pn544_enable()
104 r = regulator_enable(dev->vbat_reg); in pn544_enable()
110 if (dev->pmuvcc_reg != NULL) { in pn544_enable()
111 r = regulator_enable(dev->pmuvcc_reg); in pn544_enable()
117 if (dev->sevdd_reg != NULL) { in pn544_enable()
118 r = regulator_enable(dev->sevdd_reg); in pn544_enable()
126 if (gpio_is_valid(dev->firm_gpio)) in pn544_enable()
127 gpio_set_value_cansleep(dev->firm_gpio, 0); in pn544_enable()
128 gpio_set_value_cansleep(dev->ven_gpio, 1); in pn544_enable()
133 gpio_set_value(dev->ven_gpio, 1); in pn544_enable()
135 if (gpio_is_valid(dev->firm_gpio)) { in pn544_enable()
136 gpio_set_value(dev->firm_gpio, 1); in pn544_enable()
142 gpio_set_value(dev->ven_gpio, 0); in pn544_enable()
144 gpio_set_value(dev->ven_gpio, 1); in pn544_enable()
148 return -EINVAL; in pn544_enable()
154 if (dev->pmuvcc_reg) in pn544_enable()
155 regulator_disable(dev->pmuvcc_reg); in pn544_enable()
157 if (dev->vbat_reg) in pn544_enable()
158 regulator_disable(dev->vbat_reg); in pn544_enable()
160 if (dev->pvdd_reg) in pn544_enable()
161 regulator_disable(dev->pvdd_reg); in pn544_enable()
169 if (gpio_is_valid(dev->firm_gpio)) in pn544_disable()
170 gpio_set_value_cansleep(dev->firm_gpio, 0); in pn544_disable()
171 gpio_set_value_cansleep(dev->ven_gpio, 0); in pn544_disable()
174 if (dev->sevdd_reg) in pn544_disable()
175 regulator_disable(dev->sevdd_reg); in pn544_disable()
176 if (dev->pmuvcc_reg) in pn544_disable()
177 regulator_disable(dev->pmuvcc_reg); in pn544_disable()
178 if (dev->vbat_reg) in pn544_disable()
179 regulator_disable(dev->vbat_reg); in pn544_disable()
180 if (dev->pvdd_reg) in pn544_disable()
181 regulator_disable(dev->pvdd_reg); in pn544_disable()
191 struct pn54x_dev *pn54x_dev = filp->private_data; in pn54x_dev_read()
200 mutex_lock(&pn54x_dev->read_mutex); in pn54x_dev_read()
202 if (!gpio_get_value(pn54x_dev->irq_gpio)) { in pn54x_dev_read()
203 if (filp->f_flags & O_NONBLOCK) { in pn54x_dev_read()
204 ret = -EAGAIN; in pn54x_dev_read()
209 pn54x_dev->irq_enabled = true; in pn54x_dev_read()
210 enable_irq(pn54x_dev->client->irq); in pn54x_dev_read()
212 pn54x_dev->read_wq, in pn54x_dev_read()
213 !pn54x_dev->irq_enabled); in pn54x_dev_read()
220 if (gpio_get_value(pn54x_dev->irq_gpio)) in pn54x_dev_read()
228 ret = i2c_master_recv(pn54x_dev->client, tmp, count); in pn54x_dev_read()
230 mutex_unlock(&pn54x_dev->read_mutex); in pn54x_dev_read()
238 pr_err("%s: received too many bytes from i2c (%d)\n", in pn54x_dev_read()
240 return -EIO; in pn54x_dev_read()
244 return -EFAULT; in pn54x_dev_read()
249 mutex_unlock(&pn54x_dev->read_mutex); in pn54x_dev_read()
260 pn54x_dev = filp->private_data; in pn54x_dev_write()
267 return -EFAULT; in pn54x_dev_write()
272 ret = i2c_master_send(pn54x_dev->client, tmp, count); in pn54x_dev_write()
275 ret = -EIO; in pn54x_dev_write()
285 struct pn54x_dev *pn54x_dev = container_of(filp->private_data, in pn54x_dev_open()
288 filp->private_data = pn54x_dev; in pn54x_dev_open()
296 struct pn54x_dev *pn54x_dev = filp->private_data; in pn54x_dev_release()
306 struct pn54x_dev *pn54x_dev = filp->private_data; in pn54x_dev_ioctl()
322 return -EINVAL; in pn54x_dev_ioctl()
327 if (gpio_is_valid(pn54x_dev->clkreq_gpio)) { in pn54x_dev_ioctl()
328 gpio_set_value(pn54x_dev->clkreq_gpio, 1); in pn54x_dev_ioctl()
334 if (gpio_is_valid(pn54x_dev->clkreq_gpio)) { in pn54x_dev_ioctl()
335 gpio_set_value(pn54x_dev->clkreq_gpio, 0); in pn54x_dev_ioctl()
342 return -EINVAL; in pn54x_dev_ioctl()
347 return -EINVAL; in pn54x_dev_ioctl()
378 node = dev->of_node; in pn54x_get_pdata()
380 return -ENODEV; in pn54x_get_pdata()
386 /* ven pin - enable's power to the chip - REQUIRED */ in pn54x_get_pdata()
387 val = of_get_named_gpio_flags(node, "enable-gpios", 0, &flags); in pn54x_get_pdata()
392 pdata->ven_gpio = val; in pn54x_get_pdata()
394 /* firm pin - controls firmware download - OPTIONAL */ in pn54x_get_pdata()
395 val = of_get_named_gpio_flags(node, "firmware-gpios", 0, &flags); in pn54x_get_pdata()
400 pdata->firm_gpio = val; in pn54x_get_pdata()
402 /* irq pin - data available irq - REQUIRED */ in pn54x_get_pdata()
403 val = of_get_named_gpio_flags(node, "interrupt-gpios", 0, &flags); in pn54x_get_pdata()
408 pdata->irq_gpio = val; in pn54x_get_pdata()
410 /* clkreq pin - controls the clock to the PN547 - OPTIONAL */ in pn54x_get_pdata()
411 val = of_get_named_gpio_flags(node, "nxp,pn54x-clkreq", 0, &flags); in pn54x_get_pdata()
416 pdata->clkreq_gpio = val; in pn54x_get_pdata()
418 /* handle the regulator lines - these are optional in pn54x_get_pdata()
419 * PVdd - pad Vdd (544, 547) in pn54x_get_pdata()
420 * Vbat - Battery (544, 547) in pn54x_get_pdata()
421 * PMUVcc - UICC Power (544, 547) in pn54x_get_pdata()
422 * SEVdd - SE Power (544) in pn54x_get_pdata()
429 pdata->pvdd_reg = regulator_get(dev, "nxp,pn54x-pvdd"); in pn54x_get_pdata()
430 if (IS_ERR(pdata->pvdd_reg)) { in pn54x_get_pdata()
431 pr_err("%s: could not get nxp,pn54x-pvdd, rc=%ld\n", __func__, PTR_ERR(pdata->pvdd_reg)); in pn54x_get_pdata()
432 pdata->pvdd_reg = NULL; in pn54x_get_pdata()
435 pdata->vbat_reg = regulator_get(dev, "nxp,pn54x-vbat"); in pn54x_get_pdata()
436 if (IS_ERR(pdata->vbat_reg)) { in pn54x_get_pdata()
437 pr_err("%s: could not get nxp,pn54x-vbat, rc=%ld\n", __func__, PTR_ERR(pdata->vbat_reg)); in pn54x_get_pdata()
438 pdata->vbat_reg = NULL; in pn54x_get_pdata()
441 pdata->pmuvcc_reg = regulator_get(dev, "nxp,pn54x-pmuvcc"); in pn54x_get_pdata()
442 if (IS_ERR(pdata->pmuvcc_reg)) { in pn54x_get_pdata()
443 pr_err("%s: could not get nxp,pn54x-pmuvcc, rc=%ld\n", __func__, PTR_ERR(pdata->pmuvcc_reg)); in pn54x_get_pdata()
444 pdata->pmuvcc_reg = NULL; in pn54x_get_pdata()
447 pdata->sevdd_reg = regulator_get(dev, "nxp,pn54x-sevdd"); in pn54x_get_pdata()
448 if (IS_ERR(pdata->sevdd_reg)) { in pn54x_get_pdata()
449 pr_err("%s: could not get nxp,pn54x-sevdd, rc=%ld\n", __func__, PTR_ERR(pdata->sevdd_reg)); in pn54x_get_pdata()
450 pdata->sevdd_reg = NULL; in pn54x_get_pdata()
458 pdata = dev->platform_data; in pn54x_get_pdata()
475 /* ---- retrieve the platform data ---- */ in pn54x_probe()
478 if (!client->dev.platform_data) { in pn54x_probe()
479 ret = pn54x_get_pdata(&(client->dev), &tmp_pdata); in pn54x_probe()
484 pdata = client->dev.platform_data; in pn54x_probe()
489 return -ENODEV; in pn54x_probe()
492 /* validate the adapter has basic I2C functionality */ in pn54x_probe()
493 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { in pn54x_probe()
495 return -ENODEV; in pn54x_probe()
499 ret = gpio_request(pdata->irq_gpio, "nfc_int"); in pn54x_probe()
502 return -ENODEV; in pn54x_probe()
504 ret = gpio_to_irq(pdata->irq_gpio); in pn54x_probe()
509 client->irq = ret; in pn54x_probe()
512 ret = gpio_request(pdata->ven_gpio, "nfc_ven"); in pn54x_probe()
518 if (gpio_is_valid(pdata->firm_gpio)) { in pn54x_probe()
519 ret = gpio_request(pdata->firm_gpio, "nfc_firm"); in pn54x_probe()
526 if (gpio_is_valid(pdata->clkreq_gpio)) { in pn54x_probe()
527 ret = gpio_request(pdata->clkreq_gpio, "nfc_clkreq"); in pn54x_probe()
537 dev_err(&client->dev, "failed to allocate memory for module data\n"); in pn54x_probe()
538 ret = -ENOMEM; in pn54x_probe()
543 pn54x_dev->irq_gpio = pdata->irq_gpio; in pn54x_probe()
544 pn54x_dev->ven_gpio = pdata->ven_gpio; in pn54x_probe()
545 pn54x_dev->firm_gpio = pdata->firm_gpio; in pn54x_probe()
546 pn54x_dev->clkreq_gpio = pdata->clkreq_gpio; in pn54x_probe()
547 pn54x_dev->pvdd_reg = pdata->pvdd_reg; in pn54x_probe()
548 pn54x_dev->vbat_reg = pdata->vbat_reg; in pn54x_probe()
549 pn54x_dev->pmuvcc_reg = pdata->pmuvcc_reg; in pn54x_probe()
550 pn54x_dev->sevdd_reg = pdata->sevdd_reg; in pn54x_probe()
552 pn54x_dev->client = client; in pn54x_probe()
555 ret = gpio_direction_input(pn54x_dev->irq_gpio); in pn54x_probe()
561 ret = gpio_direction_output(pn54x_dev->ven_gpio, 0); in pn54x_probe()
567 if (gpio_is_valid(pn54x_dev->firm_gpio)) { in pn54x_probe()
568 ret = gpio_direction_output(pn54x_dev->firm_gpio, 0); in pn54x_probe()
576 if (gpio_is_valid(pn54x_dev->clkreq_gpio)) { in pn54x_probe()
577 ret = gpio_direction_output(pn54x_dev->clkreq_gpio, 0); in pn54x_probe()
586 init_waitqueue_head(&pn54x_dev->read_wq); in pn54x_probe()
587 mutex_init(&pn54x_dev->read_mutex); in pn54x_probe()
588 spin_lock_init(&pn54x_dev->irq_enabled_lock); in pn54x_probe()
590 /* register as a misc device - character based with one entry point */ in pn54x_probe()
591 pn54x_dev->pn54x_device.minor = MISC_DYNAMIC_MINOR; in pn54x_probe()
592 pn54x_dev->pn54x_device.name = CHIP; in pn54x_probe()
593 pn54x_dev->pn54x_device.fops = &pn54x_dev_fops; in pn54x_probe()
594 ret = misc_register(&pn54x_dev->pn54x_device); in pn54x_probe()
603 pn54x_dev->irq_enabled = true; in pn54x_probe()
604 ret = request_irq(client->irq, pn54x_dev_irq_handler, in pn54x_probe()
605 IRQF_TRIGGER_HIGH, client->name, pn54x_dev); in pn54x_probe()
607 dev_err(&client->dev, "request_irq failed\n"); in pn54x_probe()
617 misc_deregister(&pn54x_dev->pn54x_device); in pn54x_probe()
622 if (gpio_is_valid(pdata->clkreq_gpio)) in pn54x_probe()
623 gpio_free(pdata->clkreq_gpio); in pn54x_probe()
625 if (gpio_is_valid(pdata->firm_gpio)) in pn54x_probe()
626 gpio_free(pdata->firm_gpio); in pn54x_probe()
628 gpio_free(pdata->ven_gpio); in pn54x_probe()
630 gpio_free(pdata->irq_gpio); in pn54x_probe()
639 free_irq(client->irq, pn54x_dev); in pn54x_remove()
640 misc_deregister(&pn54x_dev->pn54x_device); in pn54x_remove()
641 mutex_destroy(&pn54x_dev->read_mutex); in pn54x_remove()
642 gpio_free(pn54x_dev->irq_gpio); in pn54x_remove()
643 gpio_free(pn54x_dev->ven_gpio); in pn54x_remove()
644 if (gpio_is_valid(pn54x_dev->firm_gpio)) in pn54x_remove()
645 gpio_free(pn54x_dev->firm_gpio); in pn54x_remove()
646 if (gpio_is_valid(pn54x_dev->clkreq_gpio)) in pn54x_remove()
647 gpio_free(pn54x_dev->clkreq_gpio); in pn54x_remove()
648 regulator_put(pn54x_dev->pvdd_reg); in pn54x_remove()
649 regulator_put(pn54x_dev->vbat_reg); in pn54x_remove()
650 regulator_put(pn54x_dev->pmuvcc_reg); in pn54x_remove()
651 regulator_put(pn54x_dev->sevdd_reg); in pn54x_remove()
664 { .compatible = "nxp,pn544", },
675 MODULE_DEVICE_TABLE(i2c, pn54x_id);
683 .name = "pn544",