Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  * Driver for NXP PN533 NFC Chip - I2C transport layer
0004  *
0005  * Copyright (C) 2011 Instituto Nokia de Tecnologia
0006  * Copyright (C) 2012-2013 Tieto Poland
0007  * Copyright (C) 2016 HALE electronic
0008  */
0009 
0010 #include <linux/device.h>
0011 #include <linux/kernel.h>
0012 #include <linux/module.h>
0013 #include <linux/slab.h>
0014 #include <linux/i2c.h>
0015 #include <linux/nfc.h>
0016 #include <linux/netdevice.h>
0017 #include <linux/interrupt.h>
0018 #include <net/nfc/nfc.h>
0019 #include "pn533.h"
0020 
0021 #define VERSION "0.1"
0022 
0023 #define PN533_I2C_DRIVER_NAME "pn533_i2c"
0024 
0025 struct pn533_i2c_phy {
0026     struct i2c_client *i2c_dev;
0027     struct pn533 *priv;
0028 
0029     bool aborted;
0030 
0031     int hard_fault;     /*
0032                  * < 0 if hardware error occurred (e.g. i2c err)
0033                  * and prevents normal operation.
0034                  */
0035 };
0036 
0037 static int pn533_i2c_send_ack(struct pn533 *dev, gfp_t flags)
0038 {
0039     struct pn533_i2c_phy *phy = dev->phy;
0040     struct i2c_client *client = phy->i2c_dev;
0041     static const u8 ack[6] = {0x00, 0x00, 0xff, 0x00, 0xff, 0x00};
0042     /* spec 6.2.1.3:  Preamble, SoPC (2), ACK Code (2), Postamble */
0043 
0044     return i2c_master_send(client, ack, 6);
0045 }
0046 
0047 static int pn533_i2c_send_frame(struct pn533 *dev,
0048                 struct sk_buff *out)
0049 {
0050     struct pn533_i2c_phy *phy = dev->phy;
0051     struct i2c_client *client = phy->i2c_dev;
0052     int rc;
0053 
0054     if (phy->hard_fault != 0)
0055         return phy->hard_fault;
0056 
0057     if (phy->priv == NULL)
0058         phy->priv = dev;
0059 
0060     phy->aborted = false;
0061 
0062     print_hex_dump_debug("PN533_i2c TX: ", DUMP_PREFIX_NONE, 16, 1,
0063                  out->data, out->len, false);
0064 
0065     rc = i2c_master_send(client, out->data, out->len);
0066 
0067     if (rc == -EREMOTEIO) { /* Retry, chip was in power down */
0068         usleep_range(6000, 10000);
0069         rc = i2c_master_send(client, out->data, out->len);
0070     }
0071 
0072     if (rc >= 0) {
0073         if (rc != out->len)
0074             rc = -EREMOTEIO;
0075         else
0076             rc = 0;
0077     }
0078 
0079     return rc;
0080 }
0081 
0082 static void pn533_i2c_abort_cmd(struct pn533 *dev, gfp_t flags)
0083 {
0084     struct pn533_i2c_phy *phy = dev->phy;
0085 
0086     phy->aborted = true;
0087 
0088     /* An ack will cancel the last issued command */
0089     pn533_i2c_send_ack(dev, flags);
0090 
0091     /* schedule cmd_complete_work to finish current command execution */
0092     pn533_recv_frame(phy->priv, NULL, -ENOENT);
0093 }
0094 
0095 static int pn533_i2c_read(struct pn533_i2c_phy *phy, struct sk_buff **skb)
0096 {
0097     struct i2c_client *client = phy->i2c_dev;
0098     int len = PN533_EXT_FRAME_HEADER_LEN +
0099           PN533_STD_FRAME_MAX_PAYLOAD_LEN +
0100           PN533_STD_FRAME_TAIL_LEN + 1;
0101     int r;
0102 
0103     *skb = alloc_skb(len, GFP_KERNEL);
0104     if (*skb == NULL)
0105         return -ENOMEM;
0106 
0107     r = i2c_master_recv(client, skb_put(*skb, len), len);
0108     if (r != len) {
0109         nfc_err(&client->dev, "cannot read. r=%d len=%d\n", r, len);
0110         kfree_skb(*skb);
0111         return -EREMOTEIO;
0112     }
0113 
0114     if (!((*skb)->data[0] & 0x01)) {
0115         nfc_err(&client->dev, "READY flag not set");
0116         kfree_skb(*skb);
0117         return -EBUSY;
0118     }
0119 
0120     /* remove READY byte */
0121     skb_pull(*skb, 1);
0122     /* trim to frame size */
0123     skb_trim(*skb, phy->priv->ops->rx_frame_size((*skb)->data));
0124 
0125     return 0;
0126 }
0127 
0128 static irqreturn_t pn533_i2c_irq_thread_fn(int irq, void *data)
0129 {
0130     struct pn533_i2c_phy *phy = data;
0131     struct sk_buff *skb = NULL;
0132     int r;
0133 
0134     if (!phy || irq != phy->i2c_dev->irq) {
0135         WARN_ON_ONCE(1);
0136         return IRQ_NONE;
0137     }
0138 
0139     if (phy->hard_fault != 0)
0140         return IRQ_HANDLED;
0141 
0142     r = pn533_i2c_read(phy, &skb);
0143     if (r == -EREMOTEIO) {
0144         phy->hard_fault = r;
0145 
0146         pn533_recv_frame(phy->priv, NULL, -EREMOTEIO);
0147 
0148         return IRQ_HANDLED;
0149     } else if ((r == -ENOMEM) || (r == -EBADMSG) || (r == -EBUSY)) {
0150         return IRQ_HANDLED;
0151     }
0152 
0153     if (!phy->aborted)
0154         pn533_recv_frame(phy->priv, skb, 0);
0155 
0156     return IRQ_HANDLED;
0157 }
0158 
0159 static const struct pn533_phy_ops i2c_phy_ops = {
0160     .send_frame = pn533_i2c_send_frame,
0161     .send_ack = pn533_i2c_send_ack,
0162     .abort_cmd = pn533_i2c_abort_cmd,
0163 };
0164 
0165 
0166 static int pn533_i2c_probe(struct i2c_client *client,
0167                    const struct i2c_device_id *id)
0168 {
0169     struct pn533_i2c_phy *phy;
0170     struct pn533 *priv;
0171     int r = 0;
0172 
0173     if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
0174         nfc_err(&client->dev, "Need I2C_FUNC_I2C\n");
0175         return -ENODEV;
0176     }
0177 
0178     phy = devm_kzalloc(&client->dev, sizeof(struct pn533_i2c_phy),
0179                GFP_KERNEL);
0180     if (!phy)
0181         return -ENOMEM;
0182 
0183     phy->i2c_dev = client;
0184     i2c_set_clientdata(client, phy);
0185 
0186     priv = pn53x_common_init(PN533_DEVICE_PN532,
0187                 PN533_PROTO_REQ_ACK_RESP,
0188                 phy, &i2c_phy_ops, NULL,
0189                 &phy->i2c_dev->dev);
0190 
0191     if (IS_ERR(priv))
0192         return PTR_ERR(priv);
0193 
0194     phy->priv = priv;
0195     r = pn532_i2c_nfc_alloc(priv, PN533_NO_TYPE_B_PROTOCOLS, &client->dev);
0196     if (r)
0197         goto nfc_alloc_err;
0198 
0199     r = request_threaded_irq(client->irq, NULL, pn533_i2c_irq_thread_fn,
0200                 IRQF_TRIGGER_FALLING |
0201                 IRQF_SHARED | IRQF_ONESHOT,
0202                 PN533_I2C_DRIVER_NAME, phy);
0203     if (r < 0) {
0204         nfc_err(&client->dev, "Unable to register IRQ handler\n");
0205         goto irq_rqst_err;
0206     }
0207 
0208     r = pn533_finalize_setup(priv);
0209     if (r)
0210         goto fn_setup_err;
0211 
0212     r = nfc_register_device(priv->nfc_dev);
0213     if (r)
0214         goto fn_setup_err;
0215 
0216     return r;
0217 
0218 fn_setup_err:
0219     free_irq(client->irq, phy);
0220 
0221 irq_rqst_err:
0222     nfc_free_device(priv->nfc_dev);
0223 
0224 nfc_alloc_err:
0225     pn53x_common_clean(phy->priv);
0226 
0227     return r;
0228 }
0229 
0230 static int pn533_i2c_remove(struct i2c_client *client)
0231 {
0232     struct pn533_i2c_phy *phy = i2c_get_clientdata(client);
0233 
0234     free_irq(client->irq, phy);
0235 
0236     pn53x_unregister_nfc(phy->priv);
0237     pn53x_common_clean(phy->priv);
0238 
0239     return 0;
0240 }
0241 
0242 static const struct of_device_id of_pn533_i2c_match[] __maybe_unused = {
0243     { .compatible = "nxp,pn532", },
0244     /*
0245      * NOTE: The use of the compatibles with the trailing "...-i2c" is
0246      * deprecated and will be removed.
0247      */
0248     { .compatible = "nxp,pn533-i2c", },
0249     { .compatible = "nxp,pn532-i2c", },
0250     {},
0251 };
0252 MODULE_DEVICE_TABLE(of, of_pn533_i2c_match);
0253 
0254 static const struct i2c_device_id pn533_i2c_id_table[] = {
0255     { PN533_I2C_DRIVER_NAME, 0 },
0256     {}
0257 };
0258 MODULE_DEVICE_TABLE(i2c, pn533_i2c_id_table);
0259 
0260 static struct i2c_driver pn533_i2c_driver = {
0261     .driver = {
0262            .name = PN533_I2C_DRIVER_NAME,
0263            .of_match_table = of_match_ptr(of_pn533_i2c_match),
0264           },
0265     .probe = pn533_i2c_probe,
0266     .id_table = pn533_i2c_id_table,
0267     .remove = pn533_i2c_remove,
0268 };
0269 
0270 module_i2c_driver(pn533_i2c_driver);
0271 
0272 MODULE_AUTHOR("Michael Thalmeier <michael.thalmeier@hale.at>");
0273 MODULE_DESCRIPTION("PN533 I2C driver ver " VERSION);
0274 MODULE_VERSION(VERSION);
0275 MODULE_LICENSE("GPL");