media: qcom: camss: Move format related functions
Move out the format related helper functions from vfe and video in a separate file. The goal here is to create a format API. Signed-off-by: Radoslav Tsvetkov <quic_rtsvetko@quicinc.com> Signed-off-by: Gjorgji Rosikopulos <quic_grosikop@quicinc.com> Acked-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org> Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
This commit is contained in:
committed by
Hans Verkuil
parent
e05d1be958
commit
ad458cb90f
@@ -19,5 +19,6 @@ qcom-camss-objs += \
|
||||
camss-vfe-gen1.o \
|
||||
camss-vfe.o \
|
||||
camss-video.o \
|
||||
camss-format.o \
|
||||
|
||||
obj-$(CONFIG_VIDEO_QCOM_CAMSS) += qcom-camss.o
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
// 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;
|
||||
}
|
||||
@@ -54,4 +54,9 @@ struct camss_formats {
|
||||
const struct camss_format_info *formats;
|
||||
};
|
||||
|
||||
u8 camss_format_get_bpp(const struct camss_format_info *formats, unsigned int nformats, u32 code);
|
||||
u32 camss_format_find_code(u32 *code, unsigned int n_code, unsigned int index, u32 req_code);
|
||||
int camss_format_find_format(u32 code, u32 pixelformat, const struct camss_format_info *formats,
|
||||
unsigned int nformats);
|
||||
|
||||
#endif /* __CAMSS_FORMAT_H__ */
|
||||
|
||||
@@ -278,48 +278,6 @@ const struct camss_formats vfe_formats_pix_845 = {
|
||||
.formats = formats_rdi_845
|
||||
};
|
||||
|
||||
/*
|
||||
* vfe_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
|
||||
*/
|
||||
static u8 vfe_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;
|
||||
}
|
||||
|
||||
static u32 vfe_find_code(u32 *code, unsigned int n_code,
|
||||
unsigned int index, u32 req_code)
|
||||
{
|
||||
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];
|
||||
}
|
||||
|
||||
static u32 vfe_src_pad_code(struct vfe_line *line, u32 sink_code,
|
||||
unsigned int index, u32 src_req_code)
|
||||
{
|
||||
@@ -335,8 +293,8 @@ static u32 vfe_src_pad_code(struct vfe_line *line, u32 sink_code,
|
||||
MEDIA_BUS_FMT_YUYV8_1_5X8,
|
||||
};
|
||||
|
||||
return vfe_find_code(src_code, ARRAY_SIZE(src_code),
|
||||
index, src_req_code);
|
||||
return camss_format_find_code(src_code, ARRAY_SIZE(src_code),
|
||||
index, src_req_code);
|
||||
}
|
||||
case MEDIA_BUS_FMT_YVYU8_1X16:
|
||||
{
|
||||
@@ -345,8 +303,8 @@ static u32 vfe_src_pad_code(struct vfe_line *line, u32 sink_code,
|
||||
MEDIA_BUS_FMT_YVYU8_1_5X8,
|
||||
};
|
||||
|
||||
return vfe_find_code(src_code, ARRAY_SIZE(src_code),
|
||||
index, src_req_code);
|
||||
return camss_format_find_code(src_code, ARRAY_SIZE(src_code),
|
||||
index, src_req_code);
|
||||
}
|
||||
case MEDIA_BUS_FMT_UYVY8_1X16:
|
||||
{
|
||||
@@ -355,8 +313,8 @@ static u32 vfe_src_pad_code(struct vfe_line *line, u32 sink_code,
|
||||
MEDIA_BUS_FMT_UYVY8_1_5X8,
|
||||
};
|
||||
|
||||
return vfe_find_code(src_code, ARRAY_SIZE(src_code),
|
||||
index, src_req_code);
|
||||
return camss_format_find_code(src_code, ARRAY_SIZE(src_code),
|
||||
index, src_req_code);
|
||||
}
|
||||
case MEDIA_BUS_FMT_VYUY8_1X16:
|
||||
{
|
||||
@@ -365,8 +323,8 @@ static u32 vfe_src_pad_code(struct vfe_line *line, u32 sink_code,
|
||||
MEDIA_BUS_FMT_VYUY8_1_5X8,
|
||||
};
|
||||
|
||||
return vfe_find_code(src_code, ARRAY_SIZE(src_code),
|
||||
index, src_req_code);
|
||||
return camss_format_find_code(src_code, ARRAY_SIZE(src_code),
|
||||
index, src_req_code);
|
||||
}
|
||||
default:
|
||||
if (index > 0)
|
||||
@@ -391,8 +349,8 @@ static u32 vfe_src_pad_code(struct vfe_line *line, u32 sink_code,
|
||||
MEDIA_BUS_FMT_YUYV8_1_5X8,
|
||||
};
|
||||
|
||||
return vfe_find_code(src_code, ARRAY_SIZE(src_code),
|
||||
index, src_req_code);
|
||||
return camss_format_find_code(src_code, ARRAY_SIZE(src_code),
|
||||
index, src_req_code);
|
||||
}
|
||||
case MEDIA_BUS_FMT_YVYU8_1X16:
|
||||
{
|
||||
@@ -404,8 +362,8 @@ static u32 vfe_src_pad_code(struct vfe_line *line, u32 sink_code,
|
||||
MEDIA_BUS_FMT_YVYU8_1_5X8,
|
||||
};
|
||||
|
||||
return vfe_find_code(src_code, ARRAY_SIZE(src_code),
|
||||
index, src_req_code);
|
||||
return camss_format_find_code(src_code, ARRAY_SIZE(src_code),
|
||||
index, src_req_code);
|
||||
}
|
||||
case MEDIA_BUS_FMT_UYVY8_1X16:
|
||||
{
|
||||
@@ -417,8 +375,8 @@ static u32 vfe_src_pad_code(struct vfe_line *line, u32 sink_code,
|
||||
MEDIA_BUS_FMT_UYVY8_1_5X8,
|
||||
};
|
||||
|
||||
return vfe_find_code(src_code, ARRAY_SIZE(src_code),
|
||||
index, src_req_code);
|
||||
return camss_format_find_code(src_code, ARRAY_SIZE(src_code),
|
||||
index, src_req_code);
|
||||
}
|
||||
case MEDIA_BUS_FMT_VYUY8_1X16:
|
||||
{
|
||||
@@ -430,8 +388,8 @@ static u32 vfe_src_pad_code(struct vfe_line *line, u32 sink_code,
|
||||
MEDIA_BUS_FMT_VYUY8_1_5X8,
|
||||
};
|
||||
|
||||
return vfe_find_code(src_code, ARRAY_SIZE(src_code),
|
||||
index, src_req_code);
|
||||
return camss_format_find_code(src_code, ARRAY_SIZE(src_code),
|
||||
index, src_req_code);
|
||||
}
|
||||
default:
|
||||
if (index > 0)
|
||||
@@ -714,9 +672,9 @@ static int vfe_set_clock_rates(struct vfe_device *vfe)
|
||||
} else {
|
||||
struct vfe_line *l = &vfe->line[j];
|
||||
|
||||
bpp = vfe_get_bpp(l->formats,
|
||||
l->nformats,
|
||||
l->fmt[MSM_VFE_PAD_SINK].code);
|
||||
bpp = camss_format_get_bpp(l->formats,
|
||||
l->nformats,
|
||||
l->fmt[MSM_VFE_PAD_SINK].code);
|
||||
tmp = pixel_clock[j] * bpp / 64;
|
||||
}
|
||||
|
||||
@@ -795,9 +753,9 @@ static int vfe_check_clock_rates(struct vfe_device *vfe)
|
||||
} else {
|
||||
struct vfe_line *l = &vfe->line[j];
|
||||
|
||||
bpp = vfe_get_bpp(l->formats,
|
||||
l->nformats,
|
||||
l->fmt[MSM_VFE_PAD_SINK].code);
|
||||
bpp = camss_format_get_bpp(l->formats,
|
||||
l->nformats,
|
||||
l->fmt[MSM_VFE_PAD_SINK].code);
|
||||
tmp = pixel_clock[j] * bpp / 64;
|
||||
}
|
||||
|
||||
|
||||
@@ -28,27 +28,6 @@
|
||||
* Helper functions
|
||||
*/
|
||||
|
||||
static int video_find_format(u32 code, u32 pixelformat,
|
||||
const struct camss_format_info *formats,
|
||||
unsigned int nformats)
|
||||
{
|
||||
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;
|
||||
|
||||
WARN_ON(1);
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/*
|
||||
* video_mbus_to_pix_mp - Convert v4l2_mbus_framefmt to v4l2_pix_format_mplane
|
||||
* @mbus: v4l2_mbus_framefmt format (input)
|
||||
@@ -121,9 +100,8 @@ static int video_get_subdev_format(struct camss_video *video,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = video_find_format(fmt.format.code,
|
||||
format->fmt.pix_mp.pixelformat,
|
||||
video->formats, video->nformats);
|
||||
ret = camss_format_find_format(fmt.format.code, format->fmt.pix_mp.pixelformat,
|
||||
video->formats, video->nformats);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user