1  /* SPDX-License-Identifier: GPL-2.0-only */
2  /*
3   * isppreview.h
4   *
5   * TI OMAP3 ISP - Preview module
6   *
7   * Copyright (C) 2010 Nokia Corporation
8   * Copyright (C) 2009 Texas Instruments, Inc.
9   *
10   * Contacts: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
11   *	     Sakari Ailus <sakari.ailus@iki.fi>
12   */
13  
14  #ifndef OMAP3_ISP_PREVIEW_H
15  #define OMAP3_ISP_PREVIEW_H
16  
17  #include <linux/omap3isp.h>
18  #include <linux/types.h>
19  #include <media/v4l2-ctrls.h>
20  
21  #include "ispvideo.h"
22  
23  #define ISPPRV_BRIGHT_STEP		0x1
24  #define ISPPRV_BRIGHT_DEF		0x0
25  #define ISPPRV_BRIGHT_LOW		0x0
26  #define ISPPRV_BRIGHT_HIGH		0xFF
27  #define ISPPRV_BRIGHT_UNITS		0x1
28  
29  #define ISPPRV_CONTRAST_STEP		0x1
30  #define ISPPRV_CONTRAST_DEF		0x10
31  #define ISPPRV_CONTRAST_LOW		0x0
32  #define ISPPRV_CONTRAST_HIGH		0xFF
33  #define ISPPRV_CONTRAST_UNITS		0x1
34  
35  /* Additional features not listed in linux/omap3isp.h */
36  #define OMAP3ISP_PREV_CONTRAST		(1 << 17)
37  #define OMAP3ISP_PREV_BRIGHTNESS	(1 << 18)
38  #define OMAP3ISP_PREV_FEATURES_END	(1 << 19)
39  
40  enum preview_input_entity {
41  	PREVIEW_INPUT_NONE,
42  	PREVIEW_INPUT_CCDC,
43  	PREVIEW_INPUT_MEMORY,
44  };
45  
46  #define PREVIEW_OUTPUT_RESIZER		(1 << 1)
47  #define PREVIEW_OUTPUT_MEMORY		(1 << 2)
48  
49  /* Configure byte layout of YUV image */
50  enum preview_ycpos_mode {
51  	YCPOS_YCrYCb = 0,
52  	YCPOS_YCbYCr = 1,
53  	YCPOS_CbYCrY = 2,
54  	YCPOS_CrYCbY = 3
55  };
56  
57  /*
58   * struct prev_params - Structure for all configuration
59   * @busy: Bitmask of busy parameters (being updated or used)
60   * @update: Bitmask of the parameters to be updated
61   * @features: Set of features enabled.
62   * @cfa: CFA coefficients.
63   * @csup: Chroma suppression coefficients.
64   * @luma: Luma enhancement coefficients.
65   * @nf: Noise filter coefficients.
66   * @dcor: Noise filter coefficients.
67   * @gamma: Gamma coefficients.
68   * @wbal: White Balance parameters.
69   * @blkadj: Black adjustment parameters.
70   * @rgb2rgb: RGB blending parameters.
71   * @csc: Color space conversion (RGB to YCbCr) parameters.
72   * @hmed: Horizontal median filter.
73   * @yclimit: YC limits parameters.
74   * @contrast: Contrast.
75   * @brightness: Brightness.
76   */
77  struct prev_params {
78  	u32 busy;
79  	u32 update;
80  	u32 features;
81  	struct omap3isp_prev_cfa cfa;
82  	struct omap3isp_prev_csup csup;
83  	struct omap3isp_prev_luma luma;
84  	struct omap3isp_prev_nf nf;
85  	struct omap3isp_prev_dcor dcor;
86  	struct omap3isp_prev_gtables gamma;
87  	struct omap3isp_prev_wbal wbal;
88  	struct omap3isp_prev_blkadj blkadj;
89  	struct omap3isp_prev_rgbtorgb rgb2rgb;
90  	struct omap3isp_prev_csc csc;
91  	struct omap3isp_prev_hmed hmed;
92  	struct omap3isp_prev_yclimit yclimit;
93  	u8 contrast;
94  	u8 brightness;
95  };
96  
97  /* Sink and source previewer pads */
98  #define PREV_PAD_SINK			0
99  #define PREV_PAD_SOURCE			1
100  #define PREV_PADS_NUM			2
101  
102  /*
103   * struct isp_prev_device - Structure for storing ISP Preview module information
104   * @subdev: V4L2 subdevice
105   * @pads: Media entity pads
106   * @formats: Active formats at the subdev pad
107   * @crop: Active crop rectangle
108   * @input: Module currently connected to the input pad
109   * @output: Bitmask of the active output
110   * @video_in: Input video entity
111   * @video_out: Output video entity
112   * @params.params : Active and shadow parameters sets
113   * @params.active: Bitmask of parameters active in set 0
114   * @params.lock: Parameters lock, protects params.active and params.shadow
115   * @underrun: Whether the preview entity has queued buffers on the output
116   * @state: Current preview pipeline state
117   *
118   * This structure is used to store the OMAP ISP Preview module Information.
119   */
120  struct isp_prev_device {
121  	struct v4l2_subdev subdev;
122  	struct media_pad pads[PREV_PADS_NUM];
123  	struct v4l2_mbus_framefmt formats[PREV_PADS_NUM];
124  	struct v4l2_rect crop;
125  
126  	struct v4l2_ctrl_handler ctrls;
127  
128  	enum preview_input_entity input;
129  	unsigned int output;
130  	struct isp_video video_in;
131  	struct isp_video video_out;
132  
133  	struct {
134  		unsigned int cfa_order;
135  		struct prev_params params[2];
136  		u32 active;
137  		spinlock_t lock;
138  	} params;
139  
140  	enum isp_pipeline_stream_state state;
141  	wait_queue_head_t wait;
142  	atomic_t stopping;
143  };
144  
145  struct isp_device;
146  
147  int omap3isp_preview_init(struct isp_device *isp);
148  void omap3isp_preview_cleanup(struct isp_device *isp);
149  
150  int omap3isp_preview_register_entities(struct isp_prev_device *prv,
151  				       struct v4l2_device *vdev);
152  void omap3isp_preview_unregister_entities(struct isp_prev_device *prv);
153  
154  void omap3isp_preview_isr_frame_sync(struct isp_prev_device *prev);
155  void omap3isp_preview_isr(struct isp_prev_device *prev);
156  
157  int omap3isp_preview_busy(struct isp_prev_device *isp_prev);
158  
159  void omap3isp_preview_restore_context(struct isp_device *isp);
160  
161  #endif	/* OMAP3_ISP_PREVIEW_H */
162