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