/** * 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(); }
void tsif_force_stop(void) { struct tsif_chrdev *the_dev = tsif_dev_tdmb; if(the_dev->state != tsif_state_stopped) { tsif_stop(the_dev->cookie); } }
static ssize_t tsif_release(struct inode *inode, struct file *filp) { #ifdef FEATURE_TSIF_DEBUG_MSG pr_info("[%s] !!!!!!!\n", __func__); #endif struct tsif_chrdev *the_dev = filp->private_data; tsif_stop(the_dev->cookie); return 0; }
/** * Stop TSIF operation and detach from TSIF driver. * * @mpq_demux: the mpq_demux we are working on. * * Return error code. */ static int mpq_tsif_dmx_stop(struct mpq_demux *mpq_demux) { int tsif; struct tsif_driver_info *tsif_driver; MPQ_DVB_DBG_PRINT("%s executed\n", __func__); /* determine the TSIF we are reading from */ if (mpq_demux->source == DMX_SOURCE_FRONT0) { tsif = 0; } else if (mpq_demux->source == DMX_SOURCE_FRONT1) { tsif = 1; } else { /* invalid source */ MPQ_DVB_ERR_PRINT( "%s: invalid input source (%d)\n", __func__, mpq_demux->source); return -EINVAL; } if (mutex_lock_interruptible(&mpq_dmx_tsif_info.tsif[tsif].mutex)) return -ERESTARTSYS; mpq_dmx_tsif_info.tsif[tsif].ref_count--; if (mpq_dmx_tsif_info.tsif[tsif].ref_count == 0) { tsif_driver = &(mpq_dmx_tsif_info.tsif[tsif].tsif_driver); tsif_stop(tsif_driver->tsif_handler); tsif_detach(tsif_driver->tsif_handler); tsif_driver->tsif_handler = NULL; tsif_driver->data_buffer = NULL; tsif_driver->buffer_size = 0; atomic_set(&mpq_dmx_tsif_info.tsif[tsif].data_cnt, 0); mpq_dmx_tsif_info.tsif[tsif].mpq_demux = NULL; } mutex_unlock(&mpq_dmx_tsif_info.tsif[tsif].mutex); return 0; }