[media] v4l2-subdev: replace v4l2_subdev_fh by v4l2_subdev_pad_config
If a subdevice pad op is called from a bridge driver, then there is no v4l2_subdev_fh struct that can be passed to the subdevice. This made it hard to use such subdevs from a bridge driver. This patch replaces the v4l2_subdev_fh pointer by a v4l2_subdev_pad_config pointer in the pad ops. This allows bridge drivers to use the various try_ pad ops by creating a v4l2_subdev_pad_config struct and passing it along to the pad op. The v4l2_subdev_get_try_* macros had to be changed because of this, so I also took the opportunity to use the full name of the v4l2_subdev_get_try_* functions in the __V4L2_SUBDEV_MK_GET_TRY macro arguments: if you now do 'git grep v4l2_subdev_get_try_format' you will actually find the header where it is defined. One remark regarding the drivers/staging/media/davinci_vpfe patches: the *_init_formats() functions assumed that fh could be NULL. However, that's not true for this driver, it's always set. This is almost certainly a copy and paste from the omap3isp driver. I've updated the code to reflect the fact that fh is never NULL. Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Acked-by: Lad, Prabhakar <prabhakar.csengg@gmail.com> Tested-by: Lad, Prabhakar <prabhakar.csengg@gmail.com> Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Acked-by: Sakari Ailus <sakari.ailus@linux.intel.com> Acked-by: Sylwester Nawrocki <s.nawrocki@samsung.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
Этот коммит содержится в:

коммит произвёл
Mauro Carvalho Chehab

родитель
3d945be05a
Коммит
f7234138f1
@@ -371,12 +371,12 @@ static int __mt9v032_set_power(struct mt9v032 *mt9v032, bool on)
|
||||
*/
|
||||
|
||||
static struct v4l2_mbus_framefmt *
|
||||
__mt9v032_get_pad_format(struct mt9v032 *mt9v032, struct v4l2_subdev_fh *fh,
|
||||
__mt9v032_get_pad_format(struct mt9v032 *mt9v032, struct v4l2_subdev_pad_config *cfg,
|
||||
unsigned int pad, enum v4l2_subdev_format_whence which)
|
||||
{
|
||||
switch (which) {
|
||||
case V4L2_SUBDEV_FORMAT_TRY:
|
||||
return v4l2_subdev_get_try_format(fh, pad);
|
||||
return v4l2_subdev_get_try_format(&mt9v032->subdev, cfg, pad);
|
||||
case V4L2_SUBDEV_FORMAT_ACTIVE:
|
||||
return &mt9v032->format;
|
||||
default:
|
||||
@@ -385,12 +385,12 @@ __mt9v032_get_pad_format(struct mt9v032 *mt9v032, struct v4l2_subdev_fh *fh,
|
||||
}
|
||||
|
||||
static struct v4l2_rect *
|
||||
__mt9v032_get_pad_crop(struct mt9v032 *mt9v032, struct v4l2_subdev_fh *fh,
|
||||
__mt9v032_get_pad_crop(struct mt9v032 *mt9v032, struct v4l2_subdev_pad_config *cfg,
|
||||
unsigned int pad, enum v4l2_subdev_format_whence which)
|
||||
{
|
||||
switch (which) {
|
||||
case V4L2_SUBDEV_FORMAT_TRY:
|
||||
return v4l2_subdev_get_try_crop(fh, pad);
|
||||
return v4l2_subdev_get_try_crop(&mt9v032->subdev, cfg, pad);
|
||||
case V4L2_SUBDEV_FORMAT_ACTIVE:
|
||||
return &mt9v032->crop;
|
||||
default:
|
||||
@@ -448,7 +448,7 @@ static int mt9v032_s_stream(struct v4l2_subdev *subdev, int enable)
|
||||
}
|
||||
|
||||
static int mt9v032_enum_mbus_code(struct v4l2_subdev *subdev,
|
||||
struct v4l2_subdev_fh *fh,
|
||||
struct v4l2_subdev_pad_config *cfg,
|
||||
struct v4l2_subdev_mbus_code_enum *code)
|
||||
{
|
||||
if (code->index > 0)
|
||||
@@ -459,7 +459,7 @@ static int mt9v032_enum_mbus_code(struct v4l2_subdev *subdev,
|
||||
}
|
||||
|
||||
static int mt9v032_enum_frame_size(struct v4l2_subdev *subdev,
|
||||
struct v4l2_subdev_fh *fh,
|
||||
struct v4l2_subdev_pad_config *cfg,
|
||||
struct v4l2_subdev_frame_size_enum *fse)
|
||||
{
|
||||
if (fse->index >= 3 || fse->code != MEDIA_BUS_FMT_SGRBG10_1X10)
|
||||
@@ -474,12 +474,12 @@ static int mt9v032_enum_frame_size(struct v4l2_subdev *subdev,
|
||||
}
|
||||
|
||||
static int mt9v032_get_format(struct v4l2_subdev *subdev,
|
||||
struct v4l2_subdev_fh *fh,
|
||||
struct v4l2_subdev_pad_config *cfg,
|
||||
struct v4l2_subdev_format *format)
|
||||
{
|
||||
struct mt9v032 *mt9v032 = to_mt9v032(subdev);
|
||||
|
||||
format->format = *__mt9v032_get_pad_format(mt9v032, fh, format->pad,
|
||||
format->format = *__mt9v032_get_pad_format(mt9v032, cfg, format->pad,
|
||||
format->which);
|
||||
return 0;
|
||||
}
|
||||
@@ -509,7 +509,7 @@ static unsigned int mt9v032_calc_ratio(unsigned int input, unsigned int output)
|
||||
}
|
||||
|
||||
static int mt9v032_set_format(struct v4l2_subdev *subdev,
|
||||
struct v4l2_subdev_fh *fh,
|
||||
struct v4l2_subdev_pad_config *cfg,
|
||||
struct v4l2_subdev_format *format)
|
||||
{
|
||||
struct mt9v032 *mt9v032 = to_mt9v032(subdev);
|
||||
@@ -520,7 +520,7 @@ static int mt9v032_set_format(struct v4l2_subdev *subdev,
|
||||
unsigned int hratio;
|
||||
unsigned int vratio;
|
||||
|
||||
__crop = __mt9v032_get_pad_crop(mt9v032, fh, format->pad,
|
||||
__crop = __mt9v032_get_pad_crop(mt9v032, cfg, format->pad,
|
||||
format->which);
|
||||
|
||||
/* Clamp the width and height to avoid dividing by zero. */
|
||||
@@ -536,7 +536,7 @@ static int mt9v032_set_format(struct v4l2_subdev *subdev,
|
||||
hratio = mt9v032_calc_ratio(__crop->width, width);
|
||||
vratio = mt9v032_calc_ratio(__crop->height, height);
|
||||
|
||||
__format = __mt9v032_get_pad_format(mt9v032, fh, format->pad,
|
||||
__format = __mt9v032_get_pad_format(mt9v032, cfg, format->pad,
|
||||
format->which);
|
||||
__format->width = __crop->width / hratio;
|
||||
__format->height = __crop->height / vratio;
|
||||
@@ -553,7 +553,7 @@ static int mt9v032_set_format(struct v4l2_subdev *subdev,
|
||||
}
|
||||
|
||||
static int mt9v032_get_selection(struct v4l2_subdev *subdev,
|
||||
struct v4l2_subdev_fh *fh,
|
||||
struct v4l2_subdev_pad_config *cfg,
|
||||
struct v4l2_subdev_selection *sel)
|
||||
{
|
||||
struct mt9v032 *mt9v032 = to_mt9v032(subdev);
|
||||
@@ -561,12 +561,12 @@ static int mt9v032_get_selection(struct v4l2_subdev *subdev,
|
||||
if (sel->target != V4L2_SEL_TGT_CROP)
|
||||
return -EINVAL;
|
||||
|
||||
sel->r = *__mt9v032_get_pad_crop(mt9v032, fh, sel->pad, sel->which);
|
||||
sel->r = *__mt9v032_get_pad_crop(mt9v032, cfg, sel->pad, sel->which);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mt9v032_set_selection(struct v4l2_subdev *subdev,
|
||||
struct v4l2_subdev_fh *fh,
|
||||
struct v4l2_subdev_pad_config *cfg,
|
||||
struct v4l2_subdev_selection *sel)
|
||||
{
|
||||
struct mt9v032 *mt9v032 = to_mt9v032(subdev);
|
||||
@@ -598,13 +598,13 @@ static int mt9v032_set_selection(struct v4l2_subdev *subdev,
|
||||
rect.height = min_t(unsigned int,
|
||||
rect.height, MT9V032_PIXEL_ARRAY_HEIGHT - rect.top);
|
||||
|
||||
__crop = __mt9v032_get_pad_crop(mt9v032, fh, sel->pad, sel->which);
|
||||
__crop = __mt9v032_get_pad_crop(mt9v032, cfg, sel->pad, sel->which);
|
||||
|
||||
if (rect.width != __crop->width || rect.height != __crop->height) {
|
||||
/* Reset the output image size if the crop rectangle size has
|
||||
* been modified.
|
||||
*/
|
||||
__format = __mt9v032_get_pad_format(mt9v032, fh, sel->pad,
|
||||
__format = __mt9v032_get_pad_format(mt9v032, cfg, sel->pad,
|
||||
sel->which);
|
||||
__format->width = rect.width;
|
||||
__format->height = rect.height;
|
||||
@@ -810,13 +810,13 @@ static int mt9v032_open(struct v4l2_subdev *subdev, struct v4l2_subdev_fh *fh)
|
||||
struct v4l2_mbus_framefmt *format;
|
||||
struct v4l2_rect *crop;
|
||||
|
||||
crop = v4l2_subdev_get_try_crop(fh, 0);
|
||||
crop = v4l2_subdev_get_try_crop(subdev, fh->pad, 0);
|
||||
crop->left = MT9V032_COLUMN_START_DEF;
|
||||
crop->top = MT9V032_ROW_START_DEF;
|
||||
crop->width = MT9V032_WINDOW_WIDTH_DEF;
|
||||
crop->height = MT9V032_WINDOW_HEIGHT_DEF;
|
||||
|
||||
format = v4l2_subdev_get_try_format(fh, 0);
|
||||
format = v4l2_subdev_get_try_format(subdev, fh->pad, 0);
|
||||
|
||||
if (mt9v032->model->color)
|
||||
format->code = MEDIA_BUS_FMT_SGRBG10_1X10;
|
||||
|
Ссылка в новой задаче
Block a user