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 | |