mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-10 06:49:29 -04:00
media: rkisp1: Add YC swap capability
The ISP version in the i.MX8MP has an MI_OUTPUT_ALIGN_FORMAT register that the rk3399 does not have. This register allows swapping bytes, which can be used to implement UYVY from YUYV. Add a flag to the format info in the list of formats supported by the capture v4l2 devices, and update enum_fmt and s_fmt to take it into account. To signify the presence of this feature, reuse the MAIN_STRIDE feature flag, as it is very likely that any ISP version that supports one of these two features will also support the other. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Tested-by: Alexander Stein <alexander.stein@ew.tq-group.com> Tested-by: Adam Ford <aford173@gmail.com>
This commit is contained in:
committed by
Laurent Pinchart
parent
da1484c7ba
commit
fd62bd4e1f
@@ -47,13 +47,15 @@ enum rkisp1_plane {
|
||||
* @fourcc: pixel format
|
||||
* @fmt_type: helper filed for pixel format
|
||||
* @uv_swap: if cb cr swapped, for yuv
|
||||
* @yc_swap: if y and cb/cr swapped, for yuv
|
||||
* @write_format: defines how YCbCr self picture data is written to memory
|
||||
* @output_format: defines sp output format
|
||||
* @mbus: the mbus code on the src resizer pad that matches the pixel format
|
||||
*/
|
||||
struct rkisp1_capture_fmt_cfg {
|
||||
u32 fourcc;
|
||||
u8 uv_swap;
|
||||
u32 uv_swap : 1;
|
||||
u32 yc_swap : 1;
|
||||
u32 write_format;
|
||||
u32 output_format;
|
||||
u32 mbus;
|
||||
@@ -1159,10 +1161,14 @@ rkisp1_fill_pixfmt(const struct rkisp1_capture *cap,
|
||||
static const struct rkisp1_capture_fmt_cfg *
|
||||
rkisp1_find_fmt_cfg(const struct rkisp1_capture *cap, const u32 pixelfmt)
|
||||
{
|
||||
bool yc_swap_support = rkisp1_has_feature(cap->rkisp1, MAIN_STRIDE);
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < cap->config->fmt_size; i++) {
|
||||
if (cap->config->fmts[i].fourcc == pixelfmt)
|
||||
const struct rkisp1_capture_fmt_cfg *fmt = &cap->config->fmts[i];
|
||||
|
||||
if (fmt->fourcc == pixelfmt &&
|
||||
(!fmt->yc_swap || yc_swap_support))
|
||||
return &cap->config->fmts[i];
|
||||
}
|
||||
return NULL;
|
||||
@@ -1231,23 +1237,29 @@ static int rkisp1_enum_fmt_vid_cap_mplane(struct file *file, void *priv,
|
||||
{
|
||||
struct rkisp1_capture *cap = video_drvdata(file);
|
||||
const struct rkisp1_capture_fmt_cfg *fmt = NULL;
|
||||
bool yc_swap_support = rkisp1_has_feature(cap->rkisp1, MAIN_STRIDE);
|
||||
unsigned int i, n = 0;
|
||||
|
||||
if (!f->mbus_code) {
|
||||
if (f->index >= cap->config->fmt_size)
|
||||
return -EINVAL;
|
||||
if (f->index >= cap->config->fmt_size)
|
||||
return -EINVAL;
|
||||
|
||||
if (!f->mbus_code && yc_swap_support) {
|
||||
fmt = &cap->config->fmts[f->index];
|
||||
f->pixelformat = fmt->fourcc;
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < cap->config->fmt_size; i++) {
|
||||
if (cap->config->fmts[i].mbus != f->mbus_code)
|
||||
fmt = &cap->config->fmts[i];
|
||||
|
||||
if (f->mbus_code && fmt->mbus != f->mbus_code)
|
||||
continue;
|
||||
|
||||
if (!yc_swap_support && fmt->yc_swap)
|
||||
continue;
|
||||
|
||||
if (n++ == f->index) {
|
||||
f->pixelformat = cap->config->fmts[i].fourcc;
|
||||
f->pixelformat = fmt->fourcc;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user