]> asedeno.scripts.mit.edu Git - linux.git/blob - drivers/media/platform/omap3isp/ispresizer.h
Merge tag 'io_uring-5.6-2020-03-07' of git://git.kernel.dk/linux-block
[linux.git] / drivers / media / platform / omap3isp / ispresizer.h
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 */