From 641eca1920c453595651fea10bc5ee5185081880 Mon Sep 17 00:00:00 2001 From: INSUN PYO Date: Tue, 28 Jan 2020 13:20:15 +0900 Subject: [PATCH] Add USB enable/disable handler Change-Id: I2a488ef551a3c92a36cfa428787cdfdd31f82cab (cherry picked from commit 2dbaad820b5f0ca6c9b59ac61c3c14460775f915) --- hw/usb_cfs_client_common.c | 6 ++++++ hw/usb_client_common.c | 19 +++++++++------- hw/usb_gadget.h | 44 +++++++++++++++++++++++--------------- 3 files changed, 44 insertions(+), 25 deletions(-) diff --git a/hw/usb_cfs_client_common.c b/hw/usb_cfs_client_common.c index 03a61d1..99d5923 100644 --- a/hw/usb_cfs_client_common.c +++ b/hw/usb_cfs_client_common.c @@ -838,6 +838,9 @@ static int cfs_enable(struct usb_client *usb) for (i = 0; gadget->funcs[i]; ++i) { func = gadget->funcs[i]; + if (func->handler) + func->handler(1); + if (func->service) (void)systemd_start_unit_wait_started(func->service, ".service", -1); } @@ -867,6 +870,9 @@ static int cfs_disable(struct usb_client *usb) if (func->service) (void)systemd_stop_unit_wait_stopped(func->service, ".service", -1); + + if (func->handler) + func->handler(0); } cfs_free_gadget(gadget); diff --git a/hw/usb_client_common.c b/hw/usb_client_common.c index 2726049..ad1208e 100644 --- a/hw/usb_client_common.c +++ b/hw/usb_client_common.c @@ -463,15 +463,13 @@ static int legacy_set_gadget_strs(struct usb_gadget_strings *strs) */ if (strs->manufacturer) { - ret = sys_set_str(LEGACY_IMANUFACTURER_PATH, - strs->manufacturer); + ret = sys_set_str(LEGACY_IMANUFACTURER_PATH, strs->manufacturer); if (ret) return ret; } if (strs->product) { - ret = sys_set_str(LEGACY_IPRODUCT_PATH, - strs->product); + ret = sys_set_str(LEGACY_IPRODUCT_PATH, strs->product); if (ret) return ret; } @@ -540,13 +538,12 @@ static int legacy_reconfigure_gadget(struct usb_client *usb, static int legacy_enable(struct usb_client *usb) { - int ret; int i; + int ret; struct usb_gadget *gadget; struct usb_function *func; - ret = sys_set_str(LEGACY_ENABLE_PATH, - LEGACY_ENABLE); + ret = sys_set_str(LEGACY_ENABLE_PATH, LEGACY_ENABLE); if (ret < 0) return ret; @@ -557,6 +554,9 @@ static int legacy_enable(struct usb_client *usb) for (i = 0; gadget->funcs[i]; ++i) { func = gadget->funcs[i]; + if (func->handler) + func->handler(1); + /* * Reuse configfs data structure to simplify design. * Configfs has a special service for functionfs. (E.g. sdbd and mtp-responder) @@ -579,8 +579,8 @@ disable_gadget: static int legacy_disable(struct usb_client *usb) { - int ret; int i; + int ret; struct usb_gadget *gadget; struct usb_function *func; @@ -601,6 +601,9 @@ static int legacy_disable(struct usb_client *usb) if (func->ffs_service) (void)systemd_stop_unit_wait_stopped(func->ffs_service, ".service", -1); + + if (func->handler) + func->handler(0); } ret = sys_set_str(LEGACY_ENABLE_PATH, LEGACY_DISABLE); diff --git a/hw/usb_gadget.h b/hw/usb_gadget.h index 629504a..8533228 100644 --- a/hw/usb_gadget.h +++ b/hw/usb_gadget.h @@ -50,6 +50,13 @@ /* Function IDX in array is number of trailing zeros */ #define FUNC_IDX_FROM_MASK(mask) _HELPER_CTZ(mask) +/* + * legacy enable : enable gadget -> handler(1) -> ffs_service start -> service start + * legacy disable : service stop -> ffs_service stop -> handler(0) -> disable gadget + * + * configfs enable : ffs_service start -> enable gadget -> handler(1) -> service start + * configfs disable : service stop -> handler(0) -> disable gadget (ffs_service is never stopped until changing usb mode) + */ struct usb_function { int id; const char *name; @@ -58,6 +65,8 @@ struct usb_function { const char *ffs_service; /* only used in configfs */ const char *service; + void (*handler)(int enable); + int (*clone)(struct usb_function *func, struct usb_function **_clone); void (*free_func)(struct usb_function *func); }; @@ -156,25 +165,26 @@ out_nomem: return -ENOMEM; } -#define DEFINE_USB_FUNCTION(_id, _name, _ffs_service, _service) \ - static struct usb_function _##_name##_function = { \ - .id = _id, \ - .name = #_name, \ - .instance = "default", \ - .ffs_service = _ffs_service, \ - .service = _service, \ - .clone = clone_simple_func, \ - .free_func = free_simple_func, \ +#define DEFINE_USB_FUNCTION(_id, _name, _ffs_service, _service, _handler) \ + static struct usb_function _##_name##_function = { \ + .id = _id, \ + .name = #_name, \ + .instance = "default", \ + .ffs_service = _ffs_service, \ + .service = _service, \ + .handler = _handler, \ + .clone = clone_simple_func, \ + .free_func = free_simple_func, \ } -DEFINE_USB_FUNCTION(USB_FUNCTION_DIAG, diag, NULL, NULL); -DEFINE_USB_FUNCTION(USB_FUNCTION_RMNET, rmnet, NULL, NULL); -DEFINE_USB_FUNCTION(USB_FUNCTION_DM, dm, NULL, NULL); -DEFINE_USB_FUNCTION(USB_FUNCTION_CONN_GADGET, conn_gadget, NULL, NULL); -DEFINE_USB_FUNCTION(USB_FUNCTION_SDB, sdb, "sdbd", NULL); -DEFINE_USB_FUNCTION(USB_FUNCTION_MTP, mtp, "mtp-responder", NULL); -DEFINE_USB_FUNCTION(USB_FUNCTION_ACM, acm, NULL, "data-router"); -DEFINE_USB_FUNCTION(USB_FUNCTION_RNDIS, rndis, NULL, "rndis"); +DEFINE_USB_FUNCTION(USB_FUNCTION_DIAG, diag, NULL, NULL, NULL); +DEFINE_USB_FUNCTION(USB_FUNCTION_RMNET, rmnet, NULL, NULL, NULL); +DEFINE_USB_FUNCTION(USB_FUNCTION_DM, dm, NULL, NULL, NULL); +DEFINE_USB_FUNCTION(USB_FUNCTION_CONN_GADGET, conn_gadget, NULL, NULL, NULL); +DEFINE_USB_FUNCTION(USB_FUNCTION_SDB, sdb, "sdbd", NULL, NULL); +DEFINE_USB_FUNCTION(USB_FUNCTION_MTP, mtp, "mtp-responder", NULL, NULL); +DEFINE_USB_FUNCTION(USB_FUNCTION_ACM, acm, NULL, "data-router", NULL); +DEFINE_USB_FUNCTION(USB_FUNCTION_RNDIS, rndis, NULL, "rndis", NULL); #undef DEFINE_USB_FUNCTION #define MAKE_FUNC_AVAILABLE(_name, _vname) \ -- 2.34.1