camss-vfe.h (5552B)
1/* SPDX-License-Identifier: GPL-2.0 */ 2/* 3 * camss-vfe.h 4 * 5 * Qualcomm MSM Camera Subsystem - VFE (Video Front End) Module 6 * 7 * Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. 8 * Copyright (C) 2015-2018 Linaro Ltd. 9 */ 10#ifndef QC_MSM_CAMSS_VFE_H 11#define QC_MSM_CAMSS_VFE_H 12 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> 18 19#include "camss-video.h" 20#include "camss-vfe-gen1.h" 21 22#define MSM_VFE_PAD_SINK 0 23#define MSM_VFE_PAD_SRC 1 24#define MSM_VFE_PADS_NUM 2 25 26#define MSM_VFE_IMAGE_MASTERS_NUM 7 27#define MSM_VFE_COMPOSITE_IRQ_NUM 4 28 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 33 34#define vfe_line_array(ptr_line) \ 35 ((const struct vfe_line (*)[]) &(ptr_line)[-(ptr_line)->id]) 36 37#define to_vfe(ptr_line) \ 38 container_of(vfe_line_array(ptr_line), struct vfe_device, line) 39 40enum vfe_output_state { 41 VFE_OUTPUT_OFF, 42 VFE_OUTPUT_RESERVED, 43 VFE_OUTPUT_SINGLE, 44 VFE_OUTPUT_CONTINUOUS, 45 VFE_OUTPUT_IDLE, 46 VFE_OUTPUT_STOPPING, 47 VFE_OUTPUT_ON, 48}; 49 50enum vfe_line_id { 51 VFE_LINE_NONE = -1, 52 VFE_LINE_RDI0 = 0, 53 VFE_LINE_RDI1 = 1, 54 VFE_LINE_RDI2 = 2, 55 VFE_LINE_NUM_GEN2 = 3, 56 VFE_LINE_PIX = 3, 57 VFE_LINE_NUM_GEN1 = 4, 58 VFE_LINE_NUM_MAX = 4 59}; 60 61struct vfe_output { 62 u8 wm_num; 63 u8 wm_idx[3]; 64 65 struct camss_buffer *buf[2]; 66 struct camss_buffer *last_buffer; 67 struct list_head pending_bufs; 68 69 unsigned int drop_update_idx; 70 71 union { 72 struct { 73 int active_buf; 74 int wait_sof; 75 } gen1; 76 struct { 77 int active_num; 78 } gen2; 79 }; 80 enum vfe_output_state state; 81 unsigned int sequence; 82 83 int wait_reg_update; 84 struct completion sof; 85 struct completion reg_update; 86}; 87 88struct vfe_line { 89 enum vfe_line_id id; 90 struct v4l2_subdev subdev; 91 struct media_pad pads[MSM_VFE_PADS_NUM]; 92 struct v4l2_mbus_framefmt fmt[MSM_VFE_PADS_NUM]; 93 struct v4l2_rect compose; 94 struct v4l2_rect crop; 95 struct camss_video video_out; 96 struct vfe_output output; 97 const struct vfe_format *formats; 98 unsigned int nformats; 99}; 100 101struct vfe_device; 102 103struct vfe_hw_ops { 104 void (*enable_irq_common)(struct vfe_device *vfe); 105 void (*global_reset)(struct vfe_device *vfe); 106 u32 (*hw_version)(struct vfe_device *vfe); 107 irqreturn_t (*isr)(int irq, void *dev); 108 void (*isr_read)(struct vfe_device *vfe, u32 *value0, u32 *value1); 109 void (*pm_domain_off)(struct vfe_device *vfe); 110 int (*pm_domain_on)(struct vfe_device *vfe); 111 void (*reg_update)(struct vfe_device *vfe, enum vfe_line_id line_id); 112 void (*reg_update_clear)(struct vfe_device *vfe, 113 enum vfe_line_id line_id); 114 void (*subdev_init)(struct device *dev, struct vfe_device *vfe); 115 int (*vfe_disable)(struct vfe_line *line); 116 int (*vfe_enable)(struct vfe_line *line); 117 int (*vfe_halt)(struct vfe_device *vfe); 118 void (*violation_read)(struct vfe_device *vfe); 119}; 120 121struct vfe_isr_ops { 122 void (*reset_ack)(struct vfe_device *vfe); 123 void (*halt_ack)(struct vfe_device *vfe); 124 void (*reg_update)(struct vfe_device *vfe, enum vfe_line_id line_id); 125 void (*sof)(struct vfe_device *vfe, enum vfe_line_id line_id); 126 void (*comp_done)(struct vfe_device *vfe, u8 comp); 127 void (*wm_done)(struct vfe_device *vfe, u8 wm); 128}; 129 130struct vfe_device { 131 struct camss *camss; 132 u8 id; 133 void __iomem *base; 134 u32 irq; 135 char irq_name[30]; 136 struct camss_clock *clock; 137 int nclocks; 138 struct completion reset_complete; 139 struct completion halt_complete; 140 struct mutex power_lock; 141 int power_count; 142 struct mutex stream_lock; 143 int stream_count; 144 spinlock_t output_lock; 145 enum vfe_line_id wm_output_map[MSM_VFE_IMAGE_MASTERS_NUM]; 146 struct vfe_line line[VFE_LINE_NUM_MAX]; 147 u8 line_num; 148 u32 reg_update; 149 u8 was_streaming; 150 const struct vfe_hw_ops *ops; 151 const struct vfe_hw_ops_gen1 *ops_gen1; 152 struct vfe_isr_ops isr_ops; 153 struct camss_video_ops video_ops; 154}; 155 156struct resources; 157 158int msm_vfe_subdev_init(struct camss *camss, struct vfe_device *vfe, 159 const struct resources *res, u8 id); 160 161int msm_vfe_register_entities(struct vfe_device *vfe, 162 struct v4l2_device *v4l2_dev); 163 164void msm_vfe_unregister_entities(struct vfe_device *vfe); 165 166void msm_vfe_get_vfe_id(struct media_entity *entity, u8 *id); 167void msm_vfe_get_vfe_line_id(struct media_entity *entity, enum vfe_line_id *id); 168 169/* 170 * vfe_buf_add_pending - Add output buffer to list of pending 171 * @output: VFE output 172 * @buffer: Video buffer 173 */ 174void vfe_buf_add_pending(struct vfe_output *output, struct camss_buffer *buffer); 175 176struct camss_buffer *vfe_buf_get_pending(struct vfe_output *output); 177 178int vfe_flush_buffers(struct camss_video *vid, enum vb2_buffer_state state); 179 180/* 181 * vfe_isr_comp_done - Process composite image done interrupt 182 * @vfe: VFE Device 183 * @comp: Composite image id 184 */ 185void vfe_isr_comp_done(struct vfe_device *vfe, u8 comp); 186 187void vfe_isr_reset_ack(struct vfe_device *vfe); 188int vfe_put_output(struct vfe_line *line); 189int vfe_release_wm(struct vfe_device *vfe, u8 wm); 190int vfe_reserve_wm(struct vfe_device *vfe, enum vfe_line_id line_id); 191 192/* 193 * vfe_reset - Trigger reset on VFE module and wait to complete 194 * @vfe: VFE device 195 * 196 * Return 0 on success or a negative error code otherwise 197 */ 198int vfe_reset(struct vfe_device *vfe); 199 200extern const struct vfe_hw_ops vfe_ops_4_1; 201extern const struct vfe_hw_ops vfe_ops_4_7; 202extern const struct vfe_hw_ops vfe_ops_4_8; 203extern const struct vfe_hw_ops vfe_ops_170; 204extern const struct vfe_hw_ops vfe_ops_480; 205 206int vfe_get(struct vfe_device *vfe); 207void vfe_put(struct vfe_device *vfe); 208 209#endif /* QC_MSM_CAMSS_VFE_H */