hc
2023-12-06 08f87f769b595151be1afeff53e144f543faa614
kernel/drivers/usb/gadget/legacy/serial.c
....@@ -97,6 +97,36 @@
9797 module_param(n_ports, uint, 0);
9898 MODULE_PARM_DESC(n_ports, "number of ports to create, default=1");
9999
100
+static bool enable = true;
101
+
102
+static int switch_gserial_enable(bool do_enable);
103
+
104
+static int enable_set(const char *s, const struct kernel_param *kp)
105
+{
106
+ bool do_enable;
107
+ int ret;
108
+
109
+ if (!s) /* called for no-arg enable == default */
110
+ return 0;
111
+
112
+ ret = strtobool(s, &do_enable);
113
+ if (ret || enable == do_enable)
114
+ return ret;
115
+
116
+ ret = switch_gserial_enable(do_enable);
117
+ if (!ret)
118
+ enable = do_enable;
119
+
120
+ return ret;
121
+}
122
+
123
+static const struct kernel_param_ops enable_ops = {
124
+ .set = enable_set,
125
+ .get = param_get_bool,
126
+};
127
+
128
+module_param_cb(enable, &enable_ops, &enable, 0644);
129
+
100130 /*-------------------------------------------------------------------------*/
101131
102132 static struct usb_configuration serial_config_driver = {
....@@ -240,6 +270,19 @@
240270 .unbind = gs_unbind,
241271 };
242272
273
+static int switch_gserial_enable(bool do_enable)
274
+{
275
+ if (!serial_config_driver.label)
276
+ /* init() was not called, yet */
277
+ return 0;
278
+
279
+ if (do_enable)
280
+ return usb_composite_probe(&gserial_driver);
281
+
282
+ usb_composite_unregister(&gserial_driver);
283
+ return 0;
284
+}
285
+
243286 static int __init init(void)
244287 {
245288 /* We *could* export two configs; that'd be much cleaner...
....@@ -266,12 +309,16 @@
266309 }
267310 strings_dev[STRING_DESCRIPTION_IDX].s = serial_config_driver.label;
268311
312
+ if (!enable)
313
+ return 0;
314
+
269315 return usb_composite_probe(&gserial_driver);
270316 }
271317 module_init(init);
272318
273319 static void __exit cleanup(void)
274320 {
275
- usb_composite_unregister(&gserial_driver);
321
+ if (enable)
322
+ usb_composite_unregister(&gserial_driver);
276323 }
277324 module_exit(cleanup);