diff options
author | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2011-02-12 16:05:06 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2011-03-22 03:53:51 -0400 |
commit | de1135d44f4f25bee5a22d92e7cf2de64ded0dca (patch) | |
tree | de830c43f790052dc3f62b0adadff0985735b03e /drivers/media/video/omap3isp/ispccdc.h | |
parent | 121e9f1c4c49c76aac2425e3a9baef70f73f50a4 (diff) |
[media] omap3isp: CCDC, preview engine and resizer
The OMAP3 ISP CCDC, preview engine and resizer entities perform image
processing and scaling.
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Sakari Ailus <sakari.ailus@iki.fi>
Signed-off-by: David Cohen <dacohen@gmail.com>
Signed-off-by: Stanimir Varbanov <svarbanov@mm-sol.com>
Signed-off-by: Vimarsh Zutshi <vimarsh.zutshi@gmail.com>
Signed-off-by: Tuukka Toivonen <tuukkat76@gmail.com>
Signed-off-by: Sergio Aguirre <saaguirre@ti.com>
Signed-off-by: Antti Koskipaa <akoskipa@gmail.com>
Signed-off-by: Ivan T. Ivanov <iivanov@mm-sol.com>
Signed-off-by: RaniSuneela <r-m@ti.com>
Signed-off-by: Atanas Filipov <afilipov@mm-sol.com>
Signed-off-by: Gjorgji Rosikopulos <grosikopulos@mm-sol.com>
Signed-off-by: Hiroshi DOYU <Hiroshi.DOYU@nokia.com>
Signed-off-by: Nayden Kanchev <nkanchev@mm-sol.com>
Signed-off-by: Phil Carmody <ext-phil.2.carmody@nokia.com>
Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
Signed-off-by: Dominic Curran <dcurran@ti.com>
Signed-off-by: Ilkka Myllyperkio <ilkka.myllyperkio@sofica.fi>
Signed-off-by: Pallavi Kulkarni <p-kulkarni@ti.com>
Signed-off-by: Vaibhav Hiremath <hvaibhav@ti.com>
Acked-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/omap3isp/ispccdc.h')
-rw-r--r-- | drivers/media/video/omap3isp/ispccdc.h | 219 |
1 files changed, 219 insertions, 0 deletions
diff --git a/drivers/media/video/omap3isp/ispccdc.h b/drivers/media/video/omap3isp/ispccdc.h new file mode 100644 index 000000000000..d403af5d31d2 --- /dev/null +++ b/drivers/media/video/omap3isp/ispccdc.h | |||
@@ -0,0 +1,219 @@ | |||
1 | /* | ||
2 | * ispccdc.h | ||
3 | * | ||
4 | * TI OMAP3 ISP - CCDC module | ||
5 | * | ||
6 | * Copyright (C) 2009-2010 Nokia Corporation | ||
7 | * Copyright (C) 2009 Texas Instruments, Inc. | ||
8 | * | ||
9 | * Contacts: Laurent Pinchart <laurent.pinchart@ideasonboard.com> | ||
10 | * Sakari Ailus <sakari.ailus@iki.fi> | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or modify | ||
13 | * it under the terms of the GNU General Public License version 2 as | ||
14 | * published by the Free Software Foundation. | ||
15 | * | ||
16 | * This program is distributed in the hope that it will be useful, but | ||
17 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
19 | * General Public License for more details. | ||
20 | * | ||
21 | * You should have received a copy of the GNU General Public License | ||
22 | * along with this program; if not, write to the Free Software | ||
23 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA | ||
24 | * 02110-1301 USA | ||
25 | */ | ||
26 | |||
27 | #ifndef OMAP3_ISP_CCDC_H | ||
28 | #define OMAP3_ISP_CCDC_H | ||
29 | |||
30 | #include <linux/omap3isp.h> | ||
31 | #include <linux/workqueue.h> | ||
32 | |||
33 | #include "ispvideo.h" | ||
34 | |||
35 | enum ccdc_input_entity { | ||
36 | CCDC_INPUT_NONE, | ||
37 | CCDC_INPUT_PARALLEL, | ||
38 | CCDC_INPUT_CSI2A, | ||
39 | CCDC_INPUT_CCP2B, | ||
40 | CCDC_INPUT_CSI2C | ||
41 | }; | ||
42 | |||
43 | #define CCDC_OUTPUT_MEMORY (1 << 0) | ||
44 | #define CCDC_OUTPUT_PREVIEW (1 << 1) | ||
45 | #define CCDC_OUTPUT_RESIZER (1 << 2) | ||
46 | |||
47 | #define OMAP3ISP_CCDC_NEVENTS 16 | ||
48 | |||
49 | /* | ||
50 | * struct ispccdc_syncif - Structure for Sync Interface between sensor and CCDC | ||
51 | * @ccdc_mastermode: Master mode. 1 - Master, 0 - Slave. | ||
52 | * @fldstat: Field state. 0 - Odd Field, 1 - Even Field. | ||
53 | * @datsz: Data size. | ||
54 | * @fldmode: 0 - Progressive, 1 - Interlaced. | ||
55 | * @datapol: 0 - Positive, 1 - Negative. | ||
56 | * @fldpol: 0 - Positive, 1 - Negative. | ||
57 | * @hdpol: 0 - Positive, 1 - Negative. | ||
58 | * @vdpol: 0 - Positive, 1 - Negative. | ||
59 | * @fldout: 0 - Input, 1 - Output. | ||
60 | * @hs_width: Width of the Horizontal Sync pulse, used for HS/VS Output. | ||
61 | * @vs_width: Width of the Vertical Sync pulse, used for HS/VS Output. | ||
62 | * @ppln: Number of pixels per line, used for HS/VS Output. | ||
63 | * @hlprf: Number of half lines per frame, used for HS/VS Output. | ||
64 | * @bt_r656_en: 1 - Enable ITU-R BT656 mode, 0 - Sync mode. | ||
65 | */ | ||
66 | struct ispccdc_syncif { | ||
67 | u8 ccdc_mastermode; | ||
68 | u8 fldstat; | ||
69 | u8 datsz; | ||
70 | u8 fldmode; | ||
71 | u8 datapol; | ||
72 | u8 fldpol; | ||
73 | u8 hdpol; | ||
74 | u8 vdpol; | ||
75 | u8 fldout; | ||
76 | u8 hs_width; | ||
77 | u8 vs_width; | ||
78 | u8 ppln; | ||
79 | u8 hlprf; | ||
80 | u8 bt_r656_en; | ||
81 | }; | ||
82 | |||
83 | /* | ||
84 | * struct ispccdc_vp - Structure for Video Port parameters | ||
85 | * @pixelclk: Input pixel clock in Hz | ||
86 | */ | ||
87 | struct ispccdc_vp { | ||
88 | unsigned int pixelclk; | ||
89 | }; | ||
90 | |||
91 | enum ispccdc_lsc_state { | ||
92 | LSC_STATE_STOPPED = 0, | ||
93 | LSC_STATE_STOPPING = 1, | ||
94 | LSC_STATE_RUNNING = 2, | ||
95 | LSC_STATE_RECONFIG = 3, | ||
96 | }; | ||
97 | |||
98 | struct ispccdc_lsc_config_req { | ||
99 | struct list_head list; | ||
100 | struct omap3isp_ccdc_lsc_config config; | ||
101 | unsigned char enable; | ||
102 | u32 table; | ||
103 | struct iovm_struct *iovm; | ||
104 | }; | ||
105 | |||
106 | /* | ||
107 | * ispccdc_lsc - CCDC LSC parameters | ||
108 | * @update_config: Set when user changes config | ||
109 | * @request_enable: Whether LSC is requested to be enabled | ||
110 | * @config: LSC config set by user | ||
111 | * @update_table: Set when user provides a new LSC table to table_new | ||
112 | * @table_new: LSC table set by user, ISP address | ||
113 | * @table_inuse: LSC table currently in use, ISP address | ||
114 | */ | ||
115 | struct ispccdc_lsc { | ||
116 | enum ispccdc_lsc_state state; | ||
117 | struct work_struct table_work; | ||
118 | |||
119 | /* LSC queue of configurations */ | ||
120 | spinlock_t req_lock; | ||
121 | struct ispccdc_lsc_config_req *request; /* requested configuration */ | ||
122 | struct ispccdc_lsc_config_req *active; /* active configuration */ | ||
123 | struct list_head free_queue; /* configurations for freeing */ | ||
124 | }; | ||
125 | |||
126 | #define CCDC_STOP_NOT_REQUESTED 0x00 | ||
127 | #define CCDC_STOP_REQUEST 0x01 | ||
128 | #define CCDC_STOP_EXECUTED (0x02 | CCDC_STOP_REQUEST) | ||
129 | #define CCDC_STOP_CCDC_FINISHED 0x04 | ||
130 | #define CCDC_STOP_LSC_FINISHED 0x08 | ||
131 | #define CCDC_STOP_FINISHED \ | ||
132 | (CCDC_STOP_EXECUTED | CCDC_STOP_CCDC_FINISHED | CCDC_STOP_LSC_FINISHED) | ||
133 | |||
134 | #define CCDC_EVENT_VD1 0x10 | ||
135 | #define CCDC_EVENT_VD0 0x20 | ||
136 | #define CCDC_EVENT_LSC_DONE 0x40 | ||
137 | |||
138 | /* Sink and source CCDC pads */ | ||
139 | #define CCDC_PAD_SINK 0 | ||
140 | #define CCDC_PAD_SOURCE_OF 1 | ||
141 | #define CCDC_PAD_SOURCE_VP 2 | ||
142 | #define CCDC_PADS_NUM 3 | ||
143 | |||
144 | /* | ||
145 | * struct isp_ccdc_device - Structure for the CCDC module to store its own | ||
146 | * information | ||
147 | * @subdev: V4L2 subdevice | ||
148 | * @pads: Sink and source media entity pads | ||
149 | * @formats: Active video formats | ||
150 | * @input: Active input | ||
151 | * @output: Active outputs | ||
152 | * @video_out: Output video node | ||
153 | * @error: A hardware error occured during capture | ||
154 | * @alaw: A-law compression enabled (1) or disabled (0) | ||
155 | * @lpf: Low pass filter enabled (1) or disabled (0) | ||
156 | * @obclamp: Optical-black clamp enabled (1) or disabled (0) | ||
157 | * @fpc_en: Faulty pixels correction enabled (1) or disabled (0) | ||
158 | * @blcomp: Black level compensation configuration | ||
159 | * @clamp: Optical-black or digital clamp configuration | ||
160 | * @fpc: Faulty pixels correction configuration | ||
161 | * @lsc: Lens shading compensation configuration | ||
162 | * @update: Bitmask of controls to update during the next interrupt | ||
163 | * @shadow_update: Controls update in progress by userspace | ||
164 | * @syncif: Interface synchronization configuration | ||
165 | * @vpcfg: Video port configuration | ||
166 | * @underrun: A buffer underrun occured and a new buffer has been queued | ||
167 | * @state: Streaming state | ||
168 | * @lock: Serializes shadow_update with interrupt handler | ||
169 | * @wait: Wait queue used to stop the module | ||
170 | * @stopping: Stopping state | ||
171 | * @ioctl_lock: Serializes ioctl calls and LSC requests freeing | ||
172 | */ | ||
173 | struct isp_ccdc_device { | ||
174 | struct v4l2_subdev subdev; | ||
175 | struct media_pad pads[CCDC_PADS_NUM]; | ||
176 | struct v4l2_mbus_framefmt formats[CCDC_PADS_NUM]; | ||
177 | |||
178 | enum ccdc_input_entity input; | ||
179 | unsigned int output; | ||
180 | struct isp_video video_out; | ||
181 | unsigned int error; | ||
182 | |||
183 | unsigned int alaw:1, | ||
184 | lpf:1, | ||
185 | obclamp:1, | ||
186 | fpc_en:1; | ||
187 | struct omap3isp_ccdc_blcomp blcomp; | ||
188 | struct omap3isp_ccdc_bclamp clamp; | ||
189 | struct omap3isp_ccdc_fpc fpc; | ||
190 | struct ispccdc_lsc lsc; | ||
191 | unsigned int update; | ||
192 | unsigned int shadow_update; | ||
193 | |||
194 | struct ispccdc_syncif syncif; | ||
195 | struct ispccdc_vp vpcfg; | ||
196 | |||
197 | unsigned int underrun:1; | ||
198 | enum isp_pipeline_stream_state state; | ||
199 | spinlock_t lock; | ||
200 | wait_queue_head_t wait; | ||
201 | unsigned int stopping; | ||
202 | struct mutex ioctl_lock; | ||
203 | }; | ||
204 | |||
205 | struct isp_device; | ||
206 | |||
207 | int omap3isp_ccdc_init(struct isp_device *isp); | ||
208 | void omap3isp_ccdc_cleanup(struct isp_device *isp); | ||
209 | int omap3isp_ccdc_register_entities(struct isp_ccdc_device *ccdc, | ||
210 | struct v4l2_device *vdev); | ||
211 | void omap3isp_ccdc_unregister_entities(struct isp_ccdc_device *ccdc); | ||
212 | |||
213 | int omap3isp_ccdc_busy(struct isp_ccdc_device *isp_ccdc); | ||
214 | int omap3isp_ccdc_isr(struct isp_ccdc_device *isp_ccdc, u32 events); | ||
215 | void omap3isp_ccdc_restore_context(struct isp_device *isp); | ||
216 | void omap3isp_ccdc_max_rate(struct isp_ccdc_device *ccdc, | ||
217 | unsigned int *max_rate); | ||
218 | |||
219 | #endif /* OMAP3_ISP_CCDC_H */ | ||