92 lines
2.0 KiB
C
92 lines
2.0 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* camss-format.c
|
|
*
|
|
* Qualcomm MSM Camera Subsystem - Format helpers
|
|
*
|
|
* Copyright (c) 2023, The Linux Foundation. All rights reserved.
|
|
* Copyright (c) 2023 Qualcomm Technologies, Inc.
|
|
*/
|
|
#include <linux/bug.h>
|
|
#include <linux/errno.h>
|
|
|
|
#include "camss-format.h"
|
|
|
|
/*
|
|
* camss_format_get_bpp - Map media bus format to bits per pixel
|
|
* @formats: supported media bus formats array
|
|
* @nformats: size of @formats array
|
|
* @code: media bus format code
|
|
*
|
|
* Return number of bits per pixel
|
|
*/
|
|
u8 camss_format_get_bpp(const struct camss_format_info *formats, unsigned int nformats, u32 code)
|
|
{
|
|
unsigned int i;
|
|
|
|
for (i = 0; i < nformats; i++)
|
|
if (code == formats[i].code)
|
|
return formats[i].mbus_bpp;
|
|
|
|
WARN(1, "Unknown format\n");
|
|
|
|
return formats[0].mbus_bpp;
|
|
}
|
|
|
|
/*
|
|
* camss_format_find_code - Find a format code in an array
|
|
* @code: a pointer to media bus format codes array
|
|
* @n_code: size of @code array
|
|
* @index: index of code in the array
|
|
* @req_code: required code
|
|
*
|
|
* Return media bus format code
|
|
*/
|
|
u32 camss_format_find_code(u32 *code, unsigned int n_code, unsigned int index, u32 req_code)
|
|
{
|
|
unsigned int i;
|
|
|
|
if (!req_code && index >= n_code)
|
|
return 0;
|
|
|
|
for (i = 0; i < n_code; i++) {
|
|
if (req_code) {
|
|
if (req_code == code[i])
|
|
return req_code;
|
|
} else {
|
|
if (i == index)
|
|
return code[i];
|
|
}
|
|
}
|
|
|
|
return code[0];
|
|
}
|
|
|
|
/*
|
|
* camss_format_find_format - Find a format in an array
|
|
* @code: media bus format code
|
|
* @pixelformat: V4L2 pixel format FCC identifier
|
|
* @formats: a pointer to formats array
|
|
* @nformats: size of @formats array
|
|
*
|
|
* Return index of a format or a negative error code otherwise
|
|
*/
|
|
int camss_format_find_format(u32 code, u32 pixelformat, const struct camss_format_info *formats,
|
|
unsigned int nformats)
|
|
{
|
|
unsigned int i;
|
|
|
|
for (i = 0; i < nformats; i++) {
|
|
if (formats[i].code == code &&
|
|
formats[i].pixelformat == pixelformat)
|
|
return i;
|
|
}
|
|
|
|
for (i = 0; i < nformats; i++) {
|
|
if (formats[i].code == code)
|
|
return i;
|
|
}
|
|
|
|
return -EINVAL;
|
|
}
|