Which *_process_message() function (if any) to call when data is received is known at initialization. Add a function pointer to the `usb_line6' struct and use to call into the appropriate logic instead of evaluating the conditional logic for each message. Signed-off-by: Chris Rorvick <chris@xxxxxxxxxxx> --- drivers/staging/line6/driver.c | 33 ++------------------------------- drivers/staging/line6/driver.h | 2 ++ drivers/staging/line6/pod.c | 4 +++- drivers/staging/line6/pod.h | 1 - drivers/staging/line6/variax.c | 4 +++- drivers/staging/line6/variax.h | 1 - 6 files changed, 10 insertions(+), 35 deletions(-) diff --git a/drivers/staging/line6/driver.c b/drivers/staging/line6/driver.c index 369e60e..f7629cb 100644 --- a/drivers/staging/line6/driver.c +++ b/drivers/staging/line6/driver.c @@ -537,37 +537,8 @@ static void line6_data_received(struct urb *urb) line6->message_length = done; line6_midi_receive(line6, line6->buffer_message, done); - switch (line6->type) { - case LINE6_BASSPODXT: - case LINE6_BASSPODXTLIVE: - case LINE6_BASSPODXTPRO: - case LINE6_PODXT: - case LINE6_PODXTPRO: - case LINE6_POCKETPOD: - line6_pod_process_message(line6); - break; - - case LINE6_PODHD300: - case LINE6_PODHD400: - case LINE6_PODHD500_0: - case LINE6_PODHD500_1: - break; /* let userspace handle MIDI */ - - case LINE6_PODXTLIVE_POD: - line6_pod_process_message(line6); - break; - - case LINE6_PODXTLIVE_VARIAX: - line6_variax_process_message(line6); - break; - - case LINE6_VARIAX: - line6_variax_process_message(line6); - break; - - default: - MISSING_CASE; - } + if (line6->process_message) + line6->process_message(line6); } line6_start_listen(line6); diff --git a/drivers/staging/line6/driver.h b/drivers/staging/line6/driver.h index a4bde71..220813f 100644 --- a/drivers/staging/line6/driver.h +++ b/drivers/staging/line6/driver.h @@ -194,6 +194,8 @@ struct usb_line6 { Length of message to be processed. */ int message_length; + + void (*process_message)(struct usb_line6 *); }; extern char *line6_alloc_sysex_buffer(struct usb_line6 *line6, int code1, diff --git a/drivers/staging/line6/pod.c b/drivers/staging/line6/pod.c index aa8977d..79dcff4 100644 --- a/drivers/staging/line6/pod.c +++ b/drivers/staging/line6/pod.c @@ -131,7 +131,7 @@ static char *pod_alloc_sysex_buffer(struct usb_line6_pod *pod, int code, /* Process a completely received message. */ -void line6_pod_process_message(struct usb_line6 *line6) +static void line6_pod_process_message(struct usb_line6 *line6) { struct usb_line6_pod *pod = (struct usb_line6_pod *) line6; const unsigned char *buf = pod->line6.buffer_message; @@ -359,6 +359,8 @@ static int pod_try_init(struct usb_interface *interface, int err; struct usb_line6_pod *pod = (struct usb_line6_pod *) line6; + line6->process_message = line6_pod_process_message; + init_timer(&pod->startup_timer); INIT_WORK(&pod->startup_work, pod_startup4); diff --git a/drivers/staging/line6/pod.h b/drivers/staging/line6/pod.h index 984a00b..0d78ca7 100644 --- a/drivers/staging/line6/pod.h +++ b/drivers/staging/line6/pod.h @@ -89,6 +89,5 @@ struct usb_line6_pod { extern void line6_pod_disconnect(struct usb_interface *interface); extern int line6_pod_init(struct usb_interface *interface, struct usb_line6 *line6); -extern void line6_pod_process_message(struct usb_line6 *line6); #endif diff --git a/drivers/staging/line6/variax.c b/drivers/staging/line6/variax.c index 4d41994..ccb1f68 100644 --- a/drivers/staging/line6/variax.c +++ b/drivers/staging/line6/variax.c @@ -130,7 +130,7 @@ static void variax_startup6(struct work_struct *work) /* Process a completely received message. */ -void line6_variax_process_message(struct usb_line6 *line6) +static void line6_variax_process_message(struct usb_line6 *line6) { struct usb_line6_variax *variax = (struct usb_line6_variax *) line6; const unsigned char *buf = variax->line6.buffer_message; @@ -180,6 +180,8 @@ static int variax_try_init(struct usb_interface *interface, struct usb_line6_variax *variax = (struct usb_line6_variax *) line6; int err; + line6->process_message = line6_variax_process_message; + init_timer(&variax->startup_timer1); init_timer(&variax->startup_timer2); INIT_WORK(&variax->startup_work, variax_startup6); diff --git a/drivers/staging/line6/variax.h b/drivers/staging/line6/variax.h index 7d445ff..f21ff20 100644 --- a/drivers/staging/line6/variax.h +++ b/drivers/staging/line6/variax.h @@ -67,6 +67,5 @@ struct usb_line6_variax { extern void line6_variax_disconnect(struct usb_interface *interface); extern int line6_variax_init(struct usb_interface *interface, struct usb_line6 *line6); -extern void line6_variax_process_message(struct usb_line6 *line6); #endif -- 2.1.0 _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel