mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-04 01:49:36 +00:00
V4L/DVB (13096): v4l2-subdev: Add v4l2_subdev_ir_ops and IR notify defines for v4l2_device
Add v4l2_subdev_ir_ops and IR notify defines for v4l2_device. This change is specifically needed at this time to support the integrated IR controller in the CX2388[58] chips. Signed-off-by: Andy Walls <awalls@radix.net> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
8c2d7821d4
commit
1d986add96
1 changed files with 94 additions and 0 deletions
|
@ -23,6 +23,16 @@
|
|||
|
||||
#include <media/v4l2-common.h>
|
||||
|
||||
/* generic v4l2_device notify callback notification values */
|
||||
#define V4L2_SUBDEV_IR_RX_NOTIFY _IOW('v', 0, u32)
|
||||
#define V4L2_SUBDEV_IR_RX_FIFO_SERVICE_REQ 0x00000001
|
||||
#define V4L2_SUBDEV_IR_RX_END_OF_RX_DETECTED 0x00000002
|
||||
#define V4L2_SUBDEV_IR_RX_HW_FIFO_OVERRUN 0x00000004
|
||||
#define V4L2_SUBDEV_IR_RX_SW_FIFO_OVERRUN 0x00000008
|
||||
|
||||
#define V4L2_SUBDEV_IR_TX_NOTIFY _IOW('v', 1, u32)
|
||||
#define V4L2_SUBDEV_IR_TX_FIFO_SERVICE_REQ 0x00000001
|
||||
|
||||
struct v4l2_device;
|
||||
struct v4l2_subdev;
|
||||
struct tuner_setup;
|
||||
|
@ -231,11 +241,95 @@ struct v4l2_subdev_video_ops {
|
|||
int (*enum_frameintervals)(struct v4l2_subdev *sd, struct v4l2_frmivalenum *fival);
|
||||
};
|
||||
|
||||
/*
|
||||
interrupt_service_routine: Called by the bridge chip's interrupt service
|
||||
handler, when an IR interrupt status has be raised due to this subdev,
|
||||
so that this subdev can handle the details. It may schedule work to be
|
||||
performed later. It must not sleep. *Called from an IRQ context*.
|
||||
|
||||
[rt]x_g_parameters: Get the current operating parameters and state of the
|
||||
the IR receiver or transmitter.
|
||||
|
||||
[rt]x_s_parameters: Set the current operating parameters and state of the
|
||||
the IR receiver or transmitter. It is recommended to call
|
||||
[rt]x_g_parameters first to fill out the current state, and only change
|
||||
the fields that need to be changed. Upon return, the actual device
|
||||
operating parameters and state will be returned. Note that hardware
|
||||
limitations may prevent the actual settings from matching the requested
|
||||
settings - e.g. an actual carrier setting of 35,904 Hz when 36,000 Hz
|
||||
was requested. An exception is when the shutdown parameter is true.
|
||||
The last used operational parameters will be returned, but the actual
|
||||
state of the hardware be different to minimize power consumption and
|
||||
processing when shutdown is true.
|
||||
|
||||
rx_read: Reads received codes or pulse width data.
|
||||
The semantics are similar to a non-blocking read() call.
|
||||
|
||||
tx_write: Writes codes or pulse width data for transmission.
|
||||
The semantics are similar to a non-blocking write() call.
|
||||
*/
|
||||
|
||||
enum v4l2_subdev_ir_mode {
|
||||
V4L2_SUBDEV_IR_MODE_PULSE_WIDTH, /* space & mark widths in nanosecs */
|
||||
};
|
||||
|
||||
/* Data format of data read or written for V4L2_SUBDEV_IR_MODE_PULSE_WIDTH */
|
||||
#define V4L2_SUBDEV_IR_PULSE_MAX_WIDTH_NS 0x7fffffff
|
||||
#define V4L2_SUBDEV_IR_PULSE_LEVEL_MASK 0x80000000
|
||||
#define V4L2_SUBDEV_IR_PULSE_RX_SEQ_END 0xffffffff
|
||||
|
||||
struct v4l2_subdev_ir_parameters {
|
||||
/* Either Rx or Tx */
|
||||
unsigned int bytes_per_data_element; /* of data in read or write call */
|
||||
enum v4l2_subdev_ir_mode mode;
|
||||
|
||||
bool enable;
|
||||
bool interrupt_enable;
|
||||
bool shutdown; /* true: set hardware to low/no power, false: normal */
|
||||
|
||||
bool modulation; /* true: uses carrier, false: baseband */
|
||||
u32 max_pulse_width; /* ns, valid only for baseband signal */
|
||||
unsigned int carrier_freq; /* Hz, valid only for modulated signal*/
|
||||
unsigned int duty_cycle; /* percent, valid only for modulated signal*/
|
||||
bool invert; /* logically invert sense of mark/space */
|
||||
|
||||
/* Rx only */
|
||||
u32 noise_filter_min_width; /* ns, min time of a valid pulse */
|
||||
unsigned int carrier_range_lower; /* Hz, valid only for modulated sig */
|
||||
unsigned int carrier_range_upper; /* Hz, valid only for modulated sig */
|
||||
u32 resolution; /* ns */
|
||||
};
|
||||
|
||||
struct v4l2_subdev_ir_ops {
|
||||
/* Common to receiver and transmitter */
|
||||
int (*interrupt_service_routine)(struct v4l2_subdev *sd,
|
||||
u32 status, bool *handled);
|
||||
|
||||
/* Receiver */
|
||||
int (*rx_read)(struct v4l2_subdev *sd, u8 *buf, size_t count,
|
||||
ssize_t *num);
|
||||
|
||||
int (*rx_g_parameters)(struct v4l2_subdev *sd,
|
||||
struct v4l2_subdev_ir_parameters *params);
|
||||
int (*rx_s_parameters)(struct v4l2_subdev *sd,
|
||||
struct v4l2_subdev_ir_parameters *params);
|
||||
|
||||
/* Transmitter */
|
||||
int (*tx_write)(struct v4l2_subdev *sd, u8 *buf, size_t count,
|
||||
ssize_t *num);
|
||||
|
||||
int (*tx_g_parameters)(struct v4l2_subdev *sd,
|
||||
struct v4l2_subdev_ir_parameters *params);
|
||||
int (*tx_s_parameters)(struct v4l2_subdev *sd,
|
||||
struct v4l2_subdev_ir_parameters *params);
|
||||
};
|
||||
|
||||
struct v4l2_subdev_ops {
|
||||
const struct v4l2_subdev_core_ops *core;
|
||||
const struct v4l2_subdev_tuner_ops *tuner;
|
||||
const struct v4l2_subdev_audio_ops *audio;
|
||||
const struct v4l2_subdev_video_ops *video;
|
||||
const struct v4l2_subdev_ir_ops *ir;
|
||||
};
|
||||
|
||||
#define V4L2_SUBDEV_NAME_SIZE 32
|
||||
|
|
Loading…
Reference in a new issue