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; }
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; }