These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / include / media / v4l2-subdev.h
index 2f0a345..b273cf9 100644 (file)
 #define V4L2_SUBDEV_IR_TX_NOTIFY               _IOW('v', 1, u32)
 #define V4L2_SUBDEV_IR_TX_FIFO_SERVICE_REQ     0x00000001
 
+#define        V4L2_DEVICE_NOTIFY_EVENT                _IOW('v', 2, struct v4l2_event)
+
 struct v4l2_device;
 struct v4l2_ctrl_handler;
+struct v4l2_event;
 struct v4l2_event_subscription;
 struct v4l2_fh;
 struct v4l2_subdev;
@@ -115,34 +118,67 @@ struct v4l2_subdev_io_pin_config {
        u8 strength;    /* Pin drive strength */
 };
 
-/*
-   s_io_pin_config: configure one or more chip I/O pins for chips that
-       multiplex different internal signal pads out to IO pins.  This function
-       takes a pointer to an array of 'n' pin configuration entries, one for
-       each pin being configured.  This function could be called at times
-       other than just subdevice initialization.
-
-   init: initialize the sensor registers to some sort of reasonable default
-       values. Do not use for new drivers and should be removed in existing
-       drivers.
-
-   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).
-
-   interrupt_service_routine: Called by the bridge chip's interrupt service
-       handler, when an 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*.
+/**
+ * struct v4l2_subdev_core_ops - Define core ops callbacks for subdevs
+ *
+ * @log_status: callback for VIDIOC_LOG_STATUS ioctl handler code.
+ *
+ * @s_io_pin_config: configure one or more chip I/O pins for chips that
+ *     multiplex different internal signal pads out to IO pins.  This function
+ *     takes a pointer to an array of 'n' pin configuration entries, one for
+ *     each pin being configured.  This function could be called at times
+ *     other than just subdevice initialization.
+ *
+ * @init: initialize the sensor registers to some sort of reasonable default
+ *     values. Do not use for new drivers and should be removed in existing
+ *     drivers.
+ *
+ * @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.
+ *
+ * @queryctrl: callback for VIDIOC_QUERYCTL ioctl handler code.
+ *
+ * @g_ctrl: callback for VIDIOC_G_CTRL ioctl handler code.
+ *
+ * @s_ctrl: callback for VIDIOC_S_CTRL ioctl handler code.
+ *
+ * @g_ext_ctrls: callback for VIDIOC_G_EXT_CTRLS ioctl handler code.
+ *
+ * @s_ext_ctrls: callback for VIDIOC_S_EXT_CTRLS ioctl handler code.
+ *
+ * @try_ext_ctrls: callback for VIDIOC_TRY_EXT_CTRLS ioctl handler code.
+ *
+ * @querymenu: callback for VIDIOC_QUERYMENU ioctl handler code.
+ *
+ * @ioctl: called at the end of ioctl() syscall handler at the V4L2 core.
+ *        used to provide support for private ioctls used on the driver.
+ *
+ * @compat_ioctl32: called when a 32 bits application uses a 64 bits Kernel,
+ *                 in order to fix data passed from/to userspace.
+ *
+ * @g_register: callback for VIDIOC_G_REGISTER ioctl handler code.
+ *
+ * @s_register: callback for VIDIOC_G_REGISTER ioctl handler code.
+ *
+ * @s_power: puts subdevice in power saving mode (on == 0) or normal operation
+ *     mode (on == 1).
+ *
+ * @interrupt_service_routine: Called by the bridge chip's interrupt service
+ *     handler, when an 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*.
+ *
+ * @subscribe_event: used by the drivers to request the control framework that
+ *                  for it to be warned when the value of a control changes.
+ *
+ * @unsubscribe_event: remove event subscription from the control framework.
  */
 struct v4l2_subdev_core_ops {
        int (*log_status)(struct v4l2_subdev *sd);
@@ -177,18 +213,32 @@ struct v4l2_subdev_core_ops {
                                 struct v4l2_event_subscription *sub);
 };
 
-/* s_radio: v4l device was opened in radio mode.
-
-   g_frequency: freq->type must be filled in. Normally done by video_ioctl2
-       or the bridge driver.
-
-   g_tuner:
-   s_tuner: vt->type must be filled in. Normally done by video_ioctl2 or the
-       bridge driver.
-
-   s_type_addr: sets tuner type and its I2C addr.
-
-   s_config: sets tda9887 specific stuff, like port1, port2 and qss
+/**
+ * struct s_radio - Callbacks used when v4l device was opened in radio mode.
+ *
+ * @s_radio: callback for VIDIOC_S_RADIO ioctl handler code.
+ *
+ * @s_frequency: callback for VIDIOC_S_FREQUENCY ioctl handler code.
+ *
+ * @g_frequency: callback for VIDIOC_G_FREQUENCY ioctl handler code.
+ *              freq->type must be filled in. Normally done by video_ioctl2
+ *             or the bridge driver.
+ *
+ * @enum_freq_bands: callback for VIDIOC_ENUM_FREQ_BANDS ioctl handler code.
+ *
+ * @g_tuner: callback for VIDIOC_G_TUNER ioctl handler code.
+ *
+ * @s_tuner: callback for VIDIOC_S_TUNER ioctl handler code. vt->type must be
+ *          filled in. Normally done by video_ioctl2 or the
+ *     bridge driver.
+ *
+ * @g_modulator: callback for VIDIOC_G_MODULATOR ioctl handler code.
+ *
+ * @s_modulator: callback for VIDIOC_S_MODULATOR ioctl handler code.
+ *
+ * @s_type_addr: sets tuner type and its I2C addr.
+ *
+ * @s_config: sets tda9887 specific stuff, like port1, port2 and qss
  */
 struct v4l2_subdev_tuner_ops {
        int (*s_radio)(struct v4l2_subdev *sd);
@@ -203,25 +253,31 @@ struct v4l2_subdev_tuner_ops {
        int (*s_config)(struct v4l2_subdev *sd, const struct v4l2_priv_tun_config *config);
 };
 
-/* s_clock_freq: set the frequency (in Hz) of the audio clock output.
-       Used to slave an audio processor to the video decoder, ensuring that
-       audio and video remain synchronized. Usual values for the frequency
-       are 48000, 44100 or 32000 Hz. If the frequency is not supported, then
-       -EINVAL is returned.
-
-   s_i2s_clock_freq: sets I2S speed in bps. This is used to provide a standard
-       way to select I2S clock used by driving digital audio streams at some
-       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,
-       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
-       board or platform it might be connected to something else entirely.
-       The calling driver is responsible for mapping a user-level input to
-       the right pins on the i2c device.
+/**
+ * struct v4l2_subdev_audio_ops - Callbacks used for audio-related settings
+ *
+ * @s_clock_freq: set the frequency (in Hz) of the audio clock output.
+ *     Used to slave an audio processor to the video decoder, ensuring that
+ *     audio and video remain synchronized. Usual values for the frequency
+ *     are 48000, 44100 or 32000 Hz. If the frequency is not supported, then
+ *     -EINVAL is returned.
+ *
+ * @s_i2s_clock_freq: sets I2S speed in bps. This is used to provide a standard
+ *     way to select I2S clock used by driving digital audio streams at some
+ *     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,
+ *     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
+ *     board or platform it might be connected to something else entirely.
+ *     The calling driver is responsible for mapping a user-level input to
+ *     the right pins on the i2c device.
+ *
+ * @s_stream: used to notify the audio code that stream will start or has
+ *     stopped.
  */
 struct v4l2_subdev_audio_ops {
        int (*s_clock_freq)(struct v4l2_subdev *sd, u32 freq);
@@ -240,6 +296,7 @@ struct v4l2_subdev_audio_ops {
 
 /**
  * struct v4l2_mbus_frame_desc_entry - media bus frame description structure
+ *
  * @flags: V4L2_MBUS_FRAME_DESC_FL_* flags
  * @pixelcode: media bus pixel code, valid if FRAME_DESC_FL_BLOB is not set
  * @length: number of octets per frame, valid if V4L2_MBUS_FRAME_DESC_FL_BLOB
@@ -263,53 +320,73 @@ struct v4l2_mbus_frame_desc {
        unsigned short num_entries;
 };
 
-/*
-   s_std_output: set v4l2_std_id for video OUTPUT devices. This is ignored by
-       video input devices.
-
-   g_std_output: get current standard for video OUTPUT devices. This is ignored
-       by video input devices.
-
-   g_tvnorms: get v4l2_std_id with all standards supported by the video
-       CAPTURE device. This is ignored by video output devices.
-
-   g_tvnorms_output: get v4l2_std_id with all standards supported by the video
-       OUTPUT device. This is ignored by video capture devices.
-
-   s_crystal_freq: sets the frequency of the crystal used to generate the
-       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
-       struct.
-
-   s_routing: see s_routing in audio_ops, except this version is for video
-       devices.
-
-   s_dv_timings(): Set custom dv timings in the sub device. This is used
-       when sub device is capable of setting detailed timing information
-       in the hardware to generate/detect the video signal.
-
-   g_dv_timings(): Get custom dv timings in the sub device.
-
-   enum_mbus_fmt: enumerate pixel formats, provided by a video data source
-
-   g_mbus_fmt: get the current pixel format, provided by a video data source
-
-   try_mbus_fmt: try to set a pixel format on a video data source
-
-   s_mbus_fmt: set a pixel format on a video data source
-
-   g_mbus_config: get supported mediabus configurations
-
-   s_mbus_config: set a certain mediabus configuration. This operation is added
-       for compatibility with soc-camera drivers and should not be used by new
-       software.
-
-   s_rx_buffer: set a host allocated memory buffer for the subdev. The subdev
-       can adjust @size to a lower value and must not write more data to the
-       buffer starting at @data than the original value of @size.
+/**
+ * struct v4l2_subdev_video_ops - Callbacks used when v4l device was opened
+ *                               in video mode.
+ *
+ * @s_routing: see s_routing in audio_ops, except this version is for video
+ *     devices.
+ *
+ * @s_crystal_freq: sets the frequency of the crystal used to generate the
+ *     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_std: callback for VIDIOC_G_STD ioctl handler code.
+ *
+ * @s_std: callback for VIDIOC_S_STD ioctl handler code.
+ *
+ * @s_std_output: set v4l2_std_id for video OUTPUT devices. This is ignored by
+ *     video input devices.
+ *
+ * @g_std_output: get current standard for video OUTPUT devices. This is ignored
+ *     by video input devices.
+ *
+ * @querystd: callback for VIDIOC_QUERYSTD ioctl handler code.
+ *
+ * @g_tvnorms: get v4l2_std_id with all standards supported by the video
+ *     CAPTURE device. This is ignored by video output devices.
+ *
+ * @g_tvnorms_output: get v4l2_std_id with all standards supported by the video
+ *     OUTPUT device. This is ignored by video capture devices.
+ *
+ * @g_input_status: get input status. Same as the status field in the v4l2_input
+ *     struct.
+ *
+ * @s_stream: used to notify the driver that a video stream will start or has
+ *     stopped.
+ *
+ * @cropcap: callback for VIDIOC_CROPCAP ioctl handler code.
+ *
+ * @g_crop: callback for VIDIOC_G_CROP ioctl handler code.
+ *
+ * @s_crop: callback for VIDIOC_S_CROP ioctl handler code.
+ *
+ * @g_parm: callback for VIDIOC_G_PARM ioctl handler code.
+ *
+ * @s_parm: callback for VIDIOC_S_PARM ioctl handler code.
+ *
+ * @g_frame_interval: callback for VIDIOC_G_FRAMEINTERVAL ioctl handler code.
+ *
+ * @s_frame_interval: callback for VIDIOC_S_FRAMEINTERVAL ioctl handler code.
+ *
+ * @s_dv_timings: Set custom dv timings in the sub device. This is used
+ *     when sub device is capable of setting detailed timing information
+ *     in the hardware to generate/detect the video signal.
+ *
+ * @g_dv_timings: Get custom dv timings in the sub device.
+ *
+ * @query_dv_timings: callback for VIDIOC_QUERY_DV_TIMINGS ioctl handler code.
+ *
+ * @g_mbus_config: get supported mediabus configurations
+ *
+ * @s_mbus_config: set a certain mediabus configuration. This operation is added
+ *     for compatibility with soc-camera drivers and should not be used by new
+ *     software.
+ *
+ * @s_rx_buffer: set a host allocated memory buffer for the subdev. The subdev
+ *     can adjust @size to a lower value and must not write more data to the
+ *     buffer starting at @data than the original value of @size.
  */
 struct v4l2_subdev_video_ops {
        int (*s_routing)(struct v4l2_subdev *sd, u32 input, u32 output, u32 config);
@@ -338,14 +415,6 @@ struct v4l2_subdev_video_ops {
                        struct v4l2_dv_timings *timings);
        int (*query_dv_timings)(struct v4l2_subdev *sd,
                        struct v4l2_dv_timings *timings);
-       int (*enum_mbus_fmt)(struct v4l2_subdev *sd, unsigned int index,
-                            u32 *code);
-       int (*g_mbus_fmt)(struct v4l2_subdev *sd,
-                         struct v4l2_mbus_framefmt *fmt);
-       int (*try_mbus_fmt)(struct v4l2_subdev *sd,
-                           struct v4l2_mbus_framefmt *fmt);
-       int (*s_mbus_fmt)(struct v4l2_subdev *sd,
-                         struct v4l2_mbus_framefmt *fmt);
        int (*g_mbus_config)(struct v4l2_subdev *sd,
                             struct v4l2_mbus_config *cfg);
        int (*s_mbus_config)(struct v4l2_subdev *sd,
@@ -354,34 +423,39 @@ struct v4l2_subdev_video_ops {
                           unsigned int *size);
 };
 
-/*
-   decode_vbi_line: video decoders that support sliced VBI need to implement
-       this ioctl. Field p of the v4l2_sliced_vbi_line struct is set to the
-       start of the VBI data that was generated by the decoder. The driver
-       then parses the sliced VBI data and sets the other fields in the
-       struct accordingly. The pointer p is updated to point to the start of
-       the payload which can be copied verbatim into the data field of the
-       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.
-       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.
-       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_raw_fmt: setup the video encoder/decoder for raw VBI.
-
-   g_sliced_fmt: retrieve the current sliced VBI settings.
-
-   s_sliced_fmt: setup the sliced VBI settings.
+/**
+ * struct v4l2_subdev_vbi_ops - Callbacks used when v4l device was opened
+ *                               in video mode via the vbi device node.
+ *
+ *  @decode_vbi_line: video decoders that support sliced VBI need to implement
+ *     this ioctl. Field p of the v4l2_sliced_vbi_line struct is set to the
+ *     start of the VBI data that was generated by the decoder. The driver
+ *     then parses the sliced VBI data and sets the other fields in the
+ *     struct accordingly. The pointer p is updated to point to the start of
+ *     the payload which can be copied verbatim into the data field of the
+ *     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.
+ *     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.
+ *     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).
+ *
+ * @g_sliced_vbi_cap: callback for VIDIOC_SLICED_VBI_CAP ioctl handler code.
+ *
+ * @s_raw_fmt: setup the video encoder/decoder for raw VBI.
+ *
+ * @g_sliced_fmt: retrieve the current sliced VBI settings.
+ *
+ * @s_sliced_fmt: setup the sliced VBI settings.
  */
 struct v4l2_subdev_vbi_ops {
        int (*decode_vbi_line)(struct v4l2_subdev *sd, struct v4l2_decode_vbi_line *vbi_line);
@@ -494,8 +568,39 @@ struct v4l2_subdev_pad_config {
 
 /**
  * struct v4l2_subdev_pad_ops - v4l2-subdev pad level operations
+ *
+ * @enum_mbus_code: callback for VIDIOC_SUBDEV_ENUM_MBUS_CODE ioctl handler
+ *                 code.
+ * @enum_frame_size: callback for VIDIOC_SUBDEV_ENUM_FRAME_SIZE ioctl handler
+ *                  code.
+ *
+ * @enum_frame_interval: callback for VIDIOC_SUBDEV_ENUM_FRAME_INTERVAL ioctl
+ *                      handler code.
+ *
+ * @get_fmt: callback for VIDIOC_SUBDEV_G_FMT ioctl handler code.
+ *
+ * @set_fmt: callback for VIDIOC_SUBDEV_S_FMT ioctl handler code.
+ *
+ * @get_selection: callback for VIDIOC_SUBDEV_G_SELECTION ioctl handler code.
+ *
+ * @set_selection: callback for VIDIOC_SUBDEV_S_SELECTION ioctl handler code.
+ *
+ * @get_edid: callback for VIDIOC_SUBDEV_G_EDID ioctl handler code.
+ *
+ * @set_edid: callback for VIDIOC_SUBDEV_S_EDID ioctl handler code.
+ *
+ * @dv_timings_cap: callback for VIDIOC_SUBDEV_DV_TIMINGS_CAP ioctl handler
+ *                 code.
+ *
+ * @enum_dv_timings: callback for VIDIOC_SUBDEV_ENUM_DV_TIMINGS ioctl handler
+ *                  code.
+ *
+ * @link_validate: used by the media controller code to check if the links
+ *                that belongs to a pipeline can be used for stream.
+ *
  * @get_frame_desc: get the current low level media bus frame parameters.
- * @get_frame_desc: set the low level media bus frame parameters, @fd array
+ *
+ * @set_frame_desc: set the low level media bus frame parameters, @fd array
  *                  may be adjusted by the subdev driver to device capabilities.
  */
 struct v4l2_subdev_pad_ops {
@@ -619,6 +724,8 @@ struct v4l2_subdev {
        struct video_device *devnode;
        /* pointer to the physical device, if any */
        struct device *dev;
+       /* The device_node of the subdev, usually the same as dev->of_node. */
+       struct device_node *of_node;
        /* Links this subdev to a global subdev_list or @notifier->done list. */
        struct list_head async_list;
        /* Pointer to respective struct v4l2_async_subdev. */
@@ -707,4 +814,7 @@ void v4l2_subdev_init(struct v4l2_subdev *sd,
 #define v4l2_subdev_has_op(sd, o, f) \
        ((sd)->ops->o && (sd)->ops->o->f)
 
+void v4l2_subdev_notify_event(struct v4l2_subdev *sd,
+                             const struct v4l2_event *ev);
+
 #endif