diff options
Diffstat (limited to 'include/media/v4l2-subdev.h')
-rw-r--r-- | include/media/v4l2-subdev.h | 103 |
1 files changed, 99 insertions, 4 deletions
diff --git a/include/media/v4l2-subdev.h b/include/media/v4l2-subdev.h index d411345f244b..00bf17608453 100644 --- a/include/media/v4l2-subdev.h +++ b/include/media/v4l2-subdev.h | |||
@@ -23,6 +23,16 @@ | |||
23 | 23 | ||
24 | #include <media/v4l2-common.h> | 24 | #include <media/v4l2-common.h> |
25 | 25 | ||
26 | /* generic v4l2_device notify callback notification values */ | ||
27 | #define V4L2_SUBDEV_IR_RX_NOTIFY _IOW('v', 0, u32) | ||
28 | #define V4L2_SUBDEV_IR_RX_FIFO_SERVICE_REQ 0x00000001 | ||
29 | #define V4L2_SUBDEV_IR_RX_END_OF_RX_DETECTED 0x00000002 | ||
30 | #define V4L2_SUBDEV_IR_RX_HW_FIFO_OVERRUN 0x00000004 | ||
31 | #define V4L2_SUBDEV_IR_RX_SW_FIFO_OVERRUN 0x00000008 | ||
32 | |||
33 | #define V4L2_SUBDEV_IR_TX_NOTIFY _IOW('v', 1, u32) | ||
34 | #define V4L2_SUBDEV_IR_TX_FIFO_SERVICE_REQ 0x00000001 | ||
35 | |||
26 | struct v4l2_device; | 36 | struct v4l2_device; |
27 | struct v4l2_subdev; | 37 | struct v4l2_subdev; |
28 | struct tuner_setup; | 38 | struct tuner_setup; |
@@ -96,6 +106,9 @@ struct v4l2_decode_vbi_line { | |||
96 | 106 | ||
97 | s_gpio: set GPIO pins. Very simple right now, might need to be extended with | 107 | s_gpio: set GPIO pins. Very simple right now, might need to be extended with |
98 | a direction argument if needed. | 108 | a direction argument if needed. |
109 | |||
110 | s_power: puts subdevice in power saving mode (on == 0) or normal operation | ||
111 | mode (on == 1). | ||
99 | */ | 112 | */ |
100 | struct v4l2_subdev_core_ops { | 113 | struct v4l2_subdev_core_ops { |
101 | int (*g_chip_ident)(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *chip); | 114 | int (*g_chip_ident)(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *chip); |
@@ -118,6 +131,7 @@ struct v4l2_subdev_core_ops { | |||
118 | int (*g_register)(struct v4l2_subdev *sd, struct v4l2_dbg_register *reg); | 131 | int (*g_register)(struct v4l2_subdev *sd, struct v4l2_dbg_register *reg); |
119 | int (*s_register)(struct v4l2_subdev *sd, struct v4l2_dbg_register *reg); | 132 | int (*s_register)(struct v4l2_subdev *sd, struct v4l2_dbg_register *reg); |
120 | #endif | 133 | #endif |
134 | int (*s_power)(struct v4l2_subdev *sd, int on); | ||
121 | }; | 135 | }; |
122 | 136 | ||
123 | /* s_mode: switch the tuner to a specific tuner mode. Replacement of s_radio. | 137 | /* s_mode: switch the tuner to a specific tuner mode. Replacement of s_radio. |
@@ -127,8 +141,6 @@ struct v4l2_subdev_core_ops { | |||
127 | s_type_addr: sets tuner type and its I2C addr. | 141 | s_type_addr: sets tuner type and its I2C addr. |
128 | 142 | ||
129 | s_config: sets tda9887 specific stuff, like port1, port2 and qss | 143 | s_config: sets tda9887 specific stuff, like port1, port2 and qss |
130 | |||
131 | s_standby: puts tuner on powersaving state, disabling it, except for i2c. | ||
132 | */ | 144 | */ |
133 | struct v4l2_subdev_tuner_ops { | 145 | struct v4l2_subdev_tuner_ops { |
134 | int (*s_mode)(struct v4l2_subdev *sd, enum v4l2_tuner_type); | 146 | int (*s_mode)(struct v4l2_subdev *sd, enum v4l2_tuner_type); |
@@ -141,7 +153,6 @@ struct v4l2_subdev_tuner_ops { | |||
141 | int (*s_modulator)(struct v4l2_subdev *sd, struct v4l2_modulator *vm); | 153 | int (*s_modulator)(struct v4l2_subdev *sd, struct v4l2_modulator *vm); |
142 | int (*s_type_addr)(struct v4l2_subdev *sd, struct tuner_setup *type); | 154 | int (*s_type_addr)(struct v4l2_subdev *sd, struct tuner_setup *type); |
143 | int (*s_config)(struct v4l2_subdev *sd, const struct v4l2_priv_tun_config *config); | 155 | int (*s_config)(struct v4l2_subdev *sd, const struct v4l2_priv_tun_config *config); |
144 | int (*s_standby)(struct v4l2_subdev *sd); | ||
145 | }; | 156 | }; |
146 | 157 | ||
147 | /* s_clock_freq: set the frequency (in Hz) of the audio clock output. | 158 | /* s_clock_freq: set the frequency (in Hz) of the audio clock output. |
@@ -231,11 +242,95 @@ struct v4l2_subdev_video_ops { | |||
231 | int (*enum_frameintervals)(struct v4l2_subdev *sd, struct v4l2_frmivalenum *fival); | 242 | int (*enum_frameintervals)(struct v4l2_subdev *sd, struct v4l2_frmivalenum *fival); |
232 | }; | 243 | }; |
233 | 244 | ||
245 | /* | ||
246 | interrupt_service_routine: Called by the bridge chip's interrupt service | ||
247 | handler, when an IR interrupt status has be raised due to this subdev, | ||
248 | so that this subdev can handle the details. It may schedule work to be | ||
249 | performed later. It must not sleep. *Called from an IRQ context*. | ||
250 | |||
251 | [rt]x_g_parameters: Get the current operating parameters and state of the | ||
252 | the IR receiver or transmitter. | ||
253 | |||
254 | [rt]x_s_parameters: Set the current operating parameters and state of the | ||
255 | the IR receiver or transmitter. It is recommended to call | ||
256 | [rt]x_g_parameters first to fill out the current state, and only change | ||
257 | the fields that need to be changed. Upon return, the actual device | ||
258 | operating parameters and state will be returned. Note that hardware | ||
259 | limitations may prevent the actual settings from matching the requested | ||
260 | settings - e.g. an actual carrier setting of 35,904 Hz when 36,000 Hz | ||
261 | was requested. An exception is when the shutdown parameter is true. | ||
262 | The last used operational parameters will be returned, but the actual | ||
263 | state of the hardware be different to minimize power consumption and | ||
264 | processing when shutdown is true. | ||
265 | |||
266 | rx_read: Reads received codes or pulse width data. | ||
267 | The semantics are similar to a non-blocking read() call. | ||
268 | |||
269 | tx_write: Writes codes or pulse width data for transmission. | ||
270 | The semantics are similar to a non-blocking write() call. | ||
271 | */ | ||
272 | |||
273 | enum v4l2_subdev_ir_mode { | ||
274 | V4L2_SUBDEV_IR_MODE_PULSE_WIDTH, /* space & mark widths in nanosecs */ | ||
275 | }; | ||
276 | |||
277 | /* Data format of data read or written for V4L2_SUBDEV_IR_MODE_PULSE_WIDTH */ | ||
278 | #define V4L2_SUBDEV_IR_PULSE_MAX_WIDTH_NS 0x7fffffff | ||
279 | #define V4L2_SUBDEV_IR_PULSE_LEVEL_MASK 0x80000000 | ||
280 | #define V4L2_SUBDEV_IR_PULSE_RX_SEQ_END 0xffffffff | ||
281 | |||
282 | struct v4l2_subdev_ir_parameters { | ||
283 | /* Either Rx or Tx */ | ||
284 | unsigned int bytes_per_data_element; /* of data in read or write call */ | ||
285 | enum v4l2_subdev_ir_mode mode; | ||
286 | |||
287 | bool enable; | ||
288 | bool interrupt_enable; | ||
289 | bool shutdown; /* true: set hardware to low/no power, false: normal */ | ||
290 | |||
291 | bool modulation; /* true: uses carrier, false: baseband */ | ||
292 | u32 max_pulse_width; /* ns, valid only for baseband signal */ | ||
293 | unsigned int carrier_freq; /* Hz, valid only for modulated signal*/ | ||
294 | unsigned int duty_cycle; /* percent, valid only for modulated signal*/ | ||
295 | bool invert; /* logically invert sense of mark/space */ | ||
296 | |||
297 | /* Rx only */ | ||
298 | u32 noise_filter_min_width; /* ns, min time of a valid pulse */ | ||
299 | unsigned int carrier_range_lower; /* Hz, valid only for modulated sig */ | ||
300 | unsigned int carrier_range_upper; /* Hz, valid only for modulated sig */ | ||
301 | u32 resolution; /* ns */ | ||
302 | }; | ||
303 | |||
304 | struct v4l2_subdev_ir_ops { | ||
305 | /* Common to receiver and transmitter */ | ||
306 | int (*interrupt_service_routine)(struct v4l2_subdev *sd, | ||
307 | u32 status, bool *handled); | ||
308 | |||
309 | /* Receiver */ | ||
310 | int (*rx_read)(struct v4l2_subdev *sd, u8 *buf, size_t count, | ||
311 | ssize_t *num); | ||
312 | |||
313 | int (*rx_g_parameters)(struct v4l2_subdev *sd, | ||
314 | struct v4l2_subdev_ir_parameters *params); | ||
315 | int (*rx_s_parameters)(struct v4l2_subdev *sd, | ||
316 | struct v4l2_subdev_ir_parameters *params); | ||
317 | |||
318 | /* Transmitter */ | ||
319 | int (*tx_write)(struct v4l2_subdev *sd, u8 *buf, size_t count, | ||
320 | ssize_t *num); | ||
321 | |||
322 | int (*tx_g_parameters)(struct v4l2_subdev *sd, | ||
323 | struct v4l2_subdev_ir_parameters *params); | ||
324 | int (*tx_s_parameters)(struct v4l2_subdev *sd, | ||
325 | struct v4l2_subdev_ir_parameters *params); | ||
326 | }; | ||
327 | |||
234 | struct v4l2_subdev_ops { | 328 | struct v4l2_subdev_ops { |
235 | const struct v4l2_subdev_core_ops *core; | 329 | const struct v4l2_subdev_core_ops *core; |
236 | const struct v4l2_subdev_tuner_ops *tuner; | 330 | const struct v4l2_subdev_tuner_ops *tuner; |
237 | const struct v4l2_subdev_audio_ops *audio; | 331 | const struct v4l2_subdev_audio_ops *audio; |
238 | const struct v4l2_subdev_video_ops *video; | 332 | const struct v4l2_subdev_video_ops *video; |
333 | const struct v4l2_subdev_ir_ops *ir; | ||
239 | }; | 334 | }; |
240 | 335 | ||
241 | #define V4L2_SUBDEV_NAME_SIZE 32 | 336 | #define V4L2_SUBDEV_NAME_SIZE 32 |
@@ -290,7 +385,7 @@ static inline void v4l2_subdev_init(struct v4l2_subdev *sd, | |||
290 | Example: err = v4l2_subdev_call(sd, core, g_chip_ident, &chip); | 385 | Example: err = v4l2_subdev_call(sd, core, g_chip_ident, &chip); |
291 | */ | 386 | */ |
292 | #define v4l2_subdev_call(sd, o, f, args...) \ | 387 | #define v4l2_subdev_call(sd, o, f, args...) \ |
293 | (!(sd) ? -ENODEV : (((sd) && (sd)->ops->o && (sd)->ops->o->f) ? \ | 388 | (!(sd) ? -ENODEV : (((sd)->ops->o && (sd)->ops->o->f) ? \ |
294 | (sd)->ops->o->f((sd) , ##args) : -ENOIOCTLCMD)) | 389 | (sd)->ops->o->f((sd) , ##args) : -ENOIOCTLCMD)) |
295 | 390 | ||
296 | /* Send a notification to v4l2_device. */ | 391 | /* Send a notification to v4l2_device. */ |