diff options
author | Steven Toth <stoth@kernellabs.com> | 2010-07-31 13:43:07 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2010-10-21 05:54:33 -0400 |
commit | add3f580a4342b8bca7e0fb4737fe9eeaefa4319 (patch) | |
tree | 370dbc9d7b9d81666c168f87000f41027c168ee4 | |
parent | 335961ca2e5098e222fdfbde93de3714899128fd (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>
-rw-r--r-- | drivers/media/video/saa7164/saa7164-api.c | 6 | ||||
-rw-r--r-- | drivers/media/video/saa7164/saa7164-buffer.c | 129 | ||||
-rw-r--r-- | drivers/media/video/saa7164/saa7164-core.c | 12 | ||||
-rw-r--r-- | drivers/media/video/saa7164/saa7164-dvb.c | 101 | ||||
-rw-r--r-- | drivers/media/video/saa7164/saa7164.h | 46 |
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 1702baad4f09..a810e6d88270 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 | ||
27 | int saa7164_api_transition_port(struct saa7164_tsport *port, u8 mode) | 27 | int 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 | ||
65 | int saa7164_api_configure_port_mpeg2ts(struct saa7164_dev *dev, | 65 | int 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 | ||
99 | int saa7164_api_dump_subdevs(struct saa7164_dev *dev, u8 *buf, int len) | 99 | int 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 7a5c7d05c15a..6f58af44d02b 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 | ||
69 | void 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 | */ |
72 | struct saa7164_buffer *saa7164_buffer_alloc(struct saa7164_tsport *port, | 92 | struct 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 | ||
136 | int saa7164_buffer_dealloc(struct saa7164_tsport *port, | 161 | int 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 */ | ||
184 | int 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 | |||
217 | int 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 1bd1e62f9896..88c36bd2bd1d 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 | ||
75 | static void saa7164_buffer_deliver(struct saa7164_buffer *buf) | 75 | static 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 | ||
85 | static irqreturn_t saa7164_irq_ts(struct saa7164_tsport *port) | 85 | static 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 4bae74567c92..ffa1c970d1cd 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 | ||
85 | static int saa7164_dvb_stop_tsport(struct saa7164_tsport *port) | 85 | static 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 | ||
103 | static int saa7164_dvb_acquire_tsport(struct saa7164_tsport *port) | 103 | static 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 | ||
121 | static int saa7164_dvb_pause_tsport(struct saa7164_tsport *port) | 121 | static 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 | */ |
143 | static int saa7164_dvb_stop_streaming(struct saa7164_tsport *port) | 143 | static 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 | ||
157 | static int saa7164_dvb_cfg_tsport(struct saa7164_tsport *port) | 157 | static 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 | |||
219 | static 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: | |||
284 | static int saa7164_dvb_start_feed(struct dvb_demux_feed *feed) | 222 | static 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) | |||
311 | static int saa7164_dvb_stop_feed(struct dvb_demux_feed *feed) | 249 | static 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 | ||
335 | static int dvb_register(struct saa7164_tsport *port) | 273 | static 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 | ||
476 | int saa7164_dvb_unregister(struct saa7164_tsport *port) | 416 | int 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 | */ |
511 | int saa7164_dvb_register(struct saa7164_tsport *port) | 454 | int 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 c4c62b0b83a0..1ca9bf2e3426 100644 --- a/drivers/media/video/saa7164/saa7164.h +++ b/drivers/media/video/saa7164/saa7164.h | |||
@@ -91,6 +91,7 @@ | |||
91 | enum port_t { | 91 | enum 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 | ||
96 | enum saa7164_i2c_bus_nr { | 97 | enum saa7164_i2c_bus_nr { |
@@ -192,14 +193,15 @@ struct saa7164_i2c { | |||
192 | u32 i2c_rc; | 193 | u32 i2c_rc; |
193 | }; | 194 | }; |
194 | 195 | ||
195 | struct saa7164_tsport; | 196 | struct saa7164_port; |
196 | 197 | ||
197 | struct saa7164_buffer { | 198 | struct 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 | ||
219 | struct saa7164_tsport { | 225 | struct 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, | |||
344 | int saa7164_api_read_eeprom(struct saa7164_dev *dev, u8 *buf, int buflen); | 354 | int saa7164_api_read_eeprom(struct saa7164_dev *dev, u8 *buf, int buflen); |
345 | int saa7164_api_set_gpiobit(struct saa7164_dev *dev, u8 unitid, u8 pin); | 355 | int saa7164_api_set_gpiobit(struct saa7164_dev *dev, u8 unitid, u8 pin); |
346 | int saa7164_api_clear_gpiobit(struct saa7164_dev *dev, u8 unitid, u8 pin); | 356 | int saa7164_api_clear_gpiobit(struct saa7164_dev *dev, u8 unitid, u8 pin); |
347 | int saa7164_api_transition_port(struct saa7164_tsport *port, u8 mode); | 357 | int 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 */ |
367 | extern int saa7164_dvb_register(struct saa7164_tsport *port); | 377 | extern int saa7164_dvb_register(struct saa7164_port *port); |
368 | extern int saa7164_dvb_unregister(struct saa7164_tsport *port); | 378 | extern int saa7164_dvb_unregister(struct saa7164_port *port); |
369 | 379 | ||
370 | /* ----------------------------------------------------------- */ | 380 | /* ----------------------------------------------------------- */ |
371 | /* saa7164-buffer.c */ | 381 | /* saa7164-buffer.c */ |
372 | extern struct saa7164_buffer *saa7164_buffer_alloc(struct saa7164_tsport *port, | 382 | extern struct saa7164_buffer *saa7164_buffer_alloc( |
373 | u32 len); | 383 | struct saa7164_port *port, u32 len); |
374 | extern int saa7164_buffer_dealloc(struct saa7164_tsport *port, | 384 | extern int saa7164_buffer_dealloc(struct saa7164_buffer *buf); |
375 | struct saa7164_buffer *buf); | 385 | extern void saa7164_buffer_display(struct saa7164_buffer *buf); |
386 | extern int saa7164_buffer_activate(struct saa7164_buffer *buf, int i); | ||
387 | extern int saa7164_buffer_cfg_port(struct saa7164_port *port); | ||
376 | 388 | ||
377 | /* ----------------------------------------------------------- */ | 389 | /* ----------------------------------------------------------- */ |
378 | 390 | ||