1 /* SPDX-License-Identifier: GPL-2.0 */
5 * Qualcomm MSM Camera Subsystem - VFE (Video Front End) Module
7 * Copyright (c) 2013-2015, The Linux Foundation. All rights reserved.
8 * Copyright (C) 2015-2018 Linaro Ltd.
10 #ifndef QC_MSM_CAMSS_VFE_H
11 #define QC_MSM_CAMSS_VFE_H
13 #include <linux/clk.h>
14 #include <linux/spinlock_types.h>
15 #include <media/media-entity.h>
16 #include <media/v4l2-device.h>
17 #include <media/v4l2-subdev.h>
19 #include "camss-video.h"
20 #include "camss-vfe-gen1.h"
22 #define MSM_VFE_PAD_SINK 0
23 #define MSM_VFE_PAD_SRC 1
24 #define MSM_VFE_PADS_NUM 2
26 #define MSM_VFE_IMAGE_MASTERS_NUM 7
27 #define MSM_VFE_COMPOSITE_IRQ_NUM 4
29 /* VFE halt timeout */
30 #define VFE_HALT_TIMEOUT_MS 100
31 /* Frame drop value. VAL + UPDATES - 1 should not exceed 31 */
32 #define VFE_FRAME_DROP_VAL 30
34 #define vfe_line_array(ptr_line) \
35 ((const struct vfe_line (*)[]) &(ptr_line)[-(ptr_line)->id])
37 #define to_vfe(ptr_line) \
38 container_of(vfe_line_array(ptr_line), struct vfe_device, line)
40 enum vfe_output_state
{
44 VFE_OUTPUT_CONTINUOUS
,
63 struct camss_buffer
*buf
[2];
64 struct camss_buffer
*last_buffer
;
65 struct list_head pending_bufs
;
67 unsigned int drop_update_idx
;
78 enum vfe_output_state state
;
79 unsigned int sequence
;
82 struct completion sof
;
83 struct completion reg_update
;
88 struct v4l2_subdev subdev
;
89 struct media_pad pads
[MSM_VFE_PADS_NUM
];
90 struct v4l2_mbus_framefmt fmt
[MSM_VFE_PADS_NUM
];
91 struct v4l2_rect compose
;
92 struct v4l2_rect crop
;
93 struct camss_video video_out
;
94 struct vfe_output output
;
95 const struct camss_format_info
*formats
;
96 unsigned int nformats
;
102 void (*enable_irq_common
)(struct vfe_device
*vfe
);
103 void (*global_reset
)(struct vfe_device
*vfe
);
104 u32 (*hw_version
)(struct vfe_device
*vfe
);
105 irqreturn_t (*isr
)(int irq
, void *dev
);
106 void (*isr_read
)(struct vfe_device
*vfe
, u32
*value0
, u32
*value1
);
107 void (*pm_domain_off
)(struct vfe_device
*vfe
);
108 int (*pm_domain_on
)(struct vfe_device
*vfe
);
109 void (*reg_update
)(struct vfe_device
*vfe
, enum vfe_line_id line_id
);
110 void (*reg_update_clear
)(struct vfe_device
*vfe
,
111 enum vfe_line_id line_id
);
112 void (*subdev_init
)(struct device
*dev
, struct vfe_device
*vfe
);
113 int (*vfe_disable
)(struct vfe_line
*line
);
114 int (*vfe_enable
)(struct vfe_line
*line
);
115 int (*vfe_halt
)(struct vfe_device
*vfe
);
116 void (*violation_read
)(struct vfe_device
*vfe
);
117 void (*vfe_wm_stop
)(struct vfe_device
*vfe
, u8 wm
);
121 void (*reset_ack
)(struct vfe_device
*vfe
);
122 void (*halt_ack
)(struct vfe_device
*vfe
);
123 void (*reg_update
)(struct vfe_device
*vfe
, enum vfe_line_id line_id
);
124 void (*sof
)(struct vfe_device
*vfe
, enum vfe_line_id line_id
);
125 void (*comp_done
)(struct vfe_device
*vfe
, u8 comp
);
126 void (*wm_done
)(struct vfe_device
*vfe
, u8 wm
);
129 struct vfe_subdev_resources
{
134 const struct vfe_hw_ops
*hw_ops
;
135 const struct camss_formats
*formats_rdi
;
136 const struct camss_formats
*formats_pix
;
145 struct camss_clock
*clock
;
147 struct completion reset_complete
;
148 struct completion halt_complete
;
149 struct mutex power_lock
;
151 struct mutex stream_lock
;
153 spinlock_t output_lock
;
154 enum vfe_line_id wm_output_map
[MSM_VFE_IMAGE_MASTERS_NUM
];
155 struct vfe_line line
[VFE_LINE_NUM_MAX
];
158 const struct vfe_subdev_resources
*res
;
159 const struct vfe_hw_ops_gen1
*ops_gen1
;
160 struct vfe_isr_ops isr_ops
;
161 struct camss_video_ops video_ops
;
162 struct device
*genpd
;
163 struct device_link
*genpd_link
;
166 struct camss_subdev_resources
;
168 int msm_vfe_subdev_init(struct camss
*camss
, struct vfe_device
*vfe
,
169 const struct camss_subdev_resources
*res
, u8 id
);
171 void msm_vfe_genpd_cleanup(struct vfe_device
*vfe
);
173 int msm_vfe_register_entities(struct vfe_device
*vfe
,
174 struct v4l2_device
*v4l2_dev
);
176 void msm_vfe_unregister_entities(struct vfe_device
*vfe
);
179 * vfe_buf_add_pending - Add output buffer to list of pending
180 * @output: VFE output
181 * @buffer: Video buffer
183 void vfe_buf_add_pending(struct vfe_output
*output
, struct camss_buffer
*buffer
);
185 struct camss_buffer
*vfe_buf_get_pending(struct vfe_output
*output
);
187 int vfe_flush_buffers(struct camss_video
*vid
, enum vb2_buffer_state state
);
190 * vfe_isr_comp_done - Process composite image done interrupt
192 * @comp: Composite image id
194 void vfe_isr_comp_done(struct vfe_device
*vfe
, u8 comp
);
196 void vfe_isr_reset_ack(struct vfe_device
*vfe
);
197 int vfe_put_output(struct vfe_line
*line
);
198 int vfe_release_wm(struct vfe_device
*vfe
, u8 wm
);
199 int vfe_reserve_wm(struct vfe_device
*vfe
, enum vfe_line_id line_id
);
202 * vfe_reset - Trigger reset on VFE module and wait to complete
205 * Return 0 on success or a negative error code otherwise
207 int vfe_reset(struct vfe_device
*vfe
);
210 * vfe_disable - Disable streaming on VFE line
213 * Return 0 on success or a negative error code otherwise
215 int vfe_disable(struct vfe_line
*line
);
218 * vfe_pm_domain_off - Disable power domains specific to this VFE.
221 void vfe_pm_domain_off(struct vfe_device
*vfe
);
224 * vfe_pm_domain_on - Enable power domains specific to this VFE.
227 int vfe_pm_domain_on(struct vfe_device
*vfe
);
229 extern const struct camss_formats vfe_formats_rdi_8x16
;
230 extern const struct camss_formats vfe_formats_pix_8x16
;
231 extern const struct camss_formats vfe_formats_rdi_8x96
;
232 extern const struct camss_formats vfe_formats_pix_8x96
;
233 extern const struct camss_formats vfe_formats_rdi_845
;
234 extern const struct camss_formats vfe_formats_pix_845
;
236 extern const struct vfe_hw_ops vfe_ops_4_1
;
237 extern const struct vfe_hw_ops vfe_ops_4_7
;
238 extern const struct vfe_hw_ops vfe_ops_4_8
;
239 extern const struct vfe_hw_ops vfe_ops_170
;
240 extern const struct vfe_hw_ops vfe_ops_480
;
242 int vfe_get(struct vfe_device
*vfe
);
243 void vfe_put(struct vfe_device
*vfe
);
246 * vfe_is_lite - Return if VFE is VFE lite.
249 * Some VFE lites have a different register layout.
251 * Return whether VFE is VFE lite
253 bool vfe_is_lite(struct vfe_device
*vfe
);
255 #endif /* QC_MSM_CAMSS_VFE_H */