xref: /linux/drivers/media/platform/ti/omap3isp/ispresizer.h (revision dec1c62e91ba268ab2a6e339d4d7a59287d5eba1)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * ispresizer.h
4  *
5  * TI OMAP3 ISP - Resizer 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_RESIZER_H
15 #define OMAP3_ISP_RESIZER_H
16 
17 #include <linux/spinlock.h>
18 #include <linux/types.h>
19 
20 /*
21  * Constants for filter coefficients count
22  */
23 #define COEFF_CNT		32
24 
25 /*
26  * struct isprsz_coef - Structure for resizer filter coefficients.
27  * @h_filter_coef_4tap: Horizontal filter coefficients for 8-phase/4-tap
28  *			mode (.5x-4x)
29  * @v_filter_coef_4tap: Vertical filter coefficients for 8-phase/4-tap
30  *			mode (.5x-4x)
31  * @h_filter_coef_7tap: Horizontal filter coefficients for 4-phase/7-tap
32  *			mode (.25x-.5x)
33  * @v_filter_coef_7tap: Vertical filter coefficients for 4-phase/7-tap
34  *			mode (.25x-.5x)
35  */
36 struct isprsz_coef {
37 	u16 h_filter_coef_4tap[32];
38 	u16 v_filter_coef_4tap[32];
39 	/* Every 8th value is a dummy value in the following arrays: */
40 	u16 h_filter_coef_7tap[32];
41 	u16 v_filter_coef_7tap[32];
42 };
43 
44 /* Chrominance horizontal algorithm */
45 enum resizer_chroma_algo {
46 	RSZ_THE_SAME = 0,	/* Chrominance the same as Luminance */
47 	RSZ_BILINEAR = 1,	/* Chrominance uses bilinear interpolation */
48 };
49 
50 /* Resizer input type select */
51 enum resizer_colors_type {
52 	RSZ_YUV422 = 0,		/* YUV422 color is interleaved */
53 	RSZ_COLOR8 = 1,		/* Color separate data on 8 bits */
54 };
55 
56 /*
57  * Structure for horizontal and vertical resizing value
58  */
59 struct resizer_ratio {
60 	u32 horz;
61 	u32 vert;
62 };
63 
64 /*
65  * Structure for luminance enhancer parameters.
66  */
67 struct resizer_luma_yenh {
68 	u8 algo;		/* algorithm select. */
69 	u8 gain;		/* maximum gain. */
70 	u8 slope;		/* slope. */
71 	u8 core;		/* core offset. */
72 };
73 
74 enum resizer_input_entity {
75 	RESIZER_INPUT_NONE,
76 	RESIZER_INPUT_VP,	/* input video port - prev or ccdc */
77 	RESIZER_INPUT_MEMORY,
78 };
79 
80 /* Sink and source resizer pads */
81 #define RESZ_PAD_SINK			0
82 #define RESZ_PAD_SOURCE			1
83 #define RESZ_PADS_NUM			2
84 
85 /*
86  * struct isp_res_device - OMAP3 ISP resizer module
87  * @lock: Protects formats and crop rectangles between set_selection and IRQ
88  * @crop.request: Crop rectangle requested by the user
89  * @crop.active: Active crop rectangle (based on hardware requirements)
90  */
91 struct isp_res_device {
92 	struct v4l2_subdev subdev;
93 	struct media_pad pads[RESZ_PADS_NUM];
94 	struct v4l2_mbus_framefmt formats[RESZ_PADS_NUM];
95 
96 	enum resizer_input_entity input;
97 	struct isp_video video_in;
98 	struct isp_video video_out;
99 
100 	u32 addr_base;   /* stored source buffer address in memory mode */
101 	u32 crop_offset; /* additional offset for crop in memory mode */
102 	struct resizer_ratio ratio;
103 	int pm_state;
104 	unsigned int applycrop:1;
105 	enum isp_pipeline_stream_state state;
106 	wait_queue_head_t wait;
107 	atomic_t stopping;
108 	spinlock_t lock;
109 
110 	struct {
111 		struct v4l2_rect request;
112 		struct v4l2_rect active;
113 	} crop;
114 };
115 
116 struct isp_device;
117 
118 int omap3isp_resizer_init(struct isp_device *isp);
119 void omap3isp_resizer_cleanup(struct isp_device *isp);
120 
121 int omap3isp_resizer_register_entities(struct isp_res_device *res,
122 				       struct v4l2_device *vdev);
123 void omap3isp_resizer_unregister_entities(struct isp_res_device *res);
124 void omap3isp_resizer_isr_frame_sync(struct isp_res_device *res);
125 void omap3isp_resizer_isr(struct isp_res_device *isp_res);
126 
127 void omap3isp_resizer_max_rate(struct isp_res_device *res,
128 			       unsigned int *max_rate);
129 
130 void omap3isp_resizer_suspend(struct isp_res_device *isp_res);
131 
132 void omap3isp_resizer_resume(struct isp_res_device *isp_res);
133 
134 int omap3isp_resizer_busy(struct isp_res_device *isp_res);
135 
136 #endif	/* OMAP3_ISP_RESIZER_H */
137