0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/module.h>
0009 #include <linux/interrupt.h>
0010 #include <linux/nfc.h>
0011 #include <linux/of_irq.h>
0012 #include <net/nfc/nci.h>
0013 #include <net/nfc/nci_core.h>
0014 #include <linux/spi/spi.h>
0015 #include "nfcmrvl.h"
0016
0017 #define SPI_WAIT_HANDSHAKE 1
0018
0019 struct nfcmrvl_spi_drv_data {
0020 unsigned long flags;
0021 struct spi_device *spi;
0022 struct nci_spi *nci_spi;
0023 struct completion handshake_completion;
0024 struct nfcmrvl_private *priv;
0025 };
0026
0027 static irqreturn_t nfcmrvl_spi_int_irq_thread_fn(int irq, void *drv_data_ptr)
0028 {
0029 struct nfcmrvl_spi_drv_data *drv_data = drv_data_ptr;
0030 struct sk_buff *skb;
0031
0032
0033
0034
0035
0036 if (test_and_clear_bit(SPI_WAIT_HANDSHAKE, &drv_data->flags)) {
0037 complete(&drv_data->handshake_completion);
0038 return IRQ_HANDLED;
0039 }
0040
0041
0042
0043 skb = nci_spi_read(drv_data->nci_spi);
0044 if (!skb) {
0045 nfc_err(&drv_data->spi->dev, "failed to read spi packet");
0046 return IRQ_HANDLED;
0047 }
0048
0049 if (nfcmrvl_nci_recv_frame(drv_data->priv, skb) < 0)
0050 nfc_err(&drv_data->spi->dev, "corrupted RX packet");
0051
0052 return IRQ_HANDLED;
0053 }
0054
0055 static int nfcmrvl_spi_nci_open(struct nfcmrvl_private *priv)
0056 {
0057 return 0;
0058 }
0059
0060 static int nfcmrvl_spi_nci_close(struct nfcmrvl_private *priv)
0061 {
0062 return 0;
0063 }
0064
0065 static int nfcmrvl_spi_nci_send(struct nfcmrvl_private *priv,
0066 struct sk_buff *skb)
0067 {
0068 struct nfcmrvl_spi_drv_data *drv_data = priv->drv_data;
0069 int err;
0070
0071
0072 reinit_completion(&drv_data->handshake_completion);
0073 set_bit(SPI_WAIT_HANDSHAKE, &drv_data->flags);
0074
0075
0076
0077
0078
0079 skb_put(skb, 1);
0080
0081
0082 err = nci_spi_send(drv_data->nci_spi, &drv_data->handshake_completion,
0083 skb);
0084 if (err)
0085 nfc_err(priv->dev, "spi_send failed %d", err);
0086
0087 return err;
0088 }
0089
0090 static void nfcmrvl_spi_nci_update_config(struct nfcmrvl_private *priv,
0091 const void *param)
0092 {
0093 struct nfcmrvl_spi_drv_data *drv_data = priv->drv_data;
0094 const struct nfcmrvl_fw_spi_config *config = param;
0095
0096 drv_data->nci_spi->xfer_speed_hz = config->clk;
0097 }
0098
0099 static const struct nfcmrvl_if_ops spi_ops = {
0100 .nci_open = nfcmrvl_spi_nci_open,
0101 .nci_close = nfcmrvl_spi_nci_close,
0102 .nci_send = nfcmrvl_spi_nci_send,
0103 .nci_update_config = nfcmrvl_spi_nci_update_config,
0104 };
0105
0106 static int nfcmrvl_spi_parse_dt(struct device_node *node,
0107 struct nfcmrvl_platform_data *pdata)
0108 {
0109 int ret;
0110
0111 ret = nfcmrvl_parse_dt(node, pdata);
0112 if (ret < 0) {
0113 pr_err("Failed to get generic entries\n");
0114 return ret;
0115 }
0116
0117 ret = irq_of_parse_and_map(node, 0);
0118 if (!ret) {
0119 pr_err("Unable to get irq\n");
0120 return -EINVAL;
0121 }
0122 pdata->irq = ret;
0123
0124 return 0;
0125 }
0126
0127 static int nfcmrvl_spi_probe(struct spi_device *spi)
0128 {
0129 const struct nfcmrvl_platform_data *pdata;
0130 struct nfcmrvl_platform_data config;
0131 struct nfcmrvl_spi_drv_data *drv_data;
0132 int ret = 0;
0133
0134 drv_data = devm_kzalloc(&spi->dev, sizeof(*drv_data), GFP_KERNEL);
0135 if (!drv_data)
0136 return -ENOMEM;
0137
0138 drv_data->spi = spi;
0139 drv_data->priv = NULL;
0140 spi_set_drvdata(spi, drv_data);
0141
0142 pdata = spi->dev.platform_data;
0143
0144 if (!pdata && spi->dev.of_node)
0145 if (nfcmrvl_spi_parse_dt(spi->dev.of_node, &config) == 0)
0146 pdata = &config;
0147
0148 if (!pdata)
0149 return -EINVAL;
0150
0151 ret = devm_request_threaded_irq(&drv_data->spi->dev, pdata->irq,
0152 NULL, nfcmrvl_spi_int_irq_thread_fn,
0153 IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
0154 "nfcmrvl_spi_int", drv_data);
0155 if (ret < 0) {
0156 nfc_err(&drv_data->spi->dev, "Unable to register IRQ handler");
0157 return -ENODEV;
0158 }
0159
0160 drv_data->priv = nfcmrvl_nci_register_dev(NFCMRVL_PHY_SPI,
0161 drv_data, &spi_ops,
0162 &drv_data->spi->dev,
0163 pdata);
0164 if (IS_ERR(drv_data->priv))
0165 return PTR_ERR(drv_data->priv);
0166
0167 drv_data->priv->support_fw_dnld = true;
0168
0169 drv_data->nci_spi = nci_spi_allocate_spi(drv_data->spi, 0, 10,
0170 drv_data->priv->ndev);
0171
0172
0173 init_completion(&drv_data->handshake_completion);
0174 return 0;
0175 }
0176
0177 static void nfcmrvl_spi_remove(struct spi_device *spi)
0178 {
0179 struct nfcmrvl_spi_drv_data *drv_data = spi_get_drvdata(spi);
0180
0181 nfcmrvl_nci_unregister_dev(drv_data->priv);
0182 }
0183
0184 static const struct of_device_id of_nfcmrvl_spi_match[] __maybe_unused = {
0185 { .compatible = "marvell,nfc-spi", },
0186 {},
0187 };
0188 MODULE_DEVICE_TABLE(of, of_nfcmrvl_spi_match);
0189
0190 static const struct spi_device_id nfcmrvl_spi_id_table[] = {
0191 { "nfcmrvl_spi", 0 },
0192 { }
0193 };
0194 MODULE_DEVICE_TABLE(spi, nfcmrvl_spi_id_table);
0195
0196 static struct spi_driver nfcmrvl_spi_driver = {
0197 .probe = nfcmrvl_spi_probe,
0198 .remove = nfcmrvl_spi_remove,
0199 .id_table = nfcmrvl_spi_id_table,
0200 .driver = {
0201 .name = "nfcmrvl_spi",
0202 .owner = THIS_MODULE,
0203 .of_match_table = of_match_ptr(of_nfcmrvl_spi_match),
0204 },
0205 };
0206
0207 module_spi_driver(nfcmrvl_spi_driver);
0208
0209 MODULE_AUTHOR("Marvell International Ltd.");
0210 MODULE_DESCRIPTION("Marvell NFC-over-SPI driver");
0211 MODULE_LICENSE("GPL v2");