123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440 |
- From dda51aa2e4524914d25022864466fa9d8713a5e9 Mon Sep 17 00:00:00 2001
- From: Eugen Hristev <[email protected]>
- 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 <[email protected]>
- Signed-off-by: Hans Verkuil <[email protected]>
- Signed-off-by: Mauro Carvalho Chehab <[email protected]>
- ---
- 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;
-
|