1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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
35enum 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
49struct ispccdc_fpc {
50 void *addr;
51 dma_addr_t dma;
52 unsigned int fpnum;
53};
54
55enum ispccdc_lsc_state {
56 LSC_STATE_STOPPED = 0,
57 LSC_STATE_STOPPING = 1,
58 LSC_STATE_RUNNING = 2,
59 LSC_STATE_RECONFIG = 3,
60};
61
62struct ispccdc_lsc_config_req {
63 struct list_head list;
64 struct omap3isp_ccdc_lsc_config config;
65 unsigned char enable;
66
67 struct {
68 void *addr;
69 dma_addr_t dma;
70 struct sg_table sgt;
71 } table;
72};
73
74
75
76
77struct ispccdc_lsc {
78 enum ispccdc_lsc_state state;
79 struct work_struct table_work;
80
81
82 spinlock_t req_lock;
83 struct ispccdc_lsc_config_req *request;
84 struct ispccdc_lsc_config_req *active;
85 struct list_head free_queue;
86};
87
88#define CCDC_STOP_NOT_REQUESTED 0x00
89#define CCDC_STOP_REQUEST 0x01
90#define CCDC_STOP_EXECUTED (0x02 | CCDC_STOP_REQUEST)
91#define CCDC_STOP_CCDC_FINISHED 0x04
92#define CCDC_STOP_LSC_FINISHED 0x08
93#define CCDC_STOP_FINISHED \
94 (CCDC_STOP_EXECUTED | CCDC_STOP_CCDC_FINISHED | CCDC_STOP_LSC_FINISHED)
95
96#define CCDC_EVENT_VD1 0x10
97#define CCDC_EVENT_VD0 0x20
98#define CCDC_EVENT_LSC_DONE 0x40
99
100
101#define CCDC_PAD_SINK 0
102#define CCDC_PAD_SOURCE_OF 1
103#define CCDC_PAD_SOURCE_VP 2
104#define CCDC_PADS_NUM 3
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133struct isp_ccdc_device {
134 struct v4l2_subdev subdev;
135 struct media_pad pads[CCDC_PADS_NUM];
136 struct v4l2_mbus_framefmt formats[CCDC_PADS_NUM];
137 struct v4l2_rect crop;
138
139 enum ccdc_input_entity input;
140 unsigned int output;
141 struct isp_video video_out;
142
143 unsigned int alaw:1,
144 lpf:1,
145 obclamp:1,
146 fpc_en:1;
147 struct omap3isp_ccdc_blcomp blcomp;
148 struct omap3isp_ccdc_bclamp clamp;
149 struct ispccdc_fpc fpc;
150 struct ispccdc_lsc lsc;
151 unsigned int update;
152 unsigned int shadow_update;
153
154 unsigned int underrun:1;
155 enum isp_pipeline_stream_state state;
156 spinlock_t lock;
157 wait_queue_head_t wait;
158 unsigned int stopping;
159 struct mutex ioctl_lock;
160};
161
162struct isp_device;
163
164int omap3isp_ccdc_init(struct isp_device *isp);
165void omap3isp_ccdc_cleanup(struct isp_device *isp);
166int omap3isp_ccdc_register_entities(struct isp_ccdc_device *ccdc,
167 struct v4l2_device *vdev);
168void omap3isp_ccdc_unregister_entities(struct isp_ccdc_device *ccdc);
169
170int omap3isp_ccdc_busy(struct isp_ccdc_device *isp_ccdc);
171int omap3isp_ccdc_isr(struct isp_ccdc_device *isp_ccdc, u32 events);
172void omap3isp_ccdc_restore_context(struct isp_device *isp);
173void omap3isp_ccdc_max_rate(struct isp_ccdc_device *ccdc,
174 unsigned int *max_rate);
175
176#endif
177