162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Samsung EXYNOS4x12 FIMC-IS (Imaging Subsystem) driver 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2013 Samsung Electronics Co., Ltd. 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Authors: Sylwester Nawrocki <s.nawrocki@samsung.com> 862306a36Sopenharmony_ci * Younghwan Joo <yhwan.joo@samsung.com> 962306a36Sopenharmony_ci */ 1062306a36Sopenharmony_ci#ifndef FIMC_ISP_H_ 1162306a36Sopenharmony_ci#define FIMC_ISP_H_ 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include <linux/io.h> 1462306a36Sopenharmony_ci#include <linux/platform_device.h> 1562306a36Sopenharmony_ci#include <linux/sched.h> 1662306a36Sopenharmony_ci#include <linux/spinlock.h> 1762306a36Sopenharmony_ci#include <linux/types.h> 1862306a36Sopenharmony_ci#include <linux/videodev2.h> 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#include <media/media-entity.h> 2162306a36Sopenharmony_ci#include <media/videobuf2-v4l2.h> 2262306a36Sopenharmony_ci#include <media/v4l2-device.h> 2362306a36Sopenharmony_ci#include <media/v4l2-mediabus.h> 2462306a36Sopenharmony_ci#include <media/drv-intf/exynos-fimc.h> 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ciextern int fimc_isp_debug; 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci#define isp_dbg(level, dev, fmt, arg...) \ 2962306a36Sopenharmony_ci v4l2_dbg(level, fimc_isp_debug, dev, fmt, ## arg) 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci/* FIXME: revisit these constraints */ 3262306a36Sopenharmony_ci#define FIMC_ISP_SINK_WIDTH_MIN (16 + 8) 3362306a36Sopenharmony_ci#define FIMC_ISP_SINK_HEIGHT_MIN (12 + 8) 3462306a36Sopenharmony_ci#define FIMC_ISP_SOURCE_WIDTH_MIN 8 3562306a36Sopenharmony_ci#define FIMC_ISP_SOURCE_HEIGHT_MIN 8 3662306a36Sopenharmony_ci#define FIMC_ISP_CAC_MARGIN_WIDTH 16 3762306a36Sopenharmony_ci#define FIMC_ISP_CAC_MARGIN_HEIGHT 12 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci#define FIMC_ISP_SINK_WIDTH_MAX (4000 - 16) 4062306a36Sopenharmony_ci#define FIMC_ISP_SINK_HEIGHT_MAX (4000 + 12) 4162306a36Sopenharmony_ci#define FIMC_ISP_SOURCE_WIDTH_MAX 4000 4262306a36Sopenharmony_ci#define FIMC_ISP_SOURCE_HEIGHT_MAX 4000 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci#define FIMC_ISP_NUM_FORMATS 3 4562306a36Sopenharmony_ci#define FIMC_ISP_REQ_BUFS_MIN 2 4662306a36Sopenharmony_ci#define FIMC_ISP_REQ_BUFS_MAX 32 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci#define FIMC_ISP_SD_PAD_SINK 0 4962306a36Sopenharmony_ci#define FIMC_ISP_SD_PAD_SRC_FIFO 1 5062306a36Sopenharmony_ci#define FIMC_ISP_SD_PAD_SRC_DMA 2 5162306a36Sopenharmony_ci#define FIMC_ISP_SD_PADS_NUM 3 5262306a36Sopenharmony_ci#define FIMC_ISP_MAX_PLANES 1 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci/** 5562306a36Sopenharmony_ci * struct fimc_isp_frame - source/target frame properties 5662306a36Sopenharmony_ci * @width: full image width 5762306a36Sopenharmony_ci * @height: full image height 5862306a36Sopenharmony_ci * @rect: crop/composition rectangle 5962306a36Sopenharmony_ci */ 6062306a36Sopenharmony_cistruct fimc_isp_frame { 6162306a36Sopenharmony_ci u16 width; 6262306a36Sopenharmony_ci u16 height; 6362306a36Sopenharmony_ci struct v4l2_rect rect; 6462306a36Sopenharmony_ci}; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_cistruct fimc_isp_ctrls { 6762306a36Sopenharmony_ci struct v4l2_ctrl_handler handler; 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci /* Auto white balance */ 7062306a36Sopenharmony_ci struct v4l2_ctrl *auto_wb; 7162306a36Sopenharmony_ci /* Auto ISO control cluster */ 7262306a36Sopenharmony_ci struct { 7362306a36Sopenharmony_ci struct v4l2_ctrl *auto_iso; 7462306a36Sopenharmony_ci struct v4l2_ctrl *iso; 7562306a36Sopenharmony_ci }; 7662306a36Sopenharmony_ci /* Adjust - contrast */ 7762306a36Sopenharmony_ci struct v4l2_ctrl *contrast; 7862306a36Sopenharmony_ci /* Adjust - saturation */ 7962306a36Sopenharmony_ci struct v4l2_ctrl *saturation; 8062306a36Sopenharmony_ci /* Adjust - sharpness */ 8162306a36Sopenharmony_ci struct v4l2_ctrl *sharpness; 8262306a36Sopenharmony_ci /* Adjust - brightness */ 8362306a36Sopenharmony_ci struct v4l2_ctrl *brightness; 8462306a36Sopenharmony_ci /* Adjust - hue */ 8562306a36Sopenharmony_ci struct v4l2_ctrl *hue; 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci /* Auto/manual exposure */ 8862306a36Sopenharmony_ci struct v4l2_ctrl *auto_exp; 8962306a36Sopenharmony_ci /* Manual exposure value */ 9062306a36Sopenharmony_ci struct v4l2_ctrl *exposure; 9162306a36Sopenharmony_ci /* AE/AWB lock/unlock */ 9262306a36Sopenharmony_ci struct v4l2_ctrl *aewb_lock; 9362306a36Sopenharmony_ci /* Exposure metering mode */ 9462306a36Sopenharmony_ci struct v4l2_ctrl *exp_metering; 9562306a36Sopenharmony_ci /* AFC */ 9662306a36Sopenharmony_ci struct v4l2_ctrl *afc; 9762306a36Sopenharmony_ci /* ISP image effect */ 9862306a36Sopenharmony_ci struct v4l2_ctrl *colorfx; 9962306a36Sopenharmony_ci}; 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_cistruct isp_video_buf { 10262306a36Sopenharmony_ci struct vb2_v4l2_buffer vb; 10362306a36Sopenharmony_ci dma_addr_t dma_addr[FIMC_ISP_MAX_PLANES]; 10462306a36Sopenharmony_ci unsigned int index; 10562306a36Sopenharmony_ci}; 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci#define to_isp_video_buf(_b) container_of(_b, struct isp_video_buf, vb) 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci#define FIMC_ISP_MAX_BUFS 4 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci/** 11262306a36Sopenharmony_ci * struct fimc_is_video - fimc-is video device structure 11362306a36Sopenharmony_ci * @ve: video_device structure and media pipeline 11462306a36Sopenharmony_ci * @type: video device type (CAPTURE/OUTPUT) 11562306a36Sopenharmony_ci * @pad: video device media (sink) pad 11662306a36Sopenharmony_ci * @pending_buf_q: pending buffers queue head 11762306a36Sopenharmony_ci * @active_buf_q: a queue head of buffers scheduled in hardware 11862306a36Sopenharmony_ci * @vb_queue: vb2 buffer queue 11962306a36Sopenharmony_ci * @reqbufs_count: the number of buffers requested in REQBUFS ioctl 12062306a36Sopenharmony_ci * @buf_count: number of video buffers scheduled in hardware 12162306a36Sopenharmony_ci * @buf_mask: bitmask of the queued video buffer indices 12262306a36Sopenharmony_ci * @frame_count: counter of frames dequeued to user space 12362306a36Sopenharmony_ci * @streaming: is streaming in progress? 12462306a36Sopenharmony_ci * @buffers: buffer info 12562306a36Sopenharmony_ci * @format: current fimc pixel format 12662306a36Sopenharmony_ci * @pixfmt: current pixel format 12762306a36Sopenharmony_ci */ 12862306a36Sopenharmony_cistruct fimc_is_video { 12962306a36Sopenharmony_ci struct exynos_video_entity ve; 13062306a36Sopenharmony_ci enum v4l2_buf_type type; 13162306a36Sopenharmony_ci struct media_pad pad; 13262306a36Sopenharmony_ci struct list_head pending_buf_q; 13362306a36Sopenharmony_ci struct list_head active_buf_q; 13462306a36Sopenharmony_ci struct vb2_queue vb_queue; 13562306a36Sopenharmony_ci unsigned int reqbufs_count; 13662306a36Sopenharmony_ci unsigned int buf_count; 13762306a36Sopenharmony_ci unsigned int buf_mask; 13862306a36Sopenharmony_ci unsigned int frame_count; 13962306a36Sopenharmony_ci int streaming; 14062306a36Sopenharmony_ci struct isp_video_buf *buffers[FIMC_ISP_MAX_BUFS]; 14162306a36Sopenharmony_ci const struct fimc_fmt *format; 14262306a36Sopenharmony_ci struct v4l2_pix_format_mplane pixfmt; 14362306a36Sopenharmony_ci}; 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci/* struct fimc_isp:state bit definitions */ 14662306a36Sopenharmony_ci#define ST_ISP_VID_CAP_BUF_PREP 0 14762306a36Sopenharmony_ci#define ST_ISP_VID_CAP_STREAMING 1 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci/** 15062306a36Sopenharmony_ci * struct fimc_isp - FIMC-IS ISP data structure 15162306a36Sopenharmony_ci * @pdev: pointer to FIMC-IS platform device 15262306a36Sopenharmony_ci * @subdev: ISP v4l2_subdev 15362306a36Sopenharmony_ci * @subdev_pads: the ISP subdev media pads 15462306a36Sopenharmony_ci * @src_fmt: source mediabus format 15562306a36Sopenharmony_ci * @sink_fmt: sink mediabus format 15662306a36Sopenharmony_ci * @test_pattern: test pattern controls 15762306a36Sopenharmony_ci * @ctrls: v4l2 controls structure 15862306a36Sopenharmony_ci * @video_lock: mutex serializing video device operations 15962306a36Sopenharmony_ci * @subdev_lock: mutex serializing subdev operations 16062306a36Sopenharmony_ci * @cac_margin_x: horizontal CAC margin in pixels 16162306a36Sopenharmony_ci * @cac_margin_y: vertical CAC margin in pixels 16262306a36Sopenharmony_ci * @state: driver state flags 16362306a36Sopenharmony_ci * @video_capture: the ISP block video capture device 16462306a36Sopenharmony_ci */ 16562306a36Sopenharmony_cistruct fimc_isp { 16662306a36Sopenharmony_ci struct platform_device *pdev; 16762306a36Sopenharmony_ci struct v4l2_subdev subdev; 16862306a36Sopenharmony_ci struct media_pad subdev_pads[FIMC_ISP_SD_PADS_NUM]; 16962306a36Sopenharmony_ci struct v4l2_mbus_framefmt src_fmt; 17062306a36Sopenharmony_ci struct v4l2_mbus_framefmt sink_fmt; 17162306a36Sopenharmony_ci struct v4l2_ctrl *test_pattern; 17262306a36Sopenharmony_ci struct fimc_isp_ctrls ctrls; 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_ci struct mutex video_lock; 17562306a36Sopenharmony_ci struct mutex subdev_lock; 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci unsigned int cac_margin_x; 17862306a36Sopenharmony_ci unsigned int cac_margin_y; 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_ci unsigned long state; 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ci struct fimc_is_video video_capture; 18362306a36Sopenharmony_ci}; 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_ci#define ctrl_to_fimc_isp(_ctrl) \ 18662306a36Sopenharmony_ci container_of(ctrl->handler, struct fimc_isp, ctrls.handler) 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_cistruct fimc_is; 18962306a36Sopenharmony_ci 19062306a36Sopenharmony_ciint fimc_isp_subdev_create(struct fimc_isp *isp); 19162306a36Sopenharmony_civoid fimc_isp_subdev_destroy(struct fimc_isp *isp); 19262306a36Sopenharmony_civoid fimc_isp_irq_handler(struct fimc_is *is); 19362306a36Sopenharmony_ciint fimc_is_create_controls(struct fimc_isp *isp); 19462306a36Sopenharmony_ciint fimc_is_delete_controls(struct fimc_isp *isp); 19562306a36Sopenharmony_ciconst struct fimc_fmt *fimc_isp_find_format(const u32 *pixelformat, 19662306a36Sopenharmony_ci const u32 *mbus_code, int index); 19762306a36Sopenharmony_ci#endif /* FIMC_ISP_H_ */ 198