0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include <linux/device.h>
0011 #include <linux/kernel.h>
0012 #include <linux/module.h>
0013 #include <linux/nfc.h>
0014 #include <linux/netdevice.h>
0015 #include <linux/of.h>
0016 #include <linux/serdev.h>
0017 #include "pn533.h"
0018
0019 #define PN532_UART_SKB_BUFF_LEN (PN533_CMD_DATAEXCH_DATA_MAXLEN * 2)
0020
0021 enum send_wakeup {
0022 PN532_SEND_NO_WAKEUP = 0,
0023 PN532_SEND_WAKEUP,
0024 PN532_SEND_LAST_WAKEUP,
0025 };
0026
0027
0028 struct pn532_uart_phy {
0029 struct serdev_device *serdev;
0030 struct sk_buff *recv_skb;
0031 struct pn533 *priv;
0032
0033
0034
0035
0036
0037
0038
0039
0040 enum send_wakeup send_wakeup;
0041 struct timer_list cmd_timeout;
0042 struct sk_buff *cur_out_buf;
0043 };
0044
0045 static int pn532_uart_send_frame(struct pn533 *dev,
0046 struct sk_buff *out)
0047 {
0048
0049 static const u8 wakeup[] = {
0050 0x55, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0051 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
0052 struct pn532_uart_phy *pn532 = dev->phy;
0053 int err;
0054
0055 print_hex_dump_debug("PN532_uart TX: ", DUMP_PREFIX_NONE, 16, 1,
0056 out->data, out->len, false);
0057
0058 pn532->cur_out_buf = out;
0059 if (pn532->send_wakeup) {
0060 err = serdev_device_write(pn532->serdev,
0061 wakeup, sizeof(wakeup),
0062 MAX_SCHEDULE_TIMEOUT);
0063 if (err < 0)
0064 return err;
0065 }
0066
0067 if (pn532->send_wakeup == PN532_SEND_LAST_WAKEUP)
0068 pn532->send_wakeup = PN532_SEND_NO_WAKEUP;
0069
0070 err = serdev_device_write(pn532->serdev, out->data, out->len,
0071 MAX_SCHEDULE_TIMEOUT);
0072 if (err < 0)
0073 return err;
0074
0075 mod_timer(&pn532->cmd_timeout, HZ / 40 + jiffies);
0076 return 0;
0077 }
0078
0079 static int pn532_uart_send_ack(struct pn533 *dev, gfp_t flags)
0080 {
0081
0082 static const u8 ack[PN533_STD_FRAME_ACK_SIZE] = {
0083 0x00, 0x00, 0xff, 0x00, 0xff, 0x00};
0084 struct pn532_uart_phy *pn532 = dev->phy;
0085 int err;
0086
0087 err = serdev_device_write(pn532->serdev, ack, sizeof(ack),
0088 MAX_SCHEDULE_TIMEOUT);
0089 if (err < 0)
0090 return err;
0091
0092 return 0;
0093 }
0094
0095 static void pn532_uart_abort_cmd(struct pn533 *dev, gfp_t flags)
0096 {
0097
0098 pn532_uart_send_ack(dev, flags);
0099
0100 pn533_recv_frame(dev, NULL, -ENOENT);
0101 }
0102
0103 static int pn532_dev_up(struct pn533 *dev)
0104 {
0105 struct pn532_uart_phy *pn532 = dev->phy;
0106 int ret = 0;
0107
0108 ret = serdev_device_open(pn532->serdev);
0109 if (ret)
0110 return ret;
0111
0112 pn532->send_wakeup = PN532_SEND_LAST_WAKEUP;
0113 return ret;
0114 }
0115
0116 static int pn532_dev_down(struct pn533 *dev)
0117 {
0118 struct pn532_uart_phy *pn532 = dev->phy;
0119
0120 serdev_device_close(pn532->serdev);
0121 pn532->send_wakeup = PN532_SEND_WAKEUP;
0122
0123 return 0;
0124 }
0125
0126 static const struct pn533_phy_ops uart_phy_ops = {
0127 .send_frame = pn532_uart_send_frame,
0128 .send_ack = pn532_uart_send_ack,
0129 .abort_cmd = pn532_uart_abort_cmd,
0130 .dev_up = pn532_dev_up,
0131 .dev_down = pn532_dev_down,
0132 };
0133
0134 static void pn532_cmd_timeout(struct timer_list *t)
0135 {
0136 struct pn532_uart_phy *dev = from_timer(dev, t, cmd_timeout);
0137
0138 pn532_uart_send_frame(dev->priv, dev->cur_out_buf);
0139 }
0140
0141
0142
0143
0144
0145
0146
0147
0148 static int pn532_uart_rx_is_frame(struct sk_buff *skb)
0149 {
0150 struct pn533_std_frame *std;
0151 struct pn533_ext_frame *ext;
0152 u16 frame_len;
0153 int i;
0154
0155 for (i = 0; i + PN533_STD_FRAME_ACK_SIZE <= skb->len; i++) {
0156 std = (struct pn533_std_frame *)&skb->data[i];
0157
0158 if (std->start_frame != cpu_to_be16(PN533_STD_FRAME_SOF))
0159 continue;
0160
0161
0162 switch (std->datalen) {
0163 case PN533_FRAME_DATALEN_ACK:
0164 if (std->datalen_checksum == 0xff) {
0165 skb_pull(skb, i);
0166 return 1;
0167 }
0168
0169 break;
0170 case PN533_FRAME_DATALEN_ERROR:
0171 if ((std->datalen_checksum == 0xff) &&
0172 (skb->len >=
0173 PN533_STD_ERROR_FRAME_SIZE)) {
0174 skb_pull(skb, i);
0175 return 1;
0176 }
0177
0178 break;
0179 case PN533_FRAME_DATALEN_EXTENDED:
0180 ext = (struct pn533_ext_frame *)&skb->data[i];
0181 frame_len = be16_to_cpu(ext->datalen);
0182 if (skb->len >= frame_len +
0183 sizeof(struct pn533_ext_frame) +
0184 2 ) {
0185 skb_pull(skb, i);
0186 return 1;
0187 }
0188
0189 break;
0190 default:
0191 frame_len = std->datalen;
0192 if (skb->len >= frame_len +
0193 sizeof(struct pn533_std_frame) +
0194 2 ) {
0195 skb_pull(skb, i);
0196 return 1;
0197 }
0198
0199 break;
0200 }
0201 }
0202
0203 return 0;
0204 }
0205
0206 static int pn532_receive_buf(struct serdev_device *serdev,
0207 const unsigned char *data, size_t count)
0208 {
0209 struct pn532_uart_phy *dev = serdev_device_get_drvdata(serdev);
0210 size_t i;
0211
0212 del_timer(&dev->cmd_timeout);
0213 for (i = 0; i < count; i++) {
0214 skb_put_u8(dev->recv_skb, *data++);
0215 if (!pn532_uart_rx_is_frame(dev->recv_skb))
0216 continue;
0217
0218 pn533_recv_frame(dev->priv, dev->recv_skb, 0);
0219 dev->recv_skb = alloc_skb(PN532_UART_SKB_BUFF_LEN, GFP_KERNEL);
0220 if (!dev->recv_skb)
0221 return 0;
0222 }
0223
0224 return i;
0225 }
0226
0227 static const struct serdev_device_ops pn532_serdev_ops = {
0228 .receive_buf = pn532_receive_buf,
0229 .write_wakeup = serdev_device_write_wakeup,
0230 };
0231
0232 static const struct of_device_id pn532_uart_of_match[] = {
0233 { .compatible = "nxp,pn532", },
0234 {},
0235 };
0236 MODULE_DEVICE_TABLE(of, pn532_uart_of_match);
0237
0238 static int pn532_uart_probe(struct serdev_device *serdev)
0239 {
0240 struct pn532_uart_phy *pn532;
0241 struct pn533 *priv;
0242 int err;
0243
0244 err = -ENOMEM;
0245 pn532 = kzalloc(sizeof(*pn532), GFP_KERNEL);
0246 if (!pn532)
0247 goto err_exit;
0248
0249 pn532->recv_skb = alloc_skb(PN532_UART_SKB_BUFF_LEN, GFP_KERNEL);
0250 if (!pn532->recv_skb)
0251 goto err_free;
0252
0253 pn532->serdev = serdev;
0254 serdev_device_set_drvdata(serdev, pn532);
0255 serdev_device_set_client_ops(serdev, &pn532_serdev_ops);
0256 err = serdev_device_open(serdev);
0257 if (err) {
0258 dev_err(&serdev->dev, "Unable to open device\n");
0259 goto err_skb;
0260 }
0261
0262 err = serdev_device_set_baudrate(serdev, 115200);
0263 if (err != 115200) {
0264 err = -EINVAL;
0265 goto err_serdev;
0266 }
0267
0268 serdev_device_set_flow_control(serdev, false);
0269 pn532->send_wakeup = PN532_SEND_WAKEUP;
0270 timer_setup(&pn532->cmd_timeout, pn532_cmd_timeout, 0);
0271 priv = pn53x_common_init(PN533_DEVICE_PN532_AUTOPOLL,
0272 PN533_PROTO_REQ_ACK_RESP,
0273 pn532, &uart_phy_ops, NULL,
0274 &pn532->serdev->dev);
0275 if (IS_ERR(priv)) {
0276 err = PTR_ERR(priv);
0277 goto err_serdev;
0278 }
0279
0280 pn532->priv = priv;
0281 err = pn533_finalize_setup(pn532->priv);
0282 if (err)
0283 goto err_clean;
0284
0285 serdev_device_close(serdev);
0286 err = pn53x_register_nfc(priv, PN533_NO_TYPE_B_PROTOCOLS, &serdev->dev);
0287 if (err) {
0288 pn53x_common_clean(pn532->priv);
0289 goto err_skb;
0290 }
0291
0292 return err;
0293
0294 err_clean:
0295 pn53x_common_clean(pn532->priv);
0296 err_serdev:
0297 serdev_device_close(serdev);
0298 err_skb:
0299 kfree_skb(pn532->recv_skb);
0300 err_free:
0301 kfree(pn532);
0302 err_exit:
0303 return err;
0304 }
0305
0306 static void pn532_uart_remove(struct serdev_device *serdev)
0307 {
0308 struct pn532_uart_phy *pn532 = serdev_device_get_drvdata(serdev);
0309
0310 pn53x_unregister_nfc(pn532->priv);
0311 serdev_device_close(serdev);
0312 pn53x_common_clean(pn532->priv);
0313 del_timer_sync(&pn532->cmd_timeout);
0314 kfree_skb(pn532->recv_skb);
0315 kfree(pn532);
0316 }
0317
0318 static struct serdev_device_driver pn532_uart_driver = {
0319 .probe = pn532_uart_probe,
0320 .remove = pn532_uart_remove,
0321 .driver = {
0322 .name = "pn532_uart",
0323 .of_match_table = pn532_uart_of_match,
0324 },
0325 };
0326
0327 module_serdev_device_driver(pn532_uart_driver);
0328
0329 MODULE_AUTHOR("Lars Pöschel <poeschel@lemonage.de>");
0330 MODULE_DESCRIPTION("PN532 UART driver");
0331 MODULE_LICENSE("GPL");