• Luca Ceresoli's avatar
    media: imx274: add cropping support via SELECTION API · 39dd23dc
    Luca Ceresoli authored
    Currently this driver does not support cropping. The supported modes
    are the following, all capturing the entire area:
    
     - 3840x2160, 1:1 binning (native sensor resolution)
     - 1920x1080, 2:1 binning
     - 1280x720,  3:1 binning
    
    The VIDIOC_SUBDEV_S_FMT ioctl chooses among these 3 configurations the
    one that matches the requested format.
    
    Add cropping support via VIDIOC_SUBDEV_S_SELECTION: with target
    V4L2_SEL_TGT_CROP to choose the captured area, with
    V4L2_SEL_TGT_COMPOSE to choose the output resolution.
    
    To maintain backward compatibility we also allow setting the compose
    format via VIDIOC_SUBDEV_S_FMT. To obtain this, compose rect and
    output format are computed in the common helper function
    __imx274_change_compose(), which sets both to the same width/height
    values.
    
    Cropping also calls __imx274_change_compose() whenever cropping rect
    size changes in order to reset the compose rect (and output format
    size) for 1:1 binning.
    
    Also rename enum imx274_mode to imx274_binning (and its values from
    IMX274_MODE_BINNING_* to IMX274_BINNING_*). Without cropping, the two
    naming are equivalent. With cropping, the resolution could be
    different, e.g. using 2:1 binning mode to crop 1200x960 and output a
    600x480 format. Using binning in the names avoids any
    misunderstanding. For the same reason, replace the 'size' field in
    struct imx274_frmfmt with 'bin_ratio'.
    
    [Sakari Ailus: Remove leftover condition in imx274_apply_trimming]
    Signed-off-by: default avatarLuca Ceresoli <luca@lucaceresoli.net>
    Signed-off-by: default avatarSakari Ailus <sakari.ailus@linux.intel.com>
    Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
    39dd23dc
imx274.c 49.5 KB