Lines Matching refs:dvb_spi

234 static int cxd2880_update_pid_filter(struct cxd2880_dvb_spi *dvb_spi,
240 if (!dvb_spi || !cfg) {
245 mutex_lock(&dvb_spi->spi_mutex);
254 ret = cxd2880_set_pid_filter(dvb_spi->spi, &tmpcfg);
256 ret = cxd2880_set_pid_filter(dvb_spi->spi, cfg);
258 mutex_unlock(&dvb_spi->spi_mutex);
268 struct cxd2880_dvb_spi *dvb_spi = NULL;
274 dvb_spi = arg;
275 if (!dvb_spi) {
280 ret = cxd2880_spi_clear_ts_buffer(dvb_spi->spi);
288 ret = cxd2880_spi_read_ts_buffer_info(dvb_spi->spi,
297 cxd2880_spi_read_ts(dvb_spi->spi,
298 dvb_spi->ts_buf,
300 dvb_dmx_swfilter(&dvb_spi->demux,
301 dvb_spi->ts_buf,
307 cxd2880_spi_read_ts(dvb_spi->spi,
308 dvb_spi->ts_buf,
310 dvb_dmx_swfilter(&dvb_spi->demux,
311 dvb_spi->ts_buf,
327 struct cxd2880_dvb_spi *dvb_spi = NULL;
339 dvb_spi = demux->priv;
341 if (dvb_spi->feed_count == CXD2880_MAX_FILTER_SIZE) {
348 if (dvb_spi->all_pid_feed_count == 0) {
349 ret = cxd2880_update_pid_filter(dvb_spi,
350 &dvb_spi->filter_config,
357 dvb_spi->all_pid_feed_count++;
360 dvb_spi->all_pid_feed_count);
364 cfgtmp = dvb_spi->filter_config;
379 if (!dvb_spi->all_pid_feed_count)
380 ret = cxd2880_update_pid_filter(dvb_spi,
386 dvb_spi->filter_config = cfgtmp;
389 if (dvb_spi->feed_count == 0) {
390 dvb_spi->ts_buf =
393 if (!dvb_spi->ts_buf) {
395 memset(&dvb_spi->filter_config, 0,
396 sizeof(dvb_spi->filter_config));
397 dvb_spi->all_pid_feed_count = 0;
400 dvb_spi->cxd2880_ts_read_thread = kthread_run(cxd2880_ts_read,
401 dvb_spi,
403 if (IS_ERR(dvb_spi->cxd2880_ts_read_thread)) {
405 kfree(dvb_spi->ts_buf);
406 dvb_spi->ts_buf = NULL;
407 memset(&dvb_spi->filter_config, 0,
408 sizeof(dvb_spi->filter_config));
409 dvb_spi->all_pid_feed_count = 0;
410 return PTR_ERR(dvb_spi->cxd2880_ts_read_thread);
414 dvb_spi->feed_count++;
416 pr_debug("start feed (count %d)\n", dvb_spi->feed_count);
425 struct cxd2880_dvb_spi *dvb_spi = NULL;
437 dvb_spi = demux->priv;
439 if (!dvb_spi->feed_count) {
448 * in dvb_spi->all_pid_feed_count.
450 if (dvb_spi->all_pid_feed_count <= 0) {
454 dvb_spi->all_pid_feed_count--;
458 cfgtmp = dvb_spi->filter_config;
470 dvb_spi->filter_config = cfgtmp;
478 ret = cxd2880_update_pid_filter(dvb_spi,
479 &dvb_spi->filter_config,
480 dvb_spi->all_pid_feed_count > 0);
481 dvb_spi->feed_count--;
483 if (dvb_spi->feed_count == 0) {
486 ret_stop = kthread_stop(dvb_spi->cxd2880_ts_read_thread);
491 kfree(dvb_spi->ts_buf);
492 dvb_spi->ts_buf = NULL;
495 pr_debug("stop feed ok.(count %d)\n", dvb_spi->feed_count);
511 struct cxd2880_dvb_spi *dvb_spi = NULL;
519 dvb_spi = kzalloc(sizeof(struct cxd2880_dvb_spi), GFP_KERNEL);
520 if (!dvb_spi)
523 dvb_spi->vcc_supply = devm_regulator_get_optional(&spi->dev, "vcc");
524 if (IS_ERR(dvb_spi->vcc_supply)) {
525 if (PTR_ERR(dvb_spi->vcc_supply) == -EPROBE_DEFER) {
529 dvb_spi->vcc_supply = NULL;
531 ret = regulator_enable(dvb_spi->vcc_supply);
536 dvb_spi->spi = spi;
537 mutex_init(&dvb_spi->spi_mutex);
538 spi_set_drvdata(spi, dvb_spi);
540 config.spi_mutex = &dvb_spi->spi_mutex;
542 ret = dvb_register_adapter(&dvb_spi->adapter,
552 if (!dvb_attach(cxd2880_attach, &dvb_spi->dvb_fe, &config)) {
558 ret = dvb_register_frontend(&dvb_spi->adapter,
559 &dvb_spi->dvb_fe);
565 dvb_spi->demux.dmx.capabilities = DMX_TS_FILTERING;
566 dvb_spi->demux.priv = dvb_spi;
567 dvb_spi->demux.filternum = CXD2880_MAX_FILTER_SIZE;
568 dvb_spi->demux.feednum = CXD2880_MAX_FILTER_SIZE;
569 dvb_spi->demux.start_feed = cxd2880_start_feed;
570 dvb_spi->demux.stop_feed = cxd2880_stop_feed;
572 ret = dvb_dmx_init(&dvb_spi->demux);
578 dvb_spi->dmxdev.filternum = CXD2880_MAX_FILTER_SIZE;
579 dvb_spi->dmxdev.demux = &dvb_spi->demux.dmx;
580 dvb_spi->dmxdev.capabilities = 0;
581 ret = dvb_dmxdev_init(&dvb_spi->dmxdev,
582 &dvb_spi->adapter);
588 dvb_spi->dmx_fe.source = DMX_FRONTEND_0;
589 ret = dvb_spi->demux.dmx.add_frontend(&dvb_spi->demux.dmx,
590 &dvb_spi->dmx_fe);
596 ret = dvb_spi->demux.dmx.connect_frontend(&dvb_spi->demux.dmx,
597 &dvb_spi->dmx_fe);
608 dvb_spi->demux.dmx.remove_frontend(&dvb_spi->demux.dmx,
609 &dvb_spi->dmx_fe);
611 dvb_dmxdev_release(&dvb_spi->dmxdev);
613 dvb_dmx_release(&dvb_spi->demux);
615 dvb_unregister_frontend(&dvb_spi->dvb_fe);
617 dvb_frontend_detach(&dvb_spi->dvb_fe);
619 dvb_unregister_adapter(&dvb_spi->adapter);
621 if (dvb_spi->vcc_supply)
622 regulator_disable(dvb_spi->vcc_supply);
624 kfree(dvb_spi);
631 struct cxd2880_dvb_spi *dvb_spi = spi_get_drvdata(spi);
633 dvb_spi->demux.dmx.remove_frontend(&dvb_spi->demux.dmx,
634 &dvb_spi->dmx_fe);
635 dvb_dmxdev_release(&dvb_spi->dmxdev);
636 dvb_dmx_release(&dvb_spi->demux);
637 dvb_unregister_frontend(&dvb_spi->dvb_fe);
638 dvb_frontend_detach(&dvb_spi->dvb_fe);
639 dvb_unregister_adapter(&dvb_spi->adapter);
641 if (dvb_spi->vcc_supply)
642 regulator_disable(dvb_spi->vcc_supply);
644 kfree(dvb_spi);