Commit 579f1163cd5b2a3fd96ec5b84b18a071e7da3b6b
Committed by
Mauro Carvalho Chehab
1 parent
6f074abb62
Exists in
master
and in
4 other branches
V4L/DVB (6195): Changes to support MPEG TS on VIDB
Changes to support MPEG TS on VIDB Signed-off-by: Steven Toth <stoth@hauppauge.com> Reviewed-by: Michael Krufky <mkrufky@linuxtv.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Showing 2 changed files with 86 additions and 63 deletions Side-by-side Diff
drivers/media/video/cx23885/cx23885-core.c
... | ... | @@ -100,12 +100,12 @@ |
100 | 100 | .cnt2_reg = DMA2_CNT2, |
101 | 101 | }, |
102 | 102 | [SRAM_CH03] = { |
103 | - .name = "ch3", | |
104 | - .cmds_start = 0x0, | |
105 | - .ctrl_start = 0x0, | |
106 | - .cdt = 0x0, | |
107 | - .fifo_start = 0x0, | |
108 | - .fifo_size = 0x0, | |
103 | + .name = "TS1 B", | |
104 | + .cmds_start = 0x100A0, | |
105 | + .ctrl_start = 0x10780, | |
106 | + .cdt = 0x10400, | |
107 | + .fifo_start = 0x5000, | |
108 | + .fifo_size = 0x1000, | |
109 | 109 | .ptr1_reg = DMA3_PTR1, |
110 | 110 | .ptr2_reg = DMA3_PTR2, |
111 | 111 | .cnt1_reg = DMA3_CNT1, |
... | ... | @@ -596,7 +596,7 @@ |
596 | 596 | |
597 | 597 | cx23885_sram_channel_setup(dev, &dev->sram_channels[ SRAM_CH01 ], 188*4, 0); |
598 | 598 | cx23885_sram_channel_setup(dev, &dev->sram_channels[ SRAM_CH02 ], 128, 0); |
599 | - cx23885_sram_channel_setup(dev, &dev->sram_channels[ SRAM_CH03 ], 128, 0); | |
599 | + cx23885_sram_channel_setup(dev, &dev->sram_channels[ SRAM_CH03 ], 188*4, 0); | |
600 | 600 | cx23885_sram_channel_setup(dev, &dev->sram_channels[ SRAM_CH04 ], 128, 0); |
601 | 601 | cx23885_sram_channel_setup(dev, &dev->sram_channels[ SRAM_CH05 ], 128, 0); |
602 | 602 | cx23885_sram_channel_setup(dev, &dev->sram_channels[ SRAM_CH06 ], 188*4, 0); |
... | ... | @@ -679,6 +679,39 @@ |
679 | 679 | atomic_inc(&dev->refcount); |
680 | 680 | |
681 | 681 | dev->nr = cx23885_devcount++; |
682 | + sprintf(dev->name, "cx23885[%d]", dev->nr); | |
683 | + | |
684 | + mutex_lock(&devlist); | |
685 | + list_add_tail(&dev->devlist, &cx23885_devlist); | |
686 | + mutex_unlock(&devlist); | |
687 | + | |
688 | + /* Configure the internal memory */ | |
689 | + if(dev->pci->device == 0x8880) { | |
690 | + dev->bridge = CX23885_BRIDGE_887; | |
691 | + dev->sram_channels = cx23887_sram_channels; | |
692 | + } else | |
693 | + if(dev->pci->device == 0x8852) { | |
694 | + dev->bridge = CX23885_BRIDGE_885; | |
695 | + dev->sram_channels = cx23885_sram_channels; | |
696 | + } else | |
697 | + BUG(); | |
698 | + | |
699 | + dprintk(1, "%s() Memory configured for PCIe bridge type %d\n", | |
700 | + __FUNCTION__, dev->bridge); | |
701 | + | |
702 | + /* board config */ | |
703 | + dev->board = UNSET; | |
704 | + if (card[dev->nr] < cx23885_bcount) | |
705 | + dev->board = card[dev->nr]; | |
706 | + for (i = 0; UNSET == dev->board && i < cx23885_idcount; i++) | |
707 | + if (dev->pci->subsystem_vendor == cx23885_subids[i].subvendor && | |
708 | + dev->pci->subsystem_device == cx23885_subids[i].subdevice) | |
709 | + dev->board = cx23885_subids[i].card; | |
710 | + if (UNSET == dev->board) { | |
711 | + dev->board = CX23885_BOARD_UNKNOWN; | |
712 | + cx23885_card_list(dev); | |
713 | + } | |
714 | + | |
682 | 715 | dev->pci_bus = dev->pci->bus->number; |
683 | 716 | dev->pci_slot = PCI_SLOT(dev->pci->devfn); |
684 | 717 | dev->pci_irqmask = 0x001f00; |
685 | 718 | |
... | ... | @@ -717,38 +750,13 @@ |
717 | 750 | spin_lock_init(&dev->ts2.slock); |
718 | 751 | dev->ts2.dev = dev; |
719 | 752 | dev->ts2.nr = 2; |
720 | - dev->ts2.sram_chno = SRAM_CH06; | |
753 | + | |
721 | 754 | INIT_LIST_HEAD(&dev->ts2.mpegq.active); |
722 | 755 | INIT_LIST_HEAD(&dev->ts2.mpegq.queued); |
723 | 756 | dev->ts2.mpegq.timeout.function = cx23885_timeout; |
724 | 757 | dev->ts2.mpegq.timeout.data = (unsigned long)&dev->ts2; |
725 | 758 | init_timer(&dev->ts2.mpegq.timeout); |
726 | 759 | |
727 | - dev->ts2.reg_gpcnt = VID_C_GPCNT; | |
728 | - dev->ts2.reg_gpcnt_ctl = VID_C_GPCNT_CTL; | |
729 | - dev->ts2.reg_dma_ctl = VID_C_DMA_CTL; | |
730 | - dev->ts2.reg_lngth = VID_C_LNGTH; | |
731 | - dev->ts2.reg_hw_sop_ctrl = VID_C_HW_SOP_CTL; | |
732 | - dev->ts2.reg_gen_ctrl = VID_C_GEN_CTL; | |
733 | - dev->ts2.reg_bd_pkt_status = VID_C_BD_PKT_STATUS; | |
734 | - dev->ts2.reg_sop_status = VID_C_SOP_STATUS; | |
735 | - dev->ts2.reg_fifo_ovfl_stat = VID_C_FIFO_OVFL_STAT; | |
736 | - dev->ts2.reg_vld_misc = VID_C_VLD_MISC; | |
737 | - dev->ts2.reg_ts_clk_en = VID_C_TS_CLK_EN; | |
738 | - dev->ts2.reg_ts_int_msk = VID_C_INT_MSK; | |
739 | - | |
740 | - // FIXME: Make this board specific | |
741 | - dev->ts2.pci_irqmask = 0x04; /* TS Port 2 bit */ | |
742 | - dev->ts2.dma_ctl_val = 0x11; /* Enable RISC controller and Fifo */ | |
743 | - dev->ts2.ts_int_msk_val = 0x1111; /* TS port bits for RISC */ | |
744 | - dev->ts2.gen_ctrl_val = 0xc; /* Serial bus + punctured clock */ | |
745 | - dev->ts2.ts_clk_en_val = 0x1; /* Enable TS_CLK */ | |
746 | - | |
747 | - cx23885_risc_stopper(dev->pci, &dev->ts2.mpegq.stopper, | |
748 | - dev->ts2.reg_dma_ctl, dev->ts2.dma_ctl_val, 0x00); | |
749 | - | |
750 | - sprintf(dev->name, "cx23885[%d]", dev->nr); | |
751 | - | |
752 | 760 | if (get_resources(dev) < 0) { |
753 | 761 | printk(KERN_ERR "CORE %s No more PCIe resources for " |
754 | 762 | "subsystem: %04x:%04x\n", |
755 | 763 | |
756 | 764 | |
... | ... | @@ -759,46 +767,18 @@ |
759 | 767 | goto fail_free; |
760 | 768 | } |
761 | 769 | |
762 | - mutex_lock(&devlist); | |
763 | - list_add_tail(&dev->devlist, &cx23885_devlist); | |
764 | - mutex_unlock(&devlist); | |
765 | - | |
766 | 770 | /* PCIe stuff */ |
767 | 771 | dev->lmmio = ioremap(pci_resource_start(dev->pci,0), |
768 | 772 | pci_resource_len(dev->pci,0)); |
769 | 773 | |
770 | 774 | dev->bmmio = (u8 __iomem *)dev->lmmio; |
771 | 775 | |
772 | - /* board config */ | |
773 | - dev->board = UNSET; | |
774 | - if (card[dev->nr] < cx23885_bcount) | |
775 | - dev->board = card[dev->nr]; | |
776 | - for (i = 0; UNSET == dev->board && i < cx23885_idcount; i++) | |
777 | - if (dev->pci->subsystem_vendor == cx23885_subids[i].subvendor && | |
778 | - dev->pci->subsystem_device == cx23885_subids[i].subdevice) | |
779 | - dev->board = cx23885_subids[i].card; | |
780 | - if (UNSET == dev->board) { | |
781 | - dev->board = CX23885_BOARD_UNKNOWN; | |
782 | - cx23885_card_list(dev); | |
783 | - } | |
784 | 776 | printk(KERN_INFO "CORE %s: subsystem: %04x:%04x, board: %s [card=%d,%s]\n", |
785 | 777 | dev->name, dev->pci->subsystem_vendor, |
786 | 778 | dev->pci->subsystem_device, cx23885_boards[dev->board].name, |
787 | 779 | dev->board, card[dev->nr] == dev->board ? |
788 | 780 | "insmod option" : "autodetected"); |
789 | 781 | |
790 | - /* Configure the internal memory */ | |
791 | - if(dev->pci->device == 0x8880) { | |
792 | - dev->bridge = CX23885_BRIDGE_887; | |
793 | - dev->sram_channels = cx23887_sram_channels; | |
794 | - } else | |
795 | - if(dev->pci->device == 0x8852) { | |
796 | - dev->bridge = CX23885_BRIDGE_885; | |
797 | - dev->sram_channels = cx23885_sram_channels; | |
798 | - } | |
799 | - dprintk(1, "%s() Memory configured for PCIe bridge type %d\n", | |
800 | - __FUNCTION__, dev->bridge); | |
801 | - | |
802 | 782 | cx23885_pci_quirks(dev); |
803 | 783 | |
804 | 784 | /* init hardware */ |
... | ... | @@ -812,6 +792,38 @@ |
812 | 792 | cx23885_card_setup(dev); |
813 | 793 | cx23885_ir_init(dev); |
814 | 794 | |
795 | + switch (dev->board) { | |
796 | + default: | |
797 | + dev->ts2.reg_gpcnt = VID_C_GPCNT; | |
798 | + dev->ts2.reg_gpcnt_ctl = VID_C_GPCNT_CTL; | |
799 | + dev->ts2.reg_dma_ctl = VID_C_DMA_CTL; | |
800 | + dev->ts2.reg_lngth = VID_C_LNGTH; | |
801 | + dev->ts2.reg_hw_sop_ctrl = VID_C_HW_SOP_CTL; | |
802 | + dev->ts2.reg_gen_ctrl = VID_C_GEN_CTL; | |
803 | + dev->ts2.reg_bd_pkt_status = VID_C_BD_PKT_STATUS; | |
804 | + dev->ts2.reg_sop_status = VID_C_SOP_STATUS; | |
805 | + dev->ts2.reg_fifo_ovfl_stat = VID_C_FIFO_OVFL_STAT; | |
806 | + dev->ts2.reg_vld_misc = VID_C_VLD_MISC; | |
807 | + dev->ts2.reg_ts_clk_en = VID_C_TS_CLK_EN; | |
808 | + dev->ts2.reg_ts_int_msk = VID_C_INT_MSK; | |
809 | + dev->ts2.reg_src_sel = 0; | |
810 | + | |
811 | + // FIXME: Make this board specific | |
812 | + dev->ts2.pci_irqmask = 0x04; /* TS Port 2 bit */ | |
813 | + dev->ts2.dma_ctl_val = 0x11; /* Enable RISC controller and Fifo */ | |
814 | + dev->ts2.ts_int_msk_val = 0x1111; /* TS port bits for RISC */ | |
815 | + dev->ts2.gen_ctrl_val = 0xc; /* Serial bus + punctured clock */ | |
816 | + dev->ts2.ts_clk_en_val = 0x1; /* Enable TS_CLK */ | |
817 | + dev->ts2.src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO; | |
818 | + | |
819 | + // Drive this from cards.c (portb/c) and move it outside of this switch | |
820 | + dev->ts2.sram_chno = SRAM_CH06; | |
821 | + } | |
822 | + | |
823 | + cx23885_risc_stopper(dev->pci, &dev->ts2.mpegq.stopper, | |
824 | + dev->ts2.reg_dma_ctl, dev->ts2.dma_ctl_val, 0x00); | |
825 | + | |
826 | + // FIXME: This should only be called if ts2 is being used, driven by cards.c | |
815 | 827 | if (cx23885_dvb_register(&dev->ts2) < 0) { |
816 | 828 | printk(KERN_ERR "%s() Failed to register dvb adapters\n", |
817 | 829 | __FUNCTION__); |
818 | 830 | |
819 | 831 | |
... | ... | @@ -1026,13 +1038,17 @@ |
1026 | 1038 | |
1027 | 1039 | udelay(100); |
1028 | 1040 | |
1041 | + /* If the port supports SRC SELECT, configure it */ | |
1042 | + if(port->reg_src_sel) | |
1043 | + cx_write(port->reg_src_sel, port->src_sel_val); | |
1044 | + | |
1029 | 1045 | cx_write(port->reg_hw_sop_ctrl, 0x47 << 16 | 188 << 4); |
1030 | 1046 | cx_write(port->reg_ts_clk_en, port->ts_clk_en_val); |
1031 | 1047 | cx_write(port->reg_vld_misc, 0x00); |
1032 | - | |
1033 | 1048 | cx_write(port->reg_gen_ctrl, port->gen_ctrl_val); |
1034 | 1049 | udelay(100); |
1035 | 1050 | |
1051 | + // NOTE: this is 2 (reserved) for portb, does it matter? | |
1036 | 1052 | /* reset counter to zero */ |
1037 | 1053 | cx_write(port->reg_gpcnt_ctl, 3); |
1038 | 1054 | q->count = 1; |
... | ... | @@ -1047,7 +1063,7 @@ |
1047 | 1063 | cx_set(PCI_INT_MSK, dev->pci_irqmask | port->pci_irqmask); |
1048 | 1064 | break; |
1049 | 1065 | default: |
1050 | - printk(KERN_ERR "%s() error, default case", __FUNCTION__ ); | |
1066 | + BUG(); | |
1051 | 1067 | } |
1052 | 1068 | |
1053 | 1069 | cx_set(DEV_CNTRL2, (1<<5)); /* Enable RISC controller */ |
drivers/media/video/cx23885/cx23885.h
... | ... | @@ -68,6 +68,11 @@ |
68 | 68 | CX23885_RADIO, |
69 | 69 | }; |
70 | 70 | |
71 | +enum cx23885_src_sel_type { | |
72 | + CX23885_SRC_SEL_EXT_656_VIDEO = 0, | |
73 | + CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO | |
74 | +}; | |
75 | + | |
71 | 76 | /* buffer for one video frame */ |
72 | 77 | struct cx23885_buffer { |
73 | 78 | /* common v4l buffer stuff -- must be first */ |
... | ... | @@ -162,6 +167,7 @@ |
162 | 167 | u32 reg_vld_misc; |
163 | 168 | u32 reg_ts_clk_en; |
164 | 169 | u32 reg_ts_int_msk; |
170 | + u32 reg_src_sel; | |
165 | 171 | |
166 | 172 | /* Default register vals */ |
167 | 173 | int pci_irqmask; |
... | ... | @@ -169,6 +175,7 @@ |
169 | 175 | u32 ts_int_msk_val; |
170 | 176 | u32 gen_ctrl_val; |
171 | 177 | u32 ts_clk_en_val; |
178 | + u32 src_sel_val; | |
172 | 179 | }; |
173 | 180 | |
174 | 181 | struct cx23885_dev { |