static usbd_status assign_all_jacks_automatically(struct umidi_softc *sc) { usbd_status err; int i; struct umidi_jack *out, *in; err = alloc_all_mididevs(sc, max(sc->sc_out_num_jacks, sc->sc_in_num_jacks)); if (err!=USBD_NORMAL_COMPLETION) return err; for (i=0; i<sc->sc_num_mididevs; i++) { out = (i<sc->sc_out_num_jacks) ? &sc->sc_out_jacks[i]:NULL; in = (i<sc->sc_in_num_jacks) ? &sc->sc_in_jacks[i]:NULL; err = bind_jacks_to_mididev(sc, out, in, &sc->sc_mididevs[i]); if (err!=USBD_NORMAL_COMPLETION) { free_all_mididevs(sc); return err; } } return USBD_NORMAL_COMPLETION; }
int umidi_detach(struct device *self, int flags) { struct umidi_softc *sc = (struct umidi_softc *)self; DPRINTFN(1,("%s\n", __func__)); detach_all_mididevs(sc, flags); free_all_mididevs(sc); free_all_jacks(sc); free_all_endpoints(sc); return 0; }
static usbd_status assign_all_jacks_automatically(struct umidi_softc *sc) { usbd_status err; int i; struct umidi_jack *out, *in; const signed char *asg_spec; err = alloc_all_mididevs(sc, max(sc->sc_out_num_jacks, sc->sc_in_num_jacks)); if (err!=USBD_NORMAL_COMPLETION) return err; if ( UMQ_ISTYPE(sc, UMQ_TYPE_MD_FIXED)) asg_spec = umidi_get_quirk_data_from_type(sc->sc_quirk, UMQ_TYPE_MD_FIXED); else asg_spec = NULL; for (i=0; i<sc->sc_num_mididevs; i++) { if ( asg_spec != NULL ) { if ( *asg_spec == -1 ) out = NULL; else out = &sc->sc_out_jacks[*asg_spec]; ++ asg_spec; if ( *asg_spec == -1 ) in = NULL; else in = &sc->sc_in_jacks[*asg_spec]; ++ asg_spec; } else { out = (i<sc->sc_out_num_jacks) ? &sc->sc_out_jacks[i] : NULL; in = (i<sc->sc_in_num_jacks) ? &sc->sc_in_jacks[i] : NULL; } err = bind_jacks_to_mididev(sc, out, in, &sc->sc_mididevs[i]); if (err!=USBD_NORMAL_COMPLETION) { free_all_mididevs(sc); return err; } } return USBD_NORMAL_COMPLETION; }