/** * Module exit function. */ static void __exit mpq_dmx_tsif_plugin_exit(void) { int i; struct tsif_driver_info *tsif_driver; MPQ_DVB_DBG_PRINT("%s executed\n", __func__); for (i = 0; i < TSIF_COUNT; i++) { mutex_lock(&mpq_dmx_tsif_info.tsif[i].mutex); tsif_driver = &(mpq_dmx_tsif_info.tsif[i].tsif_driver); if (mpq_dmx_tsif_info.tsif[i].ref_count > 0) { mpq_dmx_tsif_info.tsif[i].ref_count = 0; if (tsif_driver->tsif_handler) tsif_stop(tsif_driver->tsif_handler); } /* Detach from TSIF driver to avoid further notifications. */ if (tsif_driver->tsif_handler) tsif_detach(tsif_driver->tsif_handler); mutex_unlock(&mpq_dmx_tsif_info.tsif[i].mutex); kthread_stop(mpq_dmx_tsif_info.tsif[i].thread); mutex_destroy(&mpq_dmx_tsif_info.tsif[i].mutex); } mpq_dmx_plugin_exit(); }
static void __exit mpq_dmx_tspp_plugin_exit(void) { int i; MPQ_DVB_DBG_PRINT("%s executed\n", __func__); for (i = 0; i < TSIF_COUNT; i++) { mutex_lock(&mpq_dmx_tspp_info.tsif[i].mutex); /* * Note: tspp_close_channel will also free the TSPP buffers * even if we allocated them ourselves, * using our free function. */ if (mpq_dmx_tspp_info.tsif[i].channel_ref) { tspp_unregister_notification(0, TSPP_CHANNEL_ID(i, TSPP_CHANNEL)); tspp_close_channel(0, TSPP_CHANNEL_ID(i, TSPP_CHANNEL)); if (allocation_mode == MPQ_DMX_TSPP_CONTIGUOUS_PHYS_ALLOC) mpq_dmx_channel_mem_free(i); } if (mpq_dmx_tspp_info.tsif[i].aggregate_ids) vfree(mpq_dmx_tspp_info.tsif[i].aggregate_ids); mutex_unlock(&mpq_dmx_tspp_info.tsif[i].mutex); kthread_stop(mpq_dmx_tspp_info.tsif[i].thread); mutex_destroy(&mpq_dmx_tspp_info.tsif[i].mutex); } mpq_dmx_plugin_exit(); }
static void __exit mpq_dmx_sw_plugin_exit(void) { mpq_dmx_plugin_exit(); }
static void __exit mpq_dmx_tspp_plugin_exit(void) { MPQ_DVB_DBG_PRINT("%s executed\n", __func__); mpq_dmx_plugin_exit(); }