serial: Add non-fileio interface to serial binding

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Change-Id: I86d04368bdb5b2348f947717c1806cbbbdd29b17
diff --git a/serial.c b/serial.c
index 081538f..f673a52 100644
--- a/serial.c
+++ b/serial.c
@@ -12,6 +12,11 @@
 
 #ifdef MCTP_HAVE_FILEIO
 #include <fcntl.h>
+#else
+static const size_t write(int fd, void *buf, size_t len)
+{
+	return -1;
+}
 #endif
 
 #define pr_fmt(x) "serial: " x
@@ -26,6 +31,9 @@
 	int			fd;
 	unsigned long		bus_id;
 
+	mctp_serial_tx_fn	tx_fn;
+	void			*tx_fn_data;
+
 	/* receive buffer and state */
 	uint8_t			rxbuf[1024];
 	struct mctp_pktbuf	*rx_pkt;
@@ -129,7 +137,12 @@
 	tlr->fcs_msb = 0;
 	tlr->fcs_lsb = 0;
 
-	write(serial->fd, serial->txbuf, sizeof(*hdr) + len + sizeof(*tlr));
+	len += sizeof(*hdr) + sizeof(*tlr);
+
+	if (serial->tx_fn)
+		serial->tx_fn(serial->tx_fn_data, serial->txbuf, len);
+	else
+		write(serial->fd, serial->txbuf, len);
 
 	return 0;
 }
@@ -237,8 +250,8 @@
 
 	mctp_prdebug(" -> state: %d", serial->rx_state);
 }
-static void __attribute__((used)) mctp_rx_consume(struct mctp_binding_serial *serial,
-		void *buf, size_t len)
+static void mctp_rx_consume(struct mctp_binding_serial *serial,
+		const void *buf, size_t len)
 {
 	size_t i;
 
@@ -286,6 +299,19 @@
 }
 #endif
 
+void mctp_serial_set_tx_fn(struct mctp_binding_serial *serial,
+		mctp_serial_tx_fn fn, void *data)
+{
+	serial->tx_fn = fn;
+	serial->tx_fn_data = data;
+}
+
+int mctp_serial_rx(struct mctp_binding_serial *serial,
+		const void *buf, size_t len)
+{
+	mctp_rx_consume(serial, buf, len);
+}
+
 void mctp_serial_register_bus(struct mctp_binding_serial *serial,
 		struct mctp *mctp, mctp_eid_t eid)
 {