xref: /linux/drivers/media/usb/pwc/pwc-misc.c (revision c532de5a67a70f8533d495f8f2aaa9a0491c3ad0)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* Linux driver for Philips webcam
3    Various miscellaneous functions and tables.
4    (C) 1999-2003 Nemosoft Unv.
5    (C) 2004-2006 Luc Saillard (luc@saillard.org)
6 
7    NOTE: this version of pwc is an unofficial (modified) release of pwc & pcwx
8    driver and thus may have bugs that are not present in the original version.
9    Please send bug reports and support requests to <luc@saillard.org>.
10    The decompression routines have been implemented by reverse-engineering the
11    Nemosoft binary pwcx module. Caveat emptor.
12 
13 */
14 
15 
16 #include "pwc.h"
17 
18 const int pwc_image_sizes[PSZ_MAX][2] =
19 {
20 	{ 128,  96 }, /* sqcif */
21 	{ 160, 120 }, /* qsif */
22 	{ 176, 144 }, /* qcif */
23 	{ 320, 240 }, /* sif */
24 	{ 352, 288 }, /* cif */
25 	{ 640, 480 }, /* vga */
26 };
27 
28 /* x,y -> PSZ_ */
29 int pwc_get_size(struct pwc_device *pdev, int width, int height)
30 {
31 	int i;
32 
33 	/* Find the largest size supported by the camera that fits into the
34 	   requested size. */
35 	for (i = PSZ_MAX - 1; i >= 0; i--) {
36 		if (!(pdev->image_mask & (1 << i)))
37 			continue;
38 
39 		if (pwc_image_sizes[i][0] <= width &&
40 		    pwc_image_sizes[i][1] <= height)
41 			return i;
42 	}
43 
44 	/* No mode found, return the smallest mode we have */
45 	for (i = 0; i < PSZ_MAX; i++) {
46 		if (pdev->image_mask & (1 << i))
47 			return i;
48 	}
49 
50 	/* Never reached there always is at least one supported mode */
51 	return 0;
52 }
53 
54 /* initialize variables depending on type and decompressor */
55 void pwc_construct(struct pwc_device *pdev)
56 {
57 	if (DEVICE_USE_CODEC1(pdev->type)) {
58 
59 		pdev->image_mask = 1 << PSZ_SQCIF | 1 << PSZ_QCIF | 1 << PSZ_CIF;
60 		pdev->vcinterface = 2;
61 		pdev->vendpoint = 4;
62 		pdev->frame_header_size = 0;
63 		pdev->frame_trailer_size = 0;
64 
65 	} else if (DEVICE_USE_CODEC3(pdev->type)) {
66 
67 		pdev->image_mask = 1 << PSZ_QSIF | 1 << PSZ_SIF | 1 << PSZ_VGA;
68 		pdev->vcinterface = 3;
69 		pdev->vendpoint = 5;
70 		pdev->frame_header_size = TOUCAM_HEADER_SIZE;
71 		pdev->frame_trailer_size = TOUCAM_TRAILER_SIZE;
72 
73 	} else /* if (DEVICE_USE_CODEC2(pdev->type)) */ {
74 
75 		pdev->image_mask = 1 << PSZ_SQCIF | 1 << PSZ_QSIF | 1 << PSZ_QCIF | 1 << PSZ_SIF | 1 << PSZ_CIF | 1 << PSZ_VGA;
76 		pdev->vcinterface = 3;
77 		pdev->vendpoint = 4;
78 		pdev->frame_header_size = 0;
79 		pdev->frame_trailer_size = 0;
80 	}
81 }
82