Lines Matching +full:spi +full:- +full:slave
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Marvell NFC-over-SPI driver: SPI interface related functions
14 #include <linux/spi/spi.h>
21 struct spi_device *spi; member
36 if (test_and_clear_bit(SPI_WAIT_HANDSHAKE, &drv_data->flags)) { in nfcmrvl_spi_int_irq_thread_fn()
37 complete(&drv_data->handshake_completion); in nfcmrvl_spi_int_irq_thread_fn()
41 /* Normal case, SPI_INT deasserted by slave to trigger a master read */ in nfcmrvl_spi_int_irq_thread_fn()
43 skb = nci_spi_read(drv_data->nci_spi); in nfcmrvl_spi_int_irq_thread_fn()
45 nfc_err(&drv_data->spi->dev, "failed to read spi packet"); in nfcmrvl_spi_int_irq_thread_fn()
49 if (nfcmrvl_nci_recv_frame(drv_data->priv, skb) < 0) in nfcmrvl_spi_int_irq_thread_fn()
50 nfc_err(&drv_data->spi->dev, "corrupted RX packet"); in nfcmrvl_spi_int_irq_thread_fn()
68 struct nfcmrvl_spi_drv_data *drv_data = priv->drv_data; in nfcmrvl_spi_nci_send()
71 /* Reinit completion for slave handshake */ in nfcmrvl_spi_nci_send()
72 reinit_completion(&drv_data->handshake_completion); in nfcmrvl_spi_nci_send()
73 set_bit(SPI_WAIT_HANDSHAKE, &drv_data->flags); in nfcmrvl_spi_nci_send()
76 * Append a dummy byte at the end of SPI frame. This is due to a in nfcmrvl_spi_nci_send()
81 /* Send the SPI packet */ in nfcmrvl_spi_nci_send()
82 err = nci_spi_send(drv_data->nci_spi, &drv_data->handshake_completion, in nfcmrvl_spi_nci_send()
85 nfc_err(priv->dev, "spi_send failed %d", err); in nfcmrvl_spi_nci_send()
93 struct nfcmrvl_spi_drv_data *drv_data = priv->drv_data; in nfcmrvl_spi_nci_update_config()
96 drv_data->nci_spi->xfer_speed_hz = config->clk; in nfcmrvl_spi_nci_update_config()
120 return -EINVAL; in nfcmrvl_spi_parse_dt()
122 pdata->irq = ret; in nfcmrvl_spi_parse_dt()
127 static int nfcmrvl_spi_probe(struct spi_device *spi) in nfcmrvl_spi_probe() argument
134 drv_data = devm_kzalloc(&spi->dev, sizeof(*drv_data), GFP_KERNEL); in nfcmrvl_spi_probe()
136 return -ENOMEM; in nfcmrvl_spi_probe()
138 drv_data->spi = spi; in nfcmrvl_spi_probe()
139 drv_data->priv = NULL; in nfcmrvl_spi_probe()
140 spi_set_drvdata(spi, drv_data); in nfcmrvl_spi_probe()
142 pdata = spi->dev.platform_data; in nfcmrvl_spi_probe()
144 if (!pdata && spi->dev.of_node) in nfcmrvl_spi_probe()
145 if (nfcmrvl_spi_parse_dt(spi->dev.of_node, &config) == 0) in nfcmrvl_spi_probe()
149 return -EINVAL; in nfcmrvl_spi_probe()
151 ret = devm_request_threaded_irq(&drv_data->spi->dev, pdata->irq, in nfcmrvl_spi_probe()
156 nfc_err(&drv_data->spi->dev, "Unable to register IRQ handler"); in nfcmrvl_spi_probe()
157 return -ENODEV; in nfcmrvl_spi_probe()
160 drv_data->priv = nfcmrvl_nci_register_dev(NFCMRVL_PHY_SPI, in nfcmrvl_spi_probe()
162 &drv_data->spi->dev, in nfcmrvl_spi_probe()
164 if (IS_ERR(drv_data->priv)) in nfcmrvl_spi_probe()
165 return PTR_ERR(drv_data->priv); in nfcmrvl_spi_probe()
167 drv_data->priv->support_fw_dnld = true; in nfcmrvl_spi_probe()
169 drv_data->nci_spi = nci_spi_allocate_spi(drv_data->spi, 0, 10, in nfcmrvl_spi_probe()
170 drv_data->priv->ndev); in nfcmrvl_spi_probe()
172 /* Init completion for slave handshake */ in nfcmrvl_spi_probe()
173 init_completion(&drv_data->handshake_completion); in nfcmrvl_spi_probe()
177 static void nfcmrvl_spi_remove(struct spi_device *spi) in nfcmrvl_spi_remove() argument
179 struct nfcmrvl_spi_drv_data *drv_data = spi_get_drvdata(spi); in nfcmrvl_spi_remove()
181 nfcmrvl_nci_unregister_dev(drv_data->priv); in nfcmrvl_spi_remove()
185 { .compatible = "marvell,nfc-spi", },
194 MODULE_DEVICE_TABLE(spi, nfcmrvl_spi_id_table);
209 MODULE_DESCRIPTION("Marvell NFC-over-SPI driver");