diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-11-18 18:08:02 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-11-18 18:08:02 -0500 |
commit | a310410f616c78f24490de1274487a7b7b137d97 (patch) | |
tree | dbc2fc187800e6e7014263bf83e10d0155620029 /drivers/staging | |
parent | cdd278db0e3dd714e8076e58f723f3c59547591b (diff) | |
parent | 80f93c7b0f4599ffbdac8d964ecd1162b8b618b9 (diff) |
Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media
Pull media updates from Mauro Carvalho Chehab:
"This series include:
- a new Remote Controller driver for ST SoC with the corresponding DT
bindings
- a new frontend (cx24117)
- a new I2C camera flash driver (lm3560)
- a new mem2mem driver for TI SoC (ti-vpe)
- support for Raphael r828d added to r820t driver
- some improvements on buffer allocation at VB2 core
- usual driver fixes and improvements
PS this time, we have a smaller number of patches. While it is hard
to pinpoint to the reasons, I believe that it is mainly due to:
1) there are several patch series ready, but depending on DT review.
I decided to grant some extra time for DT maintainers to look on
it, as they're expecting to have more time with the changes agreed
during ARM mini-summit and KS. If they can't review in time for
3.14, I'll review myself and apply for the next merge window.
2) I suspect that having both LinuxCon EU and LinuxCon NA happening
during the same merge window affected the development
productivity, as several core media developers participated on
both events"
* 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: (151 commits)
[media] media: st-rc: Add ST remote control driver
[media] gpio-ir-recv: Include linux/of.h header
[media] tvp7002: Include linux/of.h header
[media] tvp514x: Include linux/of.h header
[media] ths8200: Include linux/of.h header
[media] adv7343: Include linux/of.h header
[media] v4l: Fix typo in v4l2_subdev_get_try_crop()
[media] media: i2c: add driver for dual LED Flash, lm3560
[media] rtl28xxu: add 15f4:0131 Astrometa DVB-T2
[media] rtl28xxu: add RTL2832P + R828D support
[media] rtl2832: add new tuner R828D
[media] r820t: add support for R828D
[media] media/i2c: ths8200: fix build failure with gcc 4.5.4
[media] Add support for KWorld UB435-Q V2
[media] staging/media: fix msi3101 build errors
[media] ddbridge: Remove casting the return value which is a void pointer
[media] ngene: Remove casting the return value which is a void pointer
[media] dm1105: remove unneeded not-null test
[media] sh_mobile_ceu_camera: remove deprecated IRQF_DISABLED
[media] media: rcar_vin: Add preliminary r8a7790 support
...
Diffstat (limited to 'drivers/staging')
-rw-r--r-- | drivers/staging/media/lirc/TODO | 5 | ||||
-rw-r--r-- | drivers/staging/media/lirc/lirc_bt829.c | 33 | ||||
-rw-r--r-- | drivers/staging/media/msi3101/Kconfig | 3 | ||||
-rw-r--r-- | drivers/staging/media/solo6x10/solo6x10-disp.c | 25 | ||||
-rw-r--r-- | drivers/staging/media/solo6x10/solo6x10-v4l2-enc.c | 170 | ||||
-rw-r--r-- | drivers/staging/media/solo6x10/solo6x10.h | 1 |
6 files changed, 152 insertions, 85 deletions
diff --git a/drivers/staging/media/lirc/TODO b/drivers/staging/media/lirc/TODO index b6cb593f55c6..cbea5d84fed3 100644 --- a/drivers/staging/media/lirc/TODO +++ b/drivers/staging/media/lirc/TODO | |||
@@ -2,6 +2,11 @@ | |||
2 | (see drivers/media/IR/mceusb.c vs. lirc_mceusb.c in lirc cvs for an | 2 | (see drivers/media/IR/mceusb.c vs. lirc_mceusb.c in lirc cvs for an |
3 | example of a previously completed port). | 3 | example of a previously completed port). |
4 | 4 | ||
5 | - lirc_bt829 uses registers on a Mach64 VT, which has a separate kernel | ||
6 | framebuffer driver (atyfb) and userland X driver (mach64). It can't | ||
7 | simply be converted to a normal PCI driver, but ideally it should be | ||
8 | coordinated with the other drivers. | ||
9 | |||
5 | Please send patches to: | 10 | Please send patches to: |
6 | Jarod Wilson <jarod@wilsonet.com> | 11 | Jarod Wilson <jarod@wilsonet.com> |
7 | Greg Kroah-Hartman <greg@kroah.com> | 12 | Greg Kroah-Hartman <greg@kroah.com> |
diff --git a/drivers/staging/media/lirc/lirc_bt829.c b/drivers/staging/media/lirc/lirc_bt829.c index fbbdce4c119f..30edc740ac25 100644 --- a/drivers/staging/media/lirc/lirc_bt829.c +++ b/drivers/staging/media/lirc/lirc_bt829.c | |||
@@ -63,7 +63,7 @@ static bool debug; | |||
63 | } while (0) | 63 | } while (0) |
64 | 64 | ||
65 | static int atir_minor; | 65 | static int atir_minor; |
66 | static unsigned long pci_addr_phys; | 66 | static phys_addr_t pci_addr_phys; |
67 | static unsigned char *pci_addr_lin; | 67 | static unsigned char *pci_addr_lin; |
68 | 68 | ||
69 | static struct lirc_driver atir_driver; | 69 | static struct lirc_driver atir_driver; |
@@ -78,11 +78,11 @@ static struct pci_dev *do_pci_probe(void) | |||
78 | pci_addr_phys = 0; | 78 | pci_addr_phys = 0; |
79 | if (my_dev->resource[0].flags & IORESOURCE_MEM) { | 79 | if (my_dev->resource[0].flags & IORESOURCE_MEM) { |
80 | pci_addr_phys = my_dev->resource[0].start; | 80 | pci_addr_phys = my_dev->resource[0].start; |
81 | pr_info("memory at 0x%08X\n", | 81 | pr_info("memory at %pa\n", &pci_addr_phys); |
82 | (unsigned int)pci_addr_phys); | ||
83 | } | 82 | } |
84 | if (pci_addr_phys == 0) { | 83 | if (pci_addr_phys == 0) { |
85 | pr_err("no memory resource ?\n"); | 84 | pr_err("no memory resource ?\n"); |
85 | pci_dev_put(my_dev); | ||
86 | return NULL; | 86 | return NULL; |
87 | } | 87 | } |
88 | } else { | 88 | } else { |
@@ -120,13 +120,20 @@ static void atir_set_use_dec(void *data) | |||
120 | int init_module(void) | 120 | int init_module(void) |
121 | { | 121 | { |
122 | struct pci_dev *pdev; | 122 | struct pci_dev *pdev; |
123 | int rc; | ||
123 | 124 | ||
124 | pdev = do_pci_probe(); | 125 | pdev = do_pci_probe(); |
125 | if (pdev == NULL) | 126 | if (pdev == NULL) |
126 | return -ENODEV; | 127 | return -ENODEV; |
127 | 128 | ||
128 | if (!atir_init_start()) | 129 | rc = pci_enable_device(pdev); |
129 | return -ENODEV; | 130 | if (rc) |
131 | goto err_put_dev; | ||
132 | |||
133 | if (!atir_init_start()) { | ||
134 | rc = -ENODEV; | ||
135 | goto err_disable; | ||
136 | } | ||
130 | 137 | ||
131 | strcpy(atir_driver.name, "ATIR"); | 138 | strcpy(atir_driver.name, "ATIR"); |
132 | atir_driver.minor = -1; | 139 | atir_driver.minor = -1; |
@@ -142,17 +149,31 @@ int init_module(void) | |||
142 | atir_minor = lirc_register_driver(&atir_driver); | 149 | atir_minor = lirc_register_driver(&atir_driver); |
143 | if (atir_minor < 0) { | 150 | if (atir_minor < 0) { |
144 | pr_err("failed to register driver!\n"); | 151 | pr_err("failed to register driver!\n"); |
145 | return atir_minor; | 152 | rc = atir_minor; |
153 | goto err_unmap; | ||
146 | } | 154 | } |
147 | dprintk("driver is registered on minor %d\n", atir_minor); | 155 | dprintk("driver is registered on minor %d\n", atir_minor); |
148 | 156 | ||
149 | return 0; | 157 | return 0; |
158 | |||
159 | err_unmap: | ||
160 | iounmap(pci_addr_lin); | ||
161 | err_disable: | ||
162 | pci_disable_device(pdev); | ||
163 | err_put_dev: | ||
164 | pci_dev_put(pdev); | ||
165 | return rc; | ||
150 | } | 166 | } |
151 | 167 | ||
152 | 168 | ||
153 | void cleanup_module(void) | 169 | void cleanup_module(void) |
154 | { | 170 | { |
171 | struct pci_dev *pdev = to_pci_dev(atir_driver.dev); | ||
172 | |||
155 | lirc_unregister_driver(atir_minor); | 173 | lirc_unregister_driver(atir_minor); |
174 | iounmap(pci_addr_lin); | ||
175 | pci_disable_device(pdev); | ||
176 | pci_dev_put(pdev); | ||
156 | } | 177 | } |
157 | 178 | ||
158 | 179 | ||
diff --git a/drivers/staging/media/msi3101/Kconfig b/drivers/staging/media/msi3101/Kconfig index 76d5bbd4d93c..0c349c8595e4 100644 --- a/drivers/staging/media/msi3101/Kconfig +++ b/drivers/staging/media/msi3101/Kconfig | |||
@@ -1,4 +1,5 @@ | |||
1 | config USB_MSI3101 | 1 | config USB_MSI3101 |
2 | tristate "Mirics MSi3101 SDR Dongle" | 2 | tristate "Mirics MSi3101 SDR Dongle" |
3 | depends on USB && VIDEO_DEV && VIDEO_V4L2 | 3 | depends on USB && VIDEO_DEV && VIDEO_V4L2 |
4 | select VIDEOBUF2_VMALLOC | 4 | select VIDEOBUF2_CORE |
5 | select VIDEOBUF2_VMALLOC | ||
diff --git a/drivers/staging/media/solo6x10/solo6x10-disp.c b/drivers/staging/media/solo6x10/solo6x10-disp.c index 32d9953bc36e..145295a5db72 100644 --- a/drivers/staging/media/solo6x10/solo6x10-disp.c +++ b/drivers/staging/media/solo6x10/solo6x10-disp.c | |||
@@ -176,18 +176,27 @@ static void solo_vout_config(struct solo_dev *solo_dev) | |||
176 | static int solo_dma_vin_region(struct solo_dev *solo_dev, u32 off, | 176 | static int solo_dma_vin_region(struct solo_dev *solo_dev, u32 off, |
177 | u16 val, int reg_size) | 177 | u16 val, int reg_size) |
178 | { | 178 | { |
179 | u16 buf[64]; | 179 | u16 *buf; |
180 | int i; | 180 | const int n = 64, size = n * sizeof(*buf); |
181 | int ret = 0; | 181 | int i, ret = 0; |
182 | |||
183 | buf = kmalloc(size, GFP_KERNEL); | ||
184 | if (!buf) | ||
185 | return -ENOMEM; | ||
182 | 186 | ||
183 | for (i = 0; i < sizeof(buf) >> 1; i++) | 187 | for (i = 0; i < n; i++) |
184 | buf[i] = cpu_to_le16(val); | 188 | buf[i] = cpu_to_le16(val); |
185 | 189 | ||
186 | for (i = 0; i < reg_size; i += sizeof(buf)) | 190 | for (i = 0; i < reg_size; i += size) { |
187 | ret |= solo_p2m_dma(solo_dev, 1, buf, | 191 | ret = solo_p2m_dma(solo_dev, 1, buf, |
188 | SOLO_MOTION_EXT_ADDR(solo_dev) + off + i, | 192 | SOLO_MOTION_EXT_ADDR(solo_dev) + off + i, |
189 | sizeof(buf), 0, 0); | 193 | size, 0, 0); |
194 | |||
195 | if (ret) | ||
196 | break; | ||
197 | } | ||
190 | 198 | ||
199 | kfree(buf); | ||
191 | return ret; | 200 | return ret; |
192 | } | 201 | } |
193 | 202 | ||
diff --git a/drivers/staging/media/solo6x10/solo6x10-v4l2-enc.c b/drivers/staging/media/solo6x10/solo6x10-v4l2-enc.c index a4c589604b02..d582c5b84c14 100644 --- a/drivers/staging/media/solo6x10/solo6x10-v4l2-enc.c +++ b/drivers/staging/media/solo6x10/solo6x10-v4l2-enc.c | |||
@@ -95,38 +95,11 @@ static unsigned char vop_6110_pal_cif[] = { | |||
95 | 0x01, 0x68, 0xce, 0x32, 0x28, 0x00, 0x00, 0x00, | 95 | 0x01, 0x68, 0xce, 0x32, 0x28, 0x00, 0x00, 0x00, |
96 | }; | 96 | }; |
97 | 97 | ||
98 | struct vop_header { | 98 | typedef __le32 vop_header[16]; |
99 | /* VE_STATUS0 */ | ||
100 | u32 mpeg_size:20, sad_motion_flag:1, video_motion_flag:1, vop_type:2, | ||
101 | channel:5, source_fl:1, interlace:1, progressive:1; | ||
102 | |||
103 | /* VE_STATUS1 */ | ||
104 | u32 vsize:8, hsize:8, last_queue:4, nop0:8, scale:4; | ||
105 | |||
106 | /* VE_STATUS2 */ | ||
107 | u32 mpeg_off; | ||
108 | |||
109 | /* VE_STATUS3 */ | ||
110 | u32 jpeg_off; | ||
111 | |||
112 | /* VE_STATUS4 */ | ||
113 | u32 jpeg_size:20, interval:10, nop1:2; | ||
114 | |||
115 | /* VE_STATUS5/6 */ | ||
116 | u32 sec, usec; | ||
117 | |||
118 | /* VE_STATUS7/8/9 */ | ||
119 | u32 nop2[3]; | ||
120 | |||
121 | /* VE_STATUS10 */ | ||
122 | u32 mpeg_size_alt:20, nop3:12; | ||
123 | |||
124 | u32 end_nops[5]; | ||
125 | } __packed; | ||
126 | 99 | ||
127 | struct solo_enc_buf { | 100 | struct solo_enc_buf { |
128 | enum solo_enc_types type; | 101 | enum solo_enc_types type; |
129 | struct vop_header *vh; | 102 | const vop_header *vh; |
130 | int motion; | 103 | int motion; |
131 | }; | 104 | }; |
132 | 105 | ||
@@ -346,7 +319,7 @@ static int enc_get_mpeg_dma(struct solo_dev *solo_dev, dma_addr_t dma, | |||
346 | /* Build a descriptor queue out of an SG list and send it to the P2M for | 319 | /* Build a descriptor queue out of an SG list and send it to the P2M for |
347 | * processing. */ | 320 | * processing. */ |
348 | static int solo_send_desc(struct solo_enc_dev *solo_enc, int skip, | 321 | static int solo_send_desc(struct solo_enc_dev *solo_enc, int skip, |
349 | struct vb2_dma_sg_desc *vbuf, int off, int size, | 322 | struct sg_table *vbuf, int off, int size, |
350 | unsigned int base, unsigned int base_size) | 323 | unsigned int base, unsigned int base_size) |
351 | { | 324 | { |
352 | struct solo_dev *solo_dev = solo_enc->solo_dev; | 325 | struct solo_dev *solo_dev = solo_enc->solo_dev; |
@@ -359,7 +332,7 @@ static int solo_send_desc(struct solo_enc_dev *solo_enc, int skip, | |||
359 | 332 | ||
360 | solo_enc->desc_count = 1; | 333 | solo_enc->desc_count = 1; |
361 | 334 | ||
362 | for_each_sg(vbuf->sglist, sg, vbuf->num_pages, i) { | 335 | for_each_sg(vbuf->sgl, sg, vbuf->nents, i) { |
363 | struct solo_p2m_desc *desc; | 336 | struct solo_p2m_desc *desc; |
364 | dma_addr_t dma; | 337 | dma_addr_t dma; |
365 | int len; | 338 | int len; |
@@ -430,84 +403,145 @@ static int solo_send_desc(struct solo_enc_dev *solo_enc, int skip, | |||
430 | solo_enc->desc_count - 1); | 403 | solo_enc->desc_count - 1); |
431 | } | 404 | } |
432 | 405 | ||
406 | /* Extract values from VOP header - VE_STATUSxx */ | ||
407 | static inline int vop_interlaced(const vop_header *vh) | ||
408 | { | ||
409 | return (__le32_to_cpu((*vh)[0]) >> 30) & 1; | ||
410 | } | ||
411 | |||
412 | static inline u8 vop_channel(const vop_header *vh) | ||
413 | { | ||
414 | return (__le32_to_cpu((*vh)[0]) >> 24) & 0x1F; | ||
415 | } | ||
416 | |||
417 | static inline u8 vop_type(const vop_header *vh) | ||
418 | { | ||
419 | return (__le32_to_cpu((*vh)[0]) >> 22) & 3; | ||
420 | } | ||
421 | |||
422 | static inline u32 vop_mpeg_size(const vop_header *vh) | ||
423 | { | ||
424 | return __le32_to_cpu((*vh)[0]) & 0xFFFFF; | ||
425 | } | ||
426 | |||
427 | static inline u8 vop_hsize(const vop_header *vh) | ||
428 | { | ||
429 | return (__le32_to_cpu((*vh)[1]) >> 8) & 0xFF; | ||
430 | } | ||
431 | |||
432 | static inline u8 vop_vsize(const vop_header *vh) | ||
433 | { | ||
434 | return __le32_to_cpu((*vh)[1]) & 0xFF; | ||
435 | } | ||
436 | |||
437 | static inline u32 vop_mpeg_offset(const vop_header *vh) | ||
438 | { | ||
439 | return __le32_to_cpu((*vh)[2]); | ||
440 | } | ||
441 | |||
442 | static inline u32 vop_jpeg_offset(const vop_header *vh) | ||
443 | { | ||
444 | return __le32_to_cpu((*vh)[3]); | ||
445 | } | ||
446 | |||
447 | static inline u32 vop_jpeg_size(const vop_header *vh) | ||
448 | { | ||
449 | return __le32_to_cpu((*vh)[4]) & 0xFFFFF; | ||
450 | } | ||
451 | |||
452 | static inline u32 vop_sec(const vop_header *vh) | ||
453 | { | ||
454 | return __le32_to_cpu((*vh)[5]); | ||
455 | } | ||
456 | |||
457 | static inline u32 vop_usec(const vop_header *vh) | ||
458 | { | ||
459 | return __le32_to_cpu((*vh)[6]); | ||
460 | } | ||
461 | |||
433 | static int solo_fill_jpeg(struct solo_enc_dev *solo_enc, | 462 | static int solo_fill_jpeg(struct solo_enc_dev *solo_enc, |
434 | struct vb2_buffer *vb, struct vop_header *vh) | 463 | struct vb2_buffer *vb, const vop_header *vh) |
435 | { | 464 | { |
436 | struct solo_dev *solo_dev = solo_enc->solo_dev; | 465 | struct solo_dev *solo_dev = solo_enc->solo_dev; |
437 | struct vb2_dma_sg_desc *vbuf = vb2_dma_sg_plane_desc(vb, 0); | 466 | struct sg_table *vbuf = vb2_dma_sg_plane_desc(vb, 0); |
438 | int frame_size; | 467 | int frame_size; |
439 | int ret; | 468 | int ret; |
440 | 469 | ||
441 | vb->v4l2_buf.flags |= V4L2_BUF_FLAG_KEYFRAME; | 470 | vb->v4l2_buf.flags |= V4L2_BUF_FLAG_KEYFRAME; |
442 | 471 | ||
443 | if (vb2_plane_size(vb, 0) < vh->jpeg_size + solo_enc->jpeg_len) | 472 | if (vb2_plane_size(vb, 0) < vop_jpeg_size(vh) + solo_enc->jpeg_len) |
444 | return -EIO; | 473 | return -EIO; |
445 | 474 | ||
446 | sg_copy_from_buffer(vbuf->sglist, vbuf->num_pages, | 475 | frame_size = (vop_jpeg_size(vh) + solo_enc->jpeg_len + (DMA_ALIGN - 1)) |
447 | solo_enc->jpeg_header, | ||
448 | solo_enc->jpeg_len); | ||
449 | |||
450 | frame_size = (vh->jpeg_size + solo_enc->jpeg_len + (DMA_ALIGN - 1)) | ||
451 | & ~(DMA_ALIGN - 1); | 476 | & ~(DMA_ALIGN - 1); |
452 | vb2_set_plane_payload(vb, 0, vh->jpeg_size + solo_enc->jpeg_len); | 477 | vb2_set_plane_payload(vb, 0, vop_jpeg_size(vh) + solo_enc->jpeg_len); |
453 | 478 | ||
454 | dma_map_sg(&solo_dev->pdev->dev, vbuf->sglist, vbuf->num_pages, | 479 | /* may discard all previous data in vbuf->sgl */ |
480 | dma_map_sg(&solo_dev->pdev->dev, vbuf->sgl, vbuf->nents, | ||
455 | DMA_FROM_DEVICE); | 481 | DMA_FROM_DEVICE); |
456 | ret = solo_send_desc(solo_enc, solo_enc->jpeg_len, vbuf, vh->jpeg_off, | 482 | ret = solo_send_desc(solo_enc, solo_enc->jpeg_len, vbuf, |
457 | frame_size, SOLO_JPEG_EXT_ADDR(solo_dev), | 483 | vop_jpeg_offset(vh) - SOLO_JPEG_EXT_ADDR(solo_dev), |
458 | SOLO_JPEG_EXT_SIZE(solo_dev)); | 484 | frame_size, SOLO_JPEG_EXT_ADDR(solo_dev), |
459 | dma_unmap_sg(&solo_dev->pdev->dev, vbuf->sglist, vbuf->num_pages, | 485 | SOLO_JPEG_EXT_SIZE(solo_dev)); |
486 | dma_unmap_sg(&solo_dev->pdev->dev, vbuf->sgl, vbuf->nents, | ||
460 | DMA_FROM_DEVICE); | 487 | DMA_FROM_DEVICE); |
488 | |||
489 | /* add the header only after dma_unmap_sg() */ | ||
490 | sg_copy_from_buffer(vbuf->sgl, vbuf->nents, | ||
491 | solo_enc->jpeg_header, solo_enc->jpeg_len); | ||
492 | |||
461 | return ret; | 493 | return ret; |
462 | } | 494 | } |
463 | 495 | ||
464 | static int solo_fill_mpeg(struct solo_enc_dev *solo_enc, | 496 | static int solo_fill_mpeg(struct solo_enc_dev *solo_enc, |
465 | struct vb2_buffer *vb, struct vop_header *vh) | 497 | struct vb2_buffer *vb, const vop_header *vh) |
466 | { | 498 | { |
467 | struct solo_dev *solo_dev = solo_enc->solo_dev; | 499 | struct solo_dev *solo_dev = solo_enc->solo_dev; |
468 | struct vb2_dma_sg_desc *vbuf = vb2_dma_sg_plane_desc(vb, 0); | 500 | struct sg_table *vbuf = vb2_dma_sg_plane_desc(vb, 0); |
469 | int frame_off, frame_size; | 501 | int frame_off, frame_size; |
470 | int skip = 0; | 502 | int skip = 0; |
471 | int ret; | 503 | int ret; |
472 | 504 | ||
473 | if (vb2_plane_size(vb, 0) < vh->mpeg_size) | 505 | if (vb2_plane_size(vb, 0) < vop_mpeg_size(vh)) |
474 | return -EIO; | 506 | return -EIO; |
475 | 507 | ||
476 | /* If this is a key frame, add extra header */ | 508 | /* If this is a key frame, add extra header */ |
477 | if (!vh->vop_type) { | 509 | vb->v4l2_buf.flags &= ~(V4L2_BUF_FLAG_KEYFRAME | V4L2_BUF_FLAG_PFRAME | V4L2_BUF_FLAG_BFRAME); |
478 | sg_copy_from_buffer(vbuf->sglist, vbuf->num_pages, | 510 | if (!vop_type(vh)) { |
479 | solo_enc->vop, | ||
480 | solo_enc->vop_len); | ||
481 | |||
482 | skip = solo_enc->vop_len; | 511 | skip = solo_enc->vop_len; |
483 | |||
484 | vb->v4l2_buf.flags |= V4L2_BUF_FLAG_KEYFRAME; | 512 | vb->v4l2_buf.flags |= V4L2_BUF_FLAG_KEYFRAME; |
485 | vb2_set_plane_payload(vb, 0, vh->mpeg_size + solo_enc->vop_len); | 513 | vb2_set_plane_payload(vb, 0, vop_mpeg_size(vh) + solo_enc->vop_len); |
486 | } else { | 514 | } else { |
487 | vb->v4l2_buf.flags |= V4L2_BUF_FLAG_PFRAME; | 515 | vb->v4l2_buf.flags |= V4L2_BUF_FLAG_PFRAME; |
488 | vb2_set_plane_payload(vb, 0, vh->mpeg_size); | 516 | vb2_set_plane_payload(vb, 0, vop_mpeg_size(vh)); |
489 | } | 517 | } |
490 | 518 | ||
491 | /* Now get the actual mpeg payload */ | 519 | /* Now get the actual mpeg payload */ |
492 | frame_off = (vh->mpeg_off + sizeof(*vh)) | 520 | frame_off = (vop_mpeg_offset(vh) - SOLO_MP4E_EXT_ADDR(solo_dev) + sizeof(*vh)) |
493 | % SOLO_MP4E_EXT_SIZE(solo_dev); | 521 | % SOLO_MP4E_EXT_SIZE(solo_dev); |
494 | frame_size = (vh->mpeg_size + skip + (DMA_ALIGN - 1)) | 522 | frame_size = (vop_mpeg_size(vh) + skip + (DMA_ALIGN - 1)) |
495 | & ~(DMA_ALIGN - 1); | 523 | & ~(DMA_ALIGN - 1); |
496 | 524 | ||
497 | dma_map_sg(&solo_dev->pdev->dev, vbuf->sglist, vbuf->num_pages, | 525 | /* may discard all previous data in vbuf->sgl */ |
526 | dma_map_sg(&solo_dev->pdev->dev, vbuf->sgl, vbuf->nents, | ||
498 | DMA_FROM_DEVICE); | 527 | DMA_FROM_DEVICE); |
499 | ret = solo_send_desc(solo_enc, skip, vbuf, frame_off, frame_size, | 528 | ret = solo_send_desc(solo_enc, skip, vbuf, frame_off, frame_size, |
500 | SOLO_MP4E_EXT_ADDR(solo_dev), | 529 | SOLO_MP4E_EXT_ADDR(solo_dev), |
501 | SOLO_MP4E_EXT_SIZE(solo_dev)); | 530 | SOLO_MP4E_EXT_SIZE(solo_dev)); |
502 | dma_unmap_sg(&solo_dev->pdev->dev, vbuf->sglist, vbuf->num_pages, | 531 | dma_unmap_sg(&solo_dev->pdev->dev, vbuf->sgl, vbuf->nents, |
503 | DMA_FROM_DEVICE); | 532 | DMA_FROM_DEVICE); |
533 | |||
534 | /* add the header only after dma_unmap_sg() */ | ||
535 | if (!vop_type(vh)) | ||
536 | sg_copy_from_buffer(vbuf->sgl, vbuf->nents, | ||
537 | solo_enc->vop, solo_enc->vop_len); | ||
504 | return ret; | 538 | return ret; |
505 | } | 539 | } |
506 | 540 | ||
507 | static int solo_enc_fillbuf(struct solo_enc_dev *solo_enc, | 541 | static int solo_enc_fillbuf(struct solo_enc_dev *solo_enc, |
508 | struct vb2_buffer *vb, struct solo_enc_buf *enc_buf) | 542 | struct vb2_buffer *vb, struct solo_enc_buf *enc_buf) |
509 | { | 543 | { |
510 | struct vop_header *vh = enc_buf->vh; | 544 | const vop_header *vh = enc_buf->vh; |
511 | int ret; | 545 | int ret; |
512 | 546 | ||
513 | /* Check for motion flags */ | 547 | /* Check for motion flags */ |
@@ -531,8 +565,8 @@ static int solo_enc_fillbuf(struct solo_enc_dev *solo_enc, | |||
531 | 565 | ||
532 | if (!ret) { | 566 | if (!ret) { |
533 | vb->v4l2_buf.sequence = solo_enc->sequence++; | 567 | vb->v4l2_buf.sequence = solo_enc->sequence++; |
534 | vb->v4l2_buf.timestamp.tv_sec = vh->sec; | 568 | vb->v4l2_buf.timestamp.tv_sec = vop_sec(vh); |
535 | vb->v4l2_buf.timestamp.tv_usec = vh->usec; | 569 | vb->v4l2_buf.timestamp.tv_usec = vop_usec(vh); |
536 | } | 570 | } |
537 | 571 | ||
538 | vb2_buffer_done(vb, ret ? VB2_BUF_STATE_ERROR : VB2_BUF_STATE_DONE); | 572 | vb2_buffer_done(vb, ret ? VB2_BUF_STATE_ERROR : VB2_BUF_STATE_DONE); |
@@ -605,15 +639,13 @@ static void solo_handle_ring(struct solo_dev *solo_dev) | |||
605 | 639 | ||
606 | /* FAIL... */ | 640 | /* FAIL... */ |
607 | if (enc_get_mpeg_dma(solo_dev, solo_dev->vh_dma, off, | 641 | if (enc_get_mpeg_dma(solo_dev, solo_dev->vh_dma, off, |
608 | sizeof(struct vop_header))) | 642 | sizeof(vop_header))) |
609 | continue; | 643 | continue; |
610 | 644 | ||
611 | enc_buf.vh = (struct vop_header *)solo_dev->vh_buf; | 645 | enc_buf.vh = solo_dev->vh_buf; |
612 | enc_buf.vh->mpeg_off -= SOLO_MP4E_EXT_ADDR(solo_dev); | ||
613 | enc_buf.vh->jpeg_off -= SOLO_JPEG_EXT_ADDR(solo_dev); | ||
614 | 646 | ||
615 | /* Sanity check */ | 647 | /* Sanity check */ |
616 | if (enc_buf.vh->mpeg_off != off) | 648 | if (vop_mpeg_offset(enc_buf.vh) != SOLO_MP4E_EXT_ADDR(solo_dev) + off) |
617 | continue; | 649 | continue; |
618 | 650 | ||
619 | if (solo_motion_detected(solo_enc)) | 651 | if (solo_motion_detected(solo_enc)) |
@@ -1329,7 +1361,7 @@ int solo_enc_v4l2_init(struct solo_dev *solo_dev, unsigned nr) | |||
1329 | 1361 | ||
1330 | init_waitqueue_head(&solo_dev->ring_thread_wait); | 1362 | init_waitqueue_head(&solo_dev->ring_thread_wait); |
1331 | 1363 | ||
1332 | solo_dev->vh_size = sizeof(struct vop_header); | 1364 | solo_dev->vh_size = sizeof(vop_header); |
1333 | solo_dev->vh_buf = pci_alloc_consistent(solo_dev->pdev, | 1365 | solo_dev->vh_buf = pci_alloc_consistent(solo_dev->pdev, |
1334 | solo_dev->vh_size, | 1366 | solo_dev->vh_size, |
1335 | &solo_dev->vh_dma); | 1367 | &solo_dev->vh_dma); |
diff --git a/drivers/staging/media/solo6x10/solo6x10.h b/drivers/staging/media/solo6x10/solo6x10.h index 6f91d2e34b2a..f1bbb8cb74e6 100644 --- a/drivers/staging/media/solo6x10/solo6x10.h +++ b/drivers/staging/media/solo6x10/solo6x10.h | |||
@@ -94,7 +94,6 @@ | |||
94 | #define SOLO_ENC_MODE_HD1 1 | 94 | #define SOLO_ENC_MODE_HD1 1 |
95 | #define SOLO_ENC_MODE_D1 9 | 95 | #define SOLO_ENC_MODE_D1 9 |
96 | 96 | ||
97 | #define SOLO_DEFAULT_GOP 30 | ||
98 | #define SOLO_DEFAULT_QP 3 | 97 | #define SOLO_DEFAULT_QP 3 |
99 | 98 | ||
100 | #ifndef V4L2_BUF_FLAG_MOTION_ON | 99 | #ifndef V4L2_BUF_FLAG_MOTION_ON |