Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9961127d authored by Vincent Cuissard's avatar Vincent Cuissard Committed by Samuel Ortiz
Browse files

NFC: nci: add generic uart support



Some NFC controller supports UART as host interface.
As with SPI, a lot of code can be shared between vendor
drivers. This patch add the generic support of UART and
provides some extension API for vendor specific needs.

This code is strongly inspired by the Bluetooth HCI ldisc
implementation. NCI UART vendor drivers will have to register
themselves to this layer via nci_uart_register.

Underlying tty will have to be configured from user land
thanks to an ioctl.

Signed-off-by: default avatarVincent Cuissard <cuissard@marvell.com>
Signed-off-by: default avatarSamuel Ortiz <sameo@linux.intel.com>
parent 4a2b947f
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@
#define NCI_MAX_NUM_RF_CONFIGS					10
#define NCI_MAX_NUM_CONN					10
#define NCI_MAX_PARAM_LEN					251
#define NCI_MAX_PACKET_SIZE					258

/* NCI Status Codes */
#define NCI_STATUS_OK						0x00
+47 −0
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@

#include <linux/interrupt.h>
#include <linux/skbuff.h>
#include <linux/tty.h>

#include <net/nfc/nfc.h>
#include <net/nfc/nci.h>
@@ -391,4 +392,50 @@ int nci_spi_send(struct nci_spi *nspi,
		 struct sk_buff *skb);
struct sk_buff *nci_spi_read(struct nci_spi *nspi);

/* ----- NCI UART ---- */

/* Ioctl */
#define NCIUARTSETDRIVER	_IOW('U', 0, char *)

enum nci_uart_driver {
	NCI_UART_DRIVER_MARVELL = 0,
	NCI_UART_DRIVER_MAX
};

struct nci_uart;

struct nci_uart_ops {
	int (*open)(struct nci_uart *nci_uart);
	void (*close)(struct nci_uart *nci_uart);
	int (*recv)(struct nci_uart *nci_uart, struct sk_buff *skb);
	int (*recv_buf)(struct nci_uart *nci_uart, const u8 *data, char *flags,
			int count);
	int (*send)(struct nci_uart *nci_uart, struct sk_buff *skb);
	void (*tx_start)(struct nci_uart *nci_uart);
	void (*tx_done)(struct nci_uart *nci_uart);
};

struct nci_uart {
	struct module		*owner;
	struct nci_uart_ops	ops;
	const char		*name;
	enum nci_uart_driver	driver;

	/* Dynamic data */
	struct nci_dev		*ndev;
	spinlock_t		rx_lock;
	struct work_struct	write_work;
	struct tty_struct	*tty;
	unsigned long		tx_state;
	struct sk_buff_head	tx_q;
	struct sk_buff		*tx_skb;
	struct sk_buff		*rx_skb;
	int			rx_packet_len;
	void			*drv_data;
};

int nci_uart_register(struct nci_uart *nu);
void nci_uart_unregister(struct nci_uart *nu);
void nci_uart_set_config(struct nci_uart *nu, int baudrate, int flow_ctrl);

#endif /* __NCI_CORE_H */
+1 −0
Original line number Diff line number Diff line
@@ -34,5 +34,6 @@
#define N_TI_WL		22	/* for TI's WL BT, FM, GPS combo chips */
#define N_TRACESINK	23	/* Trace data routing for MIPI P1149.7 */
#define N_TRACEROUTER	24	/* Trace data routing for MIPI P1149.7 */
#define N_NCI		25	/* NFC NCI UART */

#endif /* _UAPI_LINUX_TTY_H */
+7 −0
Original line number Diff line number Diff line
@@ -19,3 +19,10 @@ config NFC_NCI_SPI
	  an NFC Controller (NFCC) and a Device Host (DH).

	  Say yes if you use an NCI driver that requires SPI link layer.

config NFC_NCI_UART
	depends on NFC_NCI && TTY
	tristate "NCI over UART protocol support"
	default n
	help
	  Say yes if you use an NCI driver that requires UART link layer.
+3 −0
Original line number Diff line number Diff line
@@ -7,3 +7,6 @@ obj-$(CONFIG_NFC_NCI) += nci.o
nci-objs := core.o data.o lib.o ntf.o rsp.o hci.o

nci-$(CONFIG_NFC_NCI_SPI) += spi.o

nci_uart-y += uart.o
obj-$(CONFIG_NFC_NCI_UART) += nci_uart.o
Loading