]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/commitdiff
Merge branch 'patchwork' into topic/docs-next
authorMauro Carvalho Chehab <mchehab@s-opensource.com>
Sat, 23 Jul 2016 10:59:19 +0000 (07:59 -0300)
committerMauro Carvalho Chehab <mchehab@s-opensource.com>
Sat, 23 Jul 2016 10:59:19 +0000 (07:59 -0300)
* patchwork: (1492 commits)
  [media] cec: always check all_device_types and features
  [media] cec: poll should check if there is room in the tx queue
  [media] vivid: support monitor all mode
  [media] cec: fix test for unconfigured adapter in main message loop
  [media] cec: limit the size of the transmit queue
  [media] cec: zero unused msg part after msg->len
  [media] cec: don't set fh to NULL in CEC_TRANSMIT
  [media] cec: clear all status fields before transmit and always fill in sequence
  [media] cec: CEC_RECEIVE overwrote the timeout field
  [media] cxd2841er: Reading SNR for DVB-C added
  [media] cxd2841er: Reading BER and UCB for DVB-C added
  [media] cxd2841er: fix switch-case for DVB-C
  [media] cxd2841er: fix signal strength scale for ISDB-T
  [media] cxd2841er: adjust the dB scale for DVB-C
  [media] cxd2841er: provide signal strength for DVB-C
  [media] cxd2841er: fix BER report via DVBv5 stats API
  [media] mb86a20s: apply mask to val after checking for read failure
  [media] airspy: fix error logic during device register
  [media] s5p-cec/TODO: add TODO item
  [media] cec/TODO: drop comment about sphinx documentation
  ...

Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
1  2 
Documentation/DocBook/device-drivers.tmpl
Documentation/DocBook/media/v4l/lirc_device_interface.xml
Documentation/media/kapi/v4l2-controls.rst
Makefile
drivers/media/dvb-core/demux.h
include/media/rc-core.h
include/media/rc-map.h
include/media/v4l2-subdev.h
include/media/videobuf2-core.h

index e9f77f2fe27b287405638485a2eb7b447c95227d,58af32b01b909c5988e8315bb7ab4a9d108023f8..7febdeb08159167751dd45c0b210100153502b52
@@@ -128,16 -128,44 +128,44 @@@ X!Edrivers/base/interface.
  !Edrivers/base/platform.c
  !Edrivers/base/bus.c
       </sect1>
-      <sect1><title>Device Drivers DMA Management</title>
+      <sect1>
+        <title>Buffer Sharing and Synchronization</title>
+        <para>
+          The dma-buf subsystem provides the framework for sharing buffers
+          for hardware (DMA) access across multiple device drivers and
+          subsystems, and for synchronizing asynchronous hardware access.
+        </para>
+        <para>
+          This is used, for example, by drm "prime" multi-GPU support, but
+          is of course not limited to GPU use cases.
+        </para>
+        <para>
+          The three main components of this are: (1) dma-buf, representing
+          a sg_table and exposed to userspace as a file descriptor to allow
+          passing between devices, (2) fence, which provides a mechanism
+          to signal when one device as finished access, and (3) reservation,
+          which manages the shared or exclusive fence(s) associated with
+          the buffer.
+        </para>
+        <sect2><title>dma-buf</title>
  !Edrivers/dma-buf/dma-buf.c
+ !Iinclude/linux/dma-buf.h
+        </sect2>
+        <sect2><title>reservation</title>
+ !Pdrivers/dma-buf/reservation.c Reservation Object Overview
+ !Edrivers/dma-buf/reservation.c
+ !Iinclude/linux/reservation.h
+        </sect2>
+        <sect2><title>fence</title>
  !Edrivers/dma-buf/fence.c
- !Edrivers/dma-buf/seqno-fence.c
  !Iinclude/linux/fence.h
+ !Edrivers/dma-buf/seqno-fence.c
  !Iinclude/linux/seqno-fence.h
- !Edrivers/dma-buf/reservation.c
- !Iinclude/linux/reservation.h
  !Edrivers/dma-buf/sync_file.c
  !Iinclude/linux/sync_file.h
+        </sect2>
+      </sect1>
+      <sect1><title>Device Drivers DMA Management</title>
  !Edrivers/base/dma-coherent.c
  !Edrivers/base/dma-mapping.c
       </sect1>
@@@ -219,6 -247,64 +247,6 @@@ X!Isound/sound_firmware.
  -->
    </chapter>
  
 -  <chapter id="mediadev">
 -     <title>Media Devices</title>
 -
 -     <sect1><title>Video2Linux devices</title>
 -!Iinclude/media/tuner.h
 -!Iinclude/media/tuner-types.h
 -!Iinclude/media/tveeprom.h
 -!Iinclude/media/v4l2-async.h
 -!Iinclude/media/v4l2-ctrls.h
 -!Iinclude/media/v4l2-dv-timings.h
 -!Iinclude/media/v4l2-event.h
 -!Iinclude/media/v4l2-flash-led-class.h
 -!Iinclude/media/v4l2-mc.h
 -!Iinclude/media/v4l2-mediabus.h
 -!Iinclude/media/v4l2-mem2mem.h
 -!Iinclude/media/v4l2-of.h
 -!Iinclude/media/v4l2-rect.h
 -!Iinclude/media/v4l2-subdev.h
 -!Iinclude/media/videobuf2-core.h
 -!Iinclude/media/videobuf2-v4l2.h
 -!Iinclude/media/videobuf2-memops.h
 -     </sect1>
 -     <sect1><title>Digital TV (DVB) devices</title>
 -      <sect1><title>Digital TV Common functions</title>
 -!Idrivers/media/dvb-core/dvb_math.h
 -!Idrivers/media/dvb-core/dvb_ringbuffer.h
 -!Idrivers/media/dvb-core/dvbdev.h
 -      </sect1>
 -      <sect1><title>Digital TV Frontend kABI</title>
 -!Pdrivers/media/dvb-core/dvb_frontend.h Digital TV Frontend
 -!Idrivers/media/dvb-core/dvb_frontend.h
 -      </sect1>
 -      <sect1><title>Digital TV Demux kABI</title>
 -!Pdrivers/media/dvb-core/demux.h Digital TV Demux
 -      <sect1><title>Demux Callback API</title>
 -!Pdrivers/media/dvb-core/demux.h Demux Callback
 -      </sect1>
 -!Idrivers/media/dvb-core/demux.h
 -      </sect1>
 -      <sect1><title>Digital TV Conditional Access kABI</title>
 -!Idrivers/media/dvb-core/dvb_ca_en50221.h
 -      </sect1>
 -     </sect1>
 -    <sect1><title>Remote Controller devices</title>
 -!Iinclude/media/rc-core.h
 -!Iinclude/media/lirc_dev.h
 -    </sect1>
 -    <sect1><title>Media Controller devices</title>
 -!Pinclude/media/media-device.h Media Controller
 -!Iinclude/media/media-device.h
 -!Iinclude/media/media-devnode.h
 -!Iinclude/media/media-entity.h
 -    </sect1>
 -    <sect1><title>Consumer Electronics Control devices</title>
 -!Iinclude/media/cec-edid.h
 -    </sect1>
 -
 -  </chapter>
  
    <chapter id="uart16x50">
       <title>16x50 UART Driver</title>
index 725b221e1f6cae06b35ac2192dfe78ff8833ae07,71f9dbb81ec7ed5a6f22eb34675adaed86417e3c..f53ad58027a707392385c54babdad9fe572899c0
@@@ -114,7 -114,7 +114,7 @@@ on working with the default settings in
        <para>Some receiver have maximum resolution which is defined by internal
        sample rate or data format limitations. E.g. it's common that signals can
        only be reported in 50 microsecond steps. This integer value is used by
 -      lircd to automatically adjust the aeps tolerance value in the lircd
 +      lircd to automatically adjust the steps tolerance value in the lircd
        config file.</para>
      </listitem>
    </varlistentry>
    <varlistentry>
      <term>LIRC_SET_{SEND,REC}_CARRIER</term>
      <listitem>
-       <para>Set send/receive carrier (in Hz).</para>
+       <para>Set send/receive carrier (in Hz). Return 0 on success.</para>
      </listitem>
    </varlistentry>
    <varlistentry>
index 8ff9ee80604286ad9bca0f35e4b0fcb69eda7c02,0000000000000000000000000000000000000000..916fd4366cdfba1eb4bb5ad6f2315b5e510f12aa
mode 100644,000000..100644
--- /dev/null
@@@ -1,826 -1,0 +1,809 @@@
- And set all core control ops in your struct v4l2_subdev_core_ops to these
- helpers:
- .. code-block:: none
-       .queryctrl = v4l2_subdev_queryctrl,
-       .querymenu = v4l2_subdev_querymenu,
-       .g_ctrl = v4l2_subdev_g_ctrl,
-       .s_ctrl = v4l2_subdev_s_ctrl,
-       .g_ext_ctrls = v4l2_subdev_g_ext_ctrls,
-       .try_ext_ctrls = v4l2_subdev_try_ext_ctrls,
-       .s_ext_ctrls = v4l2_subdev_s_ext_ctrls,
- Note: this is a temporary solution only. Once all V4L2 drivers that depend
- on subdev drivers are converted to the control framework these helpers will
- no longer be needed.
 +V4L2 Controls
 +=============
 +
 +Introduction
 +------------
 +
 +The V4L2 control API seems simple enough, but quickly becomes very hard to
 +implement correctly in drivers. But much of the code needed to handle controls
 +is actually not driver specific and can be moved to the V4L core framework.
 +
 +After all, the only part that a driver developer is interested in is:
 +
 +1) How do I add a control?
 +2) How do I set the control's value? (i.e. s_ctrl)
 +
 +And occasionally:
 +
 +3) How do I get the control's value? (i.e. g_volatile_ctrl)
 +4) How do I validate the user's proposed control value? (i.e. try_ctrl)
 +
 +All the rest is something that can be done centrally.
 +
 +The control framework was created in order to implement all the rules of the
 +V4L2 specification with respect to controls in a central place. And to make
 +life as easy as possible for the driver developer.
 +
 +Note that the control framework relies on the presence of a struct v4l2_device
 +for V4L2 drivers and struct v4l2_subdev for sub-device drivers.
 +
 +
 +Objects in the framework
 +------------------------
 +
 +There are two main objects:
 +
 +The v4l2_ctrl object describes the control properties and keeps track of the
 +control's value (both the current value and the proposed new value).
 +
 +v4l2_ctrl_handler is the object that keeps track of controls. It maintains a
 +list of v4l2_ctrl objects that it owns and another list of references to
 +controls, possibly to controls owned by other handlers.
 +
 +
 +Basic usage for V4L2 and sub-device drivers
 +-------------------------------------------
 +
 +1) Prepare the driver:
 +
 +1.1) Add the handler to your driver's top-level struct:
 +
 +.. code-block:: none
 +
 +      struct foo_dev {
 +              ...
 +              struct v4l2_ctrl_handler ctrl_handler;
 +              ...
 +      };
 +
 +      struct foo_dev *foo;
 +
 +1.2) Initialize the handler:
 +
 +.. code-block:: none
 +
 +      v4l2_ctrl_handler_init(&foo->ctrl_handler, nr_of_controls);
 +
 +The second argument is a hint telling the function how many controls this
 +handler is expected to handle. It will allocate a hashtable based on this
 +information. It is a hint only.
 +
 +1.3) Hook the control handler into the driver:
 +
 +1.3.1) For V4L2 drivers do this:
 +
 +.. code-block:: none
 +
 +      struct foo_dev {
 +              ...
 +              struct v4l2_device v4l2_dev;
 +              ...
 +              struct v4l2_ctrl_handler ctrl_handler;
 +              ...
 +      };
 +
 +      foo->v4l2_dev.ctrl_handler = &foo->ctrl_handler;
 +
 +Where foo->v4l2_dev is of type struct v4l2_device.
 +
 +Finally, remove all control functions from your v4l2_ioctl_ops (if any):
 +vidioc_queryctrl, vidioc_query_ext_ctrl, vidioc_querymenu, vidioc_g_ctrl,
 +vidioc_s_ctrl, vidioc_g_ext_ctrls, vidioc_try_ext_ctrls and vidioc_s_ext_ctrls.
 +Those are now no longer needed.
 +
 +1.3.2) For sub-device drivers do this:
 +
 +.. code-block:: none
 +
 +      struct foo_dev {
 +              ...
 +              struct v4l2_subdev sd;
 +              ...
 +              struct v4l2_ctrl_handler ctrl_handler;
 +              ...
 +      };
 +
 +      foo->sd.ctrl_handler = &foo->ctrl_handler;
 +
 +Where foo->sd is of type struct v4l2_subdev.
 +
 +1.4) Clean up the handler at the end:
 +
 +.. code-block:: none
 +
 +      v4l2_ctrl_handler_free(&foo->ctrl_handler);
 +
 +
 +2) Add controls:
 +
 +You add non-menu controls by calling v4l2_ctrl_new_std:
 +
 +.. code-block:: none
 +
 +      struct v4l2_ctrl *v4l2_ctrl_new_std(struct v4l2_ctrl_handler *hdl,
 +                      const struct v4l2_ctrl_ops *ops,
 +                      u32 id, s32 min, s32 max, u32 step, s32 def);
 +
 +Menu and integer menu controls are added by calling v4l2_ctrl_new_std_menu:
 +
 +.. code-block:: none
 +
 +      struct v4l2_ctrl *v4l2_ctrl_new_std_menu(struct v4l2_ctrl_handler *hdl,
 +                      const struct v4l2_ctrl_ops *ops,
 +                      u32 id, s32 max, s32 skip_mask, s32 def);
 +
 +Menu controls with a driver specific menu are added by calling
 +v4l2_ctrl_new_std_menu_items:
 +
 +.. code-block:: none
 +
 +       struct v4l2_ctrl *v4l2_ctrl_new_std_menu_items(
 +                       struct v4l2_ctrl_handler *hdl,
 +                       const struct v4l2_ctrl_ops *ops, u32 id, s32 max,
 +                       s32 skip_mask, s32 def, const char * const *qmenu);
 +
 +Integer menu controls with a driver specific menu can be added by calling
 +v4l2_ctrl_new_int_menu:
 +
 +.. code-block:: none
 +
 +      struct v4l2_ctrl *v4l2_ctrl_new_int_menu(struct v4l2_ctrl_handler *hdl,
 +                      const struct v4l2_ctrl_ops *ops,
 +                      u32 id, s32 max, s32 def, const s64 *qmenu_int);
 +
 +These functions are typically called right after the v4l2_ctrl_handler_init:
 +
 +.. code-block:: none
 +
 +      static const s64 exp_bias_qmenu[] = {
 +             -2, -1, 0, 1, 2
 +      };
 +      static const char * const test_pattern[] = {
 +              "Disabled",
 +              "Vertical Bars",
 +              "Solid Black",
 +              "Solid White",
 +      };
 +
 +      v4l2_ctrl_handler_init(&foo->ctrl_handler, nr_of_controls);
 +      v4l2_ctrl_new_std(&foo->ctrl_handler, &foo_ctrl_ops,
 +                      V4L2_CID_BRIGHTNESS, 0, 255, 1, 128);
 +      v4l2_ctrl_new_std(&foo->ctrl_handler, &foo_ctrl_ops,
 +                      V4L2_CID_CONTRAST, 0, 255, 1, 128);
 +      v4l2_ctrl_new_std_menu(&foo->ctrl_handler, &foo_ctrl_ops,
 +                      V4L2_CID_POWER_LINE_FREQUENCY,
 +                      V4L2_CID_POWER_LINE_FREQUENCY_60HZ, 0,
 +                      V4L2_CID_POWER_LINE_FREQUENCY_DISABLED);
 +      v4l2_ctrl_new_int_menu(&foo->ctrl_handler, &foo_ctrl_ops,
 +                      V4L2_CID_EXPOSURE_BIAS,
 +                      ARRAY_SIZE(exp_bias_qmenu) - 1,
 +                      ARRAY_SIZE(exp_bias_qmenu) / 2 - 1,
 +                      exp_bias_qmenu);
 +      v4l2_ctrl_new_std_menu_items(&foo->ctrl_handler, &foo_ctrl_ops,
 +                      V4L2_CID_TEST_PATTERN, ARRAY_SIZE(test_pattern) - 1, 0,
 +                      0, test_pattern);
 +      ...
 +      if (foo->ctrl_handler.error) {
 +              int err = foo->ctrl_handler.error;
 +
 +              v4l2_ctrl_handler_free(&foo->ctrl_handler);
 +              return err;
 +      }
 +
 +The v4l2_ctrl_new_std function returns the v4l2_ctrl pointer to the new
 +control, but if you do not need to access the pointer outside the control ops,
 +then there is no need to store it.
 +
 +The v4l2_ctrl_new_std function will fill in most fields based on the control
 +ID except for the min, max, step and default values. These are passed in the
 +last four arguments. These values are driver specific while control attributes
 +like type, name, flags are all global. The control's current value will be set
 +to the default value.
 +
 +The v4l2_ctrl_new_std_menu function is very similar but it is used for menu
 +controls. There is no min argument since that is always 0 for menu controls,
 +and instead of a step there is a skip_mask argument: if bit X is 1, then menu
 +item X is skipped.
 +
 +The v4l2_ctrl_new_int_menu function creates a new standard integer menu
 +control with driver-specific items in the menu. It differs from
 +v4l2_ctrl_new_std_menu in that it doesn't have the mask argument and takes
 +as the last argument an array of signed 64-bit integers that form an exact
 +menu item list.
 +
 +The v4l2_ctrl_new_std_menu_items function is very similar to
 +v4l2_ctrl_new_std_menu but takes an extra parameter qmenu, which is the driver
 +specific menu for an otherwise standard menu control. A good example for this
 +control is the test pattern control for capture/display/sensors devices that
 +have the capability to generate test patterns. These test patterns are hardware
 +specific, so the contents of the menu will vary from device to device.
 +
 +Note that if something fails, the function will return NULL or an error and
 +set ctrl_handler->error to the error code. If ctrl_handler->error was already
 +set, then it will just return and do nothing. This is also true for
 +v4l2_ctrl_handler_init if it cannot allocate the internal data structure.
 +
 +This makes it easy to init the handler and just add all controls and only check
 +the error code at the end. Saves a lot of repetitive error checking.
 +
 +It is recommended to add controls in ascending control ID order: it will be
 +a bit faster that way.
 +
 +3) Optionally force initial control setup:
 +
 +.. code-block:: none
 +
 +      v4l2_ctrl_handler_setup(&foo->ctrl_handler);
 +
 +This will call s_ctrl for all controls unconditionally. Effectively this
 +initializes the hardware to the default control values. It is recommended
 +that you do this as this ensures that both the internal data structures and
 +the hardware are in sync.
 +
 +4) Finally: implement the v4l2_ctrl_ops
 +
 +.. code-block:: none
 +
 +      static const struct v4l2_ctrl_ops foo_ctrl_ops = {
 +              .s_ctrl = foo_s_ctrl,
 +      };
 +
 +Usually all you need is s_ctrl:
 +
 +.. code-block:: none
 +
 +      static int foo_s_ctrl(struct v4l2_ctrl *ctrl)
 +      {
 +              struct foo *state = container_of(ctrl->handler, struct foo, ctrl_handler);
 +
 +              switch (ctrl->id) {
 +              case V4L2_CID_BRIGHTNESS:
 +                      write_reg(0x123, ctrl->val);
 +                      break;
 +              case V4L2_CID_CONTRAST:
 +                      write_reg(0x456, ctrl->val);
 +                      break;
 +              }
 +              return 0;
 +      }
 +
 +The control ops are called with the v4l2_ctrl pointer as argument.
 +The new control value has already been validated, so all you need to do is
 +to actually update the hardware registers.
 +
 +You're done! And this is sufficient for most of the drivers we have. No need
 +to do any validation of control values, or implement QUERYCTRL, QUERY_EXT_CTRL
 +and QUERYMENU. And G/S_CTRL as well as G/TRY/S_EXT_CTRLS are automatically supported.
 +
 +
 +.. note::
 +
 +   The remainder sections deal with more advanced controls topics and scenarios.
 +   In practice the basic usage as described above is sufficient for most drivers.
 +
 +
 +Inheriting Controls
 +-------------------
 +
 +When a sub-device is registered with a V4L2 driver by calling
 +v4l2_device_register_subdev() and the ctrl_handler fields of both v4l2_subdev
 +and v4l2_device are set, then the controls of the subdev will become
 +automatically available in the V4L2 driver as well. If the subdev driver
 +contains controls that already exist in the V4L2 driver, then those will be
 +skipped (so a V4L2 driver can always override a subdev control).
 +
 +What happens here is that v4l2_device_register_subdev() calls
 +v4l2_ctrl_add_handler() adding the controls of the subdev to the controls
 +of v4l2_device.
 +
 +
 +Accessing Control Values
 +------------------------
 +
 +The following union is used inside the control framework to access control
 +values:
 +
 +.. code-block:: none
 +
 +      union v4l2_ctrl_ptr {
 +              s32 *p_s32;
 +              s64 *p_s64;
 +              char *p_char;
 +              void *p;
 +      };
 +
 +The v4l2_ctrl struct contains these fields that can be used to access both
 +current and new values:
 +
 +.. code-block:: none
 +
 +      s32 val;
 +      struct {
 +              s32 val;
 +      } cur;
 +
 +
 +      union v4l2_ctrl_ptr p_new;
 +      union v4l2_ctrl_ptr p_cur;
 +
 +If the control has a simple s32 type type, then:
 +
 +.. code-block:: none
 +
 +      &ctrl->val == ctrl->p_new.p_s32
 +      &ctrl->cur.val == ctrl->p_cur.p_s32
 +
 +For all other types use ctrl->p_cur.p<something>. Basically the val
 +and cur.val fields can be considered an alias since these are used so often.
 +
 +Within the control ops you can freely use these. The val and cur.val speak for
 +themselves. The p_char pointers point to character buffers of length
 +ctrl->maximum + 1, and are always 0-terminated.
 +
 +Unless the control is marked volatile the p_cur field points to the the
 +current cached control value. When you create a new control this value is made
 +identical to the default value. After calling v4l2_ctrl_handler_setup() this
 +value is passed to the hardware. It is generally a good idea to call this
 +function.
 +
 +Whenever a new value is set that new value is automatically cached. This means
 +that most drivers do not need to implement the g_volatile_ctrl() op. The
 +exception is for controls that return a volatile register such as a signal
 +strength read-out that changes continuously. In that case you will need to
 +implement g_volatile_ctrl like this:
 +
 +.. code-block:: none
 +
 +      static int foo_g_volatile_ctrl(struct v4l2_ctrl *ctrl)
 +      {
 +              switch (ctrl->id) {
 +              case V4L2_CID_BRIGHTNESS:
 +                      ctrl->val = read_reg(0x123);
 +                      break;
 +              }
 +      }
 +
 +Note that you use the 'new value' union as well in g_volatile_ctrl. In general
 +controls that need to implement g_volatile_ctrl are read-only controls. If they
 +are not, a V4L2_EVENT_CTRL_CH_VALUE will not be generated when the control
 +changes.
 +
 +To mark a control as volatile you have to set V4L2_CTRL_FLAG_VOLATILE:
 +
 +.. code-block:: none
 +
 +      ctrl = v4l2_ctrl_new_std(&sd->ctrl_handler, ...);
 +      if (ctrl)
 +              ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;
 +
 +For try/s_ctrl the new values (i.e. as passed by the user) are filled in and
 +you can modify them in try_ctrl or set them in s_ctrl. The 'cur' union
 +contains the current value, which you can use (but not change!) as well.
 +
 +If s_ctrl returns 0 (OK), then the control framework will copy the new final
 +values to the 'cur' union.
 +
 +While in g_volatile/s/try_ctrl you can access the value of all controls owned
 +by the same handler since the handler's lock is held. If you need to access
 +the value of controls owned by other handlers, then you have to be very careful
 +not to introduce deadlocks.
 +
 +Outside of the control ops you have to go through to helper functions to get
 +or set a single control value safely in your driver:
 +
 +.. code-block:: none
 +
 +      s32 v4l2_ctrl_g_ctrl(struct v4l2_ctrl *ctrl);
 +      int v4l2_ctrl_s_ctrl(struct v4l2_ctrl *ctrl, s32 val);
 +
 +These functions go through the control framework just as VIDIOC_G/S_CTRL ioctls
 +do. Don't use these inside the control ops g_volatile/s/try_ctrl, though, that
 +will result in a deadlock since these helpers lock the handler as well.
 +
 +You can also take the handler lock yourself:
 +
 +.. code-block:: none
 +
 +      mutex_lock(&state->ctrl_handler.lock);
 +      pr_info("String value is '%s'\n", ctrl1->p_cur.p_char);
 +      pr_info("Integer value is '%s'\n", ctrl2->cur.val);
 +      mutex_unlock(&state->ctrl_handler.lock);
 +
 +
 +Menu Controls
 +-------------
 +
 +The v4l2_ctrl struct contains this union:
 +
 +.. code-block:: none
 +
 +      union {
 +              u32 step;
 +              u32 menu_skip_mask;
 +      };
 +
 +For menu controls menu_skip_mask is used. What it does is that it allows you
 +to easily exclude certain menu items. This is used in the VIDIOC_QUERYMENU
 +implementation where you can return -EINVAL if a certain menu item is not
 +present. Note that VIDIOC_QUERYCTRL always returns a step value of 1 for
 +menu controls.
 +
 +A good example is the MPEG Audio Layer II Bitrate menu control where the
 +menu is a list of standardized possible bitrates. But in practice hardware
 +implementations will only support a subset of those. By setting the skip
 +mask you can tell the framework which menu items should be skipped. Setting
 +it to 0 means that all menu items are supported.
 +
 +You set this mask either through the v4l2_ctrl_config struct for a custom
 +control, or by calling v4l2_ctrl_new_std_menu().
 +
 +
 +Custom Controls
 +---------------
 +
 +Driver specific controls can be created using v4l2_ctrl_new_custom():
 +
 +.. code-block:: none
 +
 +      static const struct v4l2_ctrl_config ctrl_filter = {
 +              .ops = &ctrl_custom_ops,
 +              .id = V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER,
 +              .name = "Spatial Filter",
 +              .type = V4L2_CTRL_TYPE_INTEGER,
 +              .flags = V4L2_CTRL_FLAG_SLIDER,
 +              .max = 15,
 +              .step = 1,
 +      };
 +
 +      ctrl = v4l2_ctrl_new_custom(&foo->ctrl_handler, &ctrl_filter, NULL);
 +
 +The last argument is the priv pointer which can be set to driver-specific
 +private data.
 +
 +The v4l2_ctrl_config struct also has a field to set the is_private flag.
 +
 +If the name field is not set, then the framework will assume this is a standard
 +control and will fill in the name, type and flags fields accordingly.
 +
 +
 +Active and Grabbed Controls
 +---------------------------
 +
 +If you get more complex relationships between controls, then you may have to
 +activate and deactivate controls. For example, if the Chroma AGC control is
 +on, then the Chroma Gain control is inactive. That is, you may set it, but
 +the value will not be used by the hardware as long as the automatic gain
 +control is on. Typically user interfaces can disable such input fields.
 +
 +You can set the 'active' status using v4l2_ctrl_activate(). By default all
 +controls are active. Note that the framework does not check for this flag.
 +It is meant purely for GUIs. The function is typically called from within
 +s_ctrl.
 +
 +The other flag is the 'grabbed' flag. A grabbed control means that you cannot
 +change it because it is in use by some resource. Typical examples are MPEG
 +bitrate controls that cannot be changed while capturing is in progress.
 +
 +If a control is set to 'grabbed' using v4l2_ctrl_grab(), then the framework
 +will return -EBUSY if an attempt is made to set this control. The
 +v4l2_ctrl_grab() function is typically called from the driver when it
 +starts or stops streaming.
 +
 +
 +Control Clusters
 +----------------
 +
 +By default all controls are independent from the others. But in more
 +complex scenarios you can get dependencies from one control to another.
 +In that case you need to 'cluster' them:
 +
 +.. code-block:: none
 +
 +      struct foo {
 +              struct v4l2_ctrl_handler ctrl_handler;
 +      #define AUDIO_CL_VOLUME (0)
 +      #define AUDIO_CL_MUTE   (1)
 +              struct v4l2_ctrl *audio_cluster[2];
 +              ...
 +      };
 +
 +      state->audio_cluster[AUDIO_CL_VOLUME] =
 +              v4l2_ctrl_new_std(&state->ctrl_handler, ...);
 +      state->audio_cluster[AUDIO_CL_MUTE] =
 +              v4l2_ctrl_new_std(&state->ctrl_handler, ...);
 +      v4l2_ctrl_cluster(ARRAY_SIZE(state->audio_cluster), state->audio_cluster);
 +
 +From now on whenever one or more of the controls belonging to the same
 +cluster is set (or 'gotten', or 'tried'), only the control ops of the first
 +control ('volume' in this example) is called. You effectively create a new
 +composite control. Similar to how a 'struct' works in C.
 +
 +So when s_ctrl is called with V4L2_CID_AUDIO_VOLUME as argument, you should set
 +all two controls belonging to the audio_cluster:
 +
 +.. code-block:: none
 +
 +      static int foo_s_ctrl(struct v4l2_ctrl *ctrl)
 +      {
 +              struct foo *state = container_of(ctrl->handler, struct foo, ctrl_handler);
 +
 +              switch (ctrl->id) {
 +              case V4L2_CID_AUDIO_VOLUME: {
 +                      struct v4l2_ctrl *mute = ctrl->cluster[AUDIO_CL_MUTE];
 +
 +                      write_reg(0x123, mute->val ? 0 : ctrl->val);
 +                      break;
 +              }
 +              case V4L2_CID_CONTRAST:
 +                      write_reg(0x456, ctrl->val);
 +                      break;
 +              }
 +              return 0;
 +      }
 +
 +In the example above the following are equivalent for the VOLUME case:
 +
 +.. code-block:: none
 +
 +      ctrl == ctrl->cluster[AUDIO_CL_VOLUME] == state->audio_cluster[AUDIO_CL_VOLUME]
 +      ctrl->cluster[AUDIO_CL_MUTE] == state->audio_cluster[AUDIO_CL_MUTE]
 +
 +In practice using cluster arrays like this becomes very tiresome. So instead
 +the following equivalent method is used:
 +
 +.. code-block:: none
 +
 +      struct {
 +              /* audio cluster */
 +              struct v4l2_ctrl *volume;
 +              struct v4l2_ctrl *mute;
 +      };
 +
 +The anonymous struct is used to clearly 'cluster' these two control pointers,
 +but it serves no other purpose. The effect is the same as creating an
 +array with two control pointers. So you can just do:
 +
 +.. code-block:: none
 +
 +      state->volume = v4l2_ctrl_new_std(&state->ctrl_handler, ...);
 +      state->mute = v4l2_ctrl_new_std(&state->ctrl_handler, ...);
 +      v4l2_ctrl_cluster(2, &state->volume);
 +
 +And in foo_s_ctrl you can use these pointers directly: state->mute->val.
 +
 +Note that controls in a cluster may be NULL. For example, if for some
 +reason mute was never added (because the hardware doesn't support that
 +particular feature), then mute will be NULL. So in that case we have a
 +cluster of 2 controls, of which only 1 is actually instantiated. The
 +only restriction is that the first control of the cluster must always be
 +present, since that is the 'master' control of the cluster. The master
 +control is the one that identifies the cluster and that provides the
 +pointer to the v4l2_ctrl_ops struct that is used for that cluster.
 +
 +Obviously, all controls in the cluster array must be initialized to either
 +a valid control or to NULL.
 +
 +In rare cases you might want to know which controls of a cluster actually
 +were set explicitly by the user. For this you can check the 'is_new' flag of
 +each control. For example, in the case of a volume/mute cluster the 'is_new'
 +flag of the mute control would be set if the user called VIDIOC_S_CTRL for
 +mute only. If the user would call VIDIOC_S_EXT_CTRLS for both mute and volume
 +controls, then the 'is_new' flag would be 1 for both controls.
 +
 +The 'is_new' flag is always 1 when called from v4l2_ctrl_handler_setup().
 +
 +
 +Handling autogain/gain-type Controls with Auto Clusters
 +-------------------------------------------------------
 +
 +A common type of control cluster is one that handles 'auto-foo/foo'-type
 +controls. Typical examples are autogain/gain, autoexposure/exposure,
 +autowhitebalance/red balance/blue balance. In all cases you have one control
 +that determines whether another control is handled automatically by the hardware,
 +or whether it is under manual control from the user.
 +
 +If the cluster is in automatic mode, then the manual controls should be
 +marked inactive and volatile. When the volatile controls are read the
 +g_volatile_ctrl operation should return the value that the hardware's automatic
 +mode set up automatically.
 +
 +If the cluster is put in manual mode, then the manual controls should become
 +active again and the volatile flag is cleared (so g_volatile_ctrl is no longer
 +called while in manual mode). In addition just before switching to manual mode
 +the current values as determined by the auto mode are copied as the new manual
 +values.
 +
 +Finally the V4L2_CTRL_FLAG_UPDATE should be set for the auto control since
 +changing that control affects the control flags of the manual controls.
 +
 +In order to simplify this a special variation of v4l2_ctrl_cluster was
 +introduced:
 +
 +.. code-block:: none
 +
 +      void v4l2_ctrl_auto_cluster(unsigned ncontrols, struct v4l2_ctrl **controls,
 +                                  u8 manual_val, bool set_volatile);
 +
 +The first two arguments are identical to v4l2_ctrl_cluster. The third argument
 +tells the framework which value switches the cluster into manual mode. The
 +last argument will optionally set V4L2_CTRL_FLAG_VOLATILE for the non-auto controls.
 +If it is false, then the manual controls are never volatile. You would typically
 +use that if the hardware does not give you the option to read back to values as
 +determined by the auto mode (e.g. if autogain is on, the hardware doesn't allow
 +you to obtain the current gain value).
 +
 +The first control of the cluster is assumed to be the 'auto' control.
 +
 +Using this function will ensure that you don't need to handle all the complex
 +flag and volatile handling.
 +
 +
 +VIDIOC_LOG_STATUS Support
 +-------------------------
 +
 +This ioctl allow you to dump the current status of a driver to the kernel log.
 +The v4l2_ctrl_handler_log_status(ctrl_handler, prefix) can be used to dump the
 +value of the controls owned by the given handler to the log. You can supply a
 +prefix as well. If the prefix didn't end with a space, then ': ' will be added
 +for you.
 +
 +
 +Different Handlers for Different Video Nodes
 +--------------------------------------------
 +
 +Usually the V4L2 driver has just one control handler that is global for
 +all video nodes. But you can also specify different control handlers for
 +different video nodes. You can do that by manually setting the ctrl_handler
 +field of struct video_device.
 +
 +That is no problem if there are no subdevs involved but if there are, then
 +you need to block the automatic merging of subdev controls to the global
 +control handler. You do that by simply setting the ctrl_handler field in
 +struct v4l2_device to NULL. Now v4l2_device_register_subdev() will no longer
 +merge subdev controls.
 +
 +After each subdev was added, you will then have to call v4l2_ctrl_add_handler
 +manually to add the subdev's control handler (sd->ctrl_handler) to the desired
 +control handler. This control handler may be specific to the video_device or
 +for a subset of video_device's. For example: the radio device nodes only have
 +audio controls, while the video and vbi device nodes share the same control
 +handler for the audio and video controls.
 +
 +If you want to have one handler (e.g. for a radio device node) have a subset
 +of another handler (e.g. for a video device node), then you should first add
 +the controls to the first handler, add the other controls to the second
 +handler and finally add the first handler to the second. For example:
 +
 +.. code-block:: none
 +
 +      v4l2_ctrl_new_std(&radio_ctrl_handler, &radio_ops, V4L2_CID_AUDIO_VOLUME, ...);
 +      v4l2_ctrl_new_std(&radio_ctrl_handler, &radio_ops, V4L2_CID_AUDIO_MUTE, ...);
 +      v4l2_ctrl_new_std(&video_ctrl_handler, &video_ops, V4L2_CID_BRIGHTNESS, ...);
 +      v4l2_ctrl_new_std(&video_ctrl_handler, &video_ops, V4L2_CID_CONTRAST, ...);
 +      v4l2_ctrl_add_handler(&video_ctrl_handler, &radio_ctrl_handler, NULL);
 +
 +The last argument to v4l2_ctrl_add_handler() is a filter function that allows
 +you to filter which controls will be added. Set it to NULL if you want to add
 +all controls.
 +
 +Or you can add specific controls to a handler:
 +
 +.. code-block:: none
 +
 +      volume = v4l2_ctrl_new_std(&video_ctrl_handler, &ops, V4L2_CID_AUDIO_VOLUME, ...);
 +      v4l2_ctrl_new_std(&video_ctrl_handler, &ops, V4L2_CID_BRIGHTNESS, ...);
 +      v4l2_ctrl_new_std(&video_ctrl_handler, &ops, V4L2_CID_CONTRAST, ...);
 +
 +What you should not do is make two identical controls for two handlers.
 +For example:
 +
 +.. code-block:: none
 +
 +      v4l2_ctrl_new_std(&radio_ctrl_handler, &radio_ops, V4L2_CID_AUDIO_MUTE, ...);
 +      v4l2_ctrl_new_std(&video_ctrl_handler, &video_ops, V4L2_CID_AUDIO_MUTE, ...);
 +
 +This would be bad since muting the radio would not change the video mute
 +control. The rule is to have one control for each hardware 'knob' that you
 +can twiddle.
 +
 +
 +Finding Controls
 +----------------
 +
 +Normally you have created the controls yourself and you can store the struct
 +v4l2_ctrl pointer into your own struct.
 +
 +But sometimes you need to find a control from another handler that you do
 +not own. For example, if you have to find a volume control from a subdev.
 +
 +You can do that by calling v4l2_ctrl_find:
 +
 +.. code-block:: none
 +
 +      struct v4l2_ctrl *volume;
 +
 +      volume = v4l2_ctrl_find(sd->ctrl_handler, V4L2_CID_AUDIO_VOLUME);
 +
 +Since v4l2_ctrl_find will lock the handler you have to be careful where you
 +use it. For example, this is not a good idea:
 +
 +.. code-block:: none
 +
 +      struct v4l2_ctrl_handler ctrl_handler;
 +
 +      v4l2_ctrl_new_std(&ctrl_handler, &video_ops, V4L2_CID_BRIGHTNESS, ...);
 +      v4l2_ctrl_new_std(&ctrl_handler, &video_ops, V4L2_CID_CONTRAST, ...);
 +
 +...and in video_ops.s_ctrl:
 +
 +.. code-block:: none
 +
 +      case V4L2_CID_BRIGHTNESS:
 +              contrast = v4l2_find_ctrl(&ctrl_handler, V4L2_CID_CONTRAST);
 +              ...
 +
 +When s_ctrl is called by the framework the ctrl_handler.lock is already taken, so
 +attempting to find another control from the same handler will deadlock.
 +
 +It is recommended not to use this function from inside the control ops.
 +
 +
 +Inheriting Controls
 +-------------------
 +
 +When one control handler is added to another using v4l2_ctrl_add_handler, then
 +by default all controls from one are merged to the other. But a subdev might
 +have low-level controls that make sense for some advanced embedded system, but
 +not when it is used in consumer-level hardware. In that case you want to keep
 +those low-level controls local to the subdev. You can do this by simply
 +setting the 'is_private' flag of the control to 1:
 +
 +.. code-block:: none
 +
 +      static const struct v4l2_ctrl_config ctrl_private = {
 +              .ops = &ctrl_custom_ops,
 +              .id = V4L2_CID_...,
 +              .name = "Some Private Control",
 +              .type = V4L2_CTRL_TYPE_INTEGER,
 +              .max = 15,
 +              .step = 1,
 +              .is_private = 1,
 +      };
 +
 +      ctrl = v4l2_ctrl_new_custom(&foo->ctrl_handler, &ctrl_private, NULL);
 +
 +These controls will now be skipped when v4l2_ctrl_add_handler is called.
 +
 +
 +V4L2_CTRL_TYPE_CTRL_CLASS Controls
 +----------------------------------
 +
 +Controls of this type can be used by GUIs to get the name of the control class.
 +A fully featured GUI can make a dialog with multiple tabs with each tab
 +containing the controls belonging to a particular control class. The name of
 +each tab can be found by querying a special control with ID <control class | 1>.
 +
 +Drivers do not have to care about this. The framework will automatically add
 +a control of this type whenever the first control belonging to a new control
 +class is added.
 +
 +
 +Adding Notify Callbacks
 +-----------------------
 +
 +Sometimes the platform or bridge driver needs to be notified when a control
 +from a sub-device driver changes. You can set a notify callback by calling
 +this function:
 +
 +.. code-block:: none
 +
 +      void v4l2_ctrl_notify(struct v4l2_ctrl *ctrl,
 +              void (*notify)(struct v4l2_ctrl *ctrl, void *priv), void *priv);
 +
 +Whenever the give control changes value the notify callback will be called
 +with a pointer to the control and the priv pointer that was passed with
 +v4l2_ctrl_notify. Note that the control's handler lock is held when the
 +notify function is called.
 +
 +There can be only one notify function per control handler. Any attempt
 +to set another notify function will cause a WARN_ON.
diff --combined Makefile
index 34bc4e22ec0b70e51fbb6628b3a9335748e0fdb1,0d504893df6e954b46d91007ebe0378d11820b5d..f25c76e1399e0b16e44fce6582ae4956c19037af
+++ b/Makefile
@@@ -1,7 -1,7 +1,7 @@@
  VERSION = 4
  PATCHLEVEL = 7
  SUBLEVEL = 0
- EXTRAVERSION = -rc1
+ EXTRAVERSION = -rc6
  NAME = Psychotic Stoned Sheep
  
  # *DOCUMENTATION*
@@@ -363,11 -363,13 +363,13 @@@ CHECK           = spars
  
  CHECKFLAGS     := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ \
                  -Wbitwise -Wno-return-void $(CF)
+ NOSTDINC_FLAGS  =
  CFLAGS_MODULE   =
  AFLAGS_MODULE   =
  LDFLAGS_MODULE  =
  CFLAGS_KERNEL =
  AFLAGS_KERNEL =
+ LDFLAGS_vmlinux =
  CFLAGS_GCOV   = -fprofile-arcs -ftest-coverage -fno-tree-loop-im -Wno-maybe-uninitialized
  CFLAGS_KCOV   = -fsanitize-coverage=trace-pc
  
@@@ -1364,8 -1366,6 +1366,8 @@@ help
        @$(MAKE) $(build)=$(package-dir) help
        @echo  ''
        @echo  'Documentation targets:'
 +      @$(MAKE) -f $(srctree)/Documentation/Makefile.sphinx dochelp
 +      @echo  ''
        @$(MAKE) -f $(srctree)/Documentation/DocBook/Makefile dochelp
        @echo  ''
        @echo  'Architecture specific targets ($(SRCARCH)):'
@@@ -1414,11 -1414,8 +1416,11 @@@ $(help-board-dirs): help-%
  
  # Documentation targets
  # ---------------------------------------------------------------------------
 -%docs: scripts_basic FORCE
 +DOC_TARGETS := xmldocs sgmldocs psdocs pdfdocs htmldocs mandocs installmandocs epubdocs cleandocs cleanmediadocs
 +PHONY += $(DOC_TARGETS)
 +$(DOC_TARGETS): scripts_basic FORCE
        $(Q)$(MAKE) $(build)=scripts build_docproc build_check-lc_ctype
 +      $(Q)$(MAKE) $(build)=Documentation -f $(srctree)/Documentation/Makefile.sphinx $@
        $(Q)$(MAKE) $(build)=Documentation/DocBook $@
  
  else # KBUILD_EXTMOD
index ad42252b1c66e246588b81e1e05c47687d1b0c88,7f1dffef43531f1cde3339a32ac1b40caf02cad4..99379c09aa7fa8255beeaffb4a457c2d89d971ce
@@@ -1,10 -1,6 +1,10 @@@
  /*
   * demux.h
   *
 + * The Kernel Digital TV Demux kABI defines a driver-internal interface for
 + * registering low-level, hardware specific driver to a hardware independent
 + * demux layer.
 + *
   * Copyright (c) 2002 Convergence GmbH
   *
   * based on code:
  #include <linux/time.h>
  #include <linux/dvb/dmx.h>
  
 -/**
 - * DOC: Digital TV Demux
 - *
 - * The Kernel Digital TV Demux kABI defines a driver-internal interface for
 - * registering low-level, hardware specific driver to a hardware independent
 - * demux layer. It is only of interest for Digital TV device driver writers.
 - * The header file for this kABI is named demux.h and located in
 - * drivers/media/dvb-core.
 - *
 - * The demux kABI should be implemented for each demux in the system. It is
 - * used to select the TS source of a demux and to manage the demux resources.
 - * When the demux client allocates a resource via the demux kABI, it receives
 - * a pointer to the kABI of that resource.
 - *
 - * Each demux receives its TS input from a DVB front-end or from memory, as
 - * set via this demux kABI. In a system with more than one front-end, the kABI
 - * can be used to select one of the DVB front-ends as a TS source for a demux,
 - * unless this is fixed in the HW platform.
 - *
 - * The demux kABI only controls front-ends regarding to their connections with
 - * demuxes; the kABI used to set the other front-end parameters, such as
 - * tuning, are devined via the Digital TV Frontend kABI.
 - *
 - * The functions that implement the abstract interface demux should be defined
 - * static or module private and registered to the Demux core for external
 - * access. It is not necessary to implement every function in the struct
 - * &dmx_demux. For example, a demux interface might support Section filtering,
 - * but not PES filtering. The kABI client is expected to check the value of any
 - * function pointer before calling the function: the value of NULL means
 - * that the function is not available.
 - *
 - * Whenever the functions of the demux API modify shared data, the
 - * possibilities of lost update and race condition problems should be
 - * addressed, e.g. by protecting parts of code with mutexes.
 - *
 - * Note that functions called from a bottom half context must not sleep.
 - * Even a simple memory allocation without using %GFP_ATOMIC can result in a
 - * kernel thread being put to sleep if swapping is needed. For example, the
 - * Linux Kernel calls the functions of a network device interface from a
 - * bottom half context. Thus, if a demux kABI function is called from network
 - * device code, the function must not sleep.
 - */
 -
  /*
   * Common definitions
   */
@@@ -104,7 -143,7 +104,7 @@@ struct dmx_ts_feed 
                   int type,
                   enum dmx_ts_pes pes_type,
                   size_t circular_buffer_size,
-                  struct timespec timeout);
+                  ktime_t timeout);
        int (*start_filtering)(struct dmx_ts_feed *feed);
        int (*stop_filtering)(struct dmx_ts_feed *feed);
  };
@@@ -191,6 -230,30 +191,6 @@@ struct dmx_section_feed 
        int (*stop_filtering)(struct dmx_section_feed *feed);
  };
  
 -/**
 - * DOC: Demux Callback
 - *
 - * This kernel-space API comprises the callback functions that deliver filtered
 - * data to the demux client. Unlike the other DVB kABIs, these functions are
 - * provided by the client and called from the demux code.
 - *
 - * The function pointers of this abstract interface are not packed into a
 - * structure as in the other demux APIs, because the callback functions are
 - * registered and used independent of each other. As an example, it is possible
 - * for the API client to provide several callback functions for receiving TS
 - * packets and no callbacks for PES packets or sections.
 - *
 - * The functions that implement the callback API need not be re-entrant: when
 - * a demux driver calls one of these functions, the driver is not allowed to
 - * call the function again before the original call returns. If a callback is
 - * triggered by a hardware interrupt, it is recommended to use the Linux
 - * bottom half mechanism or start a tasklet instead of making the callback
 - * function call directly from a hardware interrupt.
 - *
 - * This mechanism is implemented by dmx_ts_cb() and dmx_section_cb()
 - * callbacks.
 - */
 -
  /**
   * typedef dmx_ts_cb - DVB demux TS filter callback function prototype
   *
@@@ -379,10 -442,10 +379,10 @@@ enum dmx_demux_caps 
   *    @open is called and decrement it when @close is called.
   *    The @demux function parameter contains a pointer to the demux API and
   *    instance data.
 - *    It returns
 - *            0 on success;
 - *            -EUSERS, if maximum usage count was reached;
 - *            -EINVAL, on bad parameter.
 + *    It returns:
 + *    0 on success;
 + *    -EUSERS, if maximum usage count was reached;
 + *    -EINVAL, on bad parameter.
   *
   * @close: This function reserves the demux for use by the caller and, if
   *    necessary, initializes the demux. When the demux is no longer needed,
   *    @open is called and decrement it when @close is called.
   *    The @demux function parameter contains a pointer to the demux API and
   *    instance data.
 - *    It returns
 - *            0 on success;
 - *            -ENODEV, if demux was not in use (e. g. no users);
 - *            -EINVAL, on bad parameter.
 + *    It returns:
 + *    0 on success;
 + *    -ENODEV, if demux was not in use (e. g. no users);
 + *    -EINVAL, on bad parameter.
   *
   * @write: This function provides the demux driver with a memory buffer
   *    containing TS packets. Instead of receiving TS packets from the DVB
   *    The @buf function parameter contains a pointer to the TS data in
   *    kernel-space memory.
   *    The @count function parameter contains the length of the TS data.
 - *    It returns
 - *            0 on success;
 - *            -ERESTARTSYS, if mutex lock was interrupted;
 - *            -EINTR, if a signal handling is pending;
 - *            -ENODEV, if demux was removed;
 - *            -EINVAL, on bad parameter.
 + *    It returns:
 + *    0 on success;
 + *    -ERESTARTSYS, if mutex lock was interrupted;
 + *    -EINTR, if a signal handling is pending;
 + *    -ENODEV, if demux was removed;
 + *    -EINVAL, on bad parameter.
   *
   * @allocate_ts_feed: Allocates a new TS feed, which is used to filter the TS
   *    packets carrying a certain PID. The TS feed normally corresponds to a
   *    instance data.
   *    The @callback function parameter contains a pointer to the callback
   *    function for passing received TS packet.
 - *    It returns
 - *            0 on success;
 - *            -ERESTARTSYS, if mutex lock was interrupted;
 - *            -EBUSY, if no more TS feeds is available;
 - *            -EINVAL, on bad parameter.
 + *    It returns:
 + *    0 on success;
 + *    -ERESTARTSYS, if mutex lock was interrupted;
 + *    -EBUSY, if no more TS feeds is available;
 + *    -EINVAL, on bad parameter.
   *
   * @release_ts_feed: Releases the resources allocated with @allocate_ts_feed.
   *    Any filtering in progress on the TS feed should be stopped before
   *    instance data.
   *    The @feed function parameter contains a pointer to the TS feed API and
   *    instance data.
 - *    It returns
 - *            0 on success;
 - *            -EINVAL on bad parameter.
 + *    It returns:
 + *    0 on success;
 + *    -EINVAL on bad parameter.
   *
   * @allocate_section_feed: Allocates a new section feed, i.e. a demux resource
   *    for filtering and receiving sections. On platforms with hardware
   *    instance data.
   *    The @callback function parameter contains a pointer to the callback
   *    function for passing received TS packet.
 - *    It returns
 - *            0 on success;
 - *            -EBUSY, if no more TS feeds is available;
 - *            -EINVAL, on bad parameter.
 + *    It returns:
 + *    0 on success;
 + *    -EBUSY, if no more TS feeds is available;
 + *    -EINVAL, on bad parameter.
   *
   * @release_section_feed: Releases the resources allocated with
   *    @allocate_section_feed, including allocated filters. Any filtering in
   *    instance data.
   *    The @feed function parameter contains a pointer to the TS feed API and
   *    instance data.
 - *    It returns
 - *            0 on success;
 - *            -EINVAL, on bad parameter.
 + *    It returns:
 + *    0 on success;
 + *    -EINVAL, on bad parameter.
   *
   * @add_frontend: Registers a connectivity between a demux and a front-end,
   *    i.e., indicates that the demux can be connected via a call to
   *    instance data.
   *    The @frontend function parameter contains a pointer to the front-end
   *    instance data.
 - *    It returns
 - *            0 on success;
 - *            -EINVAL, on bad parameter.
 + *    It returns:
 + *    0 on success;
 + *    -EINVAL, on bad parameter.
   *
   * @remove_frontend: Indicates that the given front-end, registered by a call
   *    to @add_frontend, can no longer be connected as a TS source by this
   *    instance data.
   *    The @frontend function parameter contains a pointer to the front-end
   *    instance data.
 - *    It returns
 - *            0 on success;
 - *            -ENODEV, if the front-end was not found,
 - *            -EINVAL, on bad parameter.
 + *    It returns:
 + *    0 on success;
 + *    -ENODEV, if the front-end was not found,
 + *    -EINVAL, on bad parameter.
   *
   * @get_frontends: Provides the APIs of the front-ends that have been
   *    registered for this demux. Any of the front-ends obtained with this
   *    instance data.
   *    The @frontend function parameter contains a pointer to the front-end
   *    instance data.
 - *    It returns
 - *            0 on success;
 - *            -EINVAL, on bad parameter.
 + *    It returns:
 + *    0 on success;
 + *    -EINVAL, on bad parameter.
   *
   * @disconnect_frontend: Disconnects the demux and a front-end previously
   *    connected by a @connect_frontend call.
   *    The @demux function parameter contains a pointer to the demux API and
   *    instance data.
 - *    It returns
 - *            0 on success;
 - *            -EINVAL on bad parameter.
 + *    It returns:
 + *    0 on success;
 + *    -EINVAL on bad parameter.
   *
   * @get_pes_pids: Get the PIDs for DMX_PES_AUDIO0, DMX_PES_VIDEO0,
   *    DMX_PES_TELETEXT0, DMX_PES_SUBTITLE0 and DMX_PES_PCR0.
   *    instance data.
   *    The @pids function parameter contains an array with five u16 elements
   *    where the PIDs will be stored.
 - *    It returns
 - *            0 on success;
 - *            -EINVAL on bad parameter.
 + *    It returns:
 + *    0 on success;
 + *    -EINVAL on bad parameter.
   */
  
  struct dmx_demux {
diff --combined include/media/rc-core.h
index ff54a71f5cd20c790c2302ef12367c648dbdccc7,324232cfc08db60de245f461778fa60fd23ba205..10908e356b23aa29c4af2caf449ce32a20ecd50f
@@@ -29,16 -29,9 +29,16 @@@ do {                                                                
                printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__);  \
  } while (0)
  
 +/**
 + * enum rc_driver_type - type of the RC output
 + *
 + * @RC_DRIVER_SCANCODE:       Driver or hardware generates a scancode
 + * @RC_DRIVER_IR_RAW: Driver or hardware generates pulse/space sequences.
 + *                    It needs a Infra-Red pulse/space decoder
 + */
  enum rc_driver_type {
 -      RC_DRIVER_SCANCODE = 0, /* Driver or hardware generates a scancode */
 -      RC_DRIVER_IR_RAW,       /* Needs a Infra-Red pulse/space decoder */
 +      RC_DRIVER_SCANCODE = 0,
 +      RC_DRIVER_IR_RAW,
  };
  
  /**
@@@ -126,6 -119,7 +126,7 @@@ enum rc_filter_type 
   * @s_carrier_report: enable carrier reports
   * @s_filter: set the scancode filter
   * @s_wakeup_filter: set the wakeup scancode filter
+  * @s_timeout: set hardware timeout in ns
   */
  struct rc_dev {
        struct device                   dev;
                                                    struct rc_scancode_filter *filter);
        int                             (*s_wakeup_filter)(struct rc_dev *dev,
                                                           struct rc_scancode_filter *filter);
+       int                             (*s_timeout)(struct rc_dev *dev,
+                                                    unsigned int timeout);
  };
  
  #define to_rc_dev(d) container_of(d, struct rc_dev, dev)
   * Remote Controller, at sys/class/rc.
   */
  
 +/**
 + * rc_allocate_device - Allocates a RC device
 + *
 + * returns a pointer to struct rc_dev.
 + */
  struct rc_dev *rc_allocate_device(void);
 +
 +/**
 + * rc_free_device - Frees a RC device
 + *
 + * @dev: pointer to struct rc_dev.
 + */
  void rc_free_device(struct rc_dev *dev);
 +
 +/**
 + * rc_register_device - Registers a RC device
 + *
 + * @dev: pointer to struct rc_dev.
 + */
  int rc_register_device(struct rc_dev *dev);
 +
 +/**
 + * rc_unregister_device - Unregisters a RC device
 + *
 + * @dev: pointer to struct rc_dev.
 + */
  void rc_unregister_device(struct rc_dev *dev);
  
 +/**
 + * rc_open - Opens a RC device
 + *
 + * @rdev: pointer to struct rc_dev.
 + */
  int rc_open(struct rc_dev *rdev);
 +
 +/**
 + * rc_open - Closes a RC device
 + *
 + * @rdev: pointer to struct rc_dev.
 + */
  void rc_close(struct rc_dev *rdev);
  
  void rc_repeat(struct rc_dev *dev);
diff --combined include/media/rc-map.h
index 726bd9374fd21a3559cadda86ff2b44c9891e71e,a459129dd554cc3dc9ec4e9061d9756944db3e73..daa75fcc1ff1d2ccdb64a76aa11696c9b25278ad
@@@ -98,25 -98,10 +98,25 @@@ struct rc_map_list 
  
  /* Routines from rc-map.c */
  
 +/**
 + * rc_map_register() - Registers a Remote Controler scancode map
 + *
 + * @map:      pointer to struct rc_map_list
 + */
  int rc_map_register(struct rc_map_list *map);
 +
 +/**
 + * rc_map_unregister() - Unregisters a Remote Controler scancode map
 + *
 + * @map:      pointer to struct rc_map_list
 + */
  void rc_map_unregister(struct rc_map_list *map);
 +
 +/**
 + * rc_map_get - gets an RC map from its name
 + * @name: name of the RC scancode map
 + */
  struct rc_map *rc_map_get(const char *name);
 -void rc_map_init(void);
  
  /* Names of the several keytables defined in-kernel */
  
  #define RC_MAP_DM1105_NEC                "rc-dm1105-nec"
  #define RC_MAP_DNTV_LIVE_DVBT_PRO        "rc-dntv-live-dvbt-pro"
  #define RC_MAP_DNTV_LIVE_DVB_T           "rc-dntv-live-dvb-t"
+ #define RC_MAP_DTT200U                   "rc-dtt200u"
  #define RC_MAP_DVBSKY                    "rc-dvbsky"
  #define RC_MAP_EMPTY                     "rc-empty"
  #define RC_MAP_EM_TERRATEC               "rc-em-terratec"
index 4c880e86a1aa6d59b633ab005be400dfa49309a8,c672efc4f87b836e293ff366d95e9a20f9f20bf4..1f672c0ac7d13b1a6d24e593fbe250fb69332d9f
@@@ -143,20 -143,6 +143,6 @@@ struct v4l2_subdev_io_pin_config 
   * @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.
   *
@@@ -190,13 -176,6 +176,6 @@@ struct v4l2_subdev_core_ops 
        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);
-       int (*g_ctrl)(struct v4l2_subdev *sd, struct v4l2_control *ctrl);
-       int (*s_ctrl)(struct v4l2_subdev *sd, struct v4l2_control *ctrl);
-       int (*g_ext_ctrls)(struct v4l2_subdev *sd, struct v4l2_ext_controls *ctrls);
-       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);
        long (*ioctl)(struct v4l2_subdev *sd, unsigned int cmd, void *arg);
  #ifdef CONFIG_COMPAT
        long (*compat_ioctl32)(struct v4l2_subdev *sd, unsigned int cmd,
   *
   * @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.
 + *             or the bridge driver.
   *
   * @enum_freq_bands: callback for VIDIOC_ENUM_FREQ_BANDS 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.
 + *         bridge driver.
   *
   * @g_modulator: callback for VIDIOC_G_MODULATOR ioctl handler code.
   *
index 01cdd5bf90c853517c9717456591261f779905eb,bea81c9e37581c3318baabbbef5238974df7dae7..c346beaaeae68cc74ed4fe3ccd2c30ba868806e3
@@@ -27,7 -27,6 +27,6 @@@ enum vb2_memory 
        VB2_MEMORY_DMABUF       = 4,
  };
  
- struct vb2_alloc_ctx;
  struct vb2_fileio_data;
  struct vb2_threadio_data;
  
@@@ -57,7 -56,7 +56,7 @@@
   * @put_userptr: inform the allocator that a USERPTR buffer will no longer
   *             be used.
   * @attach_dmabuf: attach a shared struct dma_buf for a hardware operation;
-  *               used for DMABUF memory types; alloc_ctx is the alloc context
+  *               used for DMABUF memory types; dev is the alloc device
   *               dbuf is the shared dma_buf; returns NULL on failure;
   *               allocator private per-buffer structure on success;
   *               this needs to be used for further accesses to the buffer.
   * @mmap:     setup a userspace mapping for a given memory buffer under
   *            the provided virtual memory region.
   *
 - * Required ops for USERPTR types: get_userptr, put_userptr.
 - * Required ops for MMAP types: alloc, put, num_users, mmap.
 - * Required ops for read/write access types: alloc, put, num_users, vaddr.
 - * Required ops for DMABUF types: attach_dmabuf, detach_dmabuf, map_dmabuf,
 - *                              unmap_dmabuf.
 + * Those operations are used by the videobuf2 core to implement the memory
 + * handling/memory allocators for each type of supported streaming I/O method.
 + *
 + * .. note::
 + *    #) Required ops for USERPTR types: get_userptr, put_userptr.
 + *
 + *    #) Required ops for MMAP types: alloc, put, num_users, mmap.
 + *
 + *    #) Required ops for read/write access types: alloc, put, num_users, vaddr.
 + *
 + *    #) Required ops for DMABUF types: attach_dmabuf, detach_dmabuf, map_dmabuf, unmap_dmabuf.
   */
  struct vb2_mem_ops {
-       void            *(*alloc)(void *alloc_ctx, unsigned long size,
-                                 enum dma_data_direction dma_dir,
+       void            *(*alloc)(struct device *dev, const struct dma_attrs *attrs,
+                                 unsigned long size, enum dma_data_direction dma_dir,
                                  gfp_t gfp_flags);
        void            (*put)(void *buf_priv);
        struct dma_buf *(*get_dmabuf)(void *buf_priv, unsigned long flags);
  
-       void            *(*get_userptr)(void *alloc_ctx, unsigned long vaddr,
+       void            *(*get_userptr)(struct device *dev, unsigned long vaddr,
                                        unsigned long size,
                                        enum dma_data_direction dma_dir);
        void            (*put_userptr)(void *buf_priv);
        void            (*prepare)(void *buf_priv);
        void            (*finish)(void *buf_priv);
  
-       void            *(*attach_dmabuf)(void *alloc_ctx, struct dma_buf *dbuf,
+       void            *(*attach_dmabuf)(struct device *dev, struct dma_buf *dbuf,
                                          unsigned long size,
                                          enum dma_data_direction dma_dir);
        void            (*detach_dmabuf)(void *buf_priv);
@@@ -285,19 -278,19 +284,19 @@@ struct vb2_buffer 
   *                    second time with the actually allocated number of
   *                    buffers to verify if that is OK.
   *                    The driver should return the required number of buffers
 - *                    in *num_buffers, the required number of planes per
 - *                    buffer in *num_planes, the size of each plane should be
 + *                    in \*num_buffers, the required number of planes per
 + *                    buffer in \*num_planes, the size of each plane should be
   *                    set in the sizes[] array and optional per-plane
-  *                    allocator specific context in the alloc_ctxs[] array.
-  *                    When called from VIDIOC_REQBUFS, \*num_planes == 0, the
+  *                    allocator specific device in the alloc_devs[] array.
+  *                    When called from VIDIOC_REQBUFS, *num_planes == 0, the
   *                    driver has to use the currently configured format to
 - *                    determine the plane sizes and *num_buffers is the total
 + *                    determine the plane sizes and \*num_buffers is the total
   *                    number of buffers that are being allocated. When called
 - *                    from VIDIOC_CREATE_BUFS, *num_planes != 0 and it
 + *                    from VIDIOC_CREATE_BUFS, \*num_planes != 0 and it
   *                    describes the requested number of planes and sizes[]
   *                    contains the requested plane sizes. If either
 - *                    *num_planes or the requested sizes are invalid callback
 - *                    must return -EINVAL. In this case *num_buffers are
 + *                    \*num_planes or the requested sizes are invalid callback
 + *                    must return -EINVAL. In this case \*num_buffers are
   *                    being allocated additionally to q->num_buffers.
   * @wait_prepare:     release any locks taken while calling vb2 functions;
   *                    it is called before an ioctl needs to wait for a new
  struct vb2_ops {
        int (*queue_setup)(struct vb2_queue *q,
                           unsigned int *num_buffers, unsigned int *num_planes,
-                          unsigned int sizes[], void *alloc_ctxs[]);
+                          unsigned int sizes[], struct device *alloc_devs[]);
  
        void (*wait_prepare)(struct vb2_queue *q);
        void (*wait_finish)(struct vb2_queue *q);
@@@ -407,6 -400,9 +406,9 @@@ struct vb2_buf_ops 
   *            caller. For example, for V4L2, it should match
   *            the V4L2_BUF_TYPE_* in include/uapi/linux/videodev2.h
   * @io_modes: supported io methods (see vb2_io_modes enum)
+  * @dev:      device to use for the default allocation context if the driver
+  *            doesn't fill in the @alloc_devs array.
+  * @dma_attrs:        DMA attributes to use for the DMA. May be NULL.
   * @fileio_read_once:         report EOF after reading the first buffer
   * @fileio_write_immediately: queue buffer after each write() call
   * @allow_zero_bytesused:     allow bytesused == 0 to be passed to the driver
   * @done_list:        list of buffers ready to be dequeued to userspace
   * @done_lock:        lock to protect done_list list
   * @done_wq:  waitqueue for processes waiting for buffers ready to be dequeued
-  * @alloc_ctx:        memory type/allocator-specific contexts for each plane
+  * @alloc_devs:       memory type/allocator-specific per-plane device
   * @streaming:        current streaming state
   * @start_streaming_called: start_streaming() was called successfully and we
   *            started streaming.
  struct vb2_queue {
        unsigned int                    type;
        unsigned int                    io_modes;
+       struct device                   *dev;
+       const struct dma_attrs          *dma_attrs;
        unsigned                        fileio_read_once:1;
        unsigned                        fileio_write_immediately:1;
        unsigned                        allow_zero_bytesused:1;
        spinlock_t                      done_lock;
        wait_queue_head_t               done_wq;
  
-       void                            *alloc_ctx[VB2_MAX_PLANES];
+       struct device                   *alloc_devs[VB2_MAX_PLANES];
  
        unsigned int                    streaming:1;
        unsigned int                    start_streaming_called:1;