mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-25 08:21:14 +00:00
05ed7dc50d
Patches automatically rebased. Signed-off-by: Rui Salvaterra <rsalvaterra@gmail.com>
441 lines
12 KiB
Diff
441 lines
12 KiB
Diff
From dda51aa2e4524914d25022864466fa9d8713a5e9 Mon Sep 17 00:00:00 2001
|
|
From: Eugen Hristev <eugen.hristev@microchip.com>
|
|
Date: Tue, 13 Apr 2021 12:57:22 +0200
|
|
Subject: [PATCH 180/247] media: atmel: atmel-isc: move the formats list into
|
|
product specific code
|
|
|
|
The list of input and output formats has to be product specific.
|
|
Move this list into the product specific code.
|
|
Have pointers to these arrays inside the device struct.
|
|
|
|
Signed-off-by: Eugen Hristev <eugen.hristev@microchip.com>
|
|
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
|
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
|
|
---
|
|
drivers/media/platform/atmel/atmel-isc-base.c | 167 ++----------------
|
|
drivers/media/platform/atmel/atmel-isc.h | 12 +-
|
|
.../media/platform/atmel/atmel-sama5d2-isc.c | 136 ++++++++++++++
|
|
3 files changed, 165 insertions(+), 150 deletions(-)
|
|
|
|
--- a/drivers/media/platform/atmel/atmel-isc-base.c
|
|
+++ b/drivers/media/platform/atmel/atmel-isc-base.c
|
|
@@ -45,137 +45,6 @@ module_param(sensor_preferred, uint, 064
|
|
MODULE_PARM_DESC(sensor_preferred,
|
|
"Sensor is preferred to output the specified format (1-on 0-off), default 1");
|
|
|
|
-/* This is a list of the formats that the ISC can *output* */
|
|
-const struct isc_format controller_formats[] = {
|
|
- {
|
|
- .fourcc = V4L2_PIX_FMT_ARGB444,
|
|
- },
|
|
- {
|
|
- .fourcc = V4L2_PIX_FMT_ARGB555,
|
|
- },
|
|
- {
|
|
- .fourcc = V4L2_PIX_FMT_RGB565,
|
|
- },
|
|
- {
|
|
- .fourcc = V4L2_PIX_FMT_ABGR32,
|
|
- },
|
|
- {
|
|
- .fourcc = V4L2_PIX_FMT_XBGR32,
|
|
- },
|
|
- {
|
|
- .fourcc = V4L2_PIX_FMT_YUV420,
|
|
- },
|
|
- {
|
|
- .fourcc = V4L2_PIX_FMT_YUYV,
|
|
- },
|
|
- {
|
|
- .fourcc = V4L2_PIX_FMT_YUV422P,
|
|
- },
|
|
- {
|
|
- .fourcc = V4L2_PIX_FMT_GREY,
|
|
- },
|
|
- {
|
|
- .fourcc = V4L2_PIX_FMT_Y10,
|
|
- },
|
|
-};
|
|
-
|
|
-/* This is a list of formats that the ISC can receive as *input* */
|
|
-struct isc_format formats_list[] = {
|
|
- {
|
|
- .fourcc = V4L2_PIX_FMT_SBGGR8,
|
|
- .mbus_code = MEDIA_BUS_FMT_SBGGR8_1X8,
|
|
- .pfe_cfg0_bps = ISC_PFE_CFG0_BPS_EIGHT,
|
|
- .cfa_baycfg = ISC_BAY_CFG_BGBG,
|
|
- },
|
|
- {
|
|
- .fourcc = V4L2_PIX_FMT_SGBRG8,
|
|
- .mbus_code = MEDIA_BUS_FMT_SGBRG8_1X8,
|
|
- .pfe_cfg0_bps = ISC_PFE_CFG0_BPS_EIGHT,
|
|
- .cfa_baycfg = ISC_BAY_CFG_GBGB,
|
|
- },
|
|
- {
|
|
- .fourcc = V4L2_PIX_FMT_SGRBG8,
|
|
- .mbus_code = MEDIA_BUS_FMT_SGRBG8_1X8,
|
|
- .pfe_cfg0_bps = ISC_PFE_CFG0_BPS_EIGHT,
|
|
- .cfa_baycfg = ISC_BAY_CFG_GRGR,
|
|
- },
|
|
- {
|
|
- .fourcc = V4L2_PIX_FMT_SRGGB8,
|
|
- .mbus_code = MEDIA_BUS_FMT_SRGGB8_1X8,
|
|
- .pfe_cfg0_bps = ISC_PFE_CFG0_BPS_EIGHT,
|
|
- .cfa_baycfg = ISC_BAY_CFG_RGRG,
|
|
- },
|
|
- {
|
|
- .fourcc = V4L2_PIX_FMT_SBGGR10,
|
|
- .mbus_code = MEDIA_BUS_FMT_SBGGR10_1X10,
|
|
- .pfe_cfg0_bps = ISC_PFG_CFG0_BPS_TEN,
|
|
- .cfa_baycfg = ISC_BAY_CFG_RGRG,
|
|
- },
|
|
- {
|
|
- .fourcc = V4L2_PIX_FMT_SGBRG10,
|
|
- .mbus_code = MEDIA_BUS_FMT_SGBRG10_1X10,
|
|
- .pfe_cfg0_bps = ISC_PFG_CFG0_BPS_TEN,
|
|
- .cfa_baycfg = ISC_BAY_CFG_GBGB,
|
|
- },
|
|
- {
|
|
- .fourcc = V4L2_PIX_FMT_SGRBG10,
|
|
- .mbus_code = MEDIA_BUS_FMT_SGRBG10_1X10,
|
|
- .pfe_cfg0_bps = ISC_PFG_CFG0_BPS_TEN,
|
|
- .cfa_baycfg = ISC_BAY_CFG_GRGR,
|
|
- },
|
|
- {
|
|
- .fourcc = V4L2_PIX_FMT_SRGGB10,
|
|
- .mbus_code = MEDIA_BUS_FMT_SRGGB10_1X10,
|
|
- .pfe_cfg0_bps = ISC_PFG_CFG0_BPS_TEN,
|
|
- .cfa_baycfg = ISC_BAY_CFG_RGRG,
|
|
- },
|
|
- {
|
|
- .fourcc = V4L2_PIX_FMT_SBGGR12,
|
|
- .mbus_code = MEDIA_BUS_FMT_SBGGR12_1X12,
|
|
- .pfe_cfg0_bps = ISC_PFG_CFG0_BPS_TWELVE,
|
|
- .cfa_baycfg = ISC_BAY_CFG_BGBG,
|
|
- },
|
|
- {
|
|
- .fourcc = V4L2_PIX_FMT_SGBRG12,
|
|
- .mbus_code = MEDIA_BUS_FMT_SGBRG12_1X12,
|
|
- .pfe_cfg0_bps = ISC_PFG_CFG0_BPS_TWELVE,
|
|
- .cfa_baycfg = ISC_BAY_CFG_GBGB,
|
|
- },
|
|
- {
|
|
- .fourcc = V4L2_PIX_FMT_SGRBG12,
|
|
- .mbus_code = MEDIA_BUS_FMT_SGRBG12_1X12,
|
|
- .pfe_cfg0_bps = ISC_PFG_CFG0_BPS_TWELVE,
|
|
- .cfa_baycfg = ISC_BAY_CFG_GRGR,
|
|
- },
|
|
- {
|
|
- .fourcc = V4L2_PIX_FMT_SRGGB12,
|
|
- .mbus_code = MEDIA_BUS_FMT_SRGGB12_1X12,
|
|
- .pfe_cfg0_bps = ISC_PFG_CFG0_BPS_TWELVE,
|
|
- .cfa_baycfg = ISC_BAY_CFG_RGRG,
|
|
- },
|
|
- {
|
|
- .fourcc = V4L2_PIX_FMT_GREY,
|
|
- .mbus_code = MEDIA_BUS_FMT_Y8_1X8,
|
|
- .pfe_cfg0_bps = ISC_PFE_CFG0_BPS_EIGHT,
|
|
- },
|
|
- {
|
|
- .fourcc = V4L2_PIX_FMT_YUYV,
|
|
- .mbus_code = MEDIA_BUS_FMT_YUYV8_2X8,
|
|
- .pfe_cfg0_bps = ISC_PFE_CFG0_BPS_EIGHT,
|
|
- },
|
|
- {
|
|
- .fourcc = V4L2_PIX_FMT_RGB565,
|
|
- .mbus_code = MEDIA_BUS_FMT_RGB565_2X8_LE,
|
|
- .pfe_cfg0_bps = ISC_PFE_CFG0_BPS_EIGHT,
|
|
- },
|
|
- {
|
|
- .fourcc = V4L2_PIX_FMT_Y10,
|
|
- .mbus_code = MEDIA_BUS_FMT_Y10_1X10,
|
|
- .pfe_cfg0_bps = ISC_PFG_CFG0_BPS_TEN,
|
|
- },
|
|
-
|
|
-};
|
|
-
|
|
#define ISC_IS_FORMAT_RAW(mbus_code) \
|
|
(((mbus_code) & 0xf000) == 0x3000)
|
|
|
|
@@ -919,24 +788,25 @@ static int isc_querycap(struct file *fil
|
|
static int isc_enum_fmt_vid_cap(struct file *file, void *priv,
|
|
struct v4l2_fmtdesc *f)
|
|
{
|
|
+ struct isc_device *isc = video_drvdata(file);
|
|
u32 index = f->index;
|
|
u32 i, supported_index;
|
|
|
|
- if (index < ARRAY_SIZE(controller_formats)) {
|
|
- f->pixelformat = controller_formats[index].fourcc;
|
|
+ if (index < isc->controller_formats_size) {
|
|
+ f->pixelformat = isc->controller_formats[index].fourcc;
|
|
return 0;
|
|
}
|
|
|
|
- index -= ARRAY_SIZE(controller_formats);
|
|
+ index -= isc->controller_formats_size;
|
|
|
|
supported_index = 0;
|
|
|
|
- for (i = 0; i < ARRAY_SIZE(formats_list); i++) {
|
|
- if (!ISC_IS_FORMAT_RAW(formats_list[i].mbus_code) ||
|
|
- !formats_list[i].sd_support)
|
|
+ for (i = 0; i < isc->formats_list_size; i++) {
|
|
+ if (!ISC_IS_FORMAT_RAW(isc->formats_list[i].mbus_code) ||
|
|
+ !isc->formats_list[i].sd_support)
|
|
continue;
|
|
if (supported_index == index) {
|
|
- f->pixelformat = formats_list[i].fourcc;
|
|
+ f->pixelformat = isc->formats_list[i].fourcc;
|
|
return 0;
|
|
}
|
|
supported_index++;
|
|
@@ -1477,8 +1347,8 @@ static int isc_enum_framesizes(struct fi
|
|
if (isc->user_formats[i]->fourcc == fsize->pixel_format)
|
|
ret = 0;
|
|
|
|
- for (i = 0; i < ARRAY_SIZE(controller_formats); i++)
|
|
- if (controller_formats[i].fourcc == fsize->pixel_format)
|
|
+ for (i = 0; i < isc->controller_formats_size; i++)
|
|
+ if (isc->controller_formats[i].fourcc == fsize->pixel_format)
|
|
ret = 0;
|
|
|
|
if (ret)
|
|
@@ -1514,8 +1384,8 @@ static int isc_enum_frameintervals(struc
|
|
if (isc->user_formats[i]->fourcc == fival->pixel_format)
|
|
ret = 0;
|
|
|
|
- for (i = 0; i < ARRAY_SIZE(controller_formats); i++)
|
|
- if (controller_formats[i].fourcc == fival->pixel_format)
|
|
+ for (i = 0; i < isc->controller_formats_size; i++)
|
|
+ if (isc->controller_formats[i].fourcc == fival->pixel_format)
|
|
ret = 0;
|
|
|
|
if (ret)
|
|
@@ -2126,12 +1996,13 @@ static void isc_async_unbind(struct v4l2
|
|
v4l2_ctrl_handler_free(&isc->ctrls.handler);
|
|
}
|
|
|
|
-static struct isc_format *find_format_by_code(unsigned int code, int *index)
|
|
+static struct isc_format *find_format_by_code(struct isc_device *isc,
|
|
+ unsigned int code, int *index)
|
|
{
|
|
- struct isc_format *fmt = &formats_list[0];
|
|
+ struct isc_format *fmt = &isc->formats_list[0];
|
|
unsigned int i;
|
|
|
|
- for (i = 0; i < ARRAY_SIZE(formats_list); i++) {
|
|
+ for (i = 0; i < isc->formats_list_size; i++) {
|
|
if (fmt->mbus_code == code) {
|
|
*index = i;
|
|
return fmt;
|
|
@@ -2148,7 +2019,7 @@ static int isc_formats_init(struct isc_d
|
|
struct isc_format *fmt;
|
|
struct v4l2_subdev *subdev = isc->current_subdev->sd;
|
|
unsigned int num_fmts, i, j;
|
|
- u32 list_size = ARRAY_SIZE(formats_list);
|
|
+ u32 list_size = isc->formats_list_size;
|
|
struct v4l2_subdev_mbus_code_enum mbus_code = {
|
|
.which = V4L2_SUBDEV_FORMAT_ACTIVE,
|
|
};
|
|
@@ -2158,7 +2029,7 @@ static int isc_formats_init(struct isc_d
|
|
NULL, &mbus_code)) {
|
|
mbus_code.index++;
|
|
|
|
- fmt = find_format_by_code(mbus_code.code, &i);
|
|
+ fmt = find_format_by_code(isc, mbus_code.code, &i);
|
|
if (!fmt) {
|
|
v4l2_warn(&isc->v4l2_dev, "Mbus code %x not supported\n",
|
|
mbus_code.code);
|
|
@@ -2179,7 +2050,7 @@ static int isc_formats_init(struct isc_d
|
|
if (!isc->user_formats)
|
|
return -ENOMEM;
|
|
|
|
- fmt = &formats_list[0];
|
|
+ fmt = &isc->formats_list[0];
|
|
for (i = 0, j = 0; i < list_size; i++) {
|
|
if (fmt->sd_support)
|
|
isc->user_formats[j++] = fmt;
|
|
--- a/drivers/media/platform/atmel/atmel-isc.h
|
|
+++ b/drivers/media/platform/atmel/atmel-isc.h
|
|
@@ -236,6 +236,12 @@ struct isc_reg_offsets {
|
|
* specific v4l2 controls.
|
|
*
|
|
* @offsets: struct holding the product specific register offsets
|
|
+ * @controller_formats: pointer to the array of possible formats that the
|
|
+ * controller can output
|
|
+ * @formats_list: pointer to the array of possible formats that can
|
|
+ * be used as an input to the controller
|
|
+ * @controller_formats_size: size of controller_formats array
|
|
+ * @formats_list_size: size of formats_list array
|
|
*/
|
|
struct isc_device {
|
|
struct regmap *regmap;
|
|
@@ -317,10 +323,12 @@ struct isc_device {
|
|
};
|
|
|
|
struct isc_reg_offsets offsets;
|
|
+ const struct isc_format *controller_formats;
|
|
+ struct isc_format *formats_list;
|
|
+ u32 controller_formats_size;
|
|
+ u32 formats_list_size;
|
|
};
|
|
|
|
-extern struct isc_format formats_list[];
|
|
-extern const struct isc_format controller_formats[];
|
|
extern const struct regmap_config isc_regmap_config;
|
|
extern const struct v4l2_async_notifier_operations isc_async_ops;
|
|
|
|
--- a/drivers/media/platform/atmel/atmel-sama5d2-isc.c
|
|
+++ b/drivers/media/platform/atmel/atmel-sama5d2-isc.c
|
|
@@ -54,6 +54,137 @@
|
|
|
|
#define ISC_CLK_MAX_DIV 255
|
|
|
|
+/* This is a list of the formats that the ISC can *output* */
|
|
+static const struct isc_format sama5d2_controller_formats[] = {
|
|
+ {
|
|
+ .fourcc = V4L2_PIX_FMT_ARGB444,
|
|
+ },
|
|
+ {
|
|
+ .fourcc = V4L2_PIX_FMT_ARGB555,
|
|
+ },
|
|
+ {
|
|
+ .fourcc = V4L2_PIX_FMT_RGB565,
|
|
+ },
|
|
+ {
|
|
+ .fourcc = V4L2_PIX_FMT_ABGR32,
|
|
+ },
|
|
+ {
|
|
+ .fourcc = V4L2_PIX_FMT_XBGR32,
|
|
+ },
|
|
+ {
|
|
+ .fourcc = V4L2_PIX_FMT_YUV420,
|
|
+ },
|
|
+ {
|
|
+ .fourcc = V4L2_PIX_FMT_YUYV,
|
|
+ },
|
|
+ {
|
|
+ .fourcc = V4L2_PIX_FMT_YUV422P,
|
|
+ },
|
|
+ {
|
|
+ .fourcc = V4L2_PIX_FMT_GREY,
|
|
+ },
|
|
+ {
|
|
+ .fourcc = V4L2_PIX_FMT_Y10,
|
|
+ },
|
|
+};
|
|
+
|
|
+/* This is a list of formats that the ISC can receive as *input* */
|
|
+static struct isc_format sama5d2_formats_list[] = {
|
|
+ {
|
|
+ .fourcc = V4L2_PIX_FMT_SBGGR8,
|
|
+ .mbus_code = MEDIA_BUS_FMT_SBGGR8_1X8,
|
|
+ .pfe_cfg0_bps = ISC_PFE_CFG0_BPS_EIGHT,
|
|
+ .cfa_baycfg = ISC_BAY_CFG_BGBG,
|
|
+ },
|
|
+ {
|
|
+ .fourcc = V4L2_PIX_FMT_SGBRG8,
|
|
+ .mbus_code = MEDIA_BUS_FMT_SGBRG8_1X8,
|
|
+ .pfe_cfg0_bps = ISC_PFE_CFG0_BPS_EIGHT,
|
|
+ .cfa_baycfg = ISC_BAY_CFG_GBGB,
|
|
+ },
|
|
+ {
|
|
+ .fourcc = V4L2_PIX_FMT_SGRBG8,
|
|
+ .mbus_code = MEDIA_BUS_FMT_SGRBG8_1X8,
|
|
+ .pfe_cfg0_bps = ISC_PFE_CFG0_BPS_EIGHT,
|
|
+ .cfa_baycfg = ISC_BAY_CFG_GRGR,
|
|
+ },
|
|
+ {
|
|
+ .fourcc = V4L2_PIX_FMT_SRGGB8,
|
|
+ .mbus_code = MEDIA_BUS_FMT_SRGGB8_1X8,
|
|
+ .pfe_cfg0_bps = ISC_PFE_CFG0_BPS_EIGHT,
|
|
+ .cfa_baycfg = ISC_BAY_CFG_RGRG,
|
|
+ },
|
|
+ {
|
|
+ .fourcc = V4L2_PIX_FMT_SBGGR10,
|
|
+ .mbus_code = MEDIA_BUS_FMT_SBGGR10_1X10,
|
|
+ .pfe_cfg0_bps = ISC_PFG_CFG0_BPS_TEN,
|
|
+ .cfa_baycfg = ISC_BAY_CFG_RGRG,
|
|
+ },
|
|
+ {
|
|
+ .fourcc = V4L2_PIX_FMT_SGBRG10,
|
|
+ .mbus_code = MEDIA_BUS_FMT_SGBRG10_1X10,
|
|
+ .pfe_cfg0_bps = ISC_PFG_CFG0_BPS_TEN,
|
|
+ .cfa_baycfg = ISC_BAY_CFG_GBGB,
|
|
+ },
|
|
+ {
|
|
+ .fourcc = V4L2_PIX_FMT_SGRBG10,
|
|
+ .mbus_code = MEDIA_BUS_FMT_SGRBG10_1X10,
|
|
+ .pfe_cfg0_bps = ISC_PFG_CFG0_BPS_TEN,
|
|
+ .cfa_baycfg = ISC_BAY_CFG_GRGR,
|
|
+ },
|
|
+ {
|
|
+ .fourcc = V4L2_PIX_FMT_SRGGB10,
|
|
+ .mbus_code = MEDIA_BUS_FMT_SRGGB10_1X10,
|
|
+ .pfe_cfg0_bps = ISC_PFG_CFG0_BPS_TEN,
|
|
+ .cfa_baycfg = ISC_BAY_CFG_RGRG,
|
|
+ },
|
|
+ {
|
|
+ .fourcc = V4L2_PIX_FMT_SBGGR12,
|
|
+ .mbus_code = MEDIA_BUS_FMT_SBGGR12_1X12,
|
|
+ .pfe_cfg0_bps = ISC_PFG_CFG0_BPS_TWELVE,
|
|
+ .cfa_baycfg = ISC_BAY_CFG_BGBG,
|
|
+ },
|
|
+ {
|
|
+ .fourcc = V4L2_PIX_FMT_SGBRG12,
|
|
+ .mbus_code = MEDIA_BUS_FMT_SGBRG12_1X12,
|
|
+ .pfe_cfg0_bps = ISC_PFG_CFG0_BPS_TWELVE,
|
|
+ .cfa_baycfg = ISC_BAY_CFG_GBGB,
|
|
+ },
|
|
+ {
|
|
+ .fourcc = V4L2_PIX_FMT_SGRBG12,
|
|
+ .mbus_code = MEDIA_BUS_FMT_SGRBG12_1X12,
|
|
+ .pfe_cfg0_bps = ISC_PFG_CFG0_BPS_TWELVE,
|
|
+ .cfa_baycfg = ISC_BAY_CFG_GRGR,
|
|
+ },
|
|
+ {
|
|
+ .fourcc = V4L2_PIX_FMT_SRGGB12,
|
|
+ .mbus_code = MEDIA_BUS_FMT_SRGGB12_1X12,
|
|
+ .pfe_cfg0_bps = ISC_PFG_CFG0_BPS_TWELVE,
|
|
+ .cfa_baycfg = ISC_BAY_CFG_RGRG,
|
|
+ },
|
|
+ {
|
|
+ .fourcc = V4L2_PIX_FMT_GREY,
|
|
+ .mbus_code = MEDIA_BUS_FMT_Y8_1X8,
|
|
+ .pfe_cfg0_bps = ISC_PFE_CFG0_BPS_EIGHT,
|
|
+ },
|
|
+ {
|
|
+ .fourcc = V4L2_PIX_FMT_YUYV,
|
|
+ .mbus_code = MEDIA_BUS_FMT_YUYV8_2X8,
|
|
+ .pfe_cfg0_bps = ISC_PFE_CFG0_BPS_EIGHT,
|
|
+ },
|
|
+ {
|
|
+ .fourcc = V4L2_PIX_FMT_RGB565,
|
|
+ .mbus_code = MEDIA_BUS_FMT_RGB565_2X8_LE,
|
|
+ .pfe_cfg0_bps = ISC_PFE_CFG0_BPS_EIGHT,
|
|
+ },
|
|
+ {
|
|
+ .fourcc = V4L2_PIX_FMT_Y10,
|
|
+ .mbus_code = MEDIA_BUS_FMT_Y10_1X10,
|
|
+ .pfe_cfg0_bps = ISC_PFG_CFG0_BPS_TEN,
|
|
+ },
|
|
+
|
|
+};
|
|
+
|
|
static void isc_sama5d2_config_csc(struct isc_device *isc)
|
|
{
|
|
struct regmap *regmap = isc->regmap;
|
|
@@ -310,6 +441,11 @@ static int atmel_isc_probe(struct platfo
|
|
isc->offsets.version = ISC_SAMA5D2_VERSION_OFFSET;
|
|
isc->offsets.his_entry = ISC_SAMA5D2_HIS_ENTRY_OFFSET;
|
|
|
|
+ isc->controller_formats = sama5d2_controller_formats;
|
|
+ isc->controller_formats_size = ARRAY_SIZE(sama5d2_controller_formats);
|
|
+ isc->formats_list = sama5d2_formats_list;
|
|
+ isc->formats_list_size = ARRAY_SIZE(sama5d2_formats_list);
|
|
+
|
|
/* sama5d2-isc - 8 bits per beat */
|
|
isc->dcfg = ISC_DCFG_YMBSIZE_BEATS8 | ISC_DCFG_CMBSIZE_BEATS8;
|
|
|