blob: 3dfa659cd58b81ec51f84940e2d588b9645822c1 [file] [log] [blame]
Sreesudhan Ramakrish Ramkumar7f723dc2012-10-12 22:58:13 -07001/* Copyright (c) 2009-2012, The Linux Foundation. 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>
Mitchel Humpherys252fa6a2012-09-06 10:28:47 -070027#include <linux/msm_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,
Kevin Chan6267cb62012-06-18 23:34:24 -070088 VFE_MSG_START,
89 VFE_MSG_START_RECORDING, /* 20 */
90 VFE_MSG_CAPTURE,
91 VFE_MSG_JPEG_CAPTURE,
Kiran Kumar H N0fb9dcf2011-07-17 12:31:53 -070092 VFE_MSG_OUTPUT_IRQ,
Kevin Chan6267cb62012-06-18 23:34:24 -070093 VFE_MSG_PREVIEW,
Kiran Kumar H Ndd128472011-12-01 09:35:34 -080094 VFE_MSG_OUTPUT_PRIMARY,
95 VFE_MSG_OUTPUT_SECONDARY,
Nishant Pandit28feb3d2012-04-26 23:56:22 +053096 VFE_MSG_OUTPUT_TERTIARY1,
Nishant Pandit5dd54422012-06-26 22:52:44 +053097 VFE_MSG_OUTPUT_TERTIARY2,
Aditya Jonnalagadda7ea96502012-09-12 12:45:18 +053098 VFE_MSG_V2X_LIVESHOT_PRIMARY,
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
Kevin Chan3be11612012-03-22 20:05:40 -0700131#ifndef CONFIG_MSM_CAMERA_V4L2
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700132#define VFE31_OUTPUT_MODE_PT (0x1 << 0)
133#define VFE31_OUTPUT_MODE_S (0x1 << 1)
134#define VFE31_OUTPUT_MODE_V (0x1 << 2)
135#define VFE31_OUTPUT_MODE_P (0x1 << 3)
136#define VFE31_OUTPUT_MODE_T (0x1 << 4)
Alekhya,Monikafc81e102011-12-29 15:17:33 +0530137#define VFE31_OUTPUT_MODE_P_ALL_CHNLS (0x1 << 5)
Kevin Chan3be11612012-03-22 20:05:40 -0700138#endif
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700139
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700140struct msm_vfe_phy_info {
141 uint32_t sbuf_phy;
Alekhya,Monikafc81e102011-12-29 15:17:33 +0530142 uint32_t planar0_off;
143 uint32_t planar1_off;
144 uint32_t planar2_off;
145 uint32_t p0_phy;
146 uint32_t p1_phy;
147 uint32_t p2_phy;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700148 uint8_t output_id; /* VFE31_OUTPUT_MODE_PT/S/V */
149 uint32_t frame_id;
150};
151
152struct msm_vfe_stats_msg {
Lakshmi Narayana Kalavala4ab97a92011-07-26 15:30:14 -0700153 uint8_t awb_ymin;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700154 uint32_t aec_buff;
155 uint32_t awb_buff;
156 uint32_t af_buff;
157 uint32_t ihist_buff;
158 uint32_t rs_buff;
159 uint32_t cs_buff;
160 uint32_t skin_buff;
161 uint32_t status_bits;
162 uint32_t frame_id;
163};
164
165struct video_crop_t{
166 uint32_t in1_w;
167 uint32_t out1_w;
168 uint32_t in1_h;
169 uint32_t out1_h;
170 uint32_t in2_w;
171 uint32_t out2_w;
172 uint32_t in2_h;
173 uint32_t out2_h;
174 uint8_t update_flag;
175};
176
177struct msm_vpe_buf_info {
Alekhya,Monikafc81e102011-12-29 15:17:33 +0530178 uint32_t p0_phy;
179 uint32_t p1_phy;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700180 struct timespec ts;
181 uint32_t frame_id;
182 struct video_crop_t vpe_crop;
183};
184
185struct msm_vfe_resp {
186 enum vfe_resp_msg type;
187 struct msm_cam_evt_msg evt_msg;
188 struct msm_vfe_phy_info phy;
189 struct msm_vfe_stats_msg stats_msg;
190 struct msm_vpe_buf_info vpe_bf;
191 void *extdata;
192 int32_t extlen;
193};
194
195struct msm_vpe_resp {
196 enum vpe_resp_msg type;
197 struct msm_cam_evt_msg evt_msg;
198 struct msm_vpe_phy_info phy;
199 void *extdata;
200 int32_t extlen;
201};
202
203struct msm_vpe_callback {
204 void (*vpe_resp)(struct msm_vpe_resp *,
205 enum msm_queue, void *syncdata,
206 void *time_stamp, gfp_t gfp);
207 void* (*vpe_alloc)(int, void *syncdata, gfp_t gfp);
208 void (*vpe_free)(void *ptr);
209};
210
211struct msm_vfe_callback {
212 void (*vfe_resp)(struct msm_vfe_resp *,
213 enum msm_queue, void *syncdata,
214 gfp_t gfp);
215 void* (*vfe_alloc)(int, void *syncdata, gfp_t gfp);
216 void (*vfe_free)(void *ptr);
217};
218
219struct msm_camvfe_fn {
220 int (*vfe_init)(struct msm_vfe_callback *,
221 struct platform_device *);
222 int (*vfe_enable)(struct camera_enable_cmd *);
223 int (*vfe_config)(struct msm_vfe_cfg_cmd *, void *);
224 int (*vfe_disable)(struct camera_enable_cmd *,
225 struct platform_device *dev);
226 void (*vfe_release)(struct platform_device *);
227 void (*vfe_stop)(void);
228};
229
230struct msm_camvfe_params {
231 struct msm_vfe_cfg_cmd *vfe_cfg;
232 void *data;
233};
234
Mingcheng Zhu8e9f99e2011-08-26 16:33:32 -0700235struct msm_mctl_pp_params {
236 struct msm_mctl_pp_cmd *cmd;
237 void *data;
238};
239
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700240struct msm_camvpe_fn {
241 int (*vpe_reg)(struct msm_vpe_callback *);
242 int (*vpe_cfg_update) (void *);
Alekhya,Monikafc81e102011-12-29 15:17:33 +0530243 void (*send_frame_to_vpe) (uint32_t planar0_off, uint32_t planar1_off,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700244 struct timespec *ts, int output_id);
245 int (*vpe_config)(struct msm_vpe_cfg_cmd *, void *);
246 void (*vpe_cfg_offset)(int frame_pack, uint32_t pyaddr,
247 uint32_t pcbcraddr, struct timespec *ts, int output_id,
248 struct msm_st_half st_half, int frameid);
249 int *dis;
250};
251
252struct msm_sensor_ctrl {
253 int (*s_init)(const struct msm_camera_sensor_info *);
254 int (*s_release)(void);
255 int (*s_config)(void __user *);
256 enum msm_camera_type s_camera_type;
257 uint32_t s_mount_angle;
258 enum msm_st_frame_packing s_video_packing;
259 enum msm_st_frame_packing s_snap_packing;
260};
Sreesudhan Ramakrish Ramkumara4b5f302011-09-12 16:23:22 -0700261
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700262struct msm_strobe_flash_ctrl {
263 int (*strobe_flash_init)
264 (struct msm_camera_sensor_strobe_flash_data *);
265 int (*strobe_flash_release)
266 (struct msm_camera_sensor_strobe_flash_data *, int32_t);
267 int (*strobe_flash_charge)(int32_t, int32_t, uint32_t);
268};
269
Sreesudhan Ramakrish Ramkumarc842b612012-05-21 17:23:24 -0700270enum cci_i2c_master_t {
271 MASTER_0,
272 MASTER_1,
273};
274
275enum cci_i2c_queue_t {
276 QUEUE_0,
277 QUEUE_1,
278};
279
280struct msm_camera_cci_client {
281 struct v4l2_subdev *cci_subdev;
282 uint32_t freq;
283 enum cci_i2c_master_t cci_i2c_master;
284 uint16_t sid;
285 uint16_t cid;
286 uint32_t timeout;
287 uint16_t retries;
288 uint16_t id_map;
289};
290
291enum msm_cci_cmd_type {
292 MSM_CCI_INIT,
293 MSM_CCI_RELEASE,
294 MSM_CCI_SET_SID,
295 MSM_CCI_SET_FREQ,
296 MSM_CCI_SET_SYNC_CID,
297 MSM_CCI_I2C_READ,
298 MSM_CCI_I2C_WRITE,
299 MSM_CCI_GPIO_WRITE,
300};
301
302struct msm_camera_cci_wait_sync_cfg {
303 uint16_t line;
304 uint16_t delay;
305};
306
307struct msm_camera_cci_gpio_cfg {
308 uint16_t gpio_queue;
309 uint16_t i2c_queue;
310};
311
Kevin Chanbdcf7ef2012-08-24 08:33:33 -0700312enum msm_camera_i2c_cmd_type {
313 MSM_CAMERA_I2C_CMD_WRITE,
314 MSM_CAMERA_I2C_CMD_POLL,
315};
316
317struct msm_camera_i2c_reg_conf {
318 uint16_t reg_addr;
319 uint16_t reg_data;
320 enum msm_camera_i2c_data_type dt;
321 enum msm_camera_i2c_cmd_type cmd_type;
322 int16_t mask;
323};
324
Sreesudhan Ramakrish Ramkumarc842b612012-05-21 17:23:24 -0700325struct msm_camera_cci_i2c_write_cfg {
326 struct msm_camera_i2c_reg_conf *reg_conf_tbl;
327 enum msm_camera_i2c_reg_addr_type addr_type;
328 enum msm_camera_i2c_data_type data_type;
329 uint16_t size;
330};
331
332struct msm_camera_cci_i2c_read_cfg {
333 uint16_t addr;
334 enum msm_camera_i2c_reg_addr_type addr_type;
335 uint8_t *data;
336 uint16_t num_byte;
337};
338
339struct msm_camera_cci_i2c_queue_info {
340 uint32_t max_queue_size;
341 uint32_t report_id;
342 uint32_t irq_en;
343 uint32_t capture_rep_data;
344};
345
346struct msm_camera_cci_ctrl {
347 int32_t status;
348 struct msm_camera_cci_client *cci_info;
349 enum msm_cci_cmd_type cmd;
350 union {
351 struct msm_camera_cci_i2c_write_cfg cci_i2c_write_cfg;
352 struct msm_camera_cci_i2c_read_cfg cci_i2c_read_cfg;
353 struct msm_camera_cci_wait_sync_cfg cci_wait_sync_cfg;
354 struct msm_camera_cci_gpio_cfg gpio_cfg;
355 } cfg;
356};
357
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700358/* this structure is used in kernel */
359struct msm_queue_cmd {
360 struct list_head list_config;
361 struct list_head list_control;
362 struct list_head list_frame;
363 struct list_head list_pict;
364 struct list_head list_vpe_frame;
Kevin Chan94b4c832012-03-02 21:27:16 -0800365 struct list_head list_eventdata;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700366 enum msm_queue type;
367 void *command;
368 atomic_t on_heap;
369 struct timespec ts;
370 uint32_t error_code;
Ankit Premrajka8c9bf5d2012-08-07 15:45:31 -0700371 uint32_t trans_code;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700372};
373
374struct msm_device_queue {
375 struct list_head list;
376 spinlock_t lock;
377 wait_queue_head_t wait;
378 int max;
379 int len;
380 const char *name;
381};
382
Kevin Chan047053e2012-04-19 11:30:33 -0700383struct msm_mctl_stats_t {
384 struct hlist_head pmem_stats_list;
385 spinlock_t pmem_stats_spinlock;
386};
387
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700388struct msm_sync {
389 /* These two queues are accessed from a process context only
390 * They contain pmem descriptors for the preview frames and the stats
391 * coming from the camera sensor.
392 */
393 struct hlist_head pmem_frames;
394 struct hlist_head pmem_stats;
395
396 /* The message queue is used by the control thread to send commands
397 * to the config thread, and also by the DSP to send messages to the
398 * config thread. Thus it is the only queue that is accessed from
399 * both interrupt and process context.
400 */
401 struct msm_device_queue event_q;
402
403 /* This queue contains preview frames. It is accessed by the DSP (in
404 * in interrupt context, and by the frame thread.
405 */
406 struct msm_device_queue frame_q;
407 int unblock_poll_frame;
408 int unblock_poll_pic_frame;
409
410 /* This queue contains snapshot frames. It is accessed by the DSP (in
411 * interrupt context, and by the control thread.
412 */
413 struct msm_device_queue pict_q;
414 int get_pic_abort;
415 struct msm_device_queue vpe_q;
416
417 struct msm_camera_sensor_info *sdata;
418 struct msm_camvfe_fn vfefn;
419 struct msm_camvpe_fn vpefn;
420 struct msm_sensor_ctrl sctrl;
421 struct msm_strobe_flash_ctrl sfctrl;
Stephen Boyd2fcabf92012-05-30 10:41:11 -0700422 struct pm_qos_request idle_pm_qos;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700423 struct platform_device *pdev;
424 int16_t ignore_qcmd_type;
425 uint8_t ignore_qcmd;
426 uint8_t opencnt;
427 void *cropinfo;
428 int croplen;
429 int core_powered_on;
430
431 struct fd_roi_info fdroiinfo;
432
433 atomic_t vpe_enable;
434 uint32_t pp_mask;
435 uint8_t pp_frame_avail;
436 struct msm_queue_cmd *pp_prev;
437 struct msm_queue_cmd *pp_snap;
438 struct msm_queue_cmd *pp_thumb;
439 int video_fd;
440
441 const char *apps_id;
442
443 struct mutex lock;
444 struct list_head list;
445 uint8_t liveshot_enabled;
446 struct msm_cam_v4l2_device *pcam_sync;
447
448 uint8_t stereocam_enabled;
449 struct msm_queue_cmd *pp_stereocam;
450 struct msm_queue_cmd *pp_stereocam2;
451 struct msm_queue_cmd *pp_stereosnap;
452 enum msm_stereo_state stereo_state;
453 int stcam_quality_ind;
454 uint32_t stcam_conv_value;
455
456 spinlock_t pmem_frame_spinlock;
457 spinlock_t pmem_stats_spinlock;
458 spinlock_t abort_pict_lock;
459 int snap_count;
460 int thumb_count;
461};
462
463#define MSM_APPS_ID_V4L2 "msm_v4l2"
464#define MSM_APPS_ID_PROP "msm_qct"
465
466struct msm_cam_device {
467 struct msm_sync *sync; /* most-frequently accessed */
468 struct device *device;
469 struct cdev cdev;
470 /* opened is meaningful only for the config and frame nodes,
471 * which may be opened only once.
472 */
473 atomic_t opened;
474};
475
476struct msm_control_device {
477 struct msm_cam_device *pmsm;
478
479 /* Used for MSM_CAM_IOCTL_CTRL_CMD_DONE responses */
480 uint8_t ctrl_data[max_control_command_size];
481 struct msm_ctrl_cmd ctrl;
482 struct msm_queue_cmd qcmd;
483
484 /* This queue used by the config thread to send responses back to the
485 * control thread. It is accessed only from a process context.
486 */
487 struct msm_device_queue ctrl_q;
488};
489
490struct register_address_value_pair {
491 uint16_t register_address;
492 uint16_t register_value;
493};
494
495struct msm_pmem_region {
496 struct hlist_node list;
497 unsigned long paddr;
498 unsigned long len;
499 struct file *file;
500 struct msm_pmem_info info;
Ankit Premrajka748a70a2011-11-01 08:22:04 -0700501 struct ion_handle *handle;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700502};
503
504struct axidata {
505 uint32_t bufnum1;
506 uint32_t bufnum2;
507 uint32_t bufnum3;
508 struct msm_pmem_region *region;
509};
510
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700511void msm_camvfe_init(void);
512int msm_camvfe_check(void *);
513void msm_camvfe_fn_init(struct msm_camvfe_fn *, void *);
514void msm_camvpe_fn_init(struct msm_camvpe_fn *, void *);
515int msm_camera_drv_start(struct platform_device *dev,
516 int (*sensor_probe)(const struct msm_camera_sensor_info *,
517 struct msm_sensor_ctrl *));
518
519enum msm_camio_clk_type {
520 CAMIO_VFE_MDC_CLK,
521 CAMIO_MDC_CLK,
522 CAMIO_VFE_CLK,
523 CAMIO_VFE_AXI_CLK,
524
525 CAMIO_VFE_CAMIF_CLK,
526 CAMIO_VFE_PBDG_CLK,
527 CAMIO_CAM_MCLK_CLK,
528 CAMIO_CAMIF_PAD_PBDG_CLK,
529
530 CAMIO_CSI0_VFE_CLK,
531 CAMIO_CSI1_VFE_CLK,
532 CAMIO_VFE_PCLK,
533
534 CAMIO_CSI_SRC_CLK,
535 CAMIO_CSI0_CLK,
536 CAMIO_CSI1_CLK,
537 CAMIO_CSI0_PCLK,
538 CAMIO_CSI1_PCLK,
539
540 CAMIO_CSI1_SRC_CLK,
541 CAMIO_CSI_PIX_CLK,
Sreesudhan Ramakrish Ramkumard6e9cb92011-10-12 17:55:18 -0700542 CAMIO_CSI_PIX1_CLK,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700543 CAMIO_CSI_RDI_CLK,
Sreesudhan Ramakrish Ramkumard6e9cb92011-10-12 17:55:18 -0700544 CAMIO_CSI_RDI1_CLK,
545 CAMIO_CSI_RDI2_CLK,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700546 CAMIO_CSIPHY0_TIMER_CLK,
547 CAMIO_CSIPHY1_TIMER_CLK,
548
549 CAMIO_JPEG_CLK,
550 CAMIO_JPEG_PCLK,
551 CAMIO_VPE_CLK,
552 CAMIO_VPE_PCLK,
553
554 CAMIO_CSI0_PHY_CLK,
555 CAMIO_CSI1_PHY_CLK,
556 CAMIO_CSIPHY_TIMER_SRC_CLK,
Jignesh Mehta95dd6e12011-11-18 17:21:16 -0800557 CAMIO_IMEM_CLK,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700558
559 CAMIO_MAX_CLK
560};
561
562enum msm_camio_clk_src_type {
563 MSM_CAMIO_CLK_SRC_INTERNAL,
564 MSM_CAMIO_CLK_SRC_EXTERNAL,
565 MSM_CAMIO_CLK_SRC_MAX
566};
567
568enum msm_s_test_mode {
569 S_TEST_OFF,
570 S_TEST_1,
571 S_TEST_2,
572 S_TEST_3
573};
574
575enum msm_s_resolution {
576 S_QTR_SIZE,
577 S_FULL_SIZE,
578 S_INVALID_SIZE
579};
580
581enum msm_s_reg_update {
582 /* Sensor egisters that need to be updated during initialization */
583 S_REG_INIT,
584 /* Sensor egisters that needs periodic I2C writes */
585 S_UPDATE_PERIODIC,
586 /* All the sensor Registers will be updated */
587 S_UPDATE_ALL,
588 /* Not valid update */
589 S_UPDATE_INVALID
590};
591
592enum msm_s_setting {
593 S_RES_PREVIEW,
594 S_RES_CAPTURE
595};
596
597enum msm_bus_perf_setting {
598 S_INIT,
599 S_PREVIEW,
600 S_VIDEO,
601 S_CAPTURE,
602 S_ZSL,
603 S_STEREO_VIDEO,
604 S_STEREO_CAPTURE,
605 S_DEFAULT,
Kiran Kumar H N1d1d3072012-07-05 13:40:13 -0700606 S_LIVESHOT,
Nishant Pandit221a9482012-09-03 05:36:04 +0530607 S_DUAL,
Kiran Kumar H N22370432012-11-05 20:08:10 -0800608 S_ADV_VIDEO,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700609 S_EXIT
610};
611
612int msm_camio_enable(struct platform_device *dev);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700613int msm_camio_vpe_clk_enable(uint32_t);
614int msm_camio_vpe_clk_disable(void);
615
Kevin Chanbb8ef862012-02-14 13:03:04 -0800616void msm_camio_mode_config(enum msm_camera_i2c_mux_mode mode);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700617int msm_camio_clk_enable(enum msm_camio_clk_type clk);
618int msm_camio_clk_disable(enum msm_camio_clk_type clk);
619int msm_camio_clk_config(uint32_t freq);
620void msm_camio_clk_rate_set(int rate);
Shuzhen Wange49436a2011-09-28 16:07:27 -0700621int msm_camio_vfe_clk_rate_set(int rate);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700622void msm_camio_clk_rate_set_2(struct clk *clk, int rate);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700623void msm_camio_clk_axi_rate_set(int rate);
624void msm_disable_io_gpio_clk(struct platform_device *);
625
626void msm_camio_camif_pad_reg_reset(void);
627void msm_camio_camif_pad_reg_reset_2(void);
628
629void msm_camio_vfe_blk_reset(void);
Suresh Vankadara3a9722a2012-05-21 10:09:05 +0530630void msm_camio_vfe_blk_reset_2(void);
631void msm_camio_vfe_blk_reset_3(void);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700632
Nishant Pandit24153d82011-08-27 16:05:13 +0530633int32_t msm_camio_3d_enable(const struct msm_camera_sensor_info *sinfo);
634void msm_camio_3d_disable(void);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700635void msm_camio_clk_sel(enum msm_camio_clk_src_type);
636void msm_camio_disable(struct platform_device *);
637int msm_camio_probe_on(struct platform_device *);
638int msm_camio_probe_off(struct platform_device *);
639int msm_camio_sensor_clk_off(struct platform_device *);
640int msm_camio_sensor_clk_on(struct platform_device *);
641int msm_camio_csi_config(struct msm_camera_csi_params *csi_params);
642int msm_camio_csiphy_config(struct msm_camera_csiphy_params *csiphy_params);
643int msm_camio_csid_config(struct msm_camera_csid_params *csid_params);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700644int add_axi_qos(void);
645int update_axi_qos(uint32_t freq);
646void release_axi_qos(void);
Kiran Kumar H N3ee46812012-04-13 16:57:57 -0700647void msm_camera_io_w(u32 data, void __iomem *addr);
648void msm_camera_io_w_mb(u32 data, void __iomem *addr);
649u32 msm_camera_io_r(void __iomem *addr);
650u32 msm_camera_io_r_mb(void __iomem *addr);
651void msm_camera_io_dump(void __iomem *addr, int size);
652void msm_camera_io_memcpy(void __iomem *dest_addr,
653 void __iomem *src_addr, u32 len);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700654void msm_camio_set_perf_lvl(enum msm_bus_perf_setting);
Kevin Chan09f4e662011-12-16 08:17:02 -0800655void msm_camio_bus_scale_cfg(
656 struct msm_bus_scale_pdata *, enum msm_bus_perf_setting);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700657
Shuzhen Wanga3c1a122011-08-04 15:33:27 -0700658void *msm_isp_sync_alloc(int size, gfp_t gfp);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700659
660void msm_isp_sync_free(void *ptr);
Kevin Chan85af4552011-10-25 15:07:58 -0700661
662int msm_cam_clk_enable(struct device *dev, struct msm_cam_clk_info *clk_info,
663 struct clk **clk_ptr, int num_clk, int enable);
Jeyaprakash Soundrapandian2474e8f2012-01-03 15:59:57 -0800664int msm_cam_core_reset(void);
Kevin Chaneb6b6072012-01-17 11:54:54 -0800665
666int msm_camera_config_vreg(struct device *dev, struct camera_vreg_t *cam_vreg,
Sreesudhan Ramakrish Ramkumar923fbad2012-07-26 17:31:42 -0700667 int num_vreg, enum msm_camera_vreg_name_t *vreg_seq,
668 int num_vreg_seq, struct regulator **reg_ptr, int config);
Kevin Chaneb6b6072012-01-17 11:54:54 -0800669int msm_camera_enable_vreg(struct device *dev, struct camera_vreg_t *cam_vreg,
Sreesudhan Ramakrish Ramkumar923fbad2012-07-26 17:31:42 -0700670 int num_vreg, enum msm_camera_vreg_name_t *vreg_seq,
671 int num_vreg_seq, struct regulator **reg_ptr, int enable);
Kevin Chaneb6b6072012-01-17 11:54:54 -0800672
673int msm_camera_config_gpio_table
674 (struct msm_camera_sensor_info *sinfo, int gpio_en);
675int msm_camera_request_gpio_table
676 (struct msm_camera_sensor_info *sinfo, int gpio_en);
Kevin Chan7303f592012-08-23 23:36:53 -0700677void msm_camera_bus_scale_cfg(uint32_t bus_perf_client,
678 enum msm_bus_perf_setting perf_setting);
Sreesudhan Ramakrish Ramkumar7f723dc2012-10-12 22:58:13 -0700679
680int msm_camera_init_gpio_table(struct gpio *gpio_tbl, uint8_t gpio_tbl_size,
681 int gpio_en);
682
683int msm_camera_set_gpio_table(struct msm_gpio_set_tbl *gpio_tbl,
684 uint8_t gpio_tbl_size, int gpio_en);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700685#endif