162306a36Sopenharmony_ci// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Rockchip ISP1 Driver - Common definitions
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2019 Collabora, Ltd.
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <media/mipi-csi2.h>
962306a36Sopenharmony_ci#include <media/v4l2-rect.h>
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include "rkisp1-common.h"
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_cistatic const struct rkisp1_mbus_info rkisp1_formats[] = {
1462306a36Sopenharmony_ci	{
1562306a36Sopenharmony_ci		.mbus_code	= MEDIA_BUS_FMT_YUYV8_2X8,
1662306a36Sopenharmony_ci		.pixel_enc	= V4L2_PIXEL_ENC_YUV,
1762306a36Sopenharmony_ci		.direction	= RKISP1_ISP_SD_SRC,
1862306a36Sopenharmony_ci	}, {
1962306a36Sopenharmony_ci		.mbus_code	= MEDIA_BUS_FMT_SRGGB10_1X10,
2062306a36Sopenharmony_ci		.pixel_enc	= V4L2_PIXEL_ENC_BAYER,
2162306a36Sopenharmony_ci		.mipi_dt	= MIPI_CSI2_DT_RAW10,
2262306a36Sopenharmony_ci		.bayer_pat	= RKISP1_RAW_RGGB,
2362306a36Sopenharmony_ci		.bus_width	= 10,
2462306a36Sopenharmony_ci		.direction	= RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
2562306a36Sopenharmony_ci	}, {
2662306a36Sopenharmony_ci		.mbus_code	= MEDIA_BUS_FMT_SBGGR10_1X10,
2762306a36Sopenharmony_ci		.pixel_enc	= V4L2_PIXEL_ENC_BAYER,
2862306a36Sopenharmony_ci		.mipi_dt	= MIPI_CSI2_DT_RAW10,
2962306a36Sopenharmony_ci		.bayer_pat	= RKISP1_RAW_BGGR,
3062306a36Sopenharmony_ci		.bus_width	= 10,
3162306a36Sopenharmony_ci		.direction	= RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
3262306a36Sopenharmony_ci	}, {
3362306a36Sopenharmony_ci		.mbus_code	= MEDIA_BUS_FMT_SGBRG10_1X10,
3462306a36Sopenharmony_ci		.pixel_enc	= V4L2_PIXEL_ENC_BAYER,
3562306a36Sopenharmony_ci		.mipi_dt	= MIPI_CSI2_DT_RAW10,
3662306a36Sopenharmony_ci		.bayer_pat	= RKISP1_RAW_GBRG,
3762306a36Sopenharmony_ci		.bus_width	= 10,
3862306a36Sopenharmony_ci		.direction	= RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
3962306a36Sopenharmony_ci	}, {
4062306a36Sopenharmony_ci		.mbus_code	= MEDIA_BUS_FMT_SGRBG10_1X10,
4162306a36Sopenharmony_ci		.pixel_enc	= V4L2_PIXEL_ENC_BAYER,
4262306a36Sopenharmony_ci		.mipi_dt	= MIPI_CSI2_DT_RAW10,
4362306a36Sopenharmony_ci		.bayer_pat	= RKISP1_RAW_GRBG,
4462306a36Sopenharmony_ci		.bus_width	= 10,
4562306a36Sopenharmony_ci		.direction	= RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
4662306a36Sopenharmony_ci	}, {
4762306a36Sopenharmony_ci		.mbus_code	= MEDIA_BUS_FMT_SRGGB12_1X12,
4862306a36Sopenharmony_ci		.pixel_enc	= V4L2_PIXEL_ENC_BAYER,
4962306a36Sopenharmony_ci		.mipi_dt	= MIPI_CSI2_DT_RAW12,
5062306a36Sopenharmony_ci		.bayer_pat	= RKISP1_RAW_RGGB,
5162306a36Sopenharmony_ci		.bus_width	= 12,
5262306a36Sopenharmony_ci		.direction	= RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
5362306a36Sopenharmony_ci	}, {
5462306a36Sopenharmony_ci		.mbus_code	= MEDIA_BUS_FMT_SBGGR12_1X12,
5562306a36Sopenharmony_ci		.pixel_enc	= V4L2_PIXEL_ENC_BAYER,
5662306a36Sopenharmony_ci		.mipi_dt	= MIPI_CSI2_DT_RAW12,
5762306a36Sopenharmony_ci		.bayer_pat	= RKISP1_RAW_BGGR,
5862306a36Sopenharmony_ci		.bus_width	= 12,
5962306a36Sopenharmony_ci		.direction	= RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
6062306a36Sopenharmony_ci	}, {
6162306a36Sopenharmony_ci		.mbus_code	= MEDIA_BUS_FMT_SGBRG12_1X12,
6262306a36Sopenharmony_ci		.pixel_enc	= V4L2_PIXEL_ENC_BAYER,
6362306a36Sopenharmony_ci		.mipi_dt	= MIPI_CSI2_DT_RAW12,
6462306a36Sopenharmony_ci		.bayer_pat	= RKISP1_RAW_GBRG,
6562306a36Sopenharmony_ci		.bus_width	= 12,
6662306a36Sopenharmony_ci		.direction	= RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
6762306a36Sopenharmony_ci	}, {
6862306a36Sopenharmony_ci		.mbus_code	= MEDIA_BUS_FMT_SGRBG12_1X12,
6962306a36Sopenharmony_ci		.pixel_enc	= V4L2_PIXEL_ENC_BAYER,
7062306a36Sopenharmony_ci		.mipi_dt	= MIPI_CSI2_DT_RAW12,
7162306a36Sopenharmony_ci		.bayer_pat	= RKISP1_RAW_GRBG,
7262306a36Sopenharmony_ci		.bus_width	= 12,
7362306a36Sopenharmony_ci		.direction	= RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
7462306a36Sopenharmony_ci	}, {
7562306a36Sopenharmony_ci		.mbus_code	= MEDIA_BUS_FMT_SRGGB8_1X8,
7662306a36Sopenharmony_ci		.pixel_enc	= V4L2_PIXEL_ENC_BAYER,
7762306a36Sopenharmony_ci		.mipi_dt	= MIPI_CSI2_DT_RAW8,
7862306a36Sopenharmony_ci		.bayer_pat	= RKISP1_RAW_RGGB,
7962306a36Sopenharmony_ci		.bus_width	= 8,
8062306a36Sopenharmony_ci		.direction	= RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
8162306a36Sopenharmony_ci	}, {
8262306a36Sopenharmony_ci		.mbus_code	= MEDIA_BUS_FMT_SBGGR8_1X8,
8362306a36Sopenharmony_ci		.pixel_enc	= V4L2_PIXEL_ENC_BAYER,
8462306a36Sopenharmony_ci		.mipi_dt	= MIPI_CSI2_DT_RAW8,
8562306a36Sopenharmony_ci		.bayer_pat	= RKISP1_RAW_BGGR,
8662306a36Sopenharmony_ci		.bus_width	= 8,
8762306a36Sopenharmony_ci		.direction	= RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
8862306a36Sopenharmony_ci	}, {
8962306a36Sopenharmony_ci		.mbus_code	= MEDIA_BUS_FMT_SGBRG8_1X8,
9062306a36Sopenharmony_ci		.pixel_enc	= V4L2_PIXEL_ENC_BAYER,
9162306a36Sopenharmony_ci		.mipi_dt	= MIPI_CSI2_DT_RAW8,
9262306a36Sopenharmony_ci		.bayer_pat	= RKISP1_RAW_GBRG,
9362306a36Sopenharmony_ci		.bus_width	= 8,
9462306a36Sopenharmony_ci		.direction	= RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
9562306a36Sopenharmony_ci	}, {
9662306a36Sopenharmony_ci		.mbus_code	= MEDIA_BUS_FMT_SGRBG8_1X8,
9762306a36Sopenharmony_ci		.pixel_enc	= V4L2_PIXEL_ENC_BAYER,
9862306a36Sopenharmony_ci		.mipi_dt	= MIPI_CSI2_DT_RAW8,
9962306a36Sopenharmony_ci		.bayer_pat	= RKISP1_RAW_GRBG,
10062306a36Sopenharmony_ci		.bus_width	= 8,
10162306a36Sopenharmony_ci		.direction	= RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
10262306a36Sopenharmony_ci	}, {
10362306a36Sopenharmony_ci		.mbus_code	= MEDIA_BUS_FMT_YUYV8_1X16,
10462306a36Sopenharmony_ci		.pixel_enc	= V4L2_PIXEL_ENC_YUV,
10562306a36Sopenharmony_ci		.mipi_dt	= MIPI_CSI2_DT_YUV422_8B,
10662306a36Sopenharmony_ci		.yuv_seq	= RKISP1_CIF_ISP_ACQ_PROP_YCBYCR,
10762306a36Sopenharmony_ci		.bus_width	= 16,
10862306a36Sopenharmony_ci		.direction	= RKISP1_ISP_SD_SINK,
10962306a36Sopenharmony_ci	}, {
11062306a36Sopenharmony_ci		.mbus_code	= MEDIA_BUS_FMT_YVYU8_1X16,
11162306a36Sopenharmony_ci		.pixel_enc	= V4L2_PIXEL_ENC_YUV,
11262306a36Sopenharmony_ci		.mipi_dt	= MIPI_CSI2_DT_YUV422_8B,
11362306a36Sopenharmony_ci		.yuv_seq	= RKISP1_CIF_ISP_ACQ_PROP_YCRYCB,
11462306a36Sopenharmony_ci		.bus_width	= 16,
11562306a36Sopenharmony_ci		.direction	= RKISP1_ISP_SD_SINK,
11662306a36Sopenharmony_ci	}, {
11762306a36Sopenharmony_ci		.mbus_code	= MEDIA_BUS_FMT_UYVY8_1X16,
11862306a36Sopenharmony_ci		.pixel_enc	= V4L2_PIXEL_ENC_YUV,
11962306a36Sopenharmony_ci		.mipi_dt	= MIPI_CSI2_DT_YUV422_8B,
12062306a36Sopenharmony_ci		.yuv_seq	= RKISP1_CIF_ISP_ACQ_PROP_CBYCRY,
12162306a36Sopenharmony_ci		.bus_width	= 16,
12262306a36Sopenharmony_ci		.direction	= RKISP1_ISP_SD_SINK,
12362306a36Sopenharmony_ci	}, {
12462306a36Sopenharmony_ci		.mbus_code	= MEDIA_BUS_FMT_VYUY8_1X16,
12562306a36Sopenharmony_ci		.pixel_enc	= V4L2_PIXEL_ENC_YUV,
12662306a36Sopenharmony_ci		.mipi_dt	= MIPI_CSI2_DT_YUV422_8B,
12762306a36Sopenharmony_ci		.yuv_seq	= RKISP1_CIF_ISP_ACQ_PROP_CRYCBY,
12862306a36Sopenharmony_ci		.bus_width	= 16,
12962306a36Sopenharmony_ci		.direction	= RKISP1_ISP_SD_SINK,
13062306a36Sopenharmony_ci	},
13162306a36Sopenharmony_ci};
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ciconst struct rkisp1_mbus_info *rkisp1_mbus_info_get_by_index(unsigned int index)
13462306a36Sopenharmony_ci{
13562306a36Sopenharmony_ci	if (index >= ARRAY_SIZE(rkisp1_formats))
13662306a36Sopenharmony_ci		return NULL;
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_ci	return &rkisp1_formats[index];
13962306a36Sopenharmony_ci}
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ciconst struct rkisp1_mbus_info *rkisp1_mbus_info_get_by_code(u32 mbus_code)
14262306a36Sopenharmony_ci{
14362306a36Sopenharmony_ci	unsigned int i;
14462306a36Sopenharmony_ci
14562306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(rkisp1_formats); i++) {
14662306a36Sopenharmony_ci		const struct rkisp1_mbus_info *fmt = &rkisp1_formats[i];
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_ci		if (fmt->mbus_code == mbus_code)
14962306a36Sopenharmony_ci			return fmt;
15062306a36Sopenharmony_ci	}
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_ci	return NULL;
15362306a36Sopenharmony_ci}
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_cistatic const struct v4l2_rect rkisp1_sd_min_crop = {
15662306a36Sopenharmony_ci	.width = RKISP1_ISP_MIN_WIDTH,
15762306a36Sopenharmony_ci	.height = RKISP1_ISP_MIN_HEIGHT,
15862306a36Sopenharmony_ci	.top = 0,
15962306a36Sopenharmony_ci	.left = 0,
16062306a36Sopenharmony_ci};
16162306a36Sopenharmony_ci
16262306a36Sopenharmony_civoid rkisp1_sd_adjust_crop_rect(struct v4l2_rect *crop,
16362306a36Sopenharmony_ci				const struct v4l2_rect *bounds)
16462306a36Sopenharmony_ci{
16562306a36Sopenharmony_ci	v4l2_rect_set_min_size(crop, &rkisp1_sd_min_crop);
16662306a36Sopenharmony_ci	v4l2_rect_map_inside(crop, bounds);
16762306a36Sopenharmony_ci}
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_civoid rkisp1_sd_adjust_crop(struct v4l2_rect *crop,
17062306a36Sopenharmony_ci			   const struct v4l2_mbus_framefmt *bounds)
17162306a36Sopenharmony_ci{
17262306a36Sopenharmony_ci	struct v4l2_rect crop_bounds = {
17362306a36Sopenharmony_ci		.left = 0,
17462306a36Sopenharmony_ci		.top = 0,
17562306a36Sopenharmony_ci		.width = bounds->width,
17662306a36Sopenharmony_ci		.height = bounds->height,
17762306a36Sopenharmony_ci	};
17862306a36Sopenharmony_ci
17962306a36Sopenharmony_ci	rkisp1_sd_adjust_crop_rect(crop, &crop_bounds);
18062306a36Sopenharmony_ci}
181