aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/saa7164
diff options
context:
space:
mode:
authorSteven Toth <stoth@kernellabs.com>2010-07-31 13:43:07 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2010-10-21 05:54:33 -0400
commitadd3f580a4342b8bca7e0fb4737fe9eeaefa4319 (patch)
tree370dbc9d7b9d81666c168f87000f41027c168ee4 /drivers/media/video/saa7164
parent335961ca2e5098e222fdfbde93de3714899128fd (diff)
[media] saa7164: convert buffering structs to be more generic
Current structs assume transport, making a number of changes to switch to generic functions allowing a smoother integration for the analog encoder. Signed-off-by: Steven Toth <stoth@kernellabs.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/saa7164')
-rw-r--r--drivers/media/video/saa7164/saa7164-api.c6
-rw-r--r--drivers/media/video/saa7164/saa7164-buffer.c129
-rw-r--r--drivers/media/video/saa7164/saa7164-core.c12
-rw-r--r--drivers/media/video/saa7164/saa7164-dvb.c101
-rw-r--r--drivers/media/video/saa7164/saa7164.h46
5 files changed, 178 insertions, 116 deletions
diff --git a/drivers/media/video/saa7164/saa7164-api.c b/drivers/media/video/saa7164/saa7164-api.c
index 1702baad4f0..a810e6d8827 100644
--- a/drivers/media/video/saa7164/saa7164-api.c
+++ b/drivers/media/video/saa7164/saa7164-api.c
@@ -24,7 +24,7 @@
24 24
25#include "saa7164.h" 25#include "saa7164.h"
26 26
27int saa7164_api_transition_port(struct saa7164_tsport *port, u8 mode) 27int saa7164_api_transition_port(struct saa7164_port *port, u8 mode)
28{ 28{
29 int ret; 29 int ret;
30 30
@@ -63,7 +63,7 @@ int saa7164_api_read_eeprom(struct saa7164_dev *dev, u8 *buf, int buflen)
63 63
64 64
65int saa7164_api_configure_port_mpeg2ts(struct saa7164_dev *dev, 65int saa7164_api_configure_port_mpeg2ts(struct saa7164_dev *dev,
66 struct saa7164_tsport *port, 66 struct saa7164_port *port,
67 tmComResTSFormatDescrHeader_t *tsfmt) 67 tmComResTSFormatDescrHeader_t *tsfmt)
68{ 68{
69 dprintk(DBGLVL_API, " bFormatIndex = 0x%x\n", tsfmt->bFormatIndex); 69 dprintk(DBGLVL_API, " bFormatIndex = 0x%x\n", tsfmt->bFormatIndex);
@@ -98,7 +98,7 @@ int saa7164_api_configure_port_mpeg2ts(struct saa7164_dev *dev,
98 98
99int saa7164_api_dump_subdevs(struct saa7164_dev *dev, u8 *buf, int len) 99int saa7164_api_dump_subdevs(struct saa7164_dev *dev, u8 *buf, int len)
100{ 100{
101 struct saa7164_tsport *port = 0; 101 struct saa7164_port *port = 0;
102 u32 idx, next_offset; 102 u32 idx, next_offset;
103 int i; 103 int i;
104 tmComResDescrHeader_t *hdr, *t; 104 tmComResDescrHeader_t *hdr, *t;
diff --git a/drivers/media/video/saa7164/saa7164-buffer.c b/drivers/media/video/saa7164/saa7164-buffer.c
index 7a5c7d05c15..6f58af44d02 100644
--- a/drivers/media/video/saa7164/saa7164-buffer.c
+++ b/drivers/media/video/saa7164/saa7164-buffer.c
@@ -66,12 +66,33 @@
66 | etc 66 | etc
67 */ 67 */
68 68
69void saa7164_buffer_display(struct saa7164_buffer *buf)
70{
71 struct saa7164_dev *dev = buf->port->dev;
72 int i;
73
74 dprintk(DBGLVL_BUF, "%s() buffer @ 0x%p nr=%d\n",
75 __func__, buf, buf->idx);
76 dprintk(DBGLVL_BUF, " pci_cpu @ 0x%p dma @ 0x%p len = 0x%x\n",
77 buf->cpu, (void *)buf->dma, buf->pci_size);
78 dprintk(DBGLVL_BUF, " pt_cpu @ 0x%p pt_dma @ 0x%p len = 0x%x\n",
79 buf->pt_cpu, (void *)buf->pt_dma, buf->pt_size);
80
81 /* Format the Page Table Entries to point into the data buffer */
82 for (i = 0 ; i < SAA7164_PT_ENTRIES; i++) {
83
84 dprintk(DBGLVL_BUF, " pt[%02d] = 0x%p -> 0x%llx\n",
85 i, buf->pt_cpu, (u64)*(buf->pt_cpu));
86
87 }
88}
69/* Allocate a new buffer structure and associated PCI space in bytes. 89/* Allocate a new buffer structure and associated PCI space in bytes.
70 * len must be a multiple of sizeof(u64) 90 * len must be a multiple of sizeof(u64)
71 */ 91 */
72struct saa7164_buffer *saa7164_buffer_alloc(struct saa7164_tsport *port, 92struct saa7164_buffer *saa7164_buffer_alloc(struct saa7164_port *port,
73 u32 len) 93 u32 len)
74{ 94{
95 tmHWStreamParameters_t *params = &port->hw_streamingparams;
75 struct saa7164_buffer *buf = 0; 96 struct saa7164_buffer *buf = 0;
76 struct saa7164_dev *dev = port->dev; 97 struct saa7164_dev *dev = port->dev;
77 int i; 98 int i;
@@ -87,8 +108,11 @@ struct saa7164_buffer *saa7164_buffer_alloc(struct saa7164_tsport *port,
87 goto ret; 108 goto ret;
88 } 109 }
89 110
111 buf->idx = -1;
90 buf->port = port; 112 buf->port = port;
91 buf->flags = SAA7164_BUFFER_FREE; 113 buf->flags = SAA7164_BUFFER_FREE;
114 buf->pos = 0;
115 buf->actual_size = params->pitch * params->numberoflines;
92 /* TODO: arg len is being ignored */ 116 /* TODO: arg len is being ignored */
93 buf->pci_size = SAA7164_PT_ENTRIES * 0x1000; 117 buf->pci_size = SAA7164_PT_ENTRIES * 0x1000;
94 buf->pt_size = (SAA7164_PT_ENTRIES * sizeof(u64)) + 0x1000; 118 buf->pt_size = (SAA7164_PT_ENTRIES * sizeof(u64)) + 0x1000;
@@ -108,7 +132,8 @@ struct saa7164_buffer *saa7164_buffer_alloc(struct saa7164_tsport *port,
108 memset(buf->cpu, 0xff, buf->pci_size); 132 memset(buf->cpu, 0xff, buf->pci_size);
109 memset(buf->pt_cpu, 0xff, buf->pt_size); 133 memset(buf->pt_cpu, 0xff, buf->pt_size);
110 134
111 dprintk(DBGLVL_BUF, "%s() allocated buffer @ 0x%p\n", __func__, buf); 135 dprintk(DBGLVL_BUF, "%s() allocated buffer @ 0x%p\n",
136 __func__, buf);
112 dprintk(DBGLVL_BUF, " pci_cpu @ 0x%p dma @ 0x%08lx len = 0x%x\n", 137 dprintk(DBGLVL_BUF, " pci_cpu @ 0x%p dma @ 0x%08lx len = 0x%x\n",
113 buf->cpu, (long)buf->dma, buf->pci_size); 138 buf->cpu, (long)buf->dma, buf->pci_size);
114 dprintk(DBGLVL_BUF, " pt_cpu @ 0x%p pt_dma @ 0x%08lx len = 0x%x\n", 139 dprintk(DBGLVL_BUF, " pt_cpu @ 0x%p pt_dma @ 0x%08lx len = 0x%x\n",
@@ -133,26 +158,110 @@ ret:
133 return buf; 158 return buf;
134} 159}
135 160
136int saa7164_buffer_dealloc(struct saa7164_tsport *port, 161int saa7164_buffer_dealloc(struct saa7164_buffer *buf)
137 struct saa7164_buffer *buf)
138{ 162{
139 struct saa7164_dev *dev; 163 struct saa7164_dev *dev;
140 164
141 if (!buf || !port) 165 if (!buf || !buf->port)
142 return SAA_ERR_BAD_PARAMETER; 166 return SAA_ERR_BAD_PARAMETER;
143 dev = port->dev; 167 dev = buf->port->dev;
144 168
145 dprintk(DBGLVL_BUF, "%s() deallocating buffer @ 0x%p\n", __func__, buf); 169 dprintk(DBGLVL_BUF, "%s() deallocating buffer @ 0x%p\n",
170 __func__, buf);
146 171
147 if (buf->flags != SAA7164_BUFFER_FREE) 172 if (buf->flags != SAA7164_BUFFER_FREE)
148 log_warn(" freeing a non-free buffer\n"); 173 log_warn(" freeing a non-free buffer\n");
149 174
150 pci_free_consistent(port->dev->pci, buf->pci_size, buf->cpu, buf->dma); 175 pci_free_consistent(dev->pci, buf->pci_size, buf->cpu, buf->dma);
151 pci_free_consistent(port->dev->pci, buf->pt_size, buf->pt_cpu, 176 pci_free_consistent(dev->pci, buf->pt_size, buf->pt_cpu, buf->pt_dma);
152 buf->pt_dma);
153 177
154 kfree(buf); 178 kfree(buf);
155 179
156 return SAA_OK; 180 return SAA_OK;
157} 181}
158 182
183/* Write a buffer into the hardware */
184int saa7164_buffer_activate(struct saa7164_buffer *buf, int i)
185{
186 struct saa7164_port *port = buf->port;
187 struct saa7164_dev *dev = port->dev;
188
189 if ((i < 0) || (i >= port->hwcfg.buffercount))
190 return -EINVAL;
191
192 dprintk(DBGLVL_BUF, "%s(idx = %d)\n", __func__, i);
193
194 buf->idx = i; /* Note of which buffer list index position we occupy */
195 buf->flags = SAA7164_BUFFER_BUSY;
196 buf->pos = 0;
197
198 /* TODO: Review this in light of 32v64 assignments */
199 saa7164_writel(port->bufoffset + (sizeof(u32) * i), 0);
200 saa7164_writel(port->bufptr32h + ((sizeof(u32) * 2) * i), buf->pt_dma);
201 saa7164_writel(port->bufptr32l + ((sizeof(u32) * 2) * i), 0);
202
203 dprintk(DBGLVL_BUF, " buf[%d] offset 0x%llx (0x%x) "
204 "buf 0x%llx/%llx (0x%x/%x) nr=%d\n",
205 buf->idx,
206 (u64)port->bufoffset + (i * sizeof(u32)),
207 saa7164_readl(port->bufoffset + (sizeof(u32) * i)),
208 (u64)port->bufptr32h + ((sizeof(u32) * 2) * i),
209 (u64)port->bufptr32l + ((sizeof(u32) * 2) * i),
210 saa7164_readl(port->bufptr32h + ((sizeof(u32) * i) * 2)),
211 saa7164_readl(port->bufptr32l + ((sizeof(u32) * i) * 2)),
212 buf->idx);
213
214 return 0;
215}
216
217int saa7164_buffer_cfg_port(struct saa7164_port *port)
218{
219 tmHWStreamParameters_t *params = &port->hw_streamingparams;
220 struct saa7164_dev *dev = port->dev;
221 struct saa7164_buffer *buf;
222 struct list_head *c, *n;
223 int i = 0;
224
225 dprintk(DBGLVL_BUF, "%s(port=%d)\n", __func__, port->nr);
226
227 saa7164_writel(port->bufcounter, 0);
228 saa7164_writel(port->pitch, params->pitch);
229 saa7164_writel(port->bufsize, params->pitch * params->numberoflines);
230
231 dprintk(DBGLVL_BUF, " configured:\n");
232 dprintk(DBGLVL_BUF, " lmmio 0x%p\n", dev->lmmio);
233 dprintk(DBGLVL_BUF, " bufcounter 0x%x = 0x%x\n", port->bufcounter,
234 saa7164_readl(port->bufcounter));
235
236 dprintk(DBGLVL_BUF, " pitch 0x%x = %d\n", port->pitch,
237 saa7164_readl(port->pitch));
238
239 dprintk(DBGLVL_BUF, " bufsize 0x%x = %d\n", port->bufsize,
240 saa7164_readl(port->bufsize));
241
242 dprintk(DBGLVL_BUF, " buffercount = %d\n", port->hwcfg.buffercount);
243 dprintk(DBGLVL_BUF, " bufoffset = 0x%x\n", port->bufoffset);
244 dprintk(DBGLVL_BUF, " bufptr32h = 0x%x\n", port->bufptr32h);
245 dprintk(DBGLVL_BUF, " bufptr32l = 0x%x\n", port->bufptr32l);
246
247 /* Poke the buffers and offsets into PCI space */
248 mutex_lock(&port->dmaqueue_lock);
249 list_for_each_safe(c, n, &port->dmaqueue.list) {
250 buf = list_entry(c, struct saa7164_buffer, list);
251
252 if (buf->flags != SAA7164_BUFFER_FREE)
253 BUG();
254
255 /* Place the buffer in the h/w queue */
256 saa7164_buffer_activate(buf, i);
257
258 /* Don't exceed the device maximum # bufs */
259 if (i++ > port->hwcfg.buffercount)
260 BUG();
261
262 }
263 mutex_unlock(&port->dmaqueue_lock);
264
265 return 0;
266}
267
diff --git a/drivers/media/video/saa7164/saa7164-core.c b/drivers/media/video/saa7164/saa7164-core.c
index 1bd1e62f989..88c36bd2bd1 100644
--- a/drivers/media/video/saa7164/saa7164-core.c
+++ b/drivers/media/video/saa7164/saa7164-core.c
@@ -74,7 +74,7 @@ static void saa7164_work_cmdhandler(struct work_struct *w)
74 74
75static void saa7164_buffer_deliver(struct saa7164_buffer *buf) 75static void saa7164_buffer_deliver(struct saa7164_buffer *buf)
76{ 76{
77 struct saa7164_tsport *port = buf->port; 77 struct saa7164_port *port = buf->port;
78 78
79 /* Feed the transport payload into the kernel demux */ 79 /* Feed the transport payload into the kernel demux */
80 dvb_dmx_swfilter_packets(&port->dvb.demux, (u8 *)buf->cpu, 80 dvb_dmx_swfilter_packets(&port->dvb.demux, (u8 *)buf->cpu,
@@ -82,7 +82,7 @@ static void saa7164_buffer_deliver(struct saa7164_buffer *buf)
82 82
83} 83}
84 84
85static irqreturn_t saa7164_irq_ts(struct saa7164_tsport *port) 85static irqreturn_t saa7164_irq_ts(struct saa7164_port *port)
86{ 86{
87 struct saa7164_dev *dev = port->dev; 87 struct saa7164_dev *dev = port->dev;
88 struct saa7164_buffer *buf; 88 struct saa7164_buffer *buf;
@@ -107,7 +107,7 @@ static irqreturn_t saa7164_irq_ts(struct saa7164_tsport *port)
107 if (i++ > port->hwcfg.buffercount) 107 if (i++ > port->hwcfg.buffercount)
108 BUG(); 108 BUG();
109 109
110 if (buf->nr == rp) { 110 if (buf->idx == rp) {
111 /* Found the buffer, deal with it */ 111 /* Found the buffer, deal with it */
112 dprintk(DBGLVL_IRQ, "%s() wp: %d processing: %d\n", 112 dprintk(DBGLVL_IRQ, "%s() wp: %d processing: %d\n",
113 __func__, wp, rp); 113 __func__, wp, rp);
@@ -446,20 +446,18 @@ static int saa7164_dev_setup(struct saa7164_dev *dev)
446 /* Transport port A Defaults / setup */ 446 /* Transport port A Defaults / setup */
447 dev->ts1.dev = dev; 447 dev->ts1.dev = dev;
448 dev->ts1.nr = 0; 448 dev->ts1.nr = 0;
449 dev->ts1.type = SAA7164_MPEG_UNDEFINED;
449 mutex_init(&dev->ts1.dvb.lock); 450 mutex_init(&dev->ts1.dvb.lock);
450 INIT_LIST_HEAD(&dev->ts1.dmaqueue.list); 451 INIT_LIST_HEAD(&dev->ts1.dmaqueue.list);
451 INIT_LIST_HEAD(&dev->ts1.dummy_dmaqueue.list);
452 mutex_init(&dev->ts1.dmaqueue_lock); 452 mutex_init(&dev->ts1.dmaqueue_lock);
453 mutex_init(&dev->ts1.dummy_dmaqueue_lock);
454 453
455 /* Transport port B Defaults / setup */ 454 /* Transport port B Defaults / setup */
456 dev->ts2.dev = dev; 455 dev->ts2.dev = dev;
457 dev->ts2.nr = 1; 456 dev->ts2.nr = 1;
457 dev->ts2.type = SAA7164_MPEG_UNDEFINED;
458 mutex_init(&dev->ts2.dvb.lock); 458 mutex_init(&dev->ts2.dvb.lock);
459 INIT_LIST_HEAD(&dev->ts2.dmaqueue.list); 459 INIT_LIST_HEAD(&dev->ts2.dmaqueue.list);
460 INIT_LIST_HEAD(&dev->ts2.dummy_dmaqueue.list);
461 mutex_init(&dev->ts2.dmaqueue_lock); 460 mutex_init(&dev->ts2.dmaqueue_lock);
462 mutex_init(&dev->ts2.dummy_dmaqueue_lock);
463 461
464 if (get_resources(dev) < 0) { 462 if (get_resources(dev) < 0) {
465 printk(KERN_ERR "CORE %s No more PCIe resources for " 463 printk(KERN_ERR "CORE %s No more PCIe resources for "
diff --git a/drivers/media/video/saa7164/saa7164-dvb.c b/drivers/media/video/saa7164/saa7164-dvb.c
index 4bae74567c9..ffa1c970d1c 100644
--- a/drivers/media/video/saa7164/saa7164-dvb.c
+++ b/drivers/media/video/saa7164/saa7164-dvb.c
@@ -82,7 +82,7 @@ static struct s5h1411_config hauppauge_s5h1411_config = {
82 .mpeg_timing = S5H1411_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK, 82 .mpeg_timing = S5H1411_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
83}; 83};
84 84
85static int saa7164_dvb_stop_tsport(struct saa7164_tsport *port) 85static int saa7164_dvb_stop_port(struct saa7164_port *port)
86{ 86{
87 struct saa7164_dev *dev = port->dev; 87 struct saa7164_dev *dev = port->dev;
88 int ret; 88 int ret;
@@ -100,7 +100,7 @@ static int saa7164_dvb_stop_tsport(struct saa7164_tsport *port)
100 return ret; 100 return ret;
101} 101}
102 102
103static int saa7164_dvb_acquire_tsport(struct saa7164_tsport *port) 103static int saa7164_dvb_acquire_port(struct saa7164_port *port)
104{ 104{
105 struct saa7164_dev *dev = port->dev; 105 struct saa7164_dev *dev = port->dev;
106 int ret; 106 int ret;
@@ -118,7 +118,7 @@ static int saa7164_dvb_acquire_tsport(struct saa7164_tsport *port)
118 return ret; 118 return ret;
119} 119}
120 120
121static int saa7164_dvb_pause_tsport(struct saa7164_tsport *port) 121static int saa7164_dvb_pause_port(struct saa7164_port *port)
122{ 122{
123 struct saa7164_dev *dev = port->dev; 123 struct saa7164_dev *dev = port->dev;
124 int ret; 124 int ret;
@@ -140,90 +140,28 @@ static int saa7164_dvb_pause_tsport(struct saa7164_tsport *port)
140 * the part through AVStream / KS Windows stages, forwards or backwards. 140 * the part through AVStream / KS Windows stages, forwards or backwards.
141 * States are: stopped, acquired (h/w), paused, started. 141 * States are: stopped, acquired (h/w), paused, started.
142 */ 142 */
143static int saa7164_dvb_stop_streaming(struct saa7164_tsport *port) 143static int saa7164_dvb_stop_streaming(struct saa7164_port *port)
144{ 144{
145 struct saa7164_dev *dev = port->dev; 145 struct saa7164_dev *dev = port->dev;
146 int ret; 146 int ret;
147 147
148 dprintk(DBGLVL_DVB, "%s(port=%d)\n", __func__, port->nr); 148 dprintk(DBGLVL_DVB, "%s(port=%d)\n", __func__, port->nr);
149 149
150 ret = saa7164_dvb_pause_tsport(port); 150 ret = saa7164_dvb_pause_port(port);
151 ret = saa7164_dvb_acquire_tsport(port); 151 ret = saa7164_dvb_acquire_port(port);
152 ret = saa7164_dvb_stop_tsport(port); 152 ret = saa7164_dvb_stop_port(port);
153 153
154 return ret; 154 return ret;
155} 155}
156 156
157static int saa7164_dvb_cfg_tsport(struct saa7164_tsport *port) 157static int saa7164_dvb_start_port(struct saa7164_port *port)
158{
159 tmHWStreamParameters_t *params = &port->hw_streamingparams;
160 struct saa7164_dev *dev = port->dev;
161 struct saa7164_buffer *buf;
162 struct list_head *c, *n;
163 int i = 0;
164
165 dprintk(DBGLVL_DVB, "%s(port=%d)\n", __func__, port->nr);
166
167 saa7164_writel(port->pitch, params->pitch);
168 saa7164_writel(port->bufsize, params->pitch * params->numberoflines);
169
170 dprintk(DBGLVL_DVB, " configured:\n");
171 dprintk(DBGLVL_DVB, " lmmio 0x%p\n", dev->lmmio);
172 dprintk(DBGLVL_DVB, " bufcounter 0x%x = 0x%x\n", port->bufcounter,
173 saa7164_readl(port->bufcounter));
174
175 dprintk(DBGLVL_DVB, " pitch 0x%x = %d\n", port->pitch,
176 saa7164_readl(port->pitch));
177
178 dprintk(DBGLVL_DVB, " bufsize 0x%x = %d\n", port->bufsize,
179 saa7164_readl(port->bufsize));
180
181 dprintk(DBGLVL_DVB, " buffercount = %d\n", port->hwcfg.buffercount);
182 dprintk(DBGLVL_DVB, " bufoffset = 0x%x\n", port->bufoffset);
183 dprintk(DBGLVL_DVB, " bufptr32h = 0x%x\n", port->bufptr32h);
184 dprintk(DBGLVL_DVB, " bufptr32l = 0x%x\n", port->bufptr32l);
185
186 /* Poke the buffers and offsets into PCI space */
187 mutex_lock(&port->dmaqueue_lock);
188 list_for_each_safe(c, n, &port->dmaqueue.list) {
189 buf = list_entry(c, struct saa7164_buffer, list);
190
191 /* TODO: Review this in light of 32v64 assignments */
192 saa7164_writel(port->bufoffset + (sizeof(u32) * i), 0);
193 saa7164_writel(port->bufptr32h + ((sizeof(u32) * 2) * i),
194 buf->pt_dma);
195 saa7164_writel(port->bufptr32l + ((sizeof(u32) * 2) * i), 0);
196
197 dprintk(DBGLVL_DVB,
198 " buf[%d] offset 0x%llx (0x%x) "
199 "buf 0x%llx/%llx (0x%x/%x)\n",
200 i,
201 (u64)port->bufoffset + (i * sizeof(u32)),
202 saa7164_readl(port->bufoffset + (sizeof(u32) * i)),
203 (u64)port->bufptr32h + ((sizeof(u32) * 2) * i),
204 (u64)port->bufptr32l + ((sizeof(u32) * 2) * i),
205 saa7164_readl(port->bufptr32h + ((sizeof(u32) * i)
206 * 2)),
207 saa7164_readl(port->bufptr32l + ((sizeof(u32) * i)
208 * 2)));
209
210 if (i++ > port->hwcfg.buffercount)
211 BUG();
212
213 }
214 mutex_unlock(&port->dmaqueue_lock);
215
216 return 0;
217}
218
219static int saa7164_dvb_start_tsport(struct saa7164_tsport *port)
220{ 158{
221 struct saa7164_dev *dev = port->dev; 159 struct saa7164_dev *dev = port->dev;
222 int ret = 0, result; 160 int ret = 0, result;
223 161
224 dprintk(DBGLVL_DVB, "%s(port=%d)\n", __func__, port->nr); 162 dprintk(DBGLVL_DVB, "%s(port=%d)\n", __func__, port->nr);
225 163
226 saa7164_dvb_cfg_tsport(port); 164 saa7164_buffer_cfg_port(port);
227 165
228 /* Acquire the hardware */ 166 /* Acquire the hardware */
229 result = saa7164_api_transition_port(port, SAA_DMASTATE_ACQUIRE); 167 result = saa7164_api_transition_port(port, SAA_DMASTATE_ACQUIRE);
@@ -284,7 +222,7 @@ out:
284static int saa7164_dvb_start_feed(struct dvb_demux_feed *feed) 222static int saa7164_dvb_start_feed(struct dvb_demux_feed *feed)
285{ 223{
286 struct dvb_demux *demux = feed->demux; 224 struct dvb_demux *demux = feed->demux;
287 struct saa7164_tsport *port = (struct saa7164_tsport *) demux->priv; 225 struct saa7164_port *port = (struct saa7164_port *) demux->priv;
288 struct saa7164_dvb *dvb = &port->dvb; 226 struct saa7164_dvb *dvb = &port->dvb;
289 struct saa7164_dev *dev = port->dev; 227 struct saa7164_dev *dev = port->dev;
290 int ret = 0; 228 int ret = 0;
@@ -298,7 +236,7 @@ static int saa7164_dvb_start_feed(struct dvb_demux_feed *feed)
298 mutex_lock(&dvb->lock); 236 mutex_lock(&dvb->lock);
299 if (dvb->feeding++ == 0) { 237 if (dvb->feeding++ == 0) {
300 /* Start transport */ 238 /* Start transport */
301 ret = saa7164_dvb_start_tsport(port); 239 ret = saa7164_dvb_start_port(port);
302 } 240 }
303 mutex_unlock(&dvb->lock); 241 mutex_unlock(&dvb->lock);
304 dprintk(DBGLVL_DVB, "%s(port=%d) now feeding = %d\n", 242 dprintk(DBGLVL_DVB, "%s(port=%d) now feeding = %d\n",
@@ -311,7 +249,7 @@ static int saa7164_dvb_start_feed(struct dvb_demux_feed *feed)
311static int saa7164_dvb_stop_feed(struct dvb_demux_feed *feed) 249static int saa7164_dvb_stop_feed(struct dvb_demux_feed *feed)
312{ 250{
313 struct dvb_demux *demux = feed->demux; 251 struct dvb_demux *demux = feed->demux;
314 struct saa7164_tsport *port = (struct saa7164_tsport *) demux->priv; 252 struct saa7164_port *port = (struct saa7164_port *) demux->priv;
315 struct saa7164_dvb *dvb = &port->dvb; 253 struct saa7164_dvb *dvb = &port->dvb;
316 struct saa7164_dev *dev = port->dev; 254 struct saa7164_dev *dev = port->dev;
317 int ret = 0; 255 int ret = 0;
@@ -332,7 +270,7 @@ static int saa7164_dvb_stop_feed(struct dvb_demux_feed *feed)
332 return ret; 270 return ret;
333} 271}
334 272
335static int dvb_register(struct saa7164_tsport *port) 273static int dvb_register(struct saa7164_port *port)
336{ 274{
337 struct saa7164_dvb *dvb = &port->dvb; 275 struct saa7164_dvb *dvb = &port->dvb;
338 struct saa7164_dev *dev = port->dev; 276 struct saa7164_dev *dev = port->dev;
@@ -341,6 +279,9 @@ static int dvb_register(struct saa7164_tsport *port)
341 279
342 dprintk(DBGLVL_DVB, "%s(port=%d)\n", __func__, port->nr); 280 dprintk(DBGLVL_DVB, "%s(port=%d)\n", __func__, port->nr);
343 281
282 if (port->type != SAA7164_MPEG_DVB)
283 BUG();
284
344 /* Sanity check that the PCI configuration space is active */ 285 /* Sanity check that the PCI configuration space is active */
345 if (port->hwcfg.BARLocation == 0) { 286 if (port->hwcfg.BARLocation == 0) {
346 result = -ENOMEM; 287 result = -ENOMEM;
@@ -378,7 +319,6 @@ static int dvb_register(struct saa7164_tsport *port)
378 DRIVER_NAME, result); 319 DRIVER_NAME, result);
379 goto fail_adapter; 320 goto fail_adapter;
380 } 321 }
381 buf->nr = i;
382 322
383 mutex_lock(&port->dmaqueue_lock); 323 mutex_lock(&port->dmaqueue_lock);
384 list_add_tail(&buf->list, &port->dmaqueue.list); 324 list_add_tail(&buf->list, &port->dmaqueue.list);
@@ -473,7 +413,7 @@ fail_adapter:
473 return result; 413 return result;
474} 414}
475 415
476int saa7164_dvb_unregister(struct saa7164_tsport *port) 416int saa7164_dvb_unregister(struct saa7164_port *port)
477{ 417{
478 struct saa7164_dvb *dvb = &port->dvb; 418 struct saa7164_dvb *dvb = &port->dvb;
479 struct saa7164_dev *dev = port->dev; 419 struct saa7164_dev *dev = port->dev;
@@ -482,12 +422,15 @@ int saa7164_dvb_unregister(struct saa7164_tsport *port)
482 422
483 dprintk(DBGLVL_DVB, "%s()\n", __func__); 423 dprintk(DBGLVL_DVB, "%s()\n", __func__);
484 424
425 if (port->type != SAA7164_MPEG_DVB)
426 BUG();
427
485 /* Remove any allocated buffers */ 428 /* Remove any allocated buffers */
486 mutex_lock(&port->dmaqueue_lock); 429 mutex_lock(&port->dmaqueue_lock);
487 list_for_each_safe(c, n, &port->dmaqueue.list) { 430 list_for_each_safe(c, n, &port->dmaqueue.list) {
488 b = list_entry(c, struct saa7164_buffer, list); 431 b = list_entry(c, struct saa7164_buffer, list);
489 list_del(c); 432 list_del(c);
490 saa7164_buffer_dealloc(port, b); 433 saa7164_buffer_dealloc(b);
491 } 434 }
492 mutex_unlock(&port->dmaqueue_lock); 435 mutex_unlock(&port->dmaqueue_lock);
493 436
@@ -508,7 +451,7 @@ int saa7164_dvb_unregister(struct saa7164_tsport *port)
508/* All the DVB attach calls go here, this function get's modified 451/* All the DVB attach calls go here, this function get's modified
509 * for each new card. 452 * for each new card.
510 */ 453 */
511int saa7164_dvb_register(struct saa7164_tsport *port) 454int saa7164_dvb_register(struct saa7164_port *port)
512{ 455{
513 struct saa7164_dev *dev = port->dev; 456 struct saa7164_dev *dev = port->dev;
514 struct saa7164_dvb *dvb = &port->dvb; 457 struct saa7164_dvb *dvb = &port->dvb;
diff --git a/drivers/media/video/saa7164/saa7164.h b/drivers/media/video/saa7164/saa7164.h
index c4c62b0b83a..1ca9bf2e342 100644
--- a/drivers/media/video/saa7164/saa7164.h
+++ b/drivers/media/video/saa7164/saa7164.h
@@ -91,6 +91,7 @@
91enum port_t { 91enum port_t {
92 SAA7164_MPEG_UNDEFINED = 0, 92 SAA7164_MPEG_UNDEFINED = 0,
93 SAA7164_MPEG_DVB, 93 SAA7164_MPEG_DVB,
94 SAA7164_MPEG_ENCODER,
94}; 95};
95 96
96enum saa7164_i2c_bus_nr { 97enum saa7164_i2c_bus_nr {
@@ -192,14 +193,15 @@ struct saa7164_i2c {
192 u32 i2c_rc; 193 u32 i2c_rc;
193}; 194};
194 195
195struct saa7164_tsport; 196struct saa7164_port;
196 197
197struct saa7164_buffer { 198struct saa7164_buffer {
198 struct list_head list; 199 struct list_head list;
199 200
200 u32 nr; 201 /* Note of which h/w buffer list index position we occupy */
202 int idx;
201 203
202 struct saa7164_tsport *port; 204 struct saa7164_port *port;
203 205
204 /* Hardware Specific */ 206 /* Hardware Specific */
205 /* PCI Memory allocations */ 207 /* PCI Memory allocations */
@@ -214,17 +216,21 @@ struct saa7164_buffer {
214 u32 pt_size; /* PCI allocation size in bytes */ 216 u32 pt_size; /* PCI allocation size in bytes */
215 u64 *pt_cpu; /* Virtual address */ 217 u64 *pt_cpu; /* Virtual address */
216 dma_addr_t pt_dma; /* Physical address */ 218 dma_addr_t pt_dma; /* Physical address */
219
220 /* Encoder fops */
221 u32 pos;
222 u32 actual_size;
217}; 223};
218 224
219struct saa7164_tsport { 225struct saa7164_port {
220 226
221 struct saa7164_dev *dev; 227 struct saa7164_dev *dev;
222 int nr;
223 enum port_t type; 228 enum port_t type;
229 int nr;
224 230
225 struct saa7164_dvb dvb; 231 /* --- Generic port attributes --- */
226 232
227 /* HW related stream parameters */ 233 /* HW stream parameters */
228 tmHWStreamParameters_t hw_streamingparams; 234 tmHWStreamParameters_t hw_streamingparams;
229 235
230 /* DMA configuration values, is seeded during initialization */ 236 /* DMA configuration values, is seeded during initialization */
@@ -240,10 +246,14 @@ struct saa7164_tsport {
240 u64 bufptr64; 246 u64 bufptr64;
241 247
242 u32 numpte; /* Number of entries in array, only valid in head */ 248 u32 numpte; /* Number of entries in array, only valid in head */
249
243 struct mutex dmaqueue_lock; 250 struct mutex dmaqueue_lock;
244 struct mutex dummy_dmaqueue_lock;
245 struct saa7164_buffer dmaqueue; 251 struct saa7164_buffer dmaqueue;
246 struct saa7164_buffer dummy_dmaqueue; 252
253 /* --- DVB Transport Specific --- */
254 struct saa7164_dvb dvb;
255
256 /* --- Encoder/V4L related attributes --- */
247 257
248}; 258};
249 259
@@ -287,7 +297,7 @@ struct saa7164_dev {
287 struct saa7164_i2c i2c_bus[3]; 297 struct saa7164_i2c i2c_bus[3];
288 298
289 /* Transport related */ 299 /* Transport related */
290 struct saa7164_tsport ts1, ts2; 300 struct saa7164_port ts1, ts2;
291 301
292 /* Deferred command/api interrupts handling */ 302 /* Deferred command/api interrupts handling */
293 struct work_struct workcmd; 303 struct work_struct workcmd;
@@ -344,7 +354,7 @@ int saa7164_api_dif_write(struct saa7164_i2c *bus, u8 addr,
344int saa7164_api_read_eeprom(struct saa7164_dev *dev, u8 *buf, int buflen); 354int saa7164_api_read_eeprom(struct saa7164_dev *dev, u8 *buf, int buflen);
345int saa7164_api_set_gpiobit(struct saa7164_dev *dev, u8 unitid, u8 pin); 355int saa7164_api_set_gpiobit(struct saa7164_dev *dev, u8 unitid, u8 pin);
346int saa7164_api_clear_gpiobit(struct saa7164_dev *dev, u8 unitid, u8 pin); 356int saa7164_api_clear_gpiobit(struct saa7164_dev *dev, u8 unitid, u8 pin);
347int saa7164_api_transition_port(struct saa7164_tsport *port, u8 mode); 357int saa7164_api_transition_port(struct saa7164_port *port, u8 mode);
348 358
349/* ----------------------------------------------------------- */ 359/* ----------------------------------------------------------- */
350/* saa7164-cards.c */ 360/* saa7164-cards.c */
@@ -364,15 +374,17 @@ extern char *saa7164_unitid_name(struct saa7164_dev *dev, u8 unitid);
364 374
365/* ----------------------------------------------------------- */ 375/* ----------------------------------------------------------- */
366/* saa7164-dvb.c */ 376/* saa7164-dvb.c */
367extern int saa7164_dvb_register(struct saa7164_tsport *port); 377extern int saa7164_dvb_register(struct saa7164_port *port);
368extern int saa7164_dvb_unregister(struct saa7164_tsport *port); 378extern int saa7164_dvb_unregister(struct saa7164_port *port);
369 379
370/* ----------------------------------------------------------- */ 380/* ----------------------------------------------------------- */
371/* saa7164-buffer.c */ 381/* saa7164-buffer.c */
372extern struct saa7164_buffer *saa7164_buffer_alloc(struct saa7164_tsport *port, 382extern struct saa7164_buffer *saa7164_buffer_alloc(
373 u32 len); 383 struct saa7164_port *port, u32 len);
374extern int saa7164_buffer_dealloc(struct saa7164_tsport *port, 384extern int saa7164_buffer_dealloc(struct saa7164_buffer *buf);
375 struct saa7164_buffer *buf); 385extern void saa7164_buffer_display(struct saa7164_buffer *buf);
386extern int saa7164_buffer_activate(struct saa7164_buffer *buf, int i);
387extern int saa7164_buffer_cfg_port(struct saa7164_port *port);
376 388
377/* ----------------------------------------------------------- */ 389/* ----------------------------------------------------------- */
378 390