linux/drivers/media/platform/qcom/camss/camss-vfe.h
<<
>>
Prefs
   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        void (*hw_version_read)(struct vfe_device *vfe, struct device *dev);
 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;
 204
 205#endif /* QC_MSM_CAMSS_VFE_H */
 206