1
2
3
4
5
6
7
8
9#ifndef FIMC_LITE_H_
10#define FIMC_LITE_H_
11
12#include <linux/sizes.h>
13#include <linux/io.h>
14#include <linux/irqreturn.h>
15#include <linux/platform_device.h>
16#include <linux/sched.h>
17#include <linux/spinlock.h>
18#include <linux/types.h>
19#include <linux/videodev2.h>
20
21#include <media/media-entity.h>
22#include <media/videobuf2-v4l2.h>
23#include <media/v4l2-ctrls.h>
24#include <media/v4l2-device.h>
25#include <media/v4l2-mediabus.h>
26#include <media/drv-intf/exynos-fimc.h>
27
28#define FIMC_LITE_DRV_NAME "exynos-fimc-lite"
29#define FLITE_CLK_NAME "flite"
30#define FIMC_LITE_MAX_DEVS 3
31#define FLITE_REQ_BUFS_MIN 2
32#define FLITE_DEFAULT_WIDTH 640
33#define FLITE_DEFAULT_HEIGHT 480
34
35
36enum {
37 ST_FLITE_LPM,
38 ST_FLITE_PENDING,
39 ST_FLITE_RUN,
40 ST_FLITE_STREAM,
41 ST_FLITE_SUSPENDED,
42 ST_FLITE_OFF,
43 ST_FLITE_IN_USE,
44 ST_FLITE_CONFIG,
45 ST_SENSOR_STREAM,
46};
47
48#define FLITE_SD_PAD_SINK 0
49#define FLITE_SD_PAD_SOURCE_DMA 1
50#define FLITE_SD_PAD_SOURCE_ISP 2
51#define FLITE_SD_PADS_NUM 3
52
53
54
55
56
57
58
59
60
61
62
63
64
65struct flite_drvdata {
66 unsigned short max_width;
67 unsigned short max_height;
68 unsigned short out_width_align;
69 unsigned short win_hor_offs_align;
70 unsigned short out_hor_offs_align;
71 unsigned short max_dma_bufs;
72 unsigned short num_instances;
73};
74
75struct fimc_lite_events {
76 unsigned int data_overflow;
77};
78
79#define FLITE_MAX_PLANES 1
80
81
82
83
84
85
86
87
88struct flite_frame {
89 u16 f_width;
90 u16 f_height;
91 struct v4l2_rect rect;
92 const struct fimc_fmt *fmt;
93};
94
95
96
97
98
99
100
101
102struct flite_buffer {
103 struct vb2_v4l2_buffer vb;
104 struct list_head list;
105 dma_addr_t paddr;
106 unsigned short index;
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
133
134
135
136
137
138
139
140
141
142
143
144struct fimc_lite {
145 struct platform_device *pdev;
146 struct flite_drvdata *dd;
147 struct exynos_video_entity ve;
148 struct v4l2_device *v4l2_dev;
149 struct v4l2_fh fh;
150 struct v4l2_subdev subdev;
151 struct media_pad vd_pad;
152 struct media_pad subdev_pads[FLITE_SD_PADS_NUM];
153 struct v4l2_subdev *sensor;
154 struct v4l2_ctrl_handler ctrl_handler;
155 struct v4l2_ctrl *test_pattern;
156 int index;
157
158 struct mutex lock;
159 spinlock_t slock;
160
161 struct clk *clock;
162 void __iomem *regs;
163 wait_queue_head_t irq_queue;
164
165 unsigned long payload[FLITE_MAX_PLANES];
166 struct flite_frame inp_frame;
167 struct flite_frame out_frame;
168 atomic_t out_path;
169 unsigned int source_subdev_grp_id;
170
171 unsigned long state;
172 struct list_head pending_buf_q;
173 struct list_head active_buf_q;
174 struct vb2_queue vb_queue;
175 unsigned short buf_index;
176 unsigned int frame_count;
177 unsigned int reqbufs_count;
178
179 struct fimc_lite_events events;
180 bool streaming;
181};
182
183static inline bool fimc_lite_active(struct fimc_lite *fimc)
184{
185 unsigned long flags;
186 bool ret;
187
188 spin_lock_irqsave(&fimc->slock, flags);
189 ret = fimc->state & (1 << ST_FLITE_RUN) ||
190 fimc->state & (1 << ST_FLITE_PENDING);
191 spin_unlock_irqrestore(&fimc->slock, flags);
192 return ret;
193}
194
195static inline void fimc_lite_active_queue_add(struct fimc_lite *dev,
196 struct flite_buffer *buf)
197{
198 list_add_tail(&buf->list, &dev->active_buf_q);
199}
200
201static inline struct flite_buffer *fimc_lite_active_queue_pop(
202 struct fimc_lite *dev)
203{
204 struct flite_buffer *buf = list_entry(dev->active_buf_q.next,
205 struct flite_buffer, list);
206 list_del(&buf->list);
207 return buf;
208}
209
210static inline void fimc_lite_pending_queue_add(struct fimc_lite *dev,
211 struct flite_buffer *buf)
212{
213 list_add_tail(&buf->list, &dev->pending_buf_q);
214}
215
216static inline struct flite_buffer *fimc_lite_pending_queue_pop(
217 struct fimc_lite *dev)
218{
219 struct flite_buffer *buf = list_entry(dev->pending_buf_q.next,
220 struct flite_buffer, list);
221 list_del(&buf->list);
222 return buf;
223}
224
225#endif
226