예제 #1
0
static int aml_dvb_dmx_init(struct aml_dvb *advb, struct aml_dmx *dmx, int id)
{
    int i, ret;
    struct resource *res;
    char buf[32];

    dmx->dmx_irq = id?demux1_irq:demux0_irq;
    if(dmx->dmx_irq==-1) {
        snprintf(buf, sizeof(buf), "demux%d_irq", id);
        res = platform_get_resource_byname(advb->pdev, IORESOURCE_IRQ, buf);
        if (!res) {
            pr_error("cannot get resource %s\n", buf);
            return -1;
        }
        dmx->dmx_irq = res->start;
    }

    dmx->source  = AM_TS_SRC_TS0;
    dmx->dump_ts_select = 0;
    dmx->dvr_irq = -1;
    /*
    if(id==0) {
    	dmx->dvr_irq = dvr0_irq;
    	if(dmx->dvr_irq==-1) {
    		snprintf(buf, sizeof(buf), "dvr%d_irq", id);
    		res = platform_get_resource_byname(advb->pdev, IORESOURCE_IRQ, buf);
    		if (!res) {
    			pr_error("cannot get resource %s\n", buf);
    			return -1;
    		}
    		dmx->dvr_irq = res->start;
    	}
    } else {
    	dmx->dvr_irq = -1;
    }
    */
    dmx->demux.dmx.capabilities = (DMX_TS_FILTERING | DMX_SECTION_FILTERING | DMX_PES_FILTERING | DMX_MEMORY_BASED_FILTERING | DMX_TS_DESCRAMBLING);
    dmx->demux.filternum = dmx->demux.feednum = FILTER_COUNT;
    dmx->demux.priv = advb;
    dmx->demux.start_feed = aml_dmx_hw_start_feed;
    dmx->demux.stop_feed = aml_dmx_hw_stop_feed;
    dmx->demux.write_to_decoder = NULL;
    spin_lock_init(&dmx->slock);

    if ((ret = dvb_dmx_init(&dmx->demux)) < 0) {
        pr_error("dvb_dmx failed: error %d",ret);
        goto error_dmx_init;
    }

    dmx->dmxdev.filternum = dmx->demux.feednum;
    dmx->dmxdev.demux = &dmx->demux.dmx;
    dmx->dmxdev.capabilities = 0;
    if ((ret = dvb_dmxdev_init(&dmx->dmxdev, &advb->dvb_adapter)) < 0) {
        pr_error("dvb_dmxdev_init failed: error %d",ret);
        goto error_dmxdev_init;
    }

    for (i=0; i<DMX_DEV_COUNT; i++) {
        int source = i+DMX_FRONTEND_0;
        dmx->hw_fe[i].source = source;

        if ((ret = dmx->demux.dmx.add_frontend(&dmx->demux.dmx, &dmx->hw_fe[i])) < 0) {
            pr_error("adding hw_frontend to dmx failed: error %d",ret);
            dmx->hw_fe[i].source = 0;
            goto error_add_hw_fe;
        }
    }

    dmx->mem_fe.source = DMX_MEMORY_FE;
    if ((ret = dmx->demux.dmx.add_frontend(&dmx->demux.dmx, &dmx->mem_fe)) < 0) {
        pr_error("adding mem_frontend to dmx failed: error %d",ret);
        goto error_add_mem_fe;
    }

    if ((ret = dmx->demux.dmx.connect_frontend(&dmx->demux.dmx, &dmx->hw_fe[1])) < 0) {
        pr_error("connect frontend failed: error %d",ret);
        goto error_connect_fe;
    }

    dmx->id = id;
    dmx->aud_chan = -1;
    dmx->vid_chan = -1;
    dmx->sub_chan = -1;

    if ((ret = aml_dmx_hw_init(dmx)) <0) {
        pr_error("demux hw init error %d", ret);
        dmx->id = -1;
        goto error_dmx_hw_init;
    }

    dvb_net_init(&advb->dvb_adapter, &dmx->dvb_net, &dmx->demux.dmx);

    return 0;
error_dmx_hw_init:
error_connect_fe:
    dmx->demux.dmx.remove_frontend(&dmx->demux.dmx, &dmx->mem_fe);
error_add_mem_fe:
error_add_hw_fe:
    for (i=0; i<DMX_DEV_COUNT; i++) {
        if (dmx->hw_fe[i].source)
            dmx->demux.dmx.remove_frontend(&dmx->demux.dmx, &dmx->hw_fe[i]);
    }
    dvb_dmxdev_release(&dmx->dmxdev);
error_dmxdev_init:
    dvb_dmx_release(&dmx->demux);
error_dmx_init:
    return ret;
}
예제 #2
0
static int aml_dvb_dmx_init(struct aml_dvb *advb, struct aml_dmx *dmx, int id)
{
	int i, ret;
#ifndef CONFIG_OF
	struct resource *res;
	char buf[32];
#endif
	switch(id){
		case 0:
			dmx->dmx_irq = INT_DEMUX;
			break;
		case 1:
			dmx->dmx_irq = INT_DEMUX_1;
			break;
		case 2:
			dmx->dmx_irq = INT_DEMUX_2;
			break;
	}

#ifndef CONFIG_OF
	snprintf(buf, sizeof(buf), "demux%d_irq", id);
	res = platform_get_resource_byname(advb->pdev, IORESOURCE_IRQ, buf);
	if (res) {
		dmx->dmx_irq = res->start;
	}
#endif

	dmx->source  = -1;
	dmx->dump_ts_select = 0;
	dmx->dvr_irq = -1;

	dmx->demux.dmx.capabilities = (DMX_TS_FILTERING | DMX_SECTION_FILTERING | DMX_PES_FILTERING | DMX_MEMORY_BASED_FILTERING | DMX_TS_DESCRAMBLING);
	dmx->demux.filternum = dmx->demux.feednum = FILTER_COUNT;
	dmx->demux.priv = advb;
	dmx->demux.start_feed = aml_dmx_hw_start_feed;
	dmx->demux.stop_feed = aml_dmx_hw_stop_feed;
	dmx->demux.write_to_decoder = NULL;

	if ((ret = dvb_dmx_init(&dmx->demux)) < 0) {
		pr_error("dvb_dmx failed: error %d\n",ret);
		goto error_dmx_init;
	}

	dmx->dmxdev.filternum = dmx->demux.feednum;
	dmx->dmxdev.demux = &dmx->demux.dmx;
	dmx->dmxdev.capabilities = 0;
	if ((ret = dvb_dmxdev_init(&dmx->dmxdev, &advb->dvb_adapter)) < 0) {
		pr_error("dvb_dmxdev_init failed: error %d\n",ret);
		goto error_dmxdev_init;
	}

	for (i=0; i<DMX_DEV_COUNT; i++) {
		int source = i+DMX_FRONTEND_0;
		dmx->hw_fe[i].source = source;

		if ((ret = dmx->demux.dmx.add_frontend(&dmx->demux.dmx, &dmx->hw_fe[i])) < 0) {
			pr_error("adding hw_frontend to dmx failed: error %d",ret);
			dmx->hw_fe[i].source = 0;
			goto error_add_hw_fe;
		}
	}

	dmx->mem_fe.source = DMX_MEMORY_FE;
	if ((ret = dmx->demux.dmx.add_frontend(&dmx->demux.dmx, &dmx->mem_fe)) < 0) {
		pr_error("adding mem_frontend to dmx failed: error %d",ret);
		goto error_add_mem_fe;
	}

	if ((ret = dmx->demux.dmx.connect_frontend(&dmx->demux.dmx, &dmx->hw_fe[1])) < 0) {
		pr_error("connect frontend failed: error %d",ret);
		goto error_connect_fe;
	}

	dmx->id = id;
	dmx->aud_chan = -1;
	dmx->vid_chan = -1;
	dmx->sub_chan = -1;
	dmx->pcr_chan = -1;

	if ((ret = aml_dmx_hw_init(dmx)) <0) {
		pr_error("demux hw init error %d", ret);
		dmx->id = -1;
		goto error_dmx_hw_init;
	}

	dvb_net_init(&advb->dvb_adapter, &dmx->dvb_net, &dmx->demux.dmx);

	return 0;
error_dmx_hw_init:
error_connect_fe:
	dmx->demux.dmx.remove_frontend(&dmx->demux.dmx, &dmx->mem_fe);
error_add_mem_fe:
error_add_hw_fe:
	for (i=0; i<DMX_DEV_COUNT; i++) {
		if (dmx->hw_fe[i].source)
			dmx->demux.dmx.remove_frontend(&dmx->demux.dmx, &dmx->hw_fe[i]);
	}
	dvb_dmxdev_release(&dmx->dmxdev);
error_dmxdev_init:
	dvb_dmx_release(&dmx->demux);
error_dmx_init:
	return ret;
}