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