1b873663bSTodor Tomov /* SPDX-License-Identifier: GPL-2.0 */ 2ec6859b2STodor Tomov /* 3ec6859b2STodor Tomov * camss-vfe.h 4ec6859b2STodor Tomov * 5ec6859b2STodor Tomov * Qualcomm MSM Camera Subsystem - VFE (Video Front End) Module 6ec6859b2STodor Tomov * 7ec6859b2STodor Tomov * Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. 8ec6859b2STodor Tomov * Copyright (C) 2015-2018 Linaro Ltd. 9ec6859b2STodor Tomov */ 10ec6859b2STodor Tomov #ifndef QC_MSM_CAMSS_VFE_H 11ec6859b2STodor Tomov #define QC_MSM_CAMSS_VFE_H 12ec6859b2STodor Tomov 13ec6859b2STodor Tomov #include <linux/clk.h> 14ec6859b2STodor Tomov #include <linux/spinlock_types.h> 15ec6859b2STodor Tomov #include <media/media-entity.h> 16ec6859b2STodor Tomov #include <media/v4l2-device.h> 17ec6859b2STodor Tomov #include <media/v4l2-subdev.h> 18ec6859b2STodor Tomov 19ec6859b2STodor Tomov #include "camss-video.h" 20633b388fSRobert Foss #include "camss-vfe-gen1.h" 21ec6859b2STodor Tomov 22ec6859b2STodor Tomov #define MSM_VFE_PAD_SINK 0 23ec6859b2STodor Tomov #define MSM_VFE_PAD_SRC 1 24ec6859b2STodor Tomov #define MSM_VFE_PADS_NUM 2 25ec6859b2STodor Tomov 26ec6859b2STodor Tomov #define MSM_VFE_IMAGE_MASTERS_NUM 7 27ec6859b2STodor Tomov #define MSM_VFE_COMPOSITE_IRQ_NUM 4 28ec6859b2STodor Tomov 29633b388fSRobert Foss /* VFE halt timeout */ 30633b388fSRobert Foss #define VFE_HALT_TIMEOUT_MS 100 31633b388fSRobert Foss /* Frame drop value. VAL + UPDATES - 1 should not exceed 31 */ 32633b388fSRobert Foss #define VFE_FRAME_DROP_VAL 30 33633b388fSRobert Foss 34633b388fSRobert Foss #define vfe_line_array(ptr_line) \ 35633b388fSRobert Foss ((const struct vfe_line (*)[]) &(ptr_line)[-(ptr_line)->id]) 36633b388fSRobert Foss 37633b388fSRobert Foss #define to_vfe(ptr_line) \ 38633b388fSRobert Foss container_of(vfe_line_array(ptr_line), struct vfe_device, line) 39633b388fSRobert Foss 40ec6859b2STodor Tomov enum vfe_output_state { 41ec6859b2STodor Tomov VFE_OUTPUT_OFF, 42ec6859b2STodor Tomov VFE_OUTPUT_RESERVED, 43ec6859b2STodor Tomov VFE_OUTPUT_SINGLE, 44ec6859b2STodor Tomov VFE_OUTPUT_CONTINUOUS, 45ec6859b2STodor Tomov VFE_OUTPUT_IDLE, 467319cdf1SRobert Foss VFE_OUTPUT_STOPPING, 477319cdf1SRobert Foss VFE_OUTPUT_ON, 48ec6859b2STodor Tomov }; 49ec6859b2STodor Tomov 50ec6859b2STodor Tomov enum vfe_line_id { 51ec6859b2STodor Tomov VFE_LINE_NONE = -1, 52ec6859b2STodor Tomov VFE_LINE_RDI0 = 0, 53ec6859b2STodor Tomov VFE_LINE_RDI1 = 1, 54ec6859b2STodor Tomov VFE_LINE_RDI2 = 2, 557319cdf1SRobert Foss VFE_LINE_NUM_GEN2 = 3, 56633b388fSRobert Foss VFE_LINE_PIX = 3, 57633b388fSRobert Foss VFE_LINE_NUM_GEN1 = 4, 58633b388fSRobert Foss VFE_LINE_NUM_MAX = 4 59ec6859b2STodor Tomov }; 60ec6859b2STodor Tomov 61ec6859b2STodor Tomov struct vfe_output { 62ec6859b2STodor Tomov u8 wm_num; 63ec6859b2STodor Tomov u8 wm_idx[3]; 64ec6859b2STodor Tomov 65ec6859b2STodor Tomov struct camss_buffer *buf[2]; 66ec6859b2STodor Tomov struct camss_buffer *last_buffer; 67ec6859b2STodor Tomov struct list_head pending_bufs; 68ec6859b2STodor Tomov 69ec6859b2STodor Tomov unsigned int drop_update_idx; 70ec6859b2STodor Tomov 71633b388fSRobert Foss union { 72633b388fSRobert Foss struct { 73633b388fSRobert Foss int active_buf; 74633b388fSRobert Foss int wait_sof; 75633b388fSRobert Foss } gen1; 767319cdf1SRobert Foss struct { 777319cdf1SRobert Foss int active_num; 787319cdf1SRobert Foss } gen2; 79633b388fSRobert Foss }; 80ec6859b2STodor Tomov enum vfe_output_state state; 81ec6859b2STodor Tomov unsigned int sequence; 82633b388fSRobert Foss 83ec6859b2STodor Tomov int wait_reg_update; 84ec6859b2STodor Tomov struct completion sof; 85ec6859b2STodor Tomov struct completion reg_update; 86ec6859b2STodor Tomov }; 87ec6859b2STodor Tomov 88ec6859b2STodor Tomov struct vfe_line { 89ec6859b2STodor Tomov enum vfe_line_id id; 90ec6859b2STodor Tomov struct v4l2_subdev subdev; 91ec6859b2STodor Tomov struct media_pad pads[MSM_VFE_PADS_NUM]; 92ec6859b2STodor Tomov struct v4l2_mbus_framefmt fmt[MSM_VFE_PADS_NUM]; 93ec6859b2STodor Tomov struct v4l2_rect compose; 94ec6859b2STodor Tomov struct v4l2_rect crop; 95ec6859b2STodor Tomov struct camss_video video_out; 96ec6859b2STodor Tomov struct vfe_output output; 97cba3819dSTodor Tomov const struct vfe_format *formats; 98cba3819dSTodor Tomov unsigned int nformats; 99ec6859b2STodor Tomov }; 100ec6859b2STodor Tomov 101051a01acSTodor Tomov struct vfe_device; 102051a01acSTodor Tomov 103051a01acSTodor Tomov struct vfe_hw_ops { 104633b388fSRobert Foss void (*enable_irq_common)(struct vfe_device *vfe); 105051a01acSTodor Tomov void (*global_reset)(struct vfe_device *vfe); 106d2e86540SRobert Foss u32 (*hw_version)(struct vfe_device *vfe); 107633b388fSRobert Foss irqreturn_t (*isr)(int irq, void *dev); 108633b388fSRobert Foss void (*isr_read)(struct vfe_device *vfe, u32 *value0, u32 *value1); 1092f6f8af6SRobert Foss void (*pm_domain_off)(struct vfe_device *vfe); 1102f6f8af6SRobert Foss int (*pm_domain_on)(struct vfe_device *vfe); 111051a01acSTodor Tomov void (*reg_update)(struct vfe_device *vfe, enum vfe_line_id line_id); 112051a01acSTodor Tomov void (*reg_update_clear)(struct vfe_device *vfe, 113051a01acSTodor Tomov enum vfe_line_id line_id); 114633b388fSRobert Foss void (*subdev_init)(struct device *dev, struct vfe_device *vfe); 115633b388fSRobert Foss int (*vfe_disable)(struct vfe_line *line); 116633b388fSRobert Foss int (*vfe_enable)(struct vfe_line *line); 117633b388fSRobert Foss int (*vfe_halt)(struct vfe_device *vfe); 118051a01acSTodor Tomov void (*violation_read)(struct vfe_device *vfe); 119051a01acSTodor Tomov }; 120051a01acSTodor Tomov 121051a01acSTodor Tomov struct vfe_isr_ops { 122051a01acSTodor Tomov void (*reset_ack)(struct vfe_device *vfe); 123051a01acSTodor Tomov void (*halt_ack)(struct vfe_device *vfe); 124051a01acSTodor Tomov void (*reg_update)(struct vfe_device *vfe, enum vfe_line_id line_id); 125051a01acSTodor Tomov void (*sof)(struct vfe_device *vfe, enum vfe_line_id line_id); 126051a01acSTodor Tomov void (*comp_done)(struct vfe_device *vfe, u8 comp); 127051a01acSTodor Tomov void (*wm_done)(struct vfe_device *vfe, u8 wm); 128051a01acSTodor Tomov }; 129051a01acSTodor Tomov 130ec6859b2STodor Tomov struct vfe_device { 1319c3e59deSTodor Tomov struct camss *camss; 132ec6859b2STodor Tomov u8 id; 133ec6859b2STodor Tomov void __iomem *base; 134ec6859b2STodor Tomov u32 irq; 135ec6859b2STodor Tomov char irq_name[30]; 136ec6859b2STodor Tomov struct camss_clock *clock; 137ec6859b2STodor Tomov int nclocks; 138ec6859b2STodor Tomov struct completion reset_complete; 139ec6859b2STodor Tomov struct completion halt_complete; 140ec6859b2STodor Tomov struct mutex power_lock; 141ec6859b2STodor Tomov int power_count; 142ec6859b2STodor Tomov struct mutex stream_lock; 143ec6859b2STodor Tomov int stream_count; 144ec6859b2STodor Tomov spinlock_t output_lock; 145ec6859b2STodor Tomov enum vfe_line_id wm_output_map[MSM_VFE_IMAGE_MASTERS_NUM]; 146633b388fSRobert Foss struct vfe_line line[VFE_LINE_NUM_MAX]; 147633b388fSRobert Foss u8 line_num; 148ec6859b2STodor Tomov u32 reg_update; 149ec6859b2STodor Tomov u8 was_streaming; 150051a01acSTodor Tomov const struct vfe_hw_ops *ops; 151633b388fSRobert Foss const struct vfe_hw_ops_gen1 *ops_gen1; 152051a01acSTodor Tomov struct vfe_isr_ops isr_ops; 153633b388fSRobert Foss struct camss_video_ops video_ops; 154ec6859b2STodor Tomov }; 155ec6859b2STodor Tomov 156ec6859b2STodor Tomov struct resources; 157ec6859b2STodor Tomov 1589c3e59deSTodor Tomov int msm_vfe_subdev_init(struct camss *camss, struct vfe_device *vfe, 1599c3e59deSTodor Tomov const struct resources *res, u8 id); 160ec6859b2STodor Tomov 161ec6859b2STodor Tomov int msm_vfe_register_entities(struct vfe_device *vfe, 162ec6859b2STodor Tomov struct v4l2_device *v4l2_dev); 163ec6859b2STodor Tomov 164ec6859b2STodor Tomov void msm_vfe_unregister_entities(struct vfe_device *vfe); 165ec6859b2STodor Tomov 166ec6859b2STodor Tomov void msm_vfe_get_vfe_id(struct media_entity *entity, u8 *id); 167ec6859b2STodor Tomov void msm_vfe_get_vfe_line_id(struct media_entity *entity, enum vfe_line_id *id); 168ec6859b2STodor Tomov 169633b388fSRobert Foss /* 170633b388fSRobert Foss * vfe_buf_add_pending - Add output buffer to list of pending 171633b388fSRobert Foss * @output: VFE output 172633b388fSRobert Foss * @buffer: Video buffer 173633b388fSRobert Foss */ 174633b388fSRobert Foss void vfe_buf_add_pending(struct vfe_output *output, struct camss_buffer *buffer); 175633b388fSRobert Foss 176633b388fSRobert Foss struct camss_buffer *vfe_buf_get_pending(struct vfe_output *output); 177633b388fSRobert Foss 178633b388fSRobert Foss int vfe_flush_buffers(struct camss_video *vid, enum vb2_buffer_state state); 179633b388fSRobert Foss 180633b388fSRobert Foss /* 181633b388fSRobert Foss * vfe_isr_comp_done - Process composite image done interrupt 182633b388fSRobert Foss * @vfe: VFE Device 183633b388fSRobert Foss * @comp: Composite image id 184633b388fSRobert Foss */ 185633b388fSRobert Foss void vfe_isr_comp_done(struct vfe_device *vfe, u8 comp); 186633b388fSRobert Foss 187633b388fSRobert Foss void vfe_isr_reset_ack(struct vfe_device *vfe); 188633b388fSRobert Foss int vfe_put_output(struct vfe_line *line); 189633b388fSRobert Foss int vfe_release_wm(struct vfe_device *vfe, u8 wm); 190633b388fSRobert Foss int vfe_reserve_wm(struct vfe_device *vfe, enum vfe_line_id line_id); 191633b388fSRobert Foss 1927319cdf1SRobert Foss /* 1937319cdf1SRobert Foss * vfe_reset - Trigger reset on VFE module and wait to complete 1947319cdf1SRobert Foss * @vfe: VFE device 1957319cdf1SRobert Foss * 1967319cdf1SRobert Foss * Return 0 on success or a negative error code otherwise 1977319cdf1SRobert Foss */ 1987319cdf1SRobert Foss int vfe_reset(struct vfe_device *vfe); 1997319cdf1SRobert Foss 200051a01acSTodor Tomov extern const struct vfe_hw_ops vfe_ops_4_1; 2014e1abf66STodor Tomov extern const struct vfe_hw_ops vfe_ops_4_7; 20240296e71SAngeloGioacchino Del Regno extern const struct vfe_hw_ops vfe_ops_4_8; 2037319cdf1SRobert Foss extern const struct vfe_hw_ops vfe_ops_170; 204*4edc8eaeSJonathan Marek extern const struct vfe_hw_ops vfe_ops_480; 205051a01acSTodor Tomov 206ec6859b2STodor Tomov #endif /* QC_MSM_CAMSS_VFE_H */ 207