net: fix build erros with CONFIG_BUG=n, CONFIG_GENERIC_BUG=n
[safe/jmp/linux-2.6] / include / media / v4l2-subdev.h
index c84ff88..00bf176 100644 (file)
 
 #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;
@@ -37,12 +47,6 @@ struct v4l2_decode_vbi_line {
        u32 type;               /* VBI service type (V4L2_SLICED_*). 0 if no service found */
 };
 
-/* s_crystal_freq */
-struct v4l2_crystal_freq {
-       u32 freq;       /* frequency in Hz of the crystal */
-       u32 flags;      /* device specific flags */
-};
-
 /* Sub-devices are devices that are connected somehow to the main bridge
    device. These devices are usually audio/video muxers/encoders/decoders or
    sensors and webcam controllers.
@@ -85,22 +89,33 @@ struct v4l2_crystal_freq {
    not yet implemented) since ops provide proper type-checking.
  */
 
-/* init: initialize the sensor registors to some sort of reasonable default
+/* s_config: if set, then it is always called by the v4l2_i2c_new_subdev*
+       functions after the v4l2_subdev was registered. It is used to pass
+       platform data to the subdev which can be used during initialization.
+
+   init: initialize the sensor registors to some sort of reasonable default
        values. Do not use for new drivers and should be removed in existing
        drivers.
 
-  reset: generic reset command. The argument selects which subsystems to
+   load_fw: load firmware.
+
+   reset: generic reset command. The argument selects which subsystems to
        reset. Passing 0 will always reset the whole chip. Do not use for new
        drivers without discussing this first on the linux-media mailinglist.
        There should be no reason normally to reset a device.
 
    s_gpio: set GPIO pins. Very simple right now, might need to be extended with
        a direction argument if needed.
+
+   s_power: puts subdevice in power saving mode (on == 0) or normal operation
+       mode (on == 1).
  */
 struct v4l2_subdev_core_ops {
        int (*g_chip_ident)(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *chip);
        int (*log_status)(struct v4l2_subdev *sd);
+       int (*s_config)(struct v4l2_subdev *sd, int irq, void *platform_data);
        int (*init)(struct v4l2_subdev *sd, u32 val);
+       int (*load_fw)(struct v4l2_subdev *sd);
        int (*reset)(struct v4l2_subdev *sd, u32 val);
        int (*s_gpio)(struct v4l2_subdev *sd, u32 val);
        int (*queryctrl)(struct v4l2_subdev *sd, struct v4l2_queryctrl *qc);
@@ -110,11 +125,13 @@ struct v4l2_subdev_core_ops {
        int (*s_ext_ctrls)(struct v4l2_subdev *sd, struct v4l2_ext_controls *ctrls);
        int (*try_ext_ctrls)(struct v4l2_subdev *sd, struct v4l2_ext_controls *ctrls);
        int (*querymenu)(struct v4l2_subdev *sd, struct v4l2_querymenu *qm);
+       int (*s_std)(struct v4l2_subdev *sd, v4l2_std_id norm);
        long (*ioctl)(struct v4l2_subdev *sd, unsigned int cmd, void *arg);
 #ifdef CONFIG_VIDEO_ADV_DEBUG
        int (*g_register)(struct v4l2_subdev *sd, struct v4l2_dbg_register *reg);
        int (*s_register)(struct v4l2_subdev *sd, struct v4l2_dbg_register *reg);
 #endif
+       int (*s_power)(struct v4l2_subdev *sd, int on);
 };
 
 /* s_mode: switch the tuner to a specific tuner mode. Replacement of s_radio.
@@ -124,8 +141,6 @@ struct v4l2_subdev_core_ops {
    s_type_addr: sets tuner type and its I2C addr.
 
    s_config: sets tda9887 specific stuff, like port1, port2 and qss
-
-   s_standby: puts tuner on powersaving state, disabling it, except for i2c.
  */
 struct v4l2_subdev_tuner_ops {
        int (*s_mode)(struct v4l2_subdev *sd, enum v4l2_tuner_type);
@@ -134,10 +149,10 @@ struct v4l2_subdev_tuner_ops {
        int (*g_frequency)(struct v4l2_subdev *sd, struct v4l2_frequency *freq);
        int (*g_tuner)(struct v4l2_subdev *sd, struct v4l2_tuner *vt);
        int (*s_tuner)(struct v4l2_subdev *sd, struct v4l2_tuner *vt);
-       int (*s_std)(struct v4l2_subdev *sd, v4l2_std_id norm);
+       int (*g_modulator)(struct v4l2_subdev *sd, struct v4l2_modulator *vm);
+       int (*s_modulator)(struct v4l2_subdev *sd, struct v4l2_modulator *vm);
        int (*s_type_addr)(struct v4l2_subdev *sd, struct tuner_setup *type);
        int (*s_config)(struct v4l2_subdev *sd, const struct v4l2_priv_tun_config *config);
-       int (*s_standby)(struct v4l2_subdev *sd);
 };
 
 /* s_clock_freq: set the frequency (in Hz) of the audio clock output.
@@ -151,7 +166,8 @@ struct v4l2_subdev_tuner_ops {
        board designs. Usual values for the frequency are 1024000 and 2048000.
        If the frequency is not supported, then -EINVAL is returned.
 
-   s_routing: used to define the input and/or output pins of an audio chip.
+   s_routing: used to define the input and/or output pins of an audio chip,
+       and any additional configuration data.
        Never attempt to use user-level input IDs (e.g. Composite, S-Video,
        Tuner) at this level. An i2c device shouldn't know about whether an
        input pin is connected to a Composite connector, become on another
@@ -162,7 +178,7 @@ struct v4l2_subdev_tuner_ops {
 struct v4l2_subdev_audio_ops {
        int (*s_clock_freq)(struct v4l2_subdev *sd, u32 freq);
        int (*s_i2s_clock_freq)(struct v4l2_subdev *sd, u32 freq);
-       int (*s_routing)(struct v4l2_subdev *sd, const struct v4l2_routing *route);
+       int (*s_routing)(struct v4l2_subdev *sd, u32 input, u32 output, u32 config);
 };
 
 /*
@@ -175,36 +191,36 @@ struct v4l2_subdev_audio_ops {
        v4l2_sliced_vbi_data struct. If no valid VBI data was found, then the
        type field is set to 0 on return.
 
-  s_vbi_data: used to generate VBI signals on a video signal.
+   s_vbi_data: used to generate VBI signals on a video signal.
        v4l2_sliced_vbi_data is filled with the data packets that should be
        output. Note that if you set the line field to 0, then that VBI signal
        is disabled. If no valid VBI data was found, then the type field is
        set to 0 on return.
 
-  g_vbi_data: used to obtain the sliced VBI packet from a readback register.
+   g_vbi_data: used to obtain the sliced VBI packet from a readback register.
        Not all video decoders support this. If no data is available because
        the readback register contains invalid or erroneous data -EIO is
        returned. Note that you must fill in the 'id' member and the 'field'
        member (to determine whether CC data from the first or second field
        should be obtained).
 
-  s_std_output: set v4l2_std_id for video OUTPUT devices. This is ignored by
+   s_std_output: set v4l2_std_id for video OUTPUT devices. This is ignored by
        video input devices.
 
   s_crystal_freq: sets the frequency of the crystal used to generate the
-       clocks. An extra flags field allows device specific configuration
+       clocks in Hz. An extra flags field allows device specific configuration
        regarding clock frequency dividers, etc. If not used, then set flags
        to 0. If the frequency is not supported, then -EINVAL is returned.
 
-  g_input_status: get input status. Same as the status field in the v4l2_input
+   g_input_status: get input status. Same as the status field in the v4l2_input
        struct.
 
-  s_routing: see s_routing in audio_ops, except this version is for video
+   s_routing: see s_routing in audio_ops, except this version is for video
        devices.
  */
 struct v4l2_subdev_video_ops {
-       int (*s_routing)(struct v4l2_subdev *sd, const struct v4l2_routing *route);
-       int (*s_crystal_freq)(struct v4l2_subdev *sd, struct v4l2_crystal_freq *freq);
+       int (*s_routing)(struct v4l2_subdev *sd, u32 input, u32 output, u32 config);
+       int (*s_crystal_freq)(struct v4l2_subdev *sd, u32 freq, u32 flags);
        int (*decode_vbi_line)(struct v4l2_subdev *sd, struct v4l2_decode_vbi_line *vbi_line);
        int (*s_vbi_data)(struct v4l2_subdev *sd, const struct v4l2_sliced_vbi_data *vbi_data);
        int (*g_vbi_data)(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_data *vbi_data);
@@ -217,27 +233,118 @@ struct v4l2_subdev_video_ops {
        int (*g_fmt)(struct v4l2_subdev *sd, struct v4l2_format *fmt);
        int (*try_fmt)(struct v4l2_subdev *sd, struct v4l2_format *fmt);
        int (*s_fmt)(struct v4l2_subdev *sd, struct v4l2_format *fmt);
+       int (*cropcap)(struct v4l2_subdev *sd, struct v4l2_cropcap *cc);
+       int (*g_crop)(struct v4l2_subdev *sd, struct v4l2_crop *crop);
+       int (*s_crop)(struct v4l2_subdev *sd, struct v4l2_crop *crop);
        int (*g_parm)(struct v4l2_subdev *sd, struct v4l2_streamparm *param);
        int (*s_parm)(struct v4l2_subdev *sd, struct v4l2_streamparm *param);
        int (*enum_framesizes)(struct v4l2_subdev *sd, struct v4l2_frmsizeenum *fsize);
        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
 
+/* Set this flag if this subdev is a i2c device. */
+#define V4L2_SUBDEV_FL_IS_I2C (1U << 0)
+
 /* Each instance of a subdev driver should create this struct, either
    stand-alone or embedded in a larger struct.
  */
 struct v4l2_subdev {
        struct list_head list;
        struct module *owner;
+       u32 flags;
        struct v4l2_device *v4l2_dev;
        const struct v4l2_subdev_ops *ops;
        /* name must be unique */
@@ -266,6 +373,7 @@ static inline void v4l2_subdev_init(struct v4l2_subdev *sd,
        BUG_ON(!ops || !ops->core);
        sd->ops = ops;
        sd->v4l2_dev = NULL;
+       sd->flags = 0;
        sd->name[0] = '\0';
        sd->grp_id = 0;
        sd->priv = NULL;
@@ -277,7 +385,7 @@ static inline void v4l2_subdev_init(struct v4l2_subdev *sd,
    Example: err = v4l2_subdev_call(sd, core, g_chip_ident, &chip);
  */
 #define v4l2_subdev_call(sd, o, f, args...)                            \
-       (!(sd) ? -ENODEV : (((sd) && (sd)->ops->o && (sd)->ops->o->f) ? \
+       (!(sd) ? -ENODEV : (((sd)->ops->o && (sd)->ops->o->f) ? \
                (sd)->ops->o->f((sd) , ##args) : -ENOIOCTLCMD))
 
 /* Send a notification to v4l2_device. */