summaryrefslogtreecommitdiff
path: root/drivers/media/platform/exynos5-is/fimc-is-pipeline.h
blob: 7c75df255341a29a7b1ec16324a20e7ea4501638 (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
136
137
138
139
140
141
142
143
144
145
146
147
148
/*
 * 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_PIPELINE_H_
#define FIMC_IS_PIPELINE_H_

#include "fimc-is-core.h"
#include "fimc-is-sensor.h"
#include "fimc-is-isp.h"
#include "fimc-is-scaler.h"

#define FIMC_IS_A5_TIMEOUT		1000

#define FIMC_IS_SCP_REGION_INDEX	400
#define FIMC_IS_SCC_REGION_INDEX	447

#define MAX_ODC_INTERNAL_BUF_WIDTH	2560  /* 4808 in HW */
#define MAX_ODC_INTERNAL_BUF_HEIGHT	1920  /* 3356 in HW */
#define SIZE_ODC_INTERNAL_BUF \
	(MAX_ODC_INTERNAL_BUF_WIDTH * MAX_ODC_INTERNAL_BUF_HEIGHT * 3)

#define MAX_DIS_INTERNAL_BUF_WIDTH	2400
#define MAX_DIS_INTERNAL_BUF_HEIGHT	1360
#define SIZE_DIS_INTERNAL_BUF \
	(MAX_DIS_INTERNAL_BUF_WIDTH * MAX_DIS_INTERNAL_BUF_HEIGHT * 2)

#define MAX_3DNR_INTERNAL_BUF_WIDTH	1920
#define MAX_3DNR_INTERNAL_BUF_HEIGHT	1088
#define SIZE_DNR_INTERNAL_BUF \
	(MAX_3DNR_INTERNAL_BUF_WIDTH * MAX_3DNR_INTERNAL_BUF_HEIGHT * 2)

#define NUM_ODC_INTERNAL_BUF		2
#define NUM_DIS_INTERNAL_BUF		5
#define NUM_DNR_INTERNAL_BUF		2

#define FIMC_IS_FW_BASE_MASK		((1 << 26) - 1)

#define FIMC_IS_NUM_COMPS		8

#define FIMC_IS_MAGIC_NUMBER		0x23456789

/*
 * FIMC IS sub-block mask specifying which sub-blocks
 * are available for given SoC.
 * @see is_components for sub-blocks identifiers
 */
#define FIMC_IS_EXYNOS5_SUBBLOCKS	0xff
#define FIMC_IS_EXYNOS3250_SUBBLOCKS	0x87

enum pipeline_state {
	PIPELINE_INIT,
        PIPELINE_POWER,
	PIPELINE_OPEN,
        PIPELINE_PREPARE,
	PIPELINE_START,
	PIPELINE_RUN,
        PIPELINE_RESET,
};

enum is_components {
	IS_ISP,
	IS_DRC,
	IS_SCC,
	IS_ODC,
	IS_DIS,
	IS_TDNR,
	IS_SCP,
	IS_FD
};

enum component_state {
        COMP_INVALID,
	COMP_ENABLE,
	COMP_START,
	COMP_RUN
};

struct fimc_is_config {
        unsigned long 	params[2];
        int		metadata_mode;
};

struct fimc_is_pipeline {
	unsigned long		state;
        unsigned long		subip_state[FIMC_IS_NUM_COMPS];
        unsigned int		subip_mask;
	bool			force_down;
	unsigned int		instance;
	/* Locks the isp / scaler buffers */
	spinlock_t		slock_buf;
	unsigned long		slock_flags;
	wait_queue_head_t	wait_q;
        struct work_struct	work;
        struct delayed_work	wdg_work;
	/* For locking pipeline ops */
	struct mutex		pipe_lock;
	/* For locking scaler ops in pipeline */
	struct mutex		pipe_scl_lock;

	struct fimc_is_meminfo	*minfo;
	struct is_region	*is_region;
	struct device		*dev;

	struct fimc_is		*is;
	struct fimc_is_sensor	*sensor;
	struct fimc_is_isp	isp;
	struct fimc_is_scaler	scaler[FIMC_IS_NUM_SCALERS];
        struct fimc_is_config	config;
        const struct fimc_is_fw_ctrl *fw_ctrl;
        unsigned int		data_flow;
	unsigned int		fcount;
        ktime_t			last_frame;
        long long		frame_duration;
	unsigned int		isp_width;
	unsigned int		isp_height;
        struct fimc_is_event_listener listener;
};

void fimc_is_pipeline_buf_lock(struct fimc_is_pipeline *pipeline);
void fimc_is_pipeline_buf_unlock(struct fimc_is_pipeline *pipeline);
int fimc_is_pipeline_setparams(struct fimc_is_pipeline *pipeline);
int fimc_is_pipeline_scaler_start(struct fimc_is_pipeline *pipeline,
		enum fimc_is_scaler_id scaler_id,
		unsigned int num_bufs,
		unsigned int num_planes);
int fimc_is_pipeline_scaler_stop(struct fimc_is_pipeline *pipeline,
		enum fimc_is_scaler_id scaler_id);
void fimc_is_pipeline_config_shot(struct fimc_is_pipeline *pipeline);
int fimc_is_pipeline_shot_safe(struct fimc_is_pipeline *pipeline);
int fimc_is_pipeline_shot(struct fimc_is_pipeline *pipeline);
int fimc_is_pipeline_start(struct fimc_is_pipeline *pipeline, int streamon);
int fimc_is_pipeline_stop(struct fimc_is_pipeline *pipeline, int streamoff);
int fimc_is_pipeline_init(struct fimc_is_pipeline *pipeline,
                        unsigned int instance,
                        void *is_ctx);
int fimc_is_pipeline_destroy(struct fimc_is_pipeline *pipeline);
int fimc_is_pipeline_open(struct fimc_is_pipeline *pipeline,
			struct fimc_is_sensor *sensor);
int fimc_is_pipeline_close(struct fimc_is_pipeline *pipeline);
void fimc_is_pipeline_reset(struct fimc_is_pipeline *pipeline);
#endif