summaryrefslogtreecommitdiff
path: root/drivers/media/platform/exynos5-is/fimc-is-interface.h
blob: 20f0592878f33901a1012027ea10246b46e20daf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/*
 * Samsung EXYNOS5 FIMC-IS (Imaging Subsystem) driver
 *
 * Copyright (C) 2013 Samsung Electronics Co., Ltd.
 *  Arun Kumar K <arun.kk@samsung.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */
#ifndef FIMC_IS_INTERFACE_H_
#define FIMC_IS_INTERFACE_H_

#include "fimc-is-core.h"
#include "fimc-is-backend.h"

#define TRY_RECV_AWARE_COUNT    100

#define EXYNOS5_ISDRV_VERSION   111
#define EXYNOS3_ISDRV_VERSION   244

enum fimc_is_interface_state {
	IS_IF_STATE_INIT,
	IS_IF_STATE_OPEN,
	IS_IF_STATE_START,
	IS_IF_STATE_BUSY
};

enum streaming_state {
	IS_IF_STREAMING_INIT,
	IS_IF_STREAMING_OFF,
	IS_IF_STREAMING_ON
};

enum processing_state {
	IS_IF_PROCESSING_INIT,
	IS_IF_PROCESSING_OFF,
	IS_IF_PROCESSING_ON
};

enum pdown_ready_state {
	IS_IF_POWER_DOWN_READY,
	IS_IF_POWER_DOWN_NREADY
};

struct fimc_is_msg {
	u32 id;
	u32 command;
	u32 instance;
	u32 param[4];
};

struct fimc_is_interface {
	unsigned long			state;

	void __iomem			*regs;
        void __iomem   	 		*shared_regs;
        struct fimc_is_fw_data		*fw_data;
	/* Lock for writing into MCUCTL registers */
	spinlock_t			slock;
	/* Lock for context state variable */
	spinlock_t			slock_state;
	wait_queue_head_t		irq_queue;
	struct device			*dev;
        unsigned int			drv_version;
	/* Held while sending commands to FW */
	struct mutex			request_barrier;
        struct work_struct		shot_done_work;
	enum streaming_state		streaming;
	enum processing_state		processing;
	enum pdown_ready_state		pdown_ready;
        struct shared_reg_map_entry	*shared_regs_map;
	struct fimc_is_msg		reply;

	int				debug_cnt;
	struct dentry                   *debugfs_entry;

};

int fimc_is_interface_init(struct fimc_is_interface *itf,
		void __iomem *regs, int irq);
int fimc_is_itf_wait_init_state(struct fimc_is_interface *itf);
int fimc_is_itf_open_sensor(struct fimc_is_interface *itf,
		unsigned int instance,
		unsigned int sensor_id,
		unsigned int i2c_channel,
		unsigned int sensor_ext);
int fimc_is_itf_open_sensor_ext(struct fimc_is_interface *itf,
                                unsigned int instance,
                                unsigned int sensor_id,
                                unsigned int sensor_ext);
int fimc_is_itf_sensor_close(struct fimc_is_interface *itf,
                             unsigned int instance);
int fimc_is_itf_sensor_mode(struct fimc_is_interface *itf,
                            unsigned int instance,
                            unsigned int mode);
int fimc_is_itf_get_setfile_addr(struct fimc_is_interface *this,
		unsigned int instance, unsigned int *setfile_addr);
int fimc_is_itf_load_setfile(struct fimc_is_interface *itf,
		unsigned int instance);
int fimc_is_itf_stream_on(struct fimc_is_interface *itf,
		unsigned int instance);
int fimc_is_itf_stream_off(struct fimc_is_interface *itf,
		unsigned int instance);
int fimc_is_itf_process_on(struct fimc_is_interface *itf,
		unsigned int instance);
int fimc_is_itf_process_off(struct fimc_is_interface *itf,
		unsigned int instance);
int fimc_is_itf_set_param(struct fimc_is_interface *this,
		unsigned int instance,
                unsigned int scenario,
		unsigned int lindex,
		unsigned int hindex);
int fimc_is_itf_preview_still(struct fimc_is_interface *itf,
		unsigned int instance);
int fimc_is_itf_capture_still(struct fimc_is_interface *itf,
                unsigned int instance);
int fimc_is_itf_get_capability(struct fimc_is_interface *itf,
                               unsigned int instance, unsigned int address);
int fimc_is_itf_change_sensor_mode(struct fimc_is_interface *itf,
                                   unsigned int instance,
				   unsigned int mode);
int fimc_is_itf_map_mem(struct fimc_is_interface *itf,
		unsigned int instance, unsigned int address,
		unsigned int size);
int fimc_is_itf_unmap_mem(struct fimc_is_interface *itf,
                          unsigned int instance);
int fimc_is_itf_shot_nblk(struct fimc_is_interface *itf,
		unsigned int instance, unsigned int bayer,
		unsigned int shot, unsigned int fcount, unsigned int rcount);
int fimc_is_itf_power_down(struct fimc_is_interface *itf,
		unsigned int instance);
int fimc_is_itf_hw_running(struct fimc_is_interface *itf);
void fimc_is_itf_notify_frame_done(struct fimc_is_interface *itf);
#endif