Lines Matching refs:dvb_spi

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