162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * vimc-common.h Virtual Media Controller Driver 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2015-2017 Helen Koike <helen.fornazier@gmail.com> 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#ifndef _VIMC_COMMON_H_ 962306a36Sopenharmony_ci#define _VIMC_COMMON_H_ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <linux/platform_device.h> 1262306a36Sopenharmony_ci#include <linux/slab.h> 1362306a36Sopenharmony_ci#include <media/media-device.h> 1462306a36Sopenharmony_ci#include <media/v4l2-device.h> 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#define VIMC_PDEV_NAME "vimc" 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci/* VIMC-specific controls */ 1962306a36Sopenharmony_ci#define VIMC_CID_VIMC_BASE (0x00f00000 | 0xf000) 2062306a36Sopenharmony_ci#define VIMC_CID_VIMC_CLASS (0x00f00000 | 1) 2162306a36Sopenharmony_ci#define VIMC_CID_TEST_PATTERN (VIMC_CID_VIMC_BASE + 0) 2262306a36Sopenharmony_ci#define VIMC_CID_MEAN_WIN_SIZE (VIMC_CID_VIMC_BASE + 1) 2362306a36Sopenharmony_ci#define VIMC_CID_OSD_TEXT_MODE (VIMC_CID_VIMC_BASE + 2) 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci#define VIMC_FRAME_MAX_WIDTH 4096 2662306a36Sopenharmony_ci#define VIMC_FRAME_MAX_HEIGHT 2160 2762306a36Sopenharmony_ci#define VIMC_FRAME_MIN_WIDTH 16 2862306a36Sopenharmony_ci#define VIMC_FRAME_MIN_HEIGHT 16 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci#define VIMC_FRAME_INDEX(lin, col, width, bpp) ((lin * width + col) * bpp) 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci/* Source and sink pad checks */ 3362306a36Sopenharmony_ci#define VIMC_IS_SRC(pad) (pad) 3462306a36Sopenharmony_ci#define VIMC_IS_SINK(pad) (!(pad)) 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci#define VIMC_PIX_FMT_MAX_CODES 8 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ciextern unsigned int vimc_allocator; 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_cienum vimc_allocator_type { 4162306a36Sopenharmony_ci VIMC_ALLOCATOR_VMALLOC = 0, 4262306a36Sopenharmony_ci VIMC_ALLOCATOR_DMA_CONTIG = 1, 4362306a36Sopenharmony_ci}; 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci/** 4662306a36Sopenharmony_ci * vimc_colorimetry_clamp - Adjust colorimetry parameters 4762306a36Sopenharmony_ci * 4862306a36Sopenharmony_ci * @fmt: the pointer to struct v4l2_pix_format or 4962306a36Sopenharmony_ci * struct v4l2_mbus_framefmt 5062306a36Sopenharmony_ci * 5162306a36Sopenharmony_ci * Entities must check if colorimetry given by the userspace is valid, if not 5262306a36Sopenharmony_ci * then set them as DEFAULT 5362306a36Sopenharmony_ci */ 5462306a36Sopenharmony_ci#define vimc_colorimetry_clamp(fmt) \ 5562306a36Sopenharmony_cido { \ 5662306a36Sopenharmony_ci if ((fmt)->colorspace == V4L2_COLORSPACE_DEFAULT \ 5762306a36Sopenharmony_ci || (fmt)->colorspace > V4L2_COLORSPACE_DCI_P3) { \ 5862306a36Sopenharmony_ci (fmt)->colorspace = V4L2_COLORSPACE_DEFAULT; \ 5962306a36Sopenharmony_ci (fmt)->ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT; \ 6062306a36Sopenharmony_ci (fmt)->quantization = V4L2_QUANTIZATION_DEFAULT; \ 6162306a36Sopenharmony_ci (fmt)->xfer_func = V4L2_XFER_FUNC_DEFAULT; \ 6262306a36Sopenharmony_ci } \ 6362306a36Sopenharmony_ci if ((fmt)->ycbcr_enc > V4L2_YCBCR_ENC_SMPTE240M) \ 6462306a36Sopenharmony_ci (fmt)->ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT; \ 6562306a36Sopenharmony_ci if ((fmt)->quantization > V4L2_QUANTIZATION_LIM_RANGE) \ 6662306a36Sopenharmony_ci (fmt)->quantization = V4L2_QUANTIZATION_DEFAULT; \ 6762306a36Sopenharmony_ci if ((fmt)->xfer_func > V4L2_XFER_FUNC_SMPTE2084) \ 6862306a36Sopenharmony_ci (fmt)->xfer_func = V4L2_XFER_FUNC_DEFAULT; \ 6962306a36Sopenharmony_ci} while (0) 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci/** 7262306a36Sopenharmony_ci * struct vimc_pix_map - maps media bus code with v4l2 pixel format 7362306a36Sopenharmony_ci * 7462306a36Sopenharmony_ci * @code: media bus format code defined by MEDIA_BUS_FMT_* macros 7562306a36Sopenharmony_ci * @bpp: number of bytes each pixel occupies 7662306a36Sopenharmony_ci * @pixelformat: pixel format defined by V4L2_PIX_FMT_* macros 7762306a36Sopenharmony_ci * @bayer: true if this is a bayer format 7862306a36Sopenharmony_ci * 7962306a36Sopenharmony_ci * Struct which matches the MEDIA_BUS_FMT_* codes with the corresponding 8062306a36Sopenharmony_ci * V4L2_PIX_FMT_* fourcc pixelformat and its bytes per pixel (bpp) 8162306a36Sopenharmony_ci */ 8262306a36Sopenharmony_cistruct vimc_pix_map { 8362306a36Sopenharmony_ci unsigned int code[VIMC_PIX_FMT_MAX_CODES]; 8462306a36Sopenharmony_ci unsigned int bpp; 8562306a36Sopenharmony_ci u32 pixelformat; 8662306a36Sopenharmony_ci bool bayer; 8762306a36Sopenharmony_ci}; 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci/** 9062306a36Sopenharmony_ci * struct vimc_ent_device - core struct that represents an entity in the 9162306a36Sopenharmony_ci * topology 9262306a36Sopenharmony_ci * 9362306a36Sopenharmony_ci * @dev: a pointer of the device struct of the driver 9462306a36Sopenharmony_ci * @ent: the pointer to struct media_entity for the node 9562306a36Sopenharmony_ci * @process_frame: callback send a frame to that node 9662306a36Sopenharmony_ci * @vdev_get_format: callback that returns the current format a pad, used 9762306a36Sopenharmony_ci * only when is_media_entity_v4l2_video_device(ent) returns 9862306a36Sopenharmony_ci * true 9962306a36Sopenharmony_ci * 10062306a36Sopenharmony_ci * Each node of the topology must create a vimc_ent_device struct. Depending on 10162306a36Sopenharmony_ci * the node it will be of an instance of v4l2_subdev or video_device struct 10262306a36Sopenharmony_ci * where both contains a struct media_entity. 10362306a36Sopenharmony_ci * Those structures should embedded the vimc_ent_device struct through 10462306a36Sopenharmony_ci * v4l2_set_subdevdata() and video_set_drvdata() respectively, allowing the 10562306a36Sopenharmony_ci * vimc_ent_device struct to be retrieved from the corresponding struct 10662306a36Sopenharmony_ci * media_entity 10762306a36Sopenharmony_ci */ 10862306a36Sopenharmony_cistruct vimc_ent_device { 10962306a36Sopenharmony_ci struct device *dev; 11062306a36Sopenharmony_ci struct media_entity *ent; 11162306a36Sopenharmony_ci void * (*process_frame)(struct vimc_ent_device *ved, 11262306a36Sopenharmony_ci const void *frame); 11362306a36Sopenharmony_ci void (*vdev_get_format)(struct vimc_ent_device *ved, 11462306a36Sopenharmony_ci struct v4l2_pix_format *fmt); 11562306a36Sopenharmony_ci}; 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci/** 11862306a36Sopenharmony_ci * struct vimc_device - main device for vimc driver 11962306a36Sopenharmony_ci * 12062306a36Sopenharmony_ci * @pipe_cfg: pointer to the vimc pipeline configuration structure 12162306a36Sopenharmony_ci * @ent_devs: array of vimc_ent_device pointers 12262306a36Sopenharmony_ci * @mdev: the associated media_device parent 12362306a36Sopenharmony_ci * @v4l2_dev: Internal v4l2 parent device 12462306a36Sopenharmony_ci */ 12562306a36Sopenharmony_cistruct vimc_device { 12662306a36Sopenharmony_ci const struct vimc_pipeline_config *pipe_cfg; 12762306a36Sopenharmony_ci struct vimc_ent_device **ent_devs; 12862306a36Sopenharmony_ci struct media_device mdev; 12962306a36Sopenharmony_ci struct v4l2_device v4l2_dev; 13062306a36Sopenharmony_ci}; 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci/** 13362306a36Sopenharmony_ci * struct vimc_ent_type Structure for the callbacks of the entity types 13462306a36Sopenharmony_ci * 13562306a36Sopenharmony_ci * 13662306a36Sopenharmony_ci * @add: initializes and registers 13762306a36Sopenharmony_ci * vimc entity - called from vimc-core 13862306a36Sopenharmony_ci * @unregister: unregisters vimc entity - called from vimc-core 13962306a36Sopenharmony_ci * @release: releases vimc entity - called from the v4l2_dev 14062306a36Sopenharmony_ci * release callback 14162306a36Sopenharmony_ci */ 14262306a36Sopenharmony_cistruct vimc_ent_type { 14362306a36Sopenharmony_ci struct vimc_ent_device *(*add)(struct vimc_device *vimc, 14462306a36Sopenharmony_ci const char *vcfg_name); 14562306a36Sopenharmony_ci void (*unregister)(struct vimc_ent_device *ved); 14662306a36Sopenharmony_ci void (*release)(struct vimc_ent_device *ved); 14762306a36Sopenharmony_ci}; 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci/** 15062306a36Sopenharmony_ci * struct vimc_ent_config Structure which describes individual 15162306a36Sopenharmony_ci * configuration for each entity 15262306a36Sopenharmony_ci * 15362306a36Sopenharmony_ci * @name: entity name 15462306a36Sopenharmony_ci * @type: contain the callbacks of this entity type 15562306a36Sopenharmony_ci * 15662306a36Sopenharmony_ci */ 15762306a36Sopenharmony_cistruct vimc_ent_config { 15862306a36Sopenharmony_ci const char *name; 15962306a36Sopenharmony_ci struct vimc_ent_type *type; 16062306a36Sopenharmony_ci}; 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_ci/** 16362306a36Sopenharmony_ci * vimc_is_source - returns true if the entity has only source pads 16462306a36Sopenharmony_ci * 16562306a36Sopenharmony_ci * @ent: pointer to &struct media_entity 16662306a36Sopenharmony_ci * 16762306a36Sopenharmony_ci */ 16862306a36Sopenharmony_cibool vimc_is_source(struct media_entity *ent); 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_ciextern struct vimc_ent_type vimc_sensor_type; 17162306a36Sopenharmony_ciextern struct vimc_ent_type vimc_debayer_type; 17262306a36Sopenharmony_ciextern struct vimc_ent_type vimc_scaler_type; 17362306a36Sopenharmony_ciextern struct vimc_ent_type vimc_capture_type; 17462306a36Sopenharmony_ciextern struct vimc_ent_type vimc_lens_type; 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ci/** 17762306a36Sopenharmony_ci * vimc_pix_map_by_index - get vimc_pix_map struct by its index 17862306a36Sopenharmony_ci * 17962306a36Sopenharmony_ci * @i: index of the vimc_pix_map struct in vimc_pix_map_list 18062306a36Sopenharmony_ci */ 18162306a36Sopenharmony_ciconst struct vimc_pix_map *vimc_pix_map_by_index(unsigned int i); 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_ci/** 18462306a36Sopenharmony_ci * vimc_mbus_code_by_index - get mbus code by its index 18562306a36Sopenharmony_ci * 18662306a36Sopenharmony_ci * @index: index of the mbus code in vimc_pix_map_list 18762306a36Sopenharmony_ci * 18862306a36Sopenharmony_ci * Returns 0 if no mbus code is found for the given index. 18962306a36Sopenharmony_ci */ 19062306a36Sopenharmony_ciu32 vimc_mbus_code_by_index(unsigned int index); 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_ci/** 19362306a36Sopenharmony_ci * vimc_pix_map_by_code - get vimc_pix_map struct by media bus code 19462306a36Sopenharmony_ci * 19562306a36Sopenharmony_ci * @code: media bus format code defined by MEDIA_BUS_FMT_* macros 19662306a36Sopenharmony_ci */ 19762306a36Sopenharmony_ciconst struct vimc_pix_map *vimc_pix_map_by_code(u32 code); 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_ci/** 20062306a36Sopenharmony_ci * vimc_pix_map_by_pixelformat - get vimc_pix_map struct by v4l2 pixel format 20162306a36Sopenharmony_ci * 20262306a36Sopenharmony_ci * @pixelformat: pixel format defined by V4L2_PIX_FMT_* macros 20362306a36Sopenharmony_ci */ 20462306a36Sopenharmony_ciconst struct vimc_pix_map *vimc_pix_map_by_pixelformat(u32 pixelformat); 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_ci/** 20762306a36Sopenharmony_ci * vimc_ent_sd_register - initialize and register a subdev node 20862306a36Sopenharmony_ci * 20962306a36Sopenharmony_ci * @ved: the vimc_ent_device struct to be initialize 21062306a36Sopenharmony_ci * @sd: the v4l2_subdev struct to be initialize and registered 21162306a36Sopenharmony_ci * @v4l2_dev: the v4l2 device to register the v4l2_subdev 21262306a36Sopenharmony_ci * @name: name of the sub-device. Please notice that the name must be 21362306a36Sopenharmony_ci * unique. 21462306a36Sopenharmony_ci * @function: media entity function defined by MEDIA_ENT_F_* macros 21562306a36Sopenharmony_ci * @num_pads: number of pads to initialize 21662306a36Sopenharmony_ci * @pads: the array of pads of the entity, the caller should set the 21762306a36Sopenharmony_ci * flags of the pads 21862306a36Sopenharmony_ci * @sd_ops: pointer to &struct v4l2_subdev_ops. 21962306a36Sopenharmony_ci * 22062306a36Sopenharmony_ci * Helper function initialize and register the struct vimc_ent_device and struct 22162306a36Sopenharmony_ci * v4l2_subdev which represents a subdev node in the topology 22262306a36Sopenharmony_ci */ 22362306a36Sopenharmony_ciint vimc_ent_sd_register(struct vimc_ent_device *ved, 22462306a36Sopenharmony_ci struct v4l2_subdev *sd, 22562306a36Sopenharmony_ci struct v4l2_device *v4l2_dev, 22662306a36Sopenharmony_ci const char *const name, 22762306a36Sopenharmony_ci u32 function, 22862306a36Sopenharmony_ci u16 num_pads, 22962306a36Sopenharmony_ci struct media_pad *pads, 23062306a36Sopenharmony_ci const struct v4l2_subdev_ops *sd_ops); 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_ci/** 23362306a36Sopenharmony_ci * vimc_vdev_link_validate - validates a media link 23462306a36Sopenharmony_ci * 23562306a36Sopenharmony_ci * @link: pointer to &struct media_link 23662306a36Sopenharmony_ci * 23762306a36Sopenharmony_ci * This function calls validates if a media link is valid for streaming. 23862306a36Sopenharmony_ci */ 23962306a36Sopenharmony_ciint vimc_vdev_link_validate(struct media_link *link); 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_ci#endif 242