blob: 3b0b44e26d614715f878acf4c532d61a457055bd [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>
21#include <linux/wakelock.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 Premrajkac6864b82011-07-15 11:43:41 -070027#include <mach/msm_subsystem_map.h>
Ankit Premrajka748a70a2011-11-01 08:22:04 -070028#include <linux/ion.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,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070097};
98
99enum vpe_resp_msg {
100 VPE_MSG_GENERAL,
101 VPE_MSG_OUTPUT_V, /* video (continuous mode ) */
102 VPE_MSG_OUTPUT_ST_L,
103 VPE_MSG_OUTPUT_ST_R,
104};
105
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700106enum msm_stereo_state {
107 STEREO_VIDEO_IDLE,
108 STEREO_VIDEO_ACTIVE,
109 STEREO_SNAP_IDLE,
110 STEREO_SNAP_STARTED,
111 STEREO_SNAP_BUFFER1_PROCESSING,
112 STEREO_SNAP_BUFFER2_PROCESSING,
113 STEREO_RAW_SNAP_IDLE,
114 STEREO_RAW_SNAP_STARTED,
115};
116
117enum msm_ispif_intftype {
118 PIX0,
119 RDI0,
120 PIX1,
121 RDI1,
122 PIX2,
123 RDI2,
124};
125
126enum msm_ispif_vc {
127 VC0,
128 VC1,
129 VC2,
130 VC3,
131};
132
133enum msm_ispif_cid {
134 CID0,
135 CID1,
136 CID2,
137 CID3,
138 CID4,
139 CID5,
140 CID6,
141 CID7,
142 CID8,
143 CID9,
144 CID10,
145 CID11,
146 CID12,
147 CID13,
148 CID14,
149 CID15,
150};
151
152struct msm_ispif_params {
153 uint8_t intftype;
154 uint16_t cid_mask;
155 uint8_t csid;
156};
Shuzhen Wanga3c1a122011-08-04 15:33:27 -0700157
158struct msm_ispif_params_list {
159 uint32_t len;
160 struct msm_ispif_params params[3];
161};
162
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700163struct msm_vpe_phy_info {
164 uint32_t sbuf_phy;
Alekhya,Monikafc81e102011-12-29 15:17:33 +0530165 uint32_t planar0_off;
166 uint32_t planar1_off;
167 uint32_t planar2_off;
168 uint32_t p0_phy;
169 uint32_t p1_phy;
170 uint32_t p2_phy;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700171 uint8_t output_id; /* VFE31_OUTPUT_MODE_PT/S/V */
172 uint32_t frame_id;
173};
174
175struct msm_camera_csid_vc_cfg {
176 uint8_t cid;
177 uint8_t dt;
178 uint8_t decode_format;
179};
180
181struct msm_camera_csid_lut_params {
182 uint8_t num_cid;
183 struct msm_camera_csid_vc_cfg *vc_cfg;
184};
185
186struct msm_camera_csid_params {
187 uint8_t lane_cnt;
188 uint8_t lane_assign;
189 struct msm_camera_csid_lut_params lut_params;
190};
191
192struct msm_camera_csiphy_params {
193 uint8_t lane_cnt;
194 uint8_t settle_cnt;
Hody Hung9ba65cf2012-01-17 17:34:51 -0800195 uint8_t lane_mask;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700196};
197
Kevin Chana980f392011-08-01 20:55:00 -0700198struct msm_camera_csi2_params {
199 struct msm_camera_csid_params csid_params;
200 struct msm_camera_csiphy_params csiphy_params;
201};
202
Kevin Chan3be11612012-03-22 20:05:40 -0700203#ifndef CONFIG_MSM_CAMERA_V4L2
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700204#define VFE31_OUTPUT_MODE_PT (0x1 << 0)
205#define VFE31_OUTPUT_MODE_S (0x1 << 1)
206#define VFE31_OUTPUT_MODE_V (0x1 << 2)
207#define VFE31_OUTPUT_MODE_P (0x1 << 3)
208#define VFE31_OUTPUT_MODE_T (0x1 << 4)
Alekhya,Monikafc81e102011-12-29 15:17:33 +0530209#define VFE31_OUTPUT_MODE_P_ALL_CHNLS (0x1 << 5)
Kevin Chan3be11612012-03-22 20:05:40 -0700210#endif
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700211
212#define CSI_EMBED_DATA 0x12
Hody Hungdf045322012-04-10 16:52:46 -0700213#define CSI_RESERVED_DATA_0 0x13
Rajakumar Govindaram6bc004a2011-12-05 20:58:19 -0800214#define CSI_YUV422_8 0x1E
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700215#define CSI_RAW8 0x2A
216#define CSI_RAW10 0x2B
217#define CSI_RAW12 0x2C
218
219#define CSI_DECODE_6BIT 0
220#define CSI_DECODE_8BIT 1
221#define CSI_DECODE_10BIT 2
Sreesudhan Ramakrish Ramkumar8f11b8b2012-01-04 17:09:05 -0800222#define CSI_DECODE_DPCM_10_8_10 5
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700223
224struct msm_vfe_phy_info {
225 uint32_t sbuf_phy;
Alekhya,Monikafc81e102011-12-29 15:17:33 +0530226 uint32_t planar0_off;
227 uint32_t planar1_off;
228 uint32_t planar2_off;
229 uint32_t p0_phy;
230 uint32_t p1_phy;
231 uint32_t p2_phy;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700232 uint8_t output_id; /* VFE31_OUTPUT_MODE_PT/S/V */
233 uint32_t frame_id;
234};
235
236struct msm_vfe_stats_msg {
Lakshmi Narayana Kalavala4ab97a92011-07-26 15:30:14 -0700237 uint8_t awb_ymin;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700238 uint32_t aec_buff;
239 uint32_t awb_buff;
240 uint32_t af_buff;
241 uint32_t ihist_buff;
242 uint32_t rs_buff;
243 uint32_t cs_buff;
244 uint32_t skin_buff;
245 uint32_t status_bits;
246 uint32_t frame_id;
247};
248
249struct video_crop_t{
250 uint32_t in1_w;
251 uint32_t out1_w;
252 uint32_t in1_h;
253 uint32_t out1_h;
254 uint32_t in2_w;
255 uint32_t out2_w;
256 uint32_t in2_h;
257 uint32_t out2_h;
258 uint8_t update_flag;
259};
260
261struct msm_vpe_buf_info {
Alekhya,Monikafc81e102011-12-29 15:17:33 +0530262 uint32_t p0_phy;
263 uint32_t p1_phy;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700264 struct timespec ts;
265 uint32_t frame_id;
266 struct video_crop_t vpe_crop;
267};
268
269struct msm_vfe_resp {
270 enum vfe_resp_msg type;
271 struct msm_cam_evt_msg evt_msg;
272 struct msm_vfe_phy_info phy;
273 struct msm_vfe_stats_msg stats_msg;
274 struct msm_vpe_buf_info vpe_bf;
275 void *extdata;
276 int32_t extlen;
277};
278
279struct msm_vpe_resp {
280 enum vpe_resp_msg type;
281 struct msm_cam_evt_msg evt_msg;
282 struct msm_vpe_phy_info phy;
283 void *extdata;
284 int32_t extlen;
285};
286
287struct msm_vpe_callback {
288 void (*vpe_resp)(struct msm_vpe_resp *,
289 enum msm_queue, void *syncdata,
290 void *time_stamp, gfp_t gfp);
291 void* (*vpe_alloc)(int, void *syncdata, gfp_t gfp);
292 void (*vpe_free)(void *ptr);
293};
294
295struct msm_vfe_callback {
296 void (*vfe_resp)(struct msm_vfe_resp *,
297 enum msm_queue, void *syncdata,
298 gfp_t gfp);
299 void* (*vfe_alloc)(int, void *syncdata, gfp_t gfp);
300 void (*vfe_free)(void *ptr);
301};
302
303struct msm_camvfe_fn {
304 int (*vfe_init)(struct msm_vfe_callback *,
305 struct platform_device *);
306 int (*vfe_enable)(struct camera_enable_cmd *);
307 int (*vfe_config)(struct msm_vfe_cfg_cmd *, void *);
308 int (*vfe_disable)(struct camera_enable_cmd *,
309 struct platform_device *dev);
310 void (*vfe_release)(struct platform_device *);
311 void (*vfe_stop)(void);
312};
313
314struct msm_camvfe_params {
315 struct msm_vfe_cfg_cmd *vfe_cfg;
316 void *data;
317};
318
Mingcheng Zhu8e9f99e2011-08-26 16:33:32 -0700319struct msm_mctl_pp_params {
320 struct msm_mctl_pp_cmd *cmd;
321 void *data;
322};
323
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700324struct msm_camvpe_fn {
325 int (*vpe_reg)(struct msm_vpe_callback *);
326 int (*vpe_cfg_update) (void *);
Alekhya,Monikafc81e102011-12-29 15:17:33 +0530327 void (*send_frame_to_vpe) (uint32_t planar0_off, uint32_t planar1_off,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700328 struct timespec *ts, int output_id);
329 int (*vpe_config)(struct msm_vpe_cfg_cmd *, void *);
330 void (*vpe_cfg_offset)(int frame_pack, uint32_t pyaddr,
331 uint32_t pcbcraddr, struct timespec *ts, int output_id,
332 struct msm_st_half st_half, int frameid);
333 int *dis;
334};
335
336struct msm_sensor_ctrl {
337 int (*s_init)(const struct msm_camera_sensor_info *);
338 int (*s_release)(void);
339 int (*s_config)(void __user *);
340 enum msm_camera_type s_camera_type;
341 uint32_t s_mount_angle;
342 enum msm_st_frame_packing s_video_packing;
343 enum msm_st_frame_packing s_snap_packing;
344};
Sreesudhan Ramakrish Ramkumara4b5f302011-09-12 16:23:22 -0700345
346struct msm_actuator_ctrl {
Rajakumar Govindaramdf6af9c2011-12-01 21:26:20 -0800347 int (*a_power_up)(void *);
348 int (*a_power_down)(void *);
Sreesudhan Ramakrish Ramkumara4b5f302011-09-12 16:23:22 -0700349 int (*a_create_subdevice)(void *, void *);
350 int (*a_config)(void __user *);
351};
352
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700353struct msm_strobe_flash_ctrl {
354 int (*strobe_flash_init)
355 (struct msm_camera_sensor_strobe_flash_data *);
356 int (*strobe_flash_release)
357 (struct msm_camera_sensor_strobe_flash_data *, int32_t);
358 int (*strobe_flash_charge)(int32_t, int32_t, uint32_t);
359};
360
361/* this structure is used in kernel */
362struct msm_queue_cmd {
363 struct list_head list_config;
364 struct list_head list_control;
365 struct list_head list_frame;
366 struct list_head list_pict;
367 struct list_head list_vpe_frame;
Kevin Chan94b4c832012-03-02 21:27:16 -0800368 struct list_head list_eventdata;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700369 enum msm_queue type;
370 void *command;
371 atomic_t on_heap;
372 struct timespec ts;
373 uint32_t error_code;
374};
375
376struct msm_device_queue {
377 struct list_head list;
378 spinlock_t lock;
379 wait_queue_head_t wait;
380 int max;
381 int len;
382 const char *name;
383};
384
Kevin Chan047053e2012-04-19 11:30:33 -0700385struct msm_mctl_stats_t {
386 struct hlist_head pmem_stats_list;
387 spinlock_t pmem_stats_spinlock;
388};
389
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700390struct msm_sync {
391 /* These two queues are accessed from a process context only
392 * They contain pmem descriptors for the preview frames and the stats
393 * coming from the camera sensor.
394 */
395 struct hlist_head pmem_frames;
396 struct hlist_head pmem_stats;
397
398 /* The message queue is used by the control thread to send commands
399 * to the config thread, and also by the DSP to send messages to the
400 * config thread. Thus it is the only queue that is accessed from
401 * both interrupt and process context.
402 */
403 struct msm_device_queue event_q;
404
405 /* This queue contains preview frames. It is accessed by the DSP (in
406 * in interrupt context, and by the frame thread.
407 */
408 struct msm_device_queue frame_q;
409 int unblock_poll_frame;
410 int unblock_poll_pic_frame;
411
412 /* This queue contains snapshot frames. It is accessed by the DSP (in
413 * interrupt context, and by the control thread.
414 */
415 struct msm_device_queue pict_q;
416 int get_pic_abort;
417 struct msm_device_queue vpe_q;
418
419 struct msm_camera_sensor_info *sdata;
420 struct msm_camvfe_fn vfefn;
421 struct msm_camvpe_fn vpefn;
422 struct msm_sensor_ctrl sctrl;
423 struct msm_strobe_flash_ctrl sfctrl;
Sreesudhan Ramakrish Ramkumara4b5f302011-09-12 16:23:22 -0700424 struct msm_actuator_ctrl actctrl;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700425 struct wake_lock wake_lock;
426 struct platform_device *pdev;
427 int16_t ignore_qcmd_type;
428 uint8_t ignore_qcmd;
429 uint8_t opencnt;
430 void *cropinfo;
431 int croplen;
432 int core_powered_on;
433
434 struct fd_roi_info fdroiinfo;
435
436 atomic_t vpe_enable;
437 uint32_t pp_mask;
438 uint8_t pp_frame_avail;
439 struct msm_queue_cmd *pp_prev;
440 struct msm_queue_cmd *pp_snap;
441 struct msm_queue_cmd *pp_thumb;
442 int video_fd;
443
444 const char *apps_id;
445
446 struct mutex lock;
447 struct list_head list;
448 uint8_t liveshot_enabled;
449 struct msm_cam_v4l2_device *pcam_sync;
450
451 uint8_t stereocam_enabled;
452 struct msm_queue_cmd *pp_stereocam;
453 struct msm_queue_cmd *pp_stereocam2;
454 struct msm_queue_cmd *pp_stereosnap;
455 enum msm_stereo_state stereo_state;
456 int stcam_quality_ind;
457 uint32_t stcam_conv_value;
458
459 spinlock_t pmem_frame_spinlock;
460 spinlock_t pmem_stats_spinlock;
461 spinlock_t abort_pict_lock;
462 int snap_count;
463 int thumb_count;
464};
465
466#define MSM_APPS_ID_V4L2 "msm_v4l2"
467#define MSM_APPS_ID_PROP "msm_qct"
468
469struct msm_cam_device {
470 struct msm_sync *sync; /* most-frequently accessed */
471 struct device *device;
472 struct cdev cdev;
473 /* opened is meaningful only for the config and frame nodes,
474 * which may be opened only once.
475 */
476 atomic_t opened;
477};
478
479struct msm_control_device {
480 struct msm_cam_device *pmsm;
481
482 /* Used for MSM_CAM_IOCTL_CTRL_CMD_DONE responses */
483 uint8_t ctrl_data[max_control_command_size];
484 struct msm_ctrl_cmd ctrl;
485 struct msm_queue_cmd qcmd;
486
487 /* This queue used by the config thread to send responses back to the
488 * control thread. It is accessed only from a process context.
489 */
490 struct msm_device_queue ctrl_q;
491};
492
493struct register_address_value_pair {
494 uint16_t register_address;
495 uint16_t register_value;
496};
497
498struct msm_pmem_region {
499 struct hlist_node list;
500 unsigned long paddr;
501 unsigned long len;
502 struct file *file;
503 struct msm_pmem_info info;
Ankit Premrajka748a70a2011-11-01 08:22:04 -0700504 struct ion_handle *handle;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700505};
506
507struct axidata {
508 uint32_t bufnum1;
509 uint32_t bufnum2;
510 uint32_t bufnum3;
511 struct msm_pmem_region *region;
512};
513
514#ifdef CONFIG_MSM_CAMERA_FLASH
515int msm_camera_flash_set_led_state(
516 struct msm_camera_sensor_flash_data *fdata,
517 unsigned led_state);
518int msm_strobe_flash_init(struct msm_sync *sync, uint32_t sftype);
519int msm_flash_ctrl(struct msm_camera_sensor_info *sdata,
520 struct flash_ctrl_data *flash_info);
521#else
522static inline int msm_camera_flash_set_led_state(
523 struct msm_camera_sensor_flash_data *fdata,
524 unsigned led_state)
525{
526 return -ENOTSUPP;
527}
528static inline int msm_strobe_flash_init(
529 struct msm_sync *sync, uint32_t sftype)
530{
531 return -ENOTSUPP;
532}
533static inline int msm_flash_ctrl(
534 struct msm_camera_sensor_info *sdata,
535 struct flash_ctrl_data *flash_info)
536{
537 return -ENOTSUPP;
538}
539#endif
540
541
542
543void msm_camvfe_init(void);
544int msm_camvfe_check(void *);
545void msm_camvfe_fn_init(struct msm_camvfe_fn *, void *);
546void msm_camvpe_fn_init(struct msm_camvpe_fn *, void *);
547int msm_camera_drv_start(struct platform_device *dev,
548 int (*sensor_probe)(const struct msm_camera_sensor_info *,
549 struct msm_sensor_ctrl *));
550
551enum msm_camio_clk_type {
552 CAMIO_VFE_MDC_CLK,
553 CAMIO_MDC_CLK,
554 CAMIO_VFE_CLK,
555 CAMIO_VFE_AXI_CLK,
556
557 CAMIO_VFE_CAMIF_CLK,
558 CAMIO_VFE_PBDG_CLK,
559 CAMIO_CAM_MCLK_CLK,
560 CAMIO_CAMIF_PAD_PBDG_CLK,
561
562 CAMIO_CSI0_VFE_CLK,
563 CAMIO_CSI1_VFE_CLK,
564 CAMIO_VFE_PCLK,
565
566 CAMIO_CSI_SRC_CLK,
567 CAMIO_CSI0_CLK,
568 CAMIO_CSI1_CLK,
569 CAMIO_CSI0_PCLK,
570 CAMIO_CSI1_PCLK,
571
572 CAMIO_CSI1_SRC_CLK,
573 CAMIO_CSI_PIX_CLK,
Sreesudhan Ramakrish Ramkumard6e9cb92011-10-12 17:55:18 -0700574 CAMIO_CSI_PIX1_CLK,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700575 CAMIO_CSI_RDI_CLK,
Sreesudhan Ramakrish Ramkumard6e9cb92011-10-12 17:55:18 -0700576 CAMIO_CSI_RDI1_CLK,
577 CAMIO_CSI_RDI2_CLK,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700578 CAMIO_CSIPHY0_TIMER_CLK,
579 CAMIO_CSIPHY1_TIMER_CLK,
580
581 CAMIO_JPEG_CLK,
582 CAMIO_JPEG_PCLK,
583 CAMIO_VPE_CLK,
584 CAMIO_VPE_PCLK,
585
586 CAMIO_CSI0_PHY_CLK,
587 CAMIO_CSI1_PHY_CLK,
588 CAMIO_CSIPHY_TIMER_SRC_CLK,
Jignesh Mehta95dd6e12011-11-18 17:21:16 -0800589 CAMIO_IMEM_CLK,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700590
591 CAMIO_MAX_CLK
592};
593
594enum msm_camio_clk_src_type {
595 MSM_CAMIO_CLK_SRC_INTERNAL,
596 MSM_CAMIO_CLK_SRC_EXTERNAL,
597 MSM_CAMIO_CLK_SRC_MAX
598};
599
600enum msm_s_test_mode {
601 S_TEST_OFF,
602 S_TEST_1,
603 S_TEST_2,
604 S_TEST_3
605};
606
607enum msm_s_resolution {
608 S_QTR_SIZE,
609 S_FULL_SIZE,
610 S_INVALID_SIZE
611};
612
613enum msm_s_reg_update {
614 /* Sensor egisters that need to be updated during initialization */
615 S_REG_INIT,
616 /* Sensor egisters that needs periodic I2C writes */
617 S_UPDATE_PERIODIC,
618 /* All the sensor Registers will be updated */
619 S_UPDATE_ALL,
620 /* Not valid update */
621 S_UPDATE_INVALID
622};
623
624enum msm_s_setting {
625 S_RES_PREVIEW,
626 S_RES_CAPTURE
627};
628
629enum msm_bus_perf_setting {
630 S_INIT,
631 S_PREVIEW,
632 S_VIDEO,
633 S_CAPTURE,
634 S_ZSL,
635 S_STEREO_VIDEO,
636 S_STEREO_CAPTURE,
637 S_DEFAULT,
638 S_EXIT
639};
640
Kevin Chan85af4552011-10-25 15:07:58 -0700641struct msm_cam_clk_info {
642 const char *clk_name;
643 long clk_rate;
644};
645
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700646int msm_camio_enable(struct platform_device *dev);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700647int msm_camio_vpe_clk_enable(uint32_t);
648int msm_camio_vpe_clk_disable(void);
649
Kevin Chanbb8ef862012-02-14 13:03:04 -0800650void msm_camio_mode_config(enum msm_camera_i2c_mux_mode mode);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700651int msm_camio_clk_enable(enum msm_camio_clk_type clk);
652int msm_camio_clk_disable(enum msm_camio_clk_type clk);
653int msm_camio_clk_config(uint32_t freq);
654void msm_camio_clk_rate_set(int rate);
Shuzhen Wange49436a2011-09-28 16:07:27 -0700655int msm_camio_vfe_clk_rate_set(int rate);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700656void msm_camio_clk_rate_set_2(struct clk *clk, int rate);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700657void msm_camio_clk_axi_rate_set(int rate);
658void msm_disable_io_gpio_clk(struct platform_device *);
659
660void msm_camio_camif_pad_reg_reset(void);
661void msm_camio_camif_pad_reg_reset_2(void);
662
663void msm_camio_vfe_blk_reset(void);
Suresh Vankadara6050cef52012-04-16 21:44:59 +0530664void msm_camio_vfe_blk_reset_2(int flag);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700665
Nishant Pandit24153d82011-08-27 16:05:13 +0530666int32_t msm_camio_3d_enable(const struct msm_camera_sensor_info *sinfo);
667void msm_camio_3d_disable(void);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700668void msm_camio_clk_sel(enum msm_camio_clk_src_type);
669void msm_camio_disable(struct platform_device *);
670int msm_camio_probe_on(struct platform_device *);
671int msm_camio_probe_off(struct platform_device *);
672int msm_camio_sensor_clk_off(struct platform_device *);
673int msm_camio_sensor_clk_on(struct platform_device *);
674int msm_camio_csi_config(struct msm_camera_csi_params *csi_params);
675int msm_camio_csiphy_config(struct msm_camera_csiphy_params *csiphy_params);
676int msm_camio_csid_config(struct msm_camera_csid_params *csid_params);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700677int add_axi_qos(void);
678int update_axi_qos(uint32_t freq);
679void release_axi_qos(void);
Kiran Kumar H N3ee46812012-04-13 16:57:57 -0700680void msm_camera_io_w(u32 data, void __iomem *addr);
681void msm_camera_io_w_mb(u32 data, void __iomem *addr);
682u32 msm_camera_io_r(void __iomem *addr);
683u32 msm_camera_io_r_mb(void __iomem *addr);
684void msm_camera_io_dump(void __iomem *addr, int size);
685void msm_camera_io_memcpy(void __iomem *dest_addr,
686 void __iomem *src_addr, u32 len);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700687void msm_camio_set_perf_lvl(enum msm_bus_perf_setting);
Kevin Chan09f4e662011-12-16 08:17:02 -0800688void msm_camio_bus_scale_cfg(
689 struct msm_bus_scale_pdata *, enum msm_bus_perf_setting);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700690
Shuzhen Wanga3c1a122011-08-04 15:33:27 -0700691void *msm_isp_sync_alloc(int size, gfp_t gfp);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700692
693void msm_isp_sync_free(void *ptr);
Kevin Chan85af4552011-10-25 15:07:58 -0700694
695int msm_cam_clk_enable(struct device *dev, struct msm_cam_clk_info *clk_info,
696 struct clk **clk_ptr, int num_clk, int enable);
Jeyaprakash Soundrapandian2474e8f2012-01-03 15:59:57 -0800697int msm_cam_core_reset(void);
Kevin Chaneb6b6072012-01-17 11:54:54 -0800698
699int msm_camera_config_vreg(struct device *dev, struct camera_vreg_t *cam_vreg,
700 int num_vreg, struct regulator **reg_ptr, int config);
701int msm_camera_enable_vreg(struct device *dev, struct camera_vreg_t *cam_vreg,
702 int num_vreg, struct regulator **reg_ptr, int enable);
703
704int msm_camera_config_gpio_table
705 (struct msm_camera_sensor_info *sinfo, int gpio_en);
706int msm_camera_request_gpio_table
707 (struct msm_camera_sensor_info *sinfo, int gpio_en);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700708#endif