2 * This file is part of linux driver the digital TV devices equipped with B2C2 FlexcopII(b)/III
4 * flexcop-dma.c - methods for configuring and controlling the DMA of the FlexCop.
6 * see flexcop.c for copyright information.
10 int flexcop_dma_allocate(struct pci_dev
*pdev
, struct flexcop_dma
*dma
, u32 size
)
16 err("dma buffersize has to be even.");
20 if ((tcpu
= pci_alloc_consistent(pdev
, size
, &tdma
)) != NULL
) {
22 dma
->cpu_addr0
= tcpu
;
23 dma
->dma_addr0
= tdma
;
24 dma
->cpu_addr1
= tcpu
+ size
/2;
25 dma
->dma_addr1
= tdma
+ size
/2;
31 EXPORT_SYMBOL(flexcop_dma_allocate
);
33 void flexcop_dma_free(struct flexcop_dma
*dma
)
35 pci_free_consistent(dma
->pdev
, dma
->size
*2,dma
->cpu_addr0
, dma
->dma_addr0
);
36 memset(dma
,0,sizeof(struct flexcop_dma
));
38 EXPORT_SYMBOL(flexcop_dma_free
);
40 int flexcop_dma_control_timer_irq(struct flexcop_device
*fc
, flexcop_dma_index_t no
, int onoff
)
42 flexcop_ibi_value v
= fc
->read_ibi_reg(fc
,ctrl_208
);
45 v
.ctrl_208
.DMA1_Timer_Enable_sig
= onoff
;
48 v
.ctrl_208
.DMA2_Timer_Enable_sig
= onoff
;
50 fc
->write_ibi_reg(fc
,ctrl_208
,v
);
53 EXPORT_SYMBOL(flexcop_dma_control_timer_irq
);
55 int flexcop_dma_control_size_irq(struct flexcop_device
*fc
, flexcop_dma_index_t no
, int onoff
)
57 flexcop_ibi_value v
= fc
->read_ibi_reg(fc
,ctrl_208
);
60 v
.ctrl_208
.DMA1_IRQ_Enable_sig
= onoff
;
63 v
.ctrl_208
.DMA2_IRQ_Enable_sig
= onoff
;
65 fc
->write_ibi_reg(fc
,ctrl_208
,v
);
68 EXPORT_SYMBOL(flexcop_dma_control_size_irq
);
70 int flexcop_dma_control_packet_irq(struct flexcop_device
*fc
, flexcop_dma_index_t no
, int onoff
)
72 flexcop_ibi_value v
= fc
->read_ibi_reg(fc
,ctrl_208
);
75 v
.ctrl_208
.DMA1_Size_IRQ_Enable_sig
= onoff
;
78 v
.ctrl_208
.DMA2_Size_IRQ_Enable_sig
= onoff
;
80 fc
->write_ibi_reg(fc
,ctrl_208
,v
);
83 EXPORT_SYMBOL(flexcop_dma_control_packet_irq
);
85 int flexcop_dma_config(struct flexcop_device
*fc
, struct flexcop_dma
*dma
, flexcop_dma_index_t dma_idx
,flexcop_dma_addr_index_t index
)
88 flexcop_ibi_value v0x0
,v0x4
,v0xc
;
89 v0x0
.raw
= v0x4
.raw
= v0xc
.raw
= 0;
91 v0x0
.dma_0x0
.dma_address0
= dma
->dma_addr0
>> 2;
92 v0xc
.dma_0xc
.dma_address1
= dma
->dma_addr1
>> 2;
93 v0x4
.dma_0x4_write
.dma_addr_size
= dma
->size
/ 4;
95 if (index
& FC_DMA_SUBADDR_0
)
96 v0x0
.dma_0x0
.dma_0start
= 1;
98 if (index
& FC_DMA_SUBADDR_1
)
99 v0xc
.dma_0xc
.dma_1start
= 1;
101 if (dma_idx
& FC_DMA_1
) {
102 fc
->write_ibi_reg(fc
,dma1_000
,v0x0
);
103 fc
->write_ibi_reg(fc
,dma1_004
,v0x4
);
104 fc
->write_ibi_reg(fc
,dma1_00c
,v0xc
);
105 } else { /* (dma_idx & FC_DMA_2) */
106 fc
->write_ibi_reg(fc
,dma2_010
,v0x0
);
107 fc
->write_ibi_reg(fc
,dma2_014
,v0x4
);
108 fc
->write_ibi_reg(fc
,dma2_01c
,v0xc
);
113 EXPORT_SYMBOL(flexcop_dma_config
);
115 static int flexcop_dma_remap(struct flexcop_device
*fc
, flexcop_dma_index_t dma_idx
, int onoff
)
117 flexcop_ibi_register r
= (dma_idx
& FC_DMA_1
) ? dma1_00c
: dma2_01c
;
118 flexcop_ibi_value v
= fc
->read_ibi_reg(fc
,r
);
119 v
.dma_0xc
.remap_enable
= onoff
;
120 fc
->write_ibi_reg(fc
,r
,v
);
124 /* 1 cycles = 1.97 msec */
125 int flexcop_dma_config_timer(struct flexcop_device
*fc
, flexcop_dma_index_t dma_idx
, u8 cycles
)
127 flexcop_ibi_register r
= (dma_idx
& FC_DMA_1
) ? dma1_004
: dma2_014
;
128 flexcop_ibi_value v
= fc
->read_ibi_reg(fc
,r
);
130 flexcop_dma_remap(fc
,dma_idx
,0);
132 v
.dma_0x4_write
.dmatimer
= cycles
>> 1;
133 fc
->write_ibi_reg(fc
,r
,v
);
136 EXPORT_SYMBOL(flexcop_dma_config_timer
);
138 int flexcop_dma_config_packet_count(struct flexcop_device
*fc
, flexcop_dma_index_t dma_idx
, u8 packets
)
140 flexcop_ibi_register r
= (dma_idx
& FC_DMA_1
) ? dma1_004
: dma2_014
;
141 flexcop_ibi_value v
= fc
->read_ibi_reg(fc
,r
);
143 flexcop_dma_remap(fc
,dma_idx
,1);
145 v
.dma_0x4_remap
.DMA_maxpackets
= packets
;
146 fc
->write_ibi_reg(fc
,r
,v
);
149 EXPORT_SYMBOL(flexcop_dma_config_packet_count
);