]> bbs.cooldavid.org Git - net-next-2.6.git/blame - drivers/staging/dream/include/mach/camera.h
semaphore: Remove mutex emulation
[net-next-2.6.git] / drivers / staging / dream / include / mach / camera.h
CommitLineData
e79753ed
PM
1/*
2 * Copyright (C) 2008-2009 QUALCOMM Incorporated.
3 */
4
5#ifndef __ASM__ARCH_CAMERA_H
6#define __ASM__ARCH_CAMERA_H
7
8#include <linux/list.h>
9#include <linux/poll.h>
10#include <linux/cdev.h>
11#include <linux/platform_device.h>
12#include "linux/types.h"
13
14#include <mach/board.h>
15#include <media/msm_camera.h>
16
17#ifdef CONFIG_MSM_CAMERA_DEBUG
18#define CDBG(fmt, args...) printk(KERN_INFO "msm_camera: " fmt, ##args)
19#else
20#define CDBG(fmt, args...) do { } while (0)
21#endif
22
23#define MSM_CAMERA_MSG 0
24#define MSM_CAMERA_EVT 1
25#define NUM_WB_EXP_NEUTRAL_REGION_LINES 4
26#define NUM_WB_EXP_STAT_OUTPUT_BUFFERS 3
27#define NUM_AUTOFOCUS_MULTI_WINDOW_GRIDS 16
28#define NUM_AF_STAT_OUTPUT_BUFFERS 3
29
30enum msm_queue {
31 MSM_CAM_Q_CTRL, /* control command or control command status */
32 MSM_CAM_Q_VFE_EVT, /* adsp event */
33 MSM_CAM_Q_VFE_MSG, /* adsp message */
34 MSM_CAM_Q_V4L2_REQ, /* v4l2 request */
35};
36
37enum vfe_resp_msg {
38 VFE_EVENT,
39 VFE_MSG_GENERAL,
40 VFE_MSG_SNAPSHOT,
41 VFE_MSG_OUTPUT1,
42 VFE_MSG_OUTPUT2,
43 VFE_MSG_STATS_AF,
44 VFE_MSG_STATS_WE,
45};
46
47struct msm_vfe_phy_info {
48 uint32_t sbuf_phy;
49 uint32_t y_phy;
50 uint32_t cbcr_phy;
51};
52
53struct msm_vfe_resp {
54 enum vfe_resp_msg type;
55 struct msm_vfe_evt_msg evt_msg;
56 struct msm_vfe_phy_info phy;
57 void *extdata;
58 int32_t extlen;
59};
60
61struct msm_vfe_callback {
62 void (*vfe_resp)(struct msm_vfe_resp *,
63 enum msm_queue, void *syncdata);
64 void* (*vfe_alloc)(int, void *syncdata);
65};
66
67struct msm_camvfe_fn {
68 int (*vfe_init)(struct msm_vfe_callback *, struct platform_device *);
69 int (*vfe_enable)(struct camera_enable_cmd *);
70 int (*vfe_config)(struct msm_vfe_cfg_cmd *, void *);
71 int (*vfe_disable)(struct camera_enable_cmd *,
72 struct platform_device *dev);
73 void (*vfe_release)(struct platform_device *);
74};
75
76struct msm_sensor_ctrl {
77 int (*s_init)(const struct msm_camera_sensor_info *);
78 int (*s_release)(void);
79 int (*s_config)(void __user *);
80};
81
82struct msm_sync {
83 /* These two queues are accessed from a process context only. */
84 struct hlist_head frame; /* most-frequently accessed */
85 struct hlist_head stats;
86
87 /* The message queue is used by the control thread to send commands
88 * to the config thread, and also by the DSP to send messages to the
89 * config thread. Thus it is the only queue that is accessed from
90 * both interrupt and process context.
91 */
92 spinlock_t msg_event_q_lock;
93 struct list_head msg_event_q;
94 wait_queue_head_t msg_event_wait;
95
96 /* This queue contains preview frames. It is accessed by the DSP (in
97 * in interrupt context, and by the frame thread.
98 */
99 spinlock_t prev_frame_q_lock;
100 struct list_head prev_frame_q;
101 wait_queue_head_t prev_frame_wait;
102 int unblock_poll_frame;
103
104 /* This queue contains snapshot frames. It is accessed by the DSP (in
105 * interrupt context, and by the control thread.
106 */
107 spinlock_t pict_frame_q_lock;
108 struct list_head pict_frame_q;
109 wait_queue_head_t pict_frame_wait;
110
111 struct msm_camera_sensor_info *sdata;
112 struct msm_camvfe_fn vfefn;
113 struct msm_sensor_ctrl sctrl;
114 struct platform_device *pdev;
115 uint8_t opencnt;
116 void *cropinfo;
117 int croplen;
118 unsigned pict_pp;
119
120 const char *apps_id;
121
122 struct mutex lock;
123 struct list_head list;
124};
125
126#define MSM_APPS_ID_V4L2 "msm_v4l2"
127#define MSM_APPS_ID_PROP "msm_qct"
128
129struct msm_device {
130 struct msm_sync *sync; /* most-frequently accessed */
131 struct device *device;
132 struct cdev cdev;
133 /* opened is meaningful only for the config and frame nodes,
134 * which may be opened only once.
135 */
136 atomic_t opened;
137};
138
139struct msm_control_device_queue {
140 spinlock_t ctrl_status_q_lock;
141 struct list_head ctrl_status_q;
142 wait_queue_head_t ctrl_status_wait;
143};
144
145struct msm_control_device {
146 struct msm_device *pmsm;
147
148 /* This queue used by the config thread to send responses back to the
149 * control thread. It is accessed only from a process context.
150 */
151 struct msm_control_device_queue ctrl_q;
152};
153
154/* this structure is used in kernel */
155struct msm_queue_cmd {
156 struct list_head list;
157 enum msm_queue type;
158 void *command;
159};
160
161struct register_address_value_pair {
162 uint16_t register_address;
163 uint16_t register_value;
164};
165
166struct msm_pmem_region {
167 struct hlist_node list;
168 int type;
169 void *vaddr;
170 unsigned long paddr;
171 unsigned long len;
172 struct file *file;
173 uint32_t y_off;
174 uint32_t cbcr_off;
175 int fd;
176 uint8_t active;
177};
178
179struct axidata {
180 uint32_t bufnum1;
181 uint32_t bufnum2;
182 struct msm_pmem_region *region;
183};
184
185#ifdef CONFIG_MSM_CAMERA_FLASH
186int msm_camera_flash_set_led_state(unsigned led_state);
187#else
188static inline int msm_camera_flash_set_led_state(unsigned led_state)
189{
190 return -ENOTSUPP;
191}
192#endif
193
194/* Below functions are added for V4L2 kernel APIs */
195struct msm_v4l2_driver {
196 struct msm_sync *sync;
197 int (*open)(struct msm_sync *, const char *apps_id);
198 int (*release)(struct msm_sync *);
199 int (*ctrl)(struct msm_sync *, struct msm_ctrl_cmd *);
200 int (*reg_pmem)(struct msm_sync *, struct msm_pmem_info *);
201 int (*get_frame) (struct msm_sync *, struct msm_frame *);
202 int (*put_frame) (struct msm_sync *, struct msm_frame *);
203 int (*get_pict) (struct msm_sync *, struct msm_ctrl_cmd *);
204 unsigned int (*drv_poll) (struct msm_sync *, struct file *,
205 struct poll_table_struct *);
206};
207
208int msm_v4l2_register(struct msm_v4l2_driver *);
209int msm_v4l2_unregister(struct msm_v4l2_driver *);
210
211void msm_camvfe_init(void);
212int msm_camvfe_check(void *);
213void msm_camvfe_fn_init(struct msm_camvfe_fn *, void *);
214int msm_camera_drv_start(struct platform_device *dev,
215 int (*sensor_probe)(const struct msm_camera_sensor_info *,
216 struct msm_sensor_ctrl *));
217
218enum msm_camio_clk_type {
219 CAMIO_VFE_MDC_CLK,
220 CAMIO_MDC_CLK,
221 CAMIO_VFE_CLK,
222 CAMIO_VFE_AXI_CLK,
223
224 CAMIO_MAX_CLK
225};
226
227enum msm_camio_clk_src_type {
228 MSM_CAMIO_CLK_SRC_INTERNAL,
229 MSM_CAMIO_CLK_SRC_EXTERNAL,
230 MSM_CAMIO_CLK_SRC_MAX
231};
232
233enum msm_s_test_mode {
234 S_TEST_OFF,
235 S_TEST_1,
236 S_TEST_2,
237 S_TEST_3
238};
239
240enum msm_s_resolution {
241 S_QTR_SIZE,
242 S_FULL_SIZE,
243 S_INVALID_SIZE
244};
245
246enum msm_s_reg_update {
247 /* Sensor egisters that need to be updated during initialization */
248 S_REG_INIT,
249 /* Sensor egisters that needs periodic I2C writes */
250 S_UPDATE_PERIODIC,
251 /* All the sensor Registers will be updated */
252 S_UPDATE_ALL,
253 /* Not valid update */
254 S_UPDATE_INVALID
255};
256
257enum msm_s_setting {
258 S_RES_PREVIEW,
259 S_RES_CAPTURE
260};
261
262int msm_camio_enable(struct platform_device *dev);
263
264int msm_camio_clk_enable(enum msm_camio_clk_type clk);
265int msm_camio_clk_disable(enum msm_camio_clk_type clk);
266int msm_camio_clk_config(uint32_t freq);
267void msm_camio_clk_rate_set(int rate);
268void msm_camio_clk_axi_rate_set(int rate);
269
270void msm_camio_camif_pad_reg_reset(void);
271void msm_camio_camif_pad_reg_reset_2(void);
272
273void msm_camio_vfe_blk_reset(void);
274
275void msm_camio_clk_sel(enum msm_camio_clk_src_type);
276void msm_camio_disable(struct platform_device *);
277int msm_camio_probe_on(struct platform_device *);
278int msm_camio_probe_off(struct platform_device *);
279#endif