162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * isppreview.h
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * TI OMAP3 ISP - Preview module
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Copyright (C) 2010 Nokia Corporation
862306a36Sopenharmony_ci * Copyright (C) 2009 Texas Instruments, Inc.
962306a36Sopenharmony_ci *
1062306a36Sopenharmony_ci * Contacts: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
1162306a36Sopenharmony_ci *	     Sakari Ailus <sakari.ailus@iki.fi>
1262306a36Sopenharmony_ci */
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#ifndef OMAP3_ISP_PREVIEW_H
1562306a36Sopenharmony_ci#define OMAP3_ISP_PREVIEW_H
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#include <linux/omap3isp.h>
1862306a36Sopenharmony_ci#include <linux/types.h>
1962306a36Sopenharmony_ci#include <media/v4l2-ctrls.h>
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci#include "ispvideo.h"
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci#define ISPPRV_BRIGHT_STEP		0x1
2462306a36Sopenharmony_ci#define ISPPRV_BRIGHT_DEF		0x0
2562306a36Sopenharmony_ci#define ISPPRV_BRIGHT_LOW		0x0
2662306a36Sopenharmony_ci#define ISPPRV_BRIGHT_HIGH		0xFF
2762306a36Sopenharmony_ci#define ISPPRV_BRIGHT_UNITS		0x1
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci#define ISPPRV_CONTRAST_STEP		0x1
3062306a36Sopenharmony_ci#define ISPPRV_CONTRAST_DEF		0x10
3162306a36Sopenharmony_ci#define ISPPRV_CONTRAST_LOW		0x0
3262306a36Sopenharmony_ci#define ISPPRV_CONTRAST_HIGH		0xFF
3362306a36Sopenharmony_ci#define ISPPRV_CONTRAST_UNITS		0x1
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci/* Additional features not listed in linux/omap3isp.h */
3662306a36Sopenharmony_ci#define OMAP3ISP_PREV_CONTRAST		(1 << 17)
3762306a36Sopenharmony_ci#define OMAP3ISP_PREV_BRIGHTNESS	(1 << 18)
3862306a36Sopenharmony_ci#define OMAP3ISP_PREV_FEATURES_END	(1 << 19)
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_cienum preview_input_entity {
4162306a36Sopenharmony_ci	PREVIEW_INPUT_NONE,
4262306a36Sopenharmony_ci	PREVIEW_INPUT_CCDC,
4362306a36Sopenharmony_ci	PREVIEW_INPUT_MEMORY,
4462306a36Sopenharmony_ci};
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci#define PREVIEW_OUTPUT_RESIZER		(1 << 1)
4762306a36Sopenharmony_ci#define PREVIEW_OUTPUT_MEMORY		(1 << 2)
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci/* Configure byte layout of YUV image */
5062306a36Sopenharmony_cienum preview_ycpos_mode {
5162306a36Sopenharmony_ci	YCPOS_YCrYCb = 0,
5262306a36Sopenharmony_ci	YCPOS_YCbYCr = 1,
5362306a36Sopenharmony_ci	YCPOS_CbYCrY = 2,
5462306a36Sopenharmony_ci	YCPOS_CrYCbY = 3
5562306a36Sopenharmony_ci};
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci/*
5862306a36Sopenharmony_ci * struct prev_params - Structure for all configuration
5962306a36Sopenharmony_ci * @busy: Bitmask of busy parameters (being updated or used)
6062306a36Sopenharmony_ci * @update: Bitmask of the parameters to be updated
6162306a36Sopenharmony_ci * @features: Set of features enabled.
6262306a36Sopenharmony_ci * @cfa: CFA coefficients.
6362306a36Sopenharmony_ci * @csup: Chroma suppression coefficients.
6462306a36Sopenharmony_ci * @luma: Luma enhancement coefficients.
6562306a36Sopenharmony_ci * @nf: Noise filter coefficients.
6662306a36Sopenharmony_ci * @dcor: Noise filter coefficients.
6762306a36Sopenharmony_ci * @gamma: Gamma coefficients.
6862306a36Sopenharmony_ci * @wbal: White Balance parameters.
6962306a36Sopenharmony_ci * @blkadj: Black adjustment parameters.
7062306a36Sopenharmony_ci * @rgb2rgb: RGB blending parameters.
7162306a36Sopenharmony_ci * @csc: Color space conversion (RGB to YCbCr) parameters.
7262306a36Sopenharmony_ci * @hmed: Horizontal median filter.
7362306a36Sopenharmony_ci * @yclimit: YC limits parameters.
7462306a36Sopenharmony_ci * @contrast: Contrast.
7562306a36Sopenharmony_ci * @brightness: Brightness.
7662306a36Sopenharmony_ci */
7762306a36Sopenharmony_cistruct prev_params {
7862306a36Sopenharmony_ci	u32 busy;
7962306a36Sopenharmony_ci	u32 update;
8062306a36Sopenharmony_ci	u32 features;
8162306a36Sopenharmony_ci	struct omap3isp_prev_cfa cfa;
8262306a36Sopenharmony_ci	struct omap3isp_prev_csup csup;
8362306a36Sopenharmony_ci	struct omap3isp_prev_luma luma;
8462306a36Sopenharmony_ci	struct omap3isp_prev_nf nf;
8562306a36Sopenharmony_ci	struct omap3isp_prev_dcor dcor;
8662306a36Sopenharmony_ci	struct omap3isp_prev_gtables gamma;
8762306a36Sopenharmony_ci	struct omap3isp_prev_wbal wbal;
8862306a36Sopenharmony_ci	struct omap3isp_prev_blkadj blkadj;
8962306a36Sopenharmony_ci	struct omap3isp_prev_rgbtorgb rgb2rgb;
9062306a36Sopenharmony_ci	struct omap3isp_prev_csc csc;
9162306a36Sopenharmony_ci	struct omap3isp_prev_hmed hmed;
9262306a36Sopenharmony_ci	struct omap3isp_prev_yclimit yclimit;
9362306a36Sopenharmony_ci	u8 contrast;
9462306a36Sopenharmony_ci	u8 brightness;
9562306a36Sopenharmony_ci};
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci/* Sink and source previewer pads */
9862306a36Sopenharmony_ci#define PREV_PAD_SINK			0
9962306a36Sopenharmony_ci#define PREV_PAD_SOURCE			1
10062306a36Sopenharmony_ci#define PREV_PADS_NUM			2
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci/*
10362306a36Sopenharmony_ci * struct isp_prev_device - Structure for storing ISP Preview module information
10462306a36Sopenharmony_ci * @subdev: V4L2 subdevice
10562306a36Sopenharmony_ci * @pads: Media entity pads
10662306a36Sopenharmony_ci * @formats: Active formats at the subdev pad
10762306a36Sopenharmony_ci * @crop: Active crop rectangle
10862306a36Sopenharmony_ci * @input: Module currently connected to the input pad
10962306a36Sopenharmony_ci * @output: Bitmask of the active output
11062306a36Sopenharmony_ci * @video_in: Input video entity
11162306a36Sopenharmony_ci * @video_out: Output video entity
11262306a36Sopenharmony_ci * @params.params : Active and shadow parameters sets
11362306a36Sopenharmony_ci * @params.active: Bitmask of parameters active in set 0
11462306a36Sopenharmony_ci * @params.lock: Parameters lock, protects params.active and params.shadow
11562306a36Sopenharmony_ci * @underrun: Whether the preview entity has queued buffers on the output
11662306a36Sopenharmony_ci * @state: Current preview pipeline state
11762306a36Sopenharmony_ci *
11862306a36Sopenharmony_ci * This structure is used to store the OMAP ISP Preview module Information.
11962306a36Sopenharmony_ci */
12062306a36Sopenharmony_cistruct isp_prev_device {
12162306a36Sopenharmony_ci	struct v4l2_subdev subdev;
12262306a36Sopenharmony_ci	struct media_pad pads[PREV_PADS_NUM];
12362306a36Sopenharmony_ci	struct v4l2_mbus_framefmt formats[PREV_PADS_NUM];
12462306a36Sopenharmony_ci	struct v4l2_rect crop;
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_ci	struct v4l2_ctrl_handler ctrls;
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_ci	enum preview_input_entity input;
12962306a36Sopenharmony_ci	unsigned int output;
13062306a36Sopenharmony_ci	struct isp_video video_in;
13162306a36Sopenharmony_ci	struct isp_video video_out;
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ci	struct {
13462306a36Sopenharmony_ci		unsigned int cfa_order;
13562306a36Sopenharmony_ci		struct prev_params params[2];
13662306a36Sopenharmony_ci		u32 active;
13762306a36Sopenharmony_ci		spinlock_t lock;
13862306a36Sopenharmony_ci	} params;
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_ci	enum isp_pipeline_stream_state state;
14162306a36Sopenharmony_ci	wait_queue_head_t wait;
14262306a36Sopenharmony_ci	atomic_t stopping;
14362306a36Sopenharmony_ci};
14462306a36Sopenharmony_ci
14562306a36Sopenharmony_cistruct isp_device;
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_ciint omap3isp_preview_init(struct isp_device *isp);
14862306a36Sopenharmony_civoid omap3isp_preview_cleanup(struct isp_device *isp);
14962306a36Sopenharmony_ci
15062306a36Sopenharmony_ciint omap3isp_preview_register_entities(struct isp_prev_device *prv,
15162306a36Sopenharmony_ci				       struct v4l2_device *vdev);
15262306a36Sopenharmony_civoid omap3isp_preview_unregister_entities(struct isp_prev_device *prv);
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_civoid omap3isp_preview_isr_frame_sync(struct isp_prev_device *prev);
15562306a36Sopenharmony_civoid omap3isp_preview_isr(struct isp_prev_device *prev);
15662306a36Sopenharmony_ci
15762306a36Sopenharmony_ciint omap3isp_preview_busy(struct isp_prev_device *isp_prev);
15862306a36Sopenharmony_ci
15962306a36Sopenharmony_civoid omap3isp_preview_restore_context(struct isp_device *isp);
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_ci#endif	/* OMAP3_ISP_PREVIEW_H */
162