diff --git a/input/common/hid/device_ds3.c b/input/common/hid/device_ds3.c index 365d945b2e..bd4d6a1ad4 100644 --- a/input/common/hid/device_ds3.c +++ b/input/common/hid/device_ds3.c @@ -192,8 +192,10 @@ static void ds3_free(void *data) { ds3_instance_t *instance = (ds3_instance_t *)data; - if(instance) + if(instance) { + hid_pad_deregister(instance->pad); free(instance); + } } static void ds3_handle_packet(void *data, uint8_t *packet, size_t size) diff --git a/input/common/hid/device_ds4.c b/input/common/hid/device_ds4.c index b334a13233..af923cee13 100644 --- a/input/common/hid/device_ds4.c +++ b/input/common/hid/device_ds4.c @@ -63,8 +63,10 @@ static void ds4_free(void *data) { ds4_instance_t *instance = (ds4_instance_t *)data; - if(instance) + if(instance) { + hid_pad_deregister(instance->pad); free(instance); + } } static void ds4_handle_packet(void *data, uint8_t *buffer, size_t size) diff --git a/input/common/hid/device_null.c b/input/common/hid/device_null.c index 96d99f5f74..783c615924 100644 --- a/input/common/hid/device_null.c +++ b/input/common/hid/device_null.c @@ -79,8 +79,10 @@ static void null_free(void *data) { null_instance_t *instance = (null_instance_t *)data; - if(instance) + if(instance) { + hid_pad_deregister(instance->pad); free(instance); + } } /** diff --git a/input/common/hid/device_wiiu_gca.c b/input/common/hid/device_wiiu_gca.c index 5e3968f757..9e09598022 100644 --- a/input/common/hid/device_wiiu_gca.c +++ b/input/common/hid/device_wiiu_gca.c @@ -145,34 +145,6 @@ static void update_pad_state(wiiu_gca_instance_t *instance) } } -/* -static joypad_connection_t *register_pad(wiiu_gca_instance_t *instance, int port) { - int slot; - joypad_connection_t *result; - - if(!instance || !instance->online) - { - RARCH_ERR("[gca]: bad instance\n"); - return NULL; - } - - slot = pad_connection_find_vacant_pad(hid_instance.pad_list); - if(slot < 0) - { - RARCH_ERR("[gca]: failed to find a free slot\n"); - return NULL; - } - - result = &(hid_instance.pad_list[slot]); - result->iface = &wiiu_gca_pad_connection; - result->data = result->iface->init(instance, slot, hid_instance.os_driver); - result->connected = true; - input_pad_connect(slot, hid_instance.pad_driver); - - return result; -} -*/ - static void unregister_pad(wiiu_gca_instance_t *instance, int slot) { if(!instance || slot < 0 || slot >= 4 || instance->pads[slot] == NULL) @@ -180,10 +152,8 @@ static void unregister_pad(wiiu_gca_instance_t *instance, int slot) joypad_connection_t *pad = instance->pads[slot]; instance->pads[slot] = NULL; - pad->iface->deinit(pad->data); - pad->data = NULL; - pad->iface = NULL; - pad->connected = false; + + hid_pad_deregister(pad); } static bool wiiu_gca_detect(uint16_t vendor_id, uint16_t product_id) { diff --git a/input/common/hid/hid_device_driver.c b/input/common/hid/hid_device_driver.c index b38bdd9067..ccab2dc569 100644 --- a/input/common/hid/hid_device_driver.c +++ b/input/common/hid/hid_device_driver.c @@ -60,6 +60,20 @@ joypad_connection_t *hid_pad_register(void *pad_handle, pad_connection_interface return result; } +void hid_pad_deregister(joypad_connection_t *pad) +{ + if(!pad) + return; + + if(pad->data) { + pad->iface->deinit(pad->data); + pad->data = NULL; + } + + pad->iface = NULL; + pad->connected = false; +} + static bool init_pad_list(hid_driver_instance_t *instance, unsigned slots) { if(!instance || slots > MAX_USERS) diff --git a/input/common/hid/hid_device_driver.h b/input/common/hid/hid_device_driver.h index 715fd7cfea..18a8f45479 100644 --- a/input/common/hid/hid_device_driver.h +++ b/input/common/hid/hid_device_driver.h @@ -37,6 +37,7 @@ extern hid_driver_instance_t hid_instance; hid_device_t *hid_device_driver_lookup(uint16_t vendor_id, uint16_t product_id); joypad_connection_t *hid_pad_register(void *pad_handle, pad_connection_interface_t *iface); +void hid_pad_deregister(joypad_connection_t *pad); bool hid_init(hid_driver_instance_t *instance, hid_driver_t *hid_driver, input_device_driver_t *pad_driver, unsigned slots); void hid_deinit(hid_driver_instance_t *instance);