blob: 43d707e5b71b9f6be46f9c1021b72937d4bb7517 [file] [log] [blame]
Jeyaprakash Soundrapandian2474e8f2012-01-03 15:59:57 -08001/* Copyright (c) 2009-2012, Code Aurora Forum. All rights reserved.
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 */
13
14#ifndef __ASM__ARCH_CAMERA_H
15#define __ASM__ARCH_CAMERA_H
16
17#include <linux/list.h>
18#include <linux/poll.h>
19#include <linux/cdev.h>
20#include <linux/platform_device.h>
Stephen Boyd2fcabf92012-05-30 10:41:11 -070021#include <linux/pm_qos.h>
Kevin Chaneb6b6072012-01-17 11:54:54 -080022#include <linux/regulator/consumer.h>
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070023#include "linux/types.h"
24
25#include <mach/board.h>
26#include <media/msm_camera.h>
Ankit Premrajka748a70a2011-11-01 08:22:04 -070027#include <linux/ion.h>
Laura Abbott5b1e6f12012-05-28 08:13:55 -070028#include <mach/iommu_domains.h>
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070029
30#define CONFIG_MSM_CAMERA_DEBUG
31#ifdef CONFIG_MSM_CAMERA_DEBUG
32#define CDBG(fmt, args...) pr_debug(fmt, ##args)
33#else
34#define CDBG(fmt, args...) do { } while (0)
35#endif
36
37#define PAD_TO_2K(a, b) ((!b) ? a : (((a)+2047) & ~2047))
38
39#define MSM_CAMERA_MSG 0
40#define MSM_CAMERA_EVT 1
41#define NUM_WB_EXP_NEUTRAL_REGION_LINES 4
42#define NUM_WB_EXP_STAT_OUTPUT_BUFFERS 3
43#define NUM_AUTOFOCUS_MULTI_WINDOW_GRIDS 16
44#define NUM_STAT_OUTPUT_BUFFERS 3
45#define NUM_AF_STAT_OUTPUT_BUFFERS 3
Mingcheng Zhu996be182011-10-16 16:04:23 -070046#define max_control_command_size 512
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070047#define CROP_LEN 36
48
49enum vfe_mode_of_operation{
50 VFE_MODE_OF_OPERATION_CONTINUOUS,
51 VFE_MODE_OF_OPERATION_SNAPSHOT,
52 VFE_MODE_OF_OPERATION_VIDEO,
53 VFE_MODE_OF_OPERATION_RAW_SNAPSHOT,
54 VFE_MODE_OF_OPERATION_ZSL,
Jignesh Mehta6cf8a742012-02-04 23:40:50 -080055 VFE_MODE_OF_OPERATION_JPEG_SNAPSHOT,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070056 VFE_LAST_MODE_OF_OPERATION_ENUM
57};
58
59enum msm_queue {
60 MSM_CAM_Q_CTRL, /* control command or control command status */
61 MSM_CAM_Q_VFE_EVT, /* adsp event */
62 MSM_CAM_Q_VFE_MSG, /* adsp message */
63 MSM_CAM_Q_V4L2_REQ, /* v4l2 request */
64 MSM_CAM_Q_VPE_MSG, /* vpe message */
65 MSM_CAM_Q_PP_MSG, /* pp message */
66};
67
68enum vfe_resp_msg {
69 VFE_EVENT,
70 VFE_MSG_GENERAL,
71 VFE_MSG_SNAPSHOT,
72 VFE_MSG_OUTPUT_P, /* preview (continuous mode ) */
73 VFE_MSG_OUTPUT_T, /* thumbnail (snapshot mode )*/
74 VFE_MSG_OUTPUT_S, /* main image (snapshot mode )*/
75 VFE_MSG_OUTPUT_V, /* video (continuous mode ) */
76 VFE_MSG_STATS_AEC,
77 VFE_MSG_STATS_AF,
78 VFE_MSG_STATS_AWB,
Kiran Kumar H Ndd128472011-12-01 09:35:34 -080079 VFE_MSG_STATS_RS, /* 10 */
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070080 VFE_MSG_STATS_CS,
81 VFE_MSG_STATS_IHIST,
82 VFE_MSG_STATS_SKIN,
83 VFE_MSG_STATS_WE, /* AEC + AWB */
84 VFE_MSG_SYNC_TIMER0,
85 VFE_MSG_SYNC_TIMER1,
86 VFE_MSG_SYNC_TIMER2,
87 VFE_MSG_COMMON,
Kiran Kumar H N0fb9dcf2011-07-17 12:31:53 -070088 VFE_MSG_V32_START,
Kiran Kumar H Ndd128472011-12-01 09:35:34 -080089 VFE_MSG_V32_START_RECORDING, /* 20 */
Kiran Kumar H N0fb9dcf2011-07-17 12:31:53 -070090 VFE_MSG_V32_CAPTURE,
Jignesh Mehta6cf8a742012-02-04 23:40:50 -080091 VFE_MSG_V32_JPEG_CAPTURE,
Kiran Kumar H N0fb9dcf2011-07-17 12:31:53 -070092 VFE_MSG_OUTPUT_IRQ,
Suresh Vankadara055cb8e2012-01-18 00:50:04 +053093 VFE_MSG_V2X_PREVIEW,
94 VFE_MSG_V2X_CAPTURE,
Kiran Kumar H Ndd128472011-12-01 09:35:34 -080095 VFE_MSG_OUTPUT_PRIMARY,
96 VFE_MSG_OUTPUT_SECONDARY,
Nishant Pandit28feb3d2012-04-26 23:56:22 +053097 VFE_MSG_OUTPUT_TERTIARY1,
Nishant Pandit5dd54422012-06-26 22:52:44 +053098 VFE_MSG_OUTPUT_TERTIARY2,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070099};
100
101enum vpe_resp_msg {
102 VPE_MSG_GENERAL,
103 VPE_MSG_OUTPUT_V, /* video (continuous mode ) */
104 VPE_MSG_OUTPUT_ST_L,
105 VPE_MSG_OUTPUT_ST_R,
106};
107
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700108enum msm_stereo_state {
109 STEREO_VIDEO_IDLE,
110 STEREO_VIDEO_ACTIVE,
111 STEREO_SNAP_IDLE,
112 STEREO_SNAP_STARTED,
113 STEREO_SNAP_BUFFER1_PROCESSING,
114 STEREO_SNAP_BUFFER2_PROCESSING,
115 STEREO_RAW_SNAP_IDLE,
116 STEREO_RAW_SNAP_STARTED,
117};
118
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700119struct msm_vpe_phy_info {
120 uint32_t sbuf_phy;
Alekhya,Monikafc81e102011-12-29 15:17:33 +0530121 uint32_t planar0_off;
122 uint32_t planar1_off;
123 uint32_t planar2_off;
124 uint32_t p0_phy;
125 uint32_t p1_phy;
126 uint32_t p2_phy;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700127 uint8_t output_id; /* VFE31_OUTPUT_MODE_PT/S/V */
128 uint32_t frame_id;
129};
130
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700131struct msm_camera_csid_lut_params {
132 uint8_t num_cid;
133 struct msm_camera_csid_vc_cfg *vc_cfg;
134};
135
136struct msm_camera_csid_params {
137 uint8_t lane_cnt;
Hody Hung31ed0272012-06-11 10:22:20 -0700138 uint16_t lane_assign;
139 uint8_t phy_sel;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700140 struct msm_camera_csid_lut_params lut_params;
141};
142
143struct msm_camera_csiphy_params {
144 uint8_t lane_cnt;
145 uint8_t settle_cnt;
Hody Hung31ed0272012-06-11 10:22:20 -0700146 uint16_t lane_mask;
147 uint8_t combo_mode;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700148};
149
Kevin Chana980f392011-08-01 20:55:00 -0700150struct msm_camera_csi2_params {
151 struct msm_camera_csid_params csid_params;
152 struct msm_camera_csiphy_params csiphy_params;
153};
154
Kevin Chan3be11612012-03-22 20:05:40 -0700155#ifndef CONFIG_MSM_CAMERA_V4L2
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700156#define VFE31_OUTPUT_MODE_PT (0x1 << 0)
157#define VFE31_OUTPUT_MODE_S (0x1 << 1)
158#define VFE31_OUTPUT_MODE_V (0x1 << 2)
159#define VFE31_OUTPUT_MODE_P (0x1 << 3)
160#define VFE31_OUTPUT_MODE_T (0x1 << 4)
Alekhya,Monikafc81e102011-12-29 15:17:33 +0530161#define VFE31_OUTPUT_MODE_P_ALL_CHNLS (0x1 << 5)
Kevin Chan3be11612012-03-22 20:05:40 -0700162#endif
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700163
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700164struct msm_vfe_phy_info {
165 uint32_t sbuf_phy;
Alekhya,Monikafc81e102011-12-29 15:17:33 +0530166 uint32_t planar0_off;
167 uint32_t planar1_off;
168 uint32_t planar2_off;
169 uint32_t p0_phy;
170 uint32_t p1_phy;
171 uint32_t p2_phy;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700172 uint8_t output_id; /* VFE31_OUTPUT_MODE_PT/S/V */
173 uint32_t frame_id;
174};
175
176struct msm_vfe_stats_msg {
Lakshmi Narayana Kalavala4ab97a92011-07-26 15:30:14 -0700177 uint8_t awb_ymin;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700178 uint32_t aec_buff;
179 uint32_t awb_buff;
180 uint32_t af_buff;
181 uint32_t ihist_buff;
182 uint32_t rs_buff;
183 uint32_t cs_buff;
184 uint32_t skin_buff;
185 uint32_t status_bits;
186 uint32_t frame_id;
187};
188
189struct video_crop_t{
190 uint32_t in1_w;
191 uint32_t out1_w;
192 uint32_t in1_h;
193 uint32_t out1_h;
194 uint32_t in2_w;
195 uint32_t out2_w;
196 uint32_t in2_h;
197 uint32_t out2_h;
198 uint8_t update_flag;
199};
200
201struct msm_vpe_buf_info {
Alekhya,Monikafc81e102011-12-29 15:17:33 +0530202 uint32_t p0_phy;
203 uint32_t p1_phy;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700204 struct timespec ts;
205 uint32_t frame_id;
206 struct video_crop_t vpe_crop;
207};
208
209struct msm_vfe_resp {
210 enum vfe_resp_msg type;
211 struct msm_cam_evt_msg evt_msg;
212 struct msm_vfe_phy_info phy;
213 struct msm_vfe_stats_msg stats_msg;
214 struct msm_vpe_buf_info vpe_bf;
215 void *extdata;
216 int32_t extlen;
217};
218
219struct msm_vpe_resp {
220 enum vpe_resp_msg type;
221 struct msm_cam_evt_msg evt_msg;
222 struct msm_vpe_phy_info phy;
223 void *extdata;
224 int32_t extlen;
225};
226
227struct msm_vpe_callback {
228 void (*vpe_resp)(struct msm_vpe_resp *,
229 enum msm_queue, void *syncdata,
230 void *time_stamp, gfp_t gfp);
231 void* (*vpe_alloc)(int, void *syncdata, gfp_t gfp);
232 void (*vpe_free)(void *ptr);
233};
234
235struct msm_vfe_callback {
236 void (*vfe_resp)(struct msm_vfe_resp *,
237 enum msm_queue, void *syncdata,
238 gfp_t gfp);
239 void* (*vfe_alloc)(int, void *syncdata, gfp_t gfp);
240 void (*vfe_free)(void *ptr);
241};
242
243struct msm_camvfe_fn {
244 int (*vfe_init)(struct msm_vfe_callback *,
245 struct platform_device *);
246 int (*vfe_enable)(struct camera_enable_cmd *);
247 int (*vfe_config)(struct msm_vfe_cfg_cmd *, void *);
248 int (*vfe_disable)(struct camera_enable_cmd *,
249 struct platform_device *dev);
250 void (*vfe_release)(struct platform_device *);
251 void (*vfe_stop)(void);
252};
253
254struct msm_camvfe_params {
255 struct msm_vfe_cfg_cmd *vfe_cfg;
256 void *data;
257};
258
Mingcheng Zhu8e9f99e2011-08-26 16:33:32 -0700259struct msm_mctl_pp_params {
260 struct msm_mctl_pp_cmd *cmd;
261 void *data;
262};
263
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700264struct msm_camvpe_fn {
265 int (*vpe_reg)(struct msm_vpe_callback *);
266 int (*vpe_cfg_update) (void *);
Alekhya,Monikafc81e102011-12-29 15:17:33 +0530267 void (*send_frame_to_vpe) (uint32_t planar0_off, uint32_t planar1_off,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700268 struct timespec *ts, int output_id);
269 int (*vpe_config)(struct msm_vpe_cfg_cmd *, void *);
270 void (*vpe_cfg_offset)(int frame_pack, uint32_t pyaddr,
271 uint32_t pcbcraddr, struct timespec *ts, int output_id,
272 struct msm_st_half st_half, int frameid);
273 int *dis;
274};
275
276struct msm_sensor_ctrl {
277 int (*s_init)(const struct msm_camera_sensor_info *);
278 int (*s_release)(void);
279 int (*s_config)(void __user *);
280 enum msm_camera_type s_camera_type;
281 uint32_t s_mount_angle;
282 enum msm_st_frame_packing s_video_packing;
283 enum msm_st_frame_packing s_snap_packing;
284};
Sreesudhan Ramakrish Ramkumara4b5f302011-09-12 16:23:22 -0700285
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700286struct msm_strobe_flash_ctrl {
287 int (*strobe_flash_init)
288 (struct msm_camera_sensor_strobe_flash_data *);
289 int (*strobe_flash_release)
290 (struct msm_camera_sensor_strobe_flash_data *, int32_t);
291 int (*strobe_flash_charge)(int32_t, int32_t, uint32_t);
292};
293
294/* this structure is used in kernel */
295struct msm_queue_cmd {
296 struct list_head list_config;
297 struct list_head list_control;
298 struct list_head list_frame;
299 struct list_head list_pict;
300 struct list_head list_vpe_frame;
Kevin Chan94b4c832012-03-02 21:27:16 -0800301 struct list_head list_eventdata;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700302 enum msm_queue type;
303 void *command;
304 atomic_t on_heap;
305 struct timespec ts;
306 uint32_t error_code;
307};
308
309struct msm_device_queue {
310 struct list_head list;
311 spinlock_t lock;
312 wait_queue_head_t wait;
313 int max;
314 int len;
315 const char *name;
316};
317
Kevin Chan047053e2012-04-19 11:30:33 -0700318struct msm_mctl_stats_t {
319 struct hlist_head pmem_stats_list;
320 spinlock_t pmem_stats_spinlock;
321};
322
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700323struct msm_sync {
324 /* These two queues are accessed from a process context only
325 * They contain pmem descriptors for the preview frames and the stats
326 * coming from the camera sensor.
327 */
328 struct hlist_head pmem_frames;
329 struct hlist_head pmem_stats;
330
331 /* The message queue is used by the control thread to send commands
332 * to the config thread, and also by the DSP to send messages to the
333 * config thread. Thus it is the only queue that is accessed from
334 * both interrupt and process context.
335 */
336 struct msm_device_queue event_q;
337
338 /* This queue contains preview frames. It is accessed by the DSP (in
339 * in interrupt context, and by the frame thread.
340 */
341 struct msm_device_queue frame_q;
342 int unblock_poll_frame;
343 int unblock_poll_pic_frame;
344
345 /* This queue contains snapshot frames. It is accessed by the DSP (in
346 * interrupt context, and by the control thread.
347 */
348 struct msm_device_queue pict_q;
349 int get_pic_abort;
350 struct msm_device_queue vpe_q;
351
352 struct msm_camera_sensor_info *sdata;
353 struct msm_camvfe_fn vfefn;
354 struct msm_camvpe_fn vpefn;
355 struct msm_sensor_ctrl sctrl;
356 struct msm_strobe_flash_ctrl sfctrl;
Stephen Boyd2fcabf92012-05-30 10:41:11 -0700357 struct pm_qos_request idle_pm_qos;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700358 struct platform_device *pdev;
359 int16_t ignore_qcmd_type;
360 uint8_t ignore_qcmd;
361 uint8_t opencnt;
362 void *cropinfo;
363 int croplen;
364 int core_powered_on;
365
366 struct fd_roi_info fdroiinfo;
367
368 atomic_t vpe_enable;
369 uint32_t pp_mask;
370 uint8_t pp_frame_avail;
371 struct msm_queue_cmd *pp_prev;
372 struct msm_queue_cmd *pp_snap;
373 struct msm_queue_cmd *pp_thumb;
374 int video_fd;
375
376 const char *apps_id;
377
378 struct mutex lock;
379 struct list_head list;
380 uint8_t liveshot_enabled;
381 struct msm_cam_v4l2_device *pcam_sync;
382
383 uint8_t stereocam_enabled;
384 struct msm_queue_cmd *pp_stereocam;
385 struct msm_queue_cmd *pp_stereocam2;
386 struct msm_queue_cmd *pp_stereosnap;
387 enum msm_stereo_state stereo_state;
388 int stcam_quality_ind;
389 uint32_t stcam_conv_value;
390
391 spinlock_t pmem_frame_spinlock;
392 spinlock_t pmem_stats_spinlock;
393 spinlock_t abort_pict_lock;
394 int snap_count;
395 int thumb_count;
396};
397
398#define MSM_APPS_ID_V4L2 "msm_v4l2"
399#define MSM_APPS_ID_PROP "msm_qct"
400
401struct msm_cam_device {
402 struct msm_sync *sync; /* most-frequently accessed */
403 struct device *device;
404 struct cdev cdev;
405 /* opened is meaningful only for the config and frame nodes,
406 * which may be opened only once.
407 */
408 atomic_t opened;
409};
410
411struct msm_control_device {
412 struct msm_cam_device *pmsm;
413
414 /* Used for MSM_CAM_IOCTL_CTRL_CMD_DONE responses */
415 uint8_t ctrl_data[max_control_command_size];
416 struct msm_ctrl_cmd ctrl;
417 struct msm_queue_cmd qcmd;
418
419 /* This queue used by the config thread to send responses back to the
420 * control thread. It is accessed only from a process context.
421 */
422 struct msm_device_queue ctrl_q;
423};
424
425struct register_address_value_pair {
426 uint16_t register_address;
427 uint16_t register_value;
428};
429
430struct msm_pmem_region {
431 struct hlist_node list;
432 unsigned long paddr;
433 unsigned long len;
434 struct file *file;
435 struct msm_pmem_info info;
Ankit Premrajka748a70a2011-11-01 08:22:04 -0700436 struct ion_handle *handle;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700437};
438
439struct axidata {
440 uint32_t bufnum1;
441 uint32_t bufnum2;
442 uint32_t bufnum3;
443 struct msm_pmem_region *region;
444};
445
446#ifdef CONFIG_MSM_CAMERA_FLASH
447int msm_camera_flash_set_led_state(
448 struct msm_camera_sensor_flash_data *fdata,
449 unsigned led_state);
450int msm_strobe_flash_init(struct msm_sync *sync, uint32_t sftype);
451int msm_flash_ctrl(struct msm_camera_sensor_info *sdata,
452 struct flash_ctrl_data *flash_info);
453#else
454static inline int msm_camera_flash_set_led_state(
455 struct msm_camera_sensor_flash_data *fdata,
456 unsigned led_state)
457{
458 return -ENOTSUPP;
459}
460static inline int msm_strobe_flash_init(
461 struct msm_sync *sync, uint32_t sftype)
462{
463 return -ENOTSUPP;
464}
465static inline int msm_flash_ctrl(
466 struct msm_camera_sensor_info *sdata,
467 struct flash_ctrl_data *flash_info)
468{
469 return -ENOTSUPP;
470}
471#endif
472
473
474
475void msm_camvfe_init(void);
476int msm_camvfe_check(void *);
477void msm_camvfe_fn_init(struct msm_camvfe_fn *, void *);
478void msm_camvpe_fn_init(struct msm_camvpe_fn *, void *);
479int msm_camera_drv_start(struct platform_device *dev,
480 int (*sensor_probe)(const struct msm_camera_sensor_info *,
481 struct msm_sensor_ctrl *));
482
483enum msm_camio_clk_type {
484 CAMIO_VFE_MDC_CLK,
485 CAMIO_MDC_CLK,
486 CAMIO_VFE_CLK,
487 CAMIO_VFE_AXI_CLK,
488
489 CAMIO_VFE_CAMIF_CLK,
490 CAMIO_VFE_PBDG_CLK,
491 CAMIO_CAM_MCLK_CLK,
492 CAMIO_CAMIF_PAD_PBDG_CLK,
493
494 CAMIO_CSI0_VFE_CLK,
495 CAMIO_CSI1_VFE_CLK,
496 CAMIO_VFE_PCLK,
497
498 CAMIO_CSI_SRC_CLK,
499 CAMIO_CSI0_CLK,
500 CAMIO_CSI1_CLK,
501 CAMIO_CSI0_PCLK,
502 CAMIO_CSI1_PCLK,
503
504 CAMIO_CSI1_SRC_CLK,
505 CAMIO_CSI_PIX_CLK,
Sreesudhan Ramakrish Ramkumard6e9cb92011-10-12 17:55:18 -0700506 CAMIO_CSI_PIX1_CLK,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700507 CAMIO_CSI_RDI_CLK,
Sreesudhan Ramakrish Ramkumard6e9cb92011-10-12 17:55:18 -0700508 CAMIO_CSI_RDI1_CLK,
509 CAMIO_CSI_RDI2_CLK,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700510 CAMIO_CSIPHY0_TIMER_CLK,
511 CAMIO_CSIPHY1_TIMER_CLK,
512
513 CAMIO_JPEG_CLK,
514 CAMIO_JPEG_PCLK,
515 CAMIO_VPE_CLK,
516 CAMIO_VPE_PCLK,
517
518 CAMIO_CSI0_PHY_CLK,
519 CAMIO_CSI1_PHY_CLK,
520 CAMIO_CSIPHY_TIMER_SRC_CLK,
Jignesh Mehta95dd6e12011-11-18 17:21:16 -0800521 CAMIO_IMEM_CLK,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700522
523 CAMIO_MAX_CLK
524};
525
526enum msm_camio_clk_src_type {
527 MSM_CAMIO_CLK_SRC_INTERNAL,
528 MSM_CAMIO_CLK_SRC_EXTERNAL,
529 MSM_CAMIO_CLK_SRC_MAX
530};
531
532enum msm_s_test_mode {
533 S_TEST_OFF,
534 S_TEST_1,
535 S_TEST_2,
536 S_TEST_3
537};
538
539enum msm_s_resolution {
540 S_QTR_SIZE,
541 S_FULL_SIZE,
542 S_INVALID_SIZE
543};
544
545enum msm_s_reg_update {
546 /* Sensor egisters that need to be updated during initialization */
547 S_REG_INIT,
548 /* Sensor egisters that needs periodic I2C writes */
549 S_UPDATE_PERIODIC,
550 /* All the sensor Registers will be updated */
551 S_UPDATE_ALL,
552 /* Not valid update */
553 S_UPDATE_INVALID
554};
555
556enum msm_s_setting {
557 S_RES_PREVIEW,
558 S_RES_CAPTURE
559};
560
561enum msm_bus_perf_setting {
562 S_INIT,
563 S_PREVIEW,
564 S_VIDEO,
565 S_CAPTURE,
566 S_ZSL,
567 S_STEREO_VIDEO,
568 S_STEREO_CAPTURE,
569 S_DEFAULT,
Kiran Kumar H N1d1d3072012-07-05 13:40:13 -0700570 S_LIVESHOT,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700571 S_EXIT
572};
573
Kevin Chan85af4552011-10-25 15:07:58 -0700574struct msm_cam_clk_info {
575 const char *clk_name;
576 long clk_rate;
577};
578
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700579int msm_camio_enable(struct platform_device *dev);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700580int msm_camio_vpe_clk_enable(uint32_t);
581int msm_camio_vpe_clk_disable(void);
582
Kevin Chanbb8ef862012-02-14 13:03:04 -0800583void msm_camio_mode_config(enum msm_camera_i2c_mux_mode mode);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700584int msm_camio_clk_enable(enum msm_camio_clk_type clk);
585int msm_camio_clk_disable(enum msm_camio_clk_type clk);
586int msm_camio_clk_config(uint32_t freq);
587void msm_camio_clk_rate_set(int rate);
Shuzhen Wange49436a2011-09-28 16:07:27 -0700588int msm_camio_vfe_clk_rate_set(int rate);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700589void msm_camio_clk_rate_set_2(struct clk *clk, int rate);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700590void msm_camio_clk_axi_rate_set(int rate);
591void msm_disable_io_gpio_clk(struct platform_device *);
592
593void msm_camio_camif_pad_reg_reset(void);
594void msm_camio_camif_pad_reg_reset_2(void);
595
596void msm_camio_vfe_blk_reset(void);
Suresh Vankadara3a9722a2012-05-21 10:09:05 +0530597void msm_camio_vfe_blk_reset_2(void);
598void msm_camio_vfe_blk_reset_3(void);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700599
Nishant Pandit24153d82011-08-27 16:05:13 +0530600int32_t msm_camio_3d_enable(const struct msm_camera_sensor_info *sinfo);
601void msm_camio_3d_disable(void);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700602void msm_camio_clk_sel(enum msm_camio_clk_src_type);
603void msm_camio_disable(struct platform_device *);
604int msm_camio_probe_on(struct platform_device *);
605int msm_camio_probe_off(struct platform_device *);
606int msm_camio_sensor_clk_off(struct platform_device *);
607int msm_camio_sensor_clk_on(struct platform_device *);
608int msm_camio_csi_config(struct msm_camera_csi_params *csi_params);
609int msm_camio_csiphy_config(struct msm_camera_csiphy_params *csiphy_params);
610int msm_camio_csid_config(struct msm_camera_csid_params *csid_params);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700611int add_axi_qos(void);
612int update_axi_qos(uint32_t freq);
613void release_axi_qos(void);
Kiran Kumar H N3ee46812012-04-13 16:57:57 -0700614void msm_camera_io_w(u32 data, void __iomem *addr);
615void msm_camera_io_w_mb(u32 data, void __iomem *addr);
616u32 msm_camera_io_r(void __iomem *addr);
617u32 msm_camera_io_r_mb(void __iomem *addr);
618void msm_camera_io_dump(void __iomem *addr, int size);
619void msm_camera_io_memcpy(void __iomem *dest_addr,
620 void __iomem *src_addr, u32 len);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700621void msm_camio_set_perf_lvl(enum msm_bus_perf_setting);
Kevin Chan09f4e662011-12-16 08:17:02 -0800622void msm_camio_bus_scale_cfg(
623 struct msm_bus_scale_pdata *, enum msm_bus_perf_setting);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700624
Shuzhen Wanga3c1a122011-08-04 15:33:27 -0700625void *msm_isp_sync_alloc(int size, gfp_t gfp);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700626
627void msm_isp_sync_free(void *ptr);
Kevin Chan85af4552011-10-25 15:07:58 -0700628
629int msm_cam_clk_enable(struct device *dev, struct msm_cam_clk_info *clk_info,
630 struct clk **clk_ptr, int num_clk, int enable);
Jeyaprakash Soundrapandian2474e8f2012-01-03 15:59:57 -0800631int msm_cam_core_reset(void);
Kevin Chaneb6b6072012-01-17 11:54:54 -0800632
633int msm_camera_config_vreg(struct device *dev, struct camera_vreg_t *cam_vreg,
634 int num_vreg, struct regulator **reg_ptr, int config);
635int msm_camera_enable_vreg(struct device *dev, struct camera_vreg_t *cam_vreg,
636 int num_vreg, struct regulator **reg_ptr, int enable);
637
638int msm_camera_config_gpio_table
639 (struct msm_camera_sensor_info *sinfo, int gpio_en);
640int msm_camera_request_gpio_table
641 (struct msm_camera_sensor_info *sinfo, int gpio_en);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700642#endif