1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * ispstat.h 4 * 5 * TI OMAP3 ISP - Statistics core 6 * 7 * Copyright (C) 2010 Nokia Corporation 8 * Copyright (C) 2009 Texas Instruments, Inc 9 * 10 * Contacts: David Cohen <dacohen@gmail.com> 11 * Laurent Pinchart <laurent.pinchart@ideasonboard.com> 12 * Sakari Ailus <sakari.ailus@iki.fi> 13 */ 14 15 #ifndef OMAP3_ISP_STAT_H 16 #define OMAP3_ISP_STAT_H 17 18 #include <linux/types.h> 19 #include <linux/omap3isp.h> 20 #include <media/v4l2-event.h> 21 22 #include "isp.h" 23 #include "ispvideo.h" 24 25 #define STAT_MAX_BUFS 5 26 #define STAT_NEVENTS 8 27 28 #define STAT_BUF_DONE 0 /* Buffer is ready */ 29 #define STAT_NO_BUF 1 /* An error has occurred */ 30 #define STAT_BUF_WAITING_DMA 2 /* Histogram only: DMA is running */ 31 32 struct dma_chan; 33 struct ispstat; 34 35 struct ispstat_buffer { 36 struct sg_table sgt; 37 void *virt_addr; 38 dma_addr_t dma_addr; 39 struct timespec64 ts; 40 u32 buf_size; 41 u32 frame_number; 42 u16 config_counter; 43 u8 empty; 44 }; 45 46 struct ispstat_ops { 47 /* 48 * Validate new params configuration. 49 * new_conf->buf_size value must be changed to the exact buffer size 50 * necessary for the new configuration if it's smaller. 51 */ 52 int (*validate_params)(struct ispstat *stat, void *new_conf); 53 54 /* 55 * Save new params configuration. 56 * stat->priv->buf_size value must be set to the exact buffer size for 57 * the new configuration. 58 * stat->update is set to 1 if new configuration is different than 59 * current one. 60 */ 61 void (*set_params)(struct ispstat *stat, void *new_conf); 62 63 /* Apply stored configuration. */ 64 void (*setup_regs)(struct ispstat *stat, void *priv); 65 66 /* Enable/Disable module. */ 67 void (*enable)(struct ispstat *stat, int enable); 68 69 /* Verify is module is busy. */ 70 int (*busy)(struct ispstat *stat); 71 72 /* Used for specific operations during generic buf process task. */ 73 int (*buf_process)(struct ispstat *stat); 74 }; 75 76 enum ispstat_state_t { 77 ISPSTAT_DISABLED = 0, 78 ISPSTAT_DISABLING, 79 ISPSTAT_ENABLED, 80 ISPSTAT_ENABLING, 81 ISPSTAT_SUSPENDED, 82 }; 83 84 struct ispstat { 85 struct v4l2_subdev subdev; 86 struct media_pad pad; /* sink pad */ 87 88 /* Control */ 89 unsigned configured:1; 90 unsigned update:1; 91 unsigned buf_processing:1; 92 unsigned sbl_ovl_recover:1; 93 u8 inc_config; 94 atomic_t buf_err; 95 enum ispstat_state_t state; /* enabling/disabling state */ 96 struct isp_device *isp; 97 void *priv; /* pointer to priv config struct */ 98 void *recover_priv; /* pointer to recover priv configuration */ 99 struct mutex ioctl_lock; /* serialize private ioctl */ 100 101 const struct ispstat_ops *ops; 102 103 /* Buffer */ 104 u8 wait_acc_frames; 105 u16 config_counter; 106 u32 frame_number; 107 u32 buf_size; 108 u32 buf_alloc_size; 109 struct dma_chan *dma_ch; 110 unsigned long event_type; 111 struct ispstat_buffer *buf; 112 struct ispstat_buffer *active_buf; 113 struct ispstat_buffer *locked_buf; 114 }; 115 116 struct ispstat_generic_config { 117 /* 118 * Fields must be in the same order as in: 119 * - omap3isp_h3a_aewb_config 120 * - omap3isp_h3a_af_config 121 * - omap3isp_hist_config 122 */ 123 u32 buf_size; 124 u16 config_counter; 125 }; 126 127 int omap3isp_stat_config(struct ispstat *stat, void *new_conf); 128 int omap3isp_stat_request_statistics(struct ispstat *stat, 129 struct omap3isp_stat_data *data); 130 int omap3isp_stat_request_statistics_time32(struct ispstat *stat, 131 struct omap3isp_stat_data_time32 *data); 132 int omap3isp_stat_init(struct ispstat *stat, const char *name, 133 const struct v4l2_subdev_ops *sd_ops); 134 void omap3isp_stat_cleanup(struct ispstat *stat); 135 int omap3isp_stat_subscribe_event(struct v4l2_subdev *subdev, 136 struct v4l2_fh *fh, 137 struct v4l2_event_subscription *sub); 138 int omap3isp_stat_unsubscribe_event(struct v4l2_subdev *subdev, 139 struct v4l2_fh *fh, 140 struct v4l2_event_subscription *sub); 141 int omap3isp_stat_s_stream(struct v4l2_subdev *subdev, int enable); 142 143 int omap3isp_stat_busy(struct ispstat *stat); 144 int omap3isp_stat_pcr_busy(struct ispstat *stat); 145 void omap3isp_stat_suspend(struct ispstat *stat); 146 void omap3isp_stat_resume(struct ispstat *stat); 147 int omap3isp_stat_enable(struct ispstat *stat, u8 enable); 148 void omap3isp_stat_sbl_overflow(struct ispstat *stat); 149 void omap3isp_stat_isr(struct ispstat *stat); 150 void omap3isp_stat_isr_frame_sync(struct ispstat *stat); 151 void omap3isp_stat_dma_isr(struct ispstat *stat); 152 int omap3isp_stat_register_entities(struct ispstat *stat, 153 struct v4l2_device *vdev); 154 void omap3isp_stat_unregister_entities(struct ispstat *stat); 155 156 #endif /* OMAP3_ISP_STAT_H */ 157