• Shuah Khan's avatar
    media: vimc: Collapse component structure into a single monolithic driver · f13d5f36
    Shuah Khan authored
    vimc uses Component API to split the driver into functional components.
    The real hardware resembles a monolith structure than component and
    component structure added a level of complexity making it hard to
    maintain without adding any real benefit.
    
    The sensor is one vimc component that would makes sense to be a separate
    module to closely align with the real hardware. It would be easier to
    collapse vimc into single monolithic driver first and then split the
    sensor off as a separate module.
    
    Collapse it into a single monolithic driver removing the Component API.
    This patch removes the component API and makes minimal changes to the
    code base preserving the functional division of the code structure.
    Preserving the functional structure allows us to split the sensor off
    as a separate module in the future.
    
    Major design elements in this change are:
    - Use existing struct vimc_ent_config and struct vimc_pipeline_config
      to drive the initialization of the functional components.
    - Make vimc_device and vimc_ent_config global by moving them to
      vimc-common.h
    - Add two new hooks add and rm to initialize and register, unregister
      and free subdevs.
    - All component API is now gone and bind and unbind hooks are modified
      to do "add" and "rm" with minimal changes to just add and rm subdevs.
    - vimc-core's bind and unbind are now register and unregister.
    - Add a new field to vimc_device structure for saving the pointers to
      struct vimc_ent_device(s) subdevs create in their "add" hooks. These
      get used to create links and removing the subdevs. vimc-core allocates
      this array which sized to number of entries in the topology defined in
      the vimc_pipeline_config structure.
    - vimc-core invokes "add" hooks from its vimc_register_devices().
      The "add" hooks remain the same and register subdevs. They don't
      create platform devices of their own and use vimc's pdev.dev as
      their reference device. Each "add" hook returns pointer to its struct
      vimc_ent_device. This is saved in the vimc_device ent_devs array.
    - vimc-core invokes "rm" hooks from its unregister to unregister subdevs
      and cleanup.
    - vimc-core invokes "add" and "rm" hooks with pointer to struct vimc_device
      and the corresponding vimc_ent_device saved in the ent_devs.
    
    The following configure and stream test works on all devices.
    
    media-ctl -d platform:vimc -V '"Sensor A":0[fmt:SBGGR8_1X8/640x480]'
    media-ctl -d platform:vimc -V '"Debayer A":0[fmt:SBGGR8_1X8/640x480]'
    media-ctl -d platform:vimc -V '"Sensor B":0[fmt:SBGGR8_1X8/640x480]'
    media-ctl -d platform:vimc -V '"Debayer B":0[fmt:SBGGR8_1X8/640x480]'
    
    v4l2-ctl -z platform:vimc -d "RGB/YUV Capture" -v width=1920,height=1440
    v4l2-ctl -z platform:vimc -d "Raw Capture 0" -v pixelformat=BA81
    v4l2-ctl -z platform:vimc -d "Raw Capture 1" -v pixelformat=BA81
    
    v4l2-ctl --stream-mmap --stream-count=100 -d /dev/video1
    v4l2-ctl --stream-mmap --stream-count=100 -d /dev/video2
    v4l2-ctl --stream-mmap --stream-count=100 -d /dev/video3
    Signed-off-by: default avatarShuah Khan <skhan@linuxfoundation.org>
    Acked-by: default avatarHelen Koike <helen.koike@collabora.com>
    Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
    f13d5f36
vimc-sensor.c 10 KB