.. | .. |
---|
97 | 97 | module_param(n_ports, uint, 0); |
---|
98 | 98 | MODULE_PARM_DESC(n_ports, "number of ports to create, default=1"); |
---|
99 | 99 | |
---|
| 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 | + |
---|
100 | 130 | /*-------------------------------------------------------------------------*/ |
---|
101 | 131 | |
---|
102 | 132 | static struct usb_configuration serial_config_driver = { |
---|
.. | .. |
---|
240 | 270 | .unbind = gs_unbind, |
---|
241 | 271 | }; |
---|
242 | 272 | |
---|
| 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 | + |
---|
243 | 286 | static int __init init(void) |
---|
244 | 287 | { |
---|
245 | 288 | /* We *could* export two configs; that'd be much cleaner... |
---|
.. | .. |
---|
266 | 309 | } |
---|
267 | 310 | strings_dev[STRING_DESCRIPTION_IDX].s = serial_config_driver.label; |
---|
268 | 311 | |
---|
| 312 | + if (!enable) |
---|
| 313 | + return 0; |
---|
| 314 | + |
---|
269 | 315 | return usb_composite_probe(&gserial_driver); |
---|
270 | 316 | } |
---|
271 | 317 | module_init(init); |
---|
272 | 318 | |
---|
273 | 319 | static void __exit cleanup(void) |
---|
274 | 320 | { |
---|
275 | | - usb_composite_unregister(&gserial_driver); |
---|
| 321 | + if (enable) |
---|
| 322 | + usb_composite_unregister(&gserial_driver); |
---|
276 | 323 | } |
---|
277 | 324 | module_exit(cleanup); |
---|