blob: 60ccded23e7928965053b64e77b0f53c6f43fc15 [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,
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,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070098};
99
100enum vpe_resp_msg {
101 VPE_MSG_GENERAL,
102 VPE_MSG_OUTPUT_V, /* video (continuous mode ) */
103 VPE_MSG_OUTPUT_ST_L,
104 VPE_MSG_OUTPUT_ST_R,
105};
106
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700107enum msm_stereo_state {
108 STEREO_VIDEO_IDLE,
109 STEREO_VIDEO_ACTIVE,
110 STEREO_SNAP_IDLE,
111 STEREO_SNAP_STARTED,
112 STEREO_SNAP_BUFFER1_PROCESSING,
113 STEREO_SNAP_BUFFER2_PROCESSING,
114 STEREO_RAW_SNAP_IDLE,
115 STEREO_RAW_SNAP_STARTED,
116};
117
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700118struct msm_vpe_phy_info {
119 uint32_t sbuf_phy;
Alekhya,Monikafc81e102011-12-29 15:17:33 +0530120 uint32_t planar0_off;
121 uint32_t planar1_off;
122 uint32_t planar2_off;
123 uint32_t p0_phy;
124 uint32_t p1_phy;
125 uint32_t p2_phy;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700126 uint8_t output_id; /* VFE31_OUTPUT_MODE_PT/S/V */
127 uint32_t frame_id;
128};
129
Kevin Chan3be11612012-03-22 20:05:40 -0700130#ifndef CONFIG_MSM_CAMERA_V4L2
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700131#define VFE31_OUTPUT_MODE_PT (0x1 << 0)
132#define VFE31_OUTPUT_MODE_S (0x1 << 1)
133#define VFE31_OUTPUT_MODE_V (0x1 << 2)
134#define VFE31_OUTPUT_MODE_P (0x1 << 3)
135#define VFE31_OUTPUT_MODE_T (0x1 << 4)
Alekhya,Monikafc81e102011-12-29 15:17:33 +0530136#define VFE31_OUTPUT_MODE_P_ALL_CHNLS (0x1 << 5)
Kevin Chan3be11612012-03-22 20:05:40 -0700137#endif
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700138
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700139struct msm_vfe_phy_info {
140 uint32_t sbuf_phy;
Alekhya,Monikafc81e102011-12-29 15:17:33 +0530141 uint32_t planar0_off;
142 uint32_t planar1_off;
143 uint32_t planar2_off;
144 uint32_t p0_phy;
145 uint32_t p1_phy;
146 uint32_t p2_phy;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700147 uint8_t output_id; /* VFE31_OUTPUT_MODE_PT/S/V */
148 uint32_t frame_id;
149};
150
151struct msm_vfe_stats_msg {
Lakshmi Narayana Kalavala4ab97a92011-07-26 15:30:14 -0700152 uint8_t awb_ymin;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700153 uint32_t aec_buff;
154 uint32_t awb_buff;
155 uint32_t af_buff;
156 uint32_t ihist_buff;
157 uint32_t rs_buff;
158 uint32_t cs_buff;
159 uint32_t skin_buff;
160 uint32_t status_bits;
161 uint32_t frame_id;
162};
163
164struct video_crop_t{
165 uint32_t in1_w;
166 uint32_t out1_w;
167 uint32_t in1_h;
168 uint32_t out1_h;
169 uint32_t in2_w;
170 uint32_t out2_w;
171 uint32_t in2_h;
172 uint32_t out2_h;
173 uint8_t update_flag;
174};
175
176struct msm_vpe_buf_info {
Alekhya,Monikafc81e102011-12-29 15:17:33 +0530177 uint32_t p0_phy;
178 uint32_t p1_phy;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700179 struct timespec ts;
180 uint32_t frame_id;
181 struct video_crop_t vpe_crop;
182};
183
184struct msm_vfe_resp {
185 enum vfe_resp_msg type;
186 struct msm_cam_evt_msg evt_msg;
187 struct msm_vfe_phy_info phy;
188 struct msm_vfe_stats_msg stats_msg;
189 struct msm_vpe_buf_info vpe_bf;
190 void *extdata;
191 int32_t extlen;
192};
193
194struct msm_vpe_resp {
195 enum vpe_resp_msg type;
196 struct msm_cam_evt_msg evt_msg;
197 struct msm_vpe_phy_info phy;
198 void *extdata;
199 int32_t extlen;
200};
201
202struct msm_vpe_callback {
203 void (*vpe_resp)(struct msm_vpe_resp *,
204 enum msm_queue, void *syncdata,
205 void *time_stamp, gfp_t gfp);
206 void* (*vpe_alloc)(int, void *syncdata, gfp_t gfp);
207 void (*vpe_free)(void *ptr);
208};
209
210struct msm_vfe_callback {
211 void (*vfe_resp)(struct msm_vfe_resp *,
212 enum msm_queue, void *syncdata,
213 gfp_t gfp);
214 void* (*vfe_alloc)(int, void *syncdata, gfp_t gfp);
215 void (*vfe_free)(void *ptr);
216};
217
218struct msm_camvfe_fn {
219 int (*vfe_init)(struct msm_vfe_callback *,
220 struct platform_device *);
221 int (*vfe_enable)(struct camera_enable_cmd *);
222 int (*vfe_config)(struct msm_vfe_cfg_cmd *, void *);
223 int (*vfe_disable)(struct camera_enable_cmd *,
224 struct platform_device *dev);
225 void (*vfe_release)(struct platform_device *);
226 void (*vfe_stop)(void);
227};
228
229struct msm_camvfe_params {
230 struct msm_vfe_cfg_cmd *vfe_cfg;
231 void *data;
232};
233
Mingcheng Zhu8e9f99e2011-08-26 16:33:32 -0700234struct msm_mctl_pp_params {
235 struct msm_mctl_pp_cmd *cmd;
236 void *data;
237};
238
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700239struct msm_camvpe_fn {
240 int (*vpe_reg)(struct msm_vpe_callback *);
241 int (*vpe_cfg_update) (void *);
Alekhya,Monikafc81e102011-12-29 15:17:33 +0530242 void (*send_frame_to_vpe) (uint32_t planar0_off, uint32_t planar1_off,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700243 struct timespec *ts, int output_id);
244 int (*vpe_config)(struct msm_vpe_cfg_cmd *, void *);
245 void (*vpe_cfg_offset)(int frame_pack, uint32_t pyaddr,
246 uint32_t pcbcraddr, struct timespec *ts, int output_id,
247 struct msm_st_half st_half, int frameid);
248 int *dis;
249};
250
251struct msm_sensor_ctrl {
252 int (*s_init)(const struct msm_camera_sensor_info *);
253 int (*s_release)(void);
254 int (*s_config)(void __user *);
255 enum msm_camera_type s_camera_type;
256 uint32_t s_mount_angle;
257 enum msm_st_frame_packing s_video_packing;
258 enum msm_st_frame_packing s_snap_packing;
259};
Sreesudhan Ramakrish Ramkumara4b5f302011-09-12 16:23:22 -0700260
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700261struct msm_strobe_flash_ctrl {
262 int (*strobe_flash_init)
263 (struct msm_camera_sensor_strobe_flash_data *);
264 int (*strobe_flash_release)
265 (struct msm_camera_sensor_strobe_flash_data *, int32_t);
266 int (*strobe_flash_charge)(int32_t, int32_t, uint32_t);
267};
268
Sreesudhan Ramakrish Ramkumarc842b612012-05-21 17:23:24 -0700269enum cci_i2c_master_t {
270 MASTER_0,
271 MASTER_1,
272};
273
274enum cci_i2c_queue_t {
275 QUEUE_0,
276 QUEUE_1,
277};
278
279struct msm_camera_cci_client {
280 struct v4l2_subdev *cci_subdev;
281 uint32_t freq;
282 enum cci_i2c_master_t cci_i2c_master;
283 uint16_t sid;
284 uint16_t cid;
285 uint32_t timeout;
286 uint16_t retries;
287 uint16_t id_map;
288};
289
290enum msm_cci_cmd_type {
291 MSM_CCI_INIT,
292 MSM_CCI_RELEASE,
293 MSM_CCI_SET_SID,
294 MSM_CCI_SET_FREQ,
295 MSM_CCI_SET_SYNC_CID,
296 MSM_CCI_I2C_READ,
297 MSM_CCI_I2C_WRITE,
298 MSM_CCI_GPIO_WRITE,
299};
300
301struct msm_camera_cci_wait_sync_cfg {
302 uint16_t line;
303 uint16_t delay;
304};
305
306struct msm_camera_cci_gpio_cfg {
307 uint16_t gpio_queue;
308 uint16_t i2c_queue;
309};
310
Kevin Chanbdcf7ef2012-08-24 08:33:33 -0700311enum msm_camera_i2c_cmd_type {
312 MSM_CAMERA_I2C_CMD_WRITE,
313 MSM_CAMERA_I2C_CMD_POLL,
314};
315
316struct msm_camera_i2c_reg_conf {
317 uint16_t reg_addr;
318 uint16_t reg_data;
319 enum msm_camera_i2c_data_type dt;
320 enum msm_camera_i2c_cmd_type cmd_type;
321 int16_t mask;
322};
323
Sreesudhan Ramakrish Ramkumarc842b612012-05-21 17:23:24 -0700324struct msm_camera_cci_i2c_write_cfg {
325 struct msm_camera_i2c_reg_conf *reg_conf_tbl;
326 enum msm_camera_i2c_reg_addr_type addr_type;
327 enum msm_camera_i2c_data_type data_type;
328 uint16_t size;
329};
330
331struct msm_camera_cci_i2c_read_cfg {
332 uint16_t addr;
333 enum msm_camera_i2c_reg_addr_type addr_type;
334 uint8_t *data;
335 uint16_t num_byte;
336};
337
338struct msm_camera_cci_i2c_queue_info {
339 uint32_t max_queue_size;
340 uint32_t report_id;
341 uint32_t irq_en;
342 uint32_t capture_rep_data;
343};
344
345struct msm_camera_cci_ctrl {
346 int32_t status;
347 struct msm_camera_cci_client *cci_info;
348 enum msm_cci_cmd_type cmd;
349 union {
350 struct msm_camera_cci_i2c_write_cfg cci_i2c_write_cfg;
351 struct msm_camera_cci_i2c_read_cfg cci_i2c_read_cfg;
352 struct msm_camera_cci_wait_sync_cfg cci_wait_sync_cfg;
353 struct msm_camera_cci_gpio_cfg gpio_cfg;
354 } cfg;
355};
356
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700357/* this structure is used in kernel */
358struct msm_queue_cmd {
359 struct list_head list_config;
360 struct list_head list_control;
361 struct list_head list_frame;
362 struct list_head list_pict;
363 struct list_head list_vpe_frame;
Kevin Chan94b4c832012-03-02 21:27:16 -0800364 struct list_head list_eventdata;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700365 enum msm_queue type;
366 void *command;
367 atomic_t on_heap;
368 struct timespec ts;
369 uint32_t error_code;
Ankit Premrajka8c9bf5d2012-08-07 15:45:31 -0700370 uint32_t trans_code;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700371};
372
373struct msm_device_queue {
374 struct list_head list;
375 spinlock_t lock;
376 wait_queue_head_t wait;
377 int max;
378 int len;
379 const char *name;
380};
381
Kevin Chan047053e2012-04-19 11:30:33 -0700382struct msm_mctl_stats_t {
383 struct hlist_head pmem_stats_list;
384 spinlock_t pmem_stats_spinlock;
385};
386
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700387struct msm_sync {
388 /* These two queues are accessed from a process context only
389 * They contain pmem descriptors for the preview frames and the stats
390 * coming from the camera sensor.
391 */
392 struct hlist_head pmem_frames;
393 struct hlist_head pmem_stats;
394
395 /* The message queue is used by the control thread to send commands
396 * to the config thread, and also by the DSP to send messages to the
397 * config thread. Thus it is the only queue that is accessed from
398 * both interrupt and process context.
399 */
400 struct msm_device_queue event_q;
401
402 /* This queue contains preview frames. It is accessed by the DSP (in
403 * in interrupt context, and by the frame thread.
404 */
405 struct msm_device_queue frame_q;
406 int unblock_poll_frame;
407 int unblock_poll_pic_frame;
408
409 /* This queue contains snapshot frames. It is accessed by the DSP (in
410 * interrupt context, and by the control thread.
411 */
412 struct msm_device_queue pict_q;
413 int get_pic_abort;
414 struct msm_device_queue vpe_q;
415
416 struct msm_camera_sensor_info *sdata;
417 struct msm_camvfe_fn vfefn;
418 struct msm_camvpe_fn vpefn;
419 struct msm_sensor_ctrl sctrl;
420 struct msm_strobe_flash_ctrl sfctrl;
Stephen Boyd2fcabf92012-05-30 10:41:11 -0700421 struct pm_qos_request idle_pm_qos;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700422 struct platform_device *pdev;
423 int16_t ignore_qcmd_type;
424 uint8_t ignore_qcmd;
425 uint8_t opencnt;
426 void *cropinfo;
427 int croplen;
428 int core_powered_on;
429
430 struct fd_roi_info fdroiinfo;
431
432 atomic_t vpe_enable;
433 uint32_t pp_mask;
434 uint8_t pp_frame_avail;
435 struct msm_queue_cmd *pp_prev;
436 struct msm_queue_cmd *pp_snap;
437 struct msm_queue_cmd *pp_thumb;
438 int video_fd;
439
440 const char *apps_id;
441
442 struct mutex lock;
443 struct list_head list;
444 uint8_t liveshot_enabled;
445 struct msm_cam_v4l2_device *pcam_sync;
446
447 uint8_t stereocam_enabled;
448 struct msm_queue_cmd *pp_stereocam;
449 struct msm_queue_cmd *pp_stereocam2;
450 struct msm_queue_cmd *pp_stereosnap;
451 enum msm_stereo_state stereo_state;
452 int stcam_quality_ind;
453 uint32_t stcam_conv_value;
454
455 spinlock_t pmem_frame_spinlock;
456 spinlock_t pmem_stats_spinlock;
457 spinlock_t abort_pict_lock;
458 int snap_count;
459 int thumb_count;
460};
461
462#define MSM_APPS_ID_V4L2 "msm_v4l2"
463#define MSM_APPS_ID_PROP "msm_qct"
464
465struct msm_cam_device {
466 struct msm_sync *sync; /* most-frequently accessed */
467 struct device *device;
468 struct cdev cdev;
469 /* opened is meaningful only for the config and frame nodes,
470 * which may be opened only once.
471 */
472 atomic_t opened;
473};
474
475struct msm_control_device {
476 struct msm_cam_device *pmsm;
477
478 /* Used for MSM_CAM_IOCTL_CTRL_CMD_DONE responses */
479 uint8_t ctrl_data[max_control_command_size];
480 struct msm_ctrl_cmd ctrl;
481 struct msm_queue_cmd qcmd;
482
483 /* This queue used by the config thread to send responses back to the
484 * control thread. It is accessed only from a process context.
485 */
486 struct msm_device_queue ctrl_q;
487};
488
489struct register_address_value_pair {
490 uint16_t register_address;
491 uint16_t register_value;
492};
493
494struct msm_pmem_region {
495 struct hlist_node list;
496 unsigned long paddr;
497 unsigned long len;
498 struct file *file;
499 struct msm_pmem_info info;
Ankit Premrajka748a70a2011-11-01 08:22:04 -0700500 struct ion_handle *handle;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700501};
502
503struct axidata {
504 uint32_t bufnum1;
505 uint32_t bufnum2;
506 uint32_t bufnum3;
507 struct msm_pmem_region *region;
508};
509
510#ifdef CONFIG_MSM_CAMERA_FLASH
511int msm_camera_flash_set_led_state(
512 struct msm_camera_sensor_flash_data *fdata,
513 unsigned led_state);
514int msm_strobe_flash_init(struct msm_sync *sync, uint32_t sftype);
515int msm_flash_ctrl(struct msm_camera_sensor_info *sdata,
516 struct flash_ctrl_data *flash_info);
517#else
518static inline int msm_camera_flash_set_led_state(
519 struct msm_camera_sensor_flash_data *fdata,
520 unsigned led_state)
521{
522 return -ENOTSUPP;
523}
524static inline int msm_strobe_flash_init(
525 struct msm_sync *sync, uint32_t sftype)
526{
527 return -ENOTSUPP;
528}
529static inline int msm_flash_ctrl(
530 struct msm_camera_sensor_info *sdata,
531 struct flash_ctrl_data *flash_info)
532{
533 return -ENOTSUPP;
534}
535#endif
536
537
538
539void msm_camvfe_init(void);
540int msm_camvfe_check(void *);
541void msm_camvfe_fn_init(struct msm_camvfe_fn *, void *);
542void msm_camvpe_fn_init(struct msm_camvpe_fn *, void *);
543int msm_camera_drv_start(struct platform_device *dev,
544 int (*sensor_probe)(const struct msm_camera_sensor_info *,
545 struct msm_sensor_ctrl *));
546
547enum msm_camio_clk_type {
548 CAMIO_VFE_MDC_CLK,
549 CAMIO_MDC_CLK,
550 CAMIO_VFE_CLK,
551 CAMIO_VFE_AXI_CLK,
552
553 CAMIO_VFE_CAMIF_CLK,
554 CAMIO_VFE_PBDG_CLK,
555 CAMIO_CAM_MCLK_CLK,
556 CAMIO_CAMIF_PAD_PBDG_CLK,
557
558 CAMIO_CSI0_VFE_CLK,
559 CAMIO_CSI1_VFE_CLK,
560 CAMIO_VFE_PCLK,
561
562 CAMIO_CSI_SRC_CLK,
563 CAMIO_CSI0_CLK,
564 CAMIO_CSI1_CLK,
565 CAMIO_CSI0_PCLK,
566 CAMIO_CSI1_PCLK,
567
568 CAMIO_CSI1_SRC_CLK,
569 CAMIO_CSI_PIX_CLK,
Sreesudhan Ramakrish Ramkumard6e9cb92011-10-12 17:55:18 -0700570 CAMIO_CSI_PIX1_CLK,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700571 CAMIO_CSI_RDI_CLK,
Sreesudhan Ramakrish Ramkumard6e9cb92011-10-12 17:55:18 -0700572 CAMIO_CSI_RDI1_CLK,
573 CAMIO_CSI_RDI2_CLK,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700574 CAMIO_CSIPHY0_TIMER_CLK,
575 CAMIO_CSIPHY1_TIMER_CLK,
576
577 CAMIO_JPEG_CLK,
578 CAMIO_JPEG_PCLK,
579 CAMIO_VPE_CLK,
580 CAMIO_VPE_PCLK,
581
582 CAMIO_CSI0_PHY_CLK,
583 CAMIO_CSI1_PHY_CLK,
584 CAMIO_CSIPHY_TIMER_SRC_CLK,
Jignesh Mehta95dd6e12011-11-18 17:21:16 -0800585 CAMIO_IMEM_CLK,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700586
587 CAMIO_MAX_CLK
588};
589
590enum msm_camio_clk_src_type {
591 MSM_CAMIO_CLK_SRC_INTERNAL,
592 MSM_CAMIO_CLK_SRC_EXTERNAL,
593 MSM_CAMIO_CLK_SRC_MAX
594};
595
596enum msm_s_test_mode {
597 S_TEST_OFF,
598 S_TEST_1,
599 S_TEST_2,
600 S_TEST_3
601};
602
603enum msm_s_resolution {
604 S_QTR_SIZE,
605 S_FULL_SIZE,
606 S_INVALID_SIZE
607};
608
609enum msm_s_reg_update {
610 /* Sensor egisters that need to be updated during initialization */
611 S_REG_INIT,
612 /* Sensor egisters that needs periodic I2C writes */
613 S_UPDATE_PERIODIC,
614 /* All the sensor Registers will be updated */
615 S_UPDATE_ALL,
616 /* Not valid update */
617 S_UPDATE_INVALID
618};
619
620enum msm_s_setting {
621 S_RES_PREVIEW,
622 S_RES_CAPTURE
623};
624
625enum msm_bus_perf_setting {
626 S_INIT,
627 S_PREVIEW,
628 S_VIDEO,
629 S_CAPTURE,
630 S_ZSL,
631 S_STEREO_VIDEO,
632 S_STEREO_CAPTURE,
633 S_DEFAULT,
Kiran Kumar H N1d1d3072012-07-05 13:40:13 -0700634 S_LIVESHOT,
Nishant Pandit221a9482012-09-03 05:36:04 +0530635 S_DUAL,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700636 S_EXIT
637};
638
639int msm_camio_enable(struct platform_device *dev);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700640int msm_camio_vpe_clk_enable(uint32_t);
641int msm_camio_vpe_clk_disable(void);
642
Kevin Chanbb8ef862012-02-14 13:03:04 -0800643void msm_camio_mode_config(enum msm_camera_i2c_mux_mode mode);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700644int msm_camio_clk_enable(enum msm_camio_clk_type clk);
645int msm_camio_clk_disable(enum msm_camio_clk_type clk);
646int msm_camio_clk_config(uint32_t freq);
647void msm_camio_clk_rate_set(int rate);
Shuzhen Wange49436a2011-09-28 16:07:27 -0700648int msm_camio_vfe_clk_rate_set(int rate);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700649void msm_camio_clk_rate_set_2(struct clk *clk, int rate);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700650void msm_camio_clk_axi_rate_set(int rate);
651void msm_disable_io_gpio_clk(struct platform_device *);
652
653void msm_camio_camif_pad_reg_reset(void);
654void msm_camio_camif_pad_reg_reset_2(void);
655
656void msm_camio_vfe_blk_reset(void);
Suresh Vankadara3a9722a2012-05-21 10:09:05 +0530657void msm_camio_vfe_blk_reset_2(void);
658void msm_camio_vfe_blk_reset_3(void);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700659
Nishant Pandit24153d82011-08-27 16:05:13 +0530660int32_t msm_camio_3d_enable(const struct msm_camera_sensor_info *sinfo);
661void msm_camio_3d_disable(void);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700662void msm_camio_clk_sel(enum msm_camio_clk_src_type);
663void msm_camio_disable(struct platform_device *);
664int msm_camio_probe_on(struct platform_device *);
665int msm_camio_probe_off(struct platform_device *);
666int msm_camio_sensor_clk_off(struct platform_device *);
667int msm_camio_sensor_clk_on(struct platform_device *);
668int msm_camio_csi_config(struct msm_camera_csi_params *csi_params);
669int msm_camio_csiphy_config(struct msm_camera_csiphy_params *csiphy_params);
670int msm_camio_csid_config(struct msm_camera_csid_params *csid_params);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700671int add_axi_qos(void);
672int update_axi_qos(uint32_t freq);
673void release_axi_qos(void);
Kiran Kumar H N3ee46812012-04-13 16:57:57 -0700674void msm_camera_io_w(u32 data, void __iomem *addr);
675void msm_camera_io_w_mb(u32 data, void __iomem *addr);
676u32 msm_camera_io_r(void __iomem *addr);
677u32 msm_camera_io_r_mb(void __iomem *addr);
678void msm_camera_io_dump(void __iomem *addr, int size);
679void msm_camera_io_memcpy(void __iomem *dest_addr,
680 void __iomem *src_addr, u32 len);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700681void msm_camio_set_perf_lvl(enum msm_bus_perf_setting);
Kevin Chan09f4e662011-12-16 08:17:02 -0800682void msm_camio_bus_scale_cfg(
683 struct msm_bus_scale_pdata *, enum msm_bus_perf_setting);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700684
Shuzhen Wanga3c1a122011-08-04 15:33:27 -0700685void *msm_isp_sync_alloc(int size, gfp_t gfp);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700686
687void msm_isp_sync_free(void *ptr);
Kevin Chan85af4552011-10-25 15:07:58 -0700688
689int msm_cam_clk_enable(struct device *dev, struct msm_cam_clk_info *clk_info,
690 struct clk **clk_ptr, int num_clk, int enable);
Jeyaprakash Soundrapandian2474e8f2012-01-03 15:59:57 -0800691int msm_cam_core_reset(void);
Kevin Chaneb6b6072012-01-17 11:54:54 -0800692
693int msm_camera_config_vreg(struct device *dev, struct camera_vreg_t *cam_vreg,
Sreesudhan Ramakrish Ramkumar923fbad2012-07-26 17:31:42 -0700694 int num_vreg, enum msm_camera_vreg_name_t *vreg_seq,
695 int num_vreg_seq, struct regulator **reg_ptr, int config);
Kevin Chaneb6b6072012-01-17 11:54:54 -0800696int msm_camera_enable_vreg(struct device *dev, struct camera_vreg_t *cam_vreg,
Sreesudhan Ramakrish Ramkumar923fbad2012-07-26 17:31:42 -0700697 int num_vreg, enum msm_camera_vreg_name_t *vreg_seq,
698 int num_vreg_seq, struct regulator **reg_ptr, int enable);
Kevin Chaneb6b6072012-01-17 11:54:54 -0800699
700int msm_camera_config_gpio_table
701 (struct msm_camera_sensor_info *sinfo, int gpio_en);
702int msm_camera_request_gpio_table
703 (struct msm_camera_sensor_info *sinfo, int gpio_en);
Kevin Chan7303f592012-08-23 23:36:53 -0700704void msm_camera_bus_scale_cfg(uint32_t bus_perf_client,
705 enum msm_bus_perf_setting perf_setting);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700706#endif