icE1usb fw: Move handling of device-wide request in usb_dev.c

We have upcoming ones not related to the E1 interface, so really
it make more sense to not have those in usb_e1.c

Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
Change-Id: I686916bb2b2cb90e94ac9c595deab19f189fcd49
diff --git a/firmware/ice40-riscv/icE1usb/Makefile b/firmware/ice40-riscv/icE1usb/Makefile
index 0022bd9..1240a9f 100644
--- a/firmware/ice40-riscv/icE1usb/Makefile
+++ b/firmware/ice40-riscv/icE1usb/Makefile
@@ -50,6 +50,7 @@
 	ice1usb_proto.h \
 	misc.h \
 	usb_desc_ids.h \
+	usb_dev.h \
 	usb_e1.h \
 	usb_str_app.gen.h \
 	$(NULL)
@@ -59,6 +60,7 @@
 	fw_app.c \
 	misc.c \
 	usb_desc_app.c \
+	usb_dev.c \
 	usb_e1.c \
 	$(NULL)
 
diff --git a/firmware/ice40-riscv/icE1usb/fw_app.c b/firmware/ice40-riscv/icE1usb/fw_app.c
index 3fbec7c..41ef3ab 100644
--- a/firmware/ice40-riscv/icE1usb/fw_app.c
+++ b/firmware/ice40-riscv/icE1usb/fw_app.c
@@ -18,6 +18,7 @@
 #include "misc.h"
 #include "mini-printf.h"
 #include "spi.h"
+#include "usb_dev.h"
 #include "usb_e1.h"
 #include "utils.h"
 
@@ -97,6 +98,7 @@
 
 	/* Enable USB directly */
 	usb_init(&app_stack_desc);
+	usb_dev_init();
 	usb_dfu_rt_init();
 	usb_e1_init();
 
diff --git a/firmware/ice40-riscv/icE1usb/usb_dev.c b/firmware/ice40-riscv/icE1usb/usb_dev.c
new file mode 100644
index 0000000..1187047
--- /dev/null
+++ b/firmware/ice40-riscv/icE1usb/usb_dev.c
@@ -0,0 +1,48 @@
+/*
+ * usb_dev.c
+ *
+ * Copyright (C) 2019-2022  Sylvain Munaut <tnt@246tNt.com>
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+#include <stdint.h>
+
+#include <no2usb/usb.h>
+#include <no2usb/usb_proto.h>
+
+#include "console.h"
+#include "misc.h"
+
+#include "ice1usb_proto.h"
+
+
+static enum usb_fnd_resp
+_usb_dev_ctrl_req(struct usb_ctrl_req *req, struct usb_xfer *xfer)
+{
+	/* Check it's a device-wide vendor request */
+	if (USB_REQ_TYPE_RCPT(req) != (USB_REQ_TYPE_VENDOR | USB_REQ_RCPT_DEV))
+		return USB_FND_CONTINUE;
+
+	/* Dispatch / Handle */
+	switch (req->bRequest) {
+	case ICE1USB_DEV_GET_CAPABILITIES:
+		xfer->data[0] = (1 << ICE1USB_DEV_CAP_GPSDO);
+		xfer->len = 1;
+		break;
+	default:
+		return USB_FND_ERROR;
+	}
+
+	return USB_FND_SUCCESS;
+}
+
+
+static struct usb_fn_drv _dev_drv = {
+	.ctrl_req = _usb_dev_ctrl_req,
+};
+
+void
+usb_dev_init(void)
+{
+	usb_register_function_driver(&_dev_drv);
+}
diff --git a/firmware/ice40-riscv/icE1usb/usb_dev.h b/firmware/ice40-riscv/icE1usb/usb_dev.h
new file mode 100644
index 0000000..ca32a46
--- /dev/null
+++ b/firmware/ice40-riscv/icE1usb/usb_dev.h
@@ -0,0 +1,10 @@
+/*
+ * usb_dev.h
+ *
+ * Copyright (C) 2019-2022  Sylvain Munaut <tnt@246tNt.com>
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+#pragma once
+
+void usb_dev_init(void);
diff --git a/firmware/ice40-riscv/icE1usb/usb_e1.c b/firmware/ice40-riscv/icE1usb/usb_e1.c
index 5d32924..6d0d3cf 100644
--- a/firmware/ice40-riscv/icE1usb/usb_e1.c
+++ b/firmware/ice40-riscv/icE1usb/usb_e1.c
@@ -371,13 +371,16 @@
 	return true;
 }
 
-/* per-interface requests */
 static enum usb_fnd_resp
-_e1_ctrl_req_intf(struct usb_ctrl_req *req, struct usb_xfer *xfer)
+_e1_ctrl_req(struct usb_ctrl_req *req, struct usb_xfer *xfer)
 {
 	struct usb_e1_state *usb_e1;
 	int port;
 
+	/* Check it's for an E1 interface */
+	if (USB_REQ_TYPE_RCPT(req) != (USB_REQ_TYPE_VENDOR | USB_REQ_RCPT_INTF))
+		return USB_FND_CONTINUE;
+
 	/* Get matching port (if any) */
 	port = _ifnum2port(req->wIndex);
 	if (port < 0)
@@ -424,42 +427,6 @@
 	return USB_FND_SUCCESS;
 }
 
-/* device-global requests */
-static enum usb_fnd_resp
-_e1_ctrl_req_dev(struct usb_ctrl_req *req, struct usb_xfer *xfer)
-{
-	switch (req->bRequest) {
-	case ICE1USB_DEV_GET_CAPABILITIES:
-		xfer->data[0] = (1 << ICE1USB_DEV_CAP_GPSDO);
-		xfer->len = 1;
-		break;
-	default:
-		return USB_FND_ERROR;
-	}
-
-	return USB_FND_SUCCESS;
-}
-
-
-/* USB host issues a control request to us */
-static enum usb_fnd_resp
-_e1_ctrl_req(struct usb_ctrl_req *req, struct usb_xfer *xfer)
-{
-	if (USB_REQ_TYPE(req) != USB_REQ_TYPE_VENDOR)
-		return USB_FND_CONTINUE;
-
-	switch (USB_REQ_RCPT(req)) {
-	case USB_REQ_RCPT_DEV:
-		return _e1_ctrl_req_dev(req, xfer);
-	case USB_REQ_RCPT_INTF:
-		return _e1_ctrl_req_intf(req, xfer);
-	case USB_REQ_RCPT_EP:
-	case USB_REQ_RCPT_OTHER:
-	default:
-		return USB_FND_ERROR;
-	}
-}
-
 
 static struct usb_fn_drv _e1_drv = {
 	.set_conf	= _e1_set_conf,