162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
262306a36Sopenharmony_ci/* Linux driver for Philips webcam
362306a36Sopenharmony_ci   Various miscellaneous functions and tables.
462306a36Sopenharmony_ci   (C) 1999-2003 Nemosoft Unv.
562306a36Sopenharmony_ci   (C) 2004-2006 Luc Saillard (luc@saillard.org)
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci   NOTE: this version of pwc is an unofficial (modified) release of pwc & pcwx
862306a36Sopenharmony_ci   driver and thus may have bugs that are not present in the original version.
962306a36Sopenharmony_ci   Please send bug reports and support requests to <luc@saillard.org>.
1062306a36Sopenharmony_ci   The decompression routines have been implemented by reverse-engineering the
1162306a36Sopenharmony_ci   Nemosoft binary pwcx module. Caveat emptor.
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci*/
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#include "pwc.h"
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ciconst int pwc_image_sizes[PSZ_MAX][2] =
1962306a36Sopenharmony_ci{
2062306a36Sopenharmony_ci	{ 128,  96 }, /* sqcif */
2162306a36Sopenharmony_ci	{ 160, 120 }, /* qsif */
2262306a36Sopenharmony_ci	{ 176, 144 }, /* qcif */
2362306a36Sopenharmony_ci	{ 320, 240 }, /* sif */
2462306a36Sopenharmony_ci	{ 352, 288 }, /* cif */
2562306a36Sopenharmony_ci	{ 640, 480 }, /* vga */
2662306a36Sopenharmony_ci};
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci/* x,y -> PSZ_ */
2962306a36Sopenharmony_ciint pwc_get_size(struct pwc_device *pdev, int width, int height)
3062306a36Sopenharmony_ci{
3162306a36Sopenharmony_ci	int i;
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci	/* Find the largest size supported by the camera that fits into the
3462306a36Sopenharmony_ci	   requested size. */
3562306a36Sopenharmony_ci	for (i = PSZ_MAX - 1; i >= 0; i--) {
3662306a36Sopenharmony_ci		if (!(pdev->image_mask & (1 << i)))
3762306a36Sopenharmony_ci			continue;
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci		if (pwc_image_sizes[i][0] <= width &&
4062306a36Sopenharmony_ci		    pwc_image_sizes[i][1] <= height)
4162306a36Sopenharmony_ci			return i;
4262306a36Sopenharmony_ci	}
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci	/* No mode found, return the smallest mode we have */
4562306a36Sopenharmony_ci	for (i = 0; i < PSZ_MAX; i++) {
4662306a36Sopenharmony_ci		if (pdev->image_mask & (1 << i))
4762306a36Sopenharmony_ci			return i;
4862306a36Sopenharmony_ci	}
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci	/* Never reached there always is at least one supported mode */
5162306a36Sopenharmony_ci	return 0;
5262306a36Sopenharmony_ci}
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci/* initialize variables depending on type and decompressor */
5562306a36Sopenharmony_civoid pwc_construct(struct pwc_device *pdev)
5662306a36Sopenharmony_ci{
5762306a36Sopenharmony_ci	if (DEVICE_USE_CODEC1(pdev->type)) {
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci		pdev->image_mask = 1 << PSZ_SQCIF | 1 << PSZ_QCIF | 1 << PSZ_CIF;
6062306a36Sopenharmony_ci		pdev->vcinterface = 2;
6162306a36Sopenharmony_ci		pdev->vendpoint = 4;
6262306a36Sopenharmony_ci		pdev->frame_header_size = 0;
6362306a36Sopenharmony_ci		pdev->frame_trailer_size = 0;
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci	} else if (DEVICE_USE_CODEC3(pdev->type)) {
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci		pdev->image_mask = 1 << PSZ_QSIF | 1 << PSZ_SIF | 1 << PSZ_VGA;
6862306a36Sopenharmony_ci		pdev->vcinterface = 3;
6962306a36Sopenharmony_ci		pdev->vendpoint = 5;
7062306a36Sopenharmony_ci		pdev->frame_header_size = TOUCAM_HEADER_SIZE;
7162306a36Sopenharmony_ci		pdev->frame_trailer_size = TOUCAM_TRAILER_SIZE;
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci	} else /* if (DEVICE_USE_CODEC2(pdev->type)) */ {
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci		pdev->image_mask = 1 << PSZ_SQCIF | 1 << PSZ_QSIF | 1 << PSZ_QCIF | 1 << PSZ_SIF | 1 << PSZ_CIF | 1 << PSZ_VGA;
7662306a36Sopenharmony_ci		pdev->vcinterface = 3;
7762306a36Sopenharmony_ci		pdev->vendpoint = 4;
7862306a36Sopenharmony_ci		pdev->frame_header_size = 0;
7962306a36Sopenharmony_ci		pdev->frame_trailer_size = 0;
8062306a36Sopenharmony_ci	}
8162306a36Sopenharmony_ci}
82