if (ret)
return;
- chan->fmtinfo = tegra_core_get_format_by_code(mbus_fmt.code);
+ chan->fmtinfo = tegra_core_get_format_by_code(fmt.format.code);
v4l2_fill_pix_format(&chan->format, &fmt.format);
chan->format.pixelformat = chan->fmtinfo->fourcc;
chan->format.bytesperline = chan->format.width *
}
if (atomic_read(&chan->is_hdmiin_unplug)) {
- vb2_buffer_done(&buf->buf, VB2_BUF_STATE_ERROR);
+ vb2_buffer_done(&buf->buf.vb2_buf, VB2_BUF_STATE_ERROR);
complete(&chan->capture_comp);
} else {
/* Move buffer to capture done queue */
{
struct v4l2_fh *vfh = file->private_data;
struct tegra_channel *chan = to_tegra_channel(vfh->vdev);
+ struct v4l2_subdev_frame_size_enum fse = {
+ .index = sizes->index,
+ };
int num_sd;
for (num_sd = 0; num_sd < chan->num_subdevs; num_sd++) {
struct v4l2_subdev *sd = chan->subdev[num_sd];
- int ret = v4l2_subdev_call(sd, video, enum_framesizes, sizes);
+ int ret = v4l2_subdev_call(sd, pad, enum_frame_size, NULL, &fse);
if (sd && (ret == 0 || ret != -ENOIOCTLCMD))
return ret;
{
struct v4l2_fh *vfh = file->private_data;
struct tegra_channel *chan = to_tegra_channel(vfh->vdev);
+ struct v4l2_subdev_frame_interval_enum fie = {
+ .index = intervals->index,
+ .width = intervals->width,
+ .height = intervals->height,
+ };
int num_sd;
for (num_sd = 0; num_sd < chan->num_subdevs; num_sd++) {
struct v4l2_subdev *sd = chan->subdev[num_sd];
- int ret = v4l2_subdev_call(sd, video, enum_frameintervals,
- intervals);
+ int ret = v4l2_subdev_call(sd, pad, enum_frame_interval, NULL,
+ &fie);
if (sd && (ret == 0 || ret != -ENOIOCTLCMD))
return ret;
return __tegra_channel_get_format(chan, pix);
}
-static int
-tegra_channel_get_format(struct file *file, void *fh,
- struct v4l2_format *format)
-{
- struct v4l2_fh *vfh = file->private_data;
- struct tegra_channel *chan = to_tegra_channel(vfh->vdev);
- struct v4l2_pix_format *pix = &format->fmt.pix;
-
- return __tegra_channel_get_format(chan, pix);
-}
-
static int
__tegra_channel_try_format(struct tegra_channel *chan,
struct v4l2_pix_format *pix)
chan->video.ctrl_handler = &chan->ctrl_handler;
chan->video.lock = &chan->video_lock;
- set_bit(V4L2_FL_USE_FH_PRIO, &chan->video.flags);
+ set_bit(_IOC_NR(VIDIOC_G_PRIORITY), chan->video.valid_ioctls);
+ set_bit(_IOC_NR(VIDIOC_S_PRIORITY), chan->video.valid_ioctls);
video_set_drvdata(&chan->video, chan);
{
TEGRA_DEF_WIDTH,
TEGRA_DEF_HEIGHT,
- V4L2_MBUS_FMT_RGBA8888_4X8_LE,
+ MEDIA_BUS_FMT_RGBA8888_4X8_LE,
V4L2_FIELD_NONE,
V4L2_COLORSPACE_SRGB
}
};
static int tegra_csi_enum_framesizes(struct v4l2_subdev *sd,
- struct v4l2_frmsizeenum *sizes)
+ struct v4l2_subdev_pad_config *cfg,
+ struct v4l2_subdev_frame_size_enum *fse)
{
int i;
struct tegra_csi_device *csi = to_csi(sd);
return -EINVAL;
}
- if (sizes->index >= ARRAY_SIZE(tegra_csi_tpg_sizes))
+ if (fse->index >= ARRAY_SIZE(tegra_csi_tpg_sizes))
return -EINVAL;
for (i = 0; i < ARRAY_SIZE(tegra_csi_tpg_fmts); i++) {
const struct tegra_video_format *format =
tegra_core_get_format_by_code(tegra_csi_tpg_fmts[i].code);
- if (format && format->fourcc == sizes->pixel_format)
+ if (format && format->fourcc == fse->code)
break;
}
if (i == ARRAY_SIZE(tegra_csi_tpg_fmts))
return -EINVAL;
- sizes->type = V4L2_FRMSIZE_TYPE_DISCRETE;
- sizes->discrete = tegra_csi_tpg_sizes[sizes->index];
+ fse->min_width = fse->max_width =
+ tegra_csi_tpg_sizes[fse->index].width;
+ fse->min_height = fse->max_height =
+ tegra_csi_tpg_sizes[fse->index].height;
return 0;
}
#define TPG_PIXEL_OUTPUT_RATE 182476800
static int tegra_csi_enum_frameintervals(struct v4l2_subdev *sd,
- struct v4l2_frmivalenum *intervals)
+ struct v4l2_subdev_pad_config *cfg,
+ struct v4l2_subdev_frame_interval_enum *fie)
{
int i;
struct tegra_csi_device *csi = to_csi(sd);
}
/* One resolution just one framerate */
- if (intervals->index > 0)
+ if (fie->index > 0)
return -EINVAL;
for (i = 0; i < ARRAY_SIZE(tegra_csi_tpg_fmts); i++) {
const struct tegra_video_format *format =
tegra_core_get_format_by_code(tegra_csi_tpg_fmts[i].code);
- if (format && format->fourcc == intervals->pixel_format)
+ if (format && format->fourcc == fie->code)
break;
}
if (i == ARRAY_SIZE(tegra_csi_tpg_fmts))
return -EINVAL;
for (i = 0; i < ARRAY_SIZE(tegra_csi_tpg_sizes); i++) {
- if (tegra_csi_tpg_sizes[i].width == intervals->width &&
- tegra_csi_tpg_sizes[i].height == intervals->height)
+ if (tegra_csi_tpg_sizes[i].width == fie->width &&
+ tegra_csi_tpg_sizes[i].height == fie->height)
break;
}
if (i == ARRAY_SIZE(tegra_csi_tpg_sizes))
return -EINVAL;
- intervals->type = V4L2_FRMIVAL_TYPE_DISCRETE;
- intervals->discrete.numerator = 1;
- intervals->discrete.denominator = TPG_PIXEL_OUTPUT_RATE /
- (intervals->width * intervals->height);
+ fie->interval.numerator = 1;
+ fie->interval.denominator = TPG_PIXEL_OUTPUT_RATE /
+ (fie->width * fie->height);
return 0;
}
return 0;
}
-static int tegra_csi_s_mbus_fmt(struct v4l2_subdev *sd,
- struct v4l2_mbus_framefmt *fmt)
-{
- int i;
- struct tegra_csi_device *csi = to_csi(sd);
-
- if (!csi->pg_mode) {
- dev_err(csi->dev, "CSI is not in TPG mode\n");
- return -EINVAL;
- }
-
- tegra_csi_try_mbus_fmt(sd, fmt);
-
- for (i = 0; i < csi->num_ports; i++) {
- struct v4l2_mbus_framefmt *format = &csi->ports[i].format;
- memcpy(format, fmt, sizeof(struct v4l2_mbus_framefmt));
- }
-
- return 0;
-}
-
static int tegra_csi_g_mbus_fmt(struct v4l2_subdev *sd,
struct v4l2_mbus_framefmt *fmt)
{
*/
static int tegra_csi_get_format(struct v4l2_subdev *subdev,
- struct v4l2_subdev_fh *cfg,
+ struct v4l2_subdev_pad_config *cfg,
struct v4l2_subdev_format *fmt)
{
struct v4l2_mbus_framefmt mbus_fmt;
static struct v4l2_subdev_video_ops tegra_csi_video_ops = {
.s_stream = tegra_csi_s_stream,
.g_input_status = tegra_csi_g_input_status,
- .enum_framesizes = tegra_csi_enum_framesizes,
- .enum_frameintervals = tegra_csi_enum_frameintervals,
};
static struct v4l2_subdev_pad_ops tegra_csi_pad_ops = {
.get_fmt = tegra_csi_get_format,
.set_fmt = tegra_csi_set_format,
+ .enum_frame_size = tegra_csi_enum_framesizes,
+ .enum_frame_interval = tegra_csi_enum_frameintervals,
};
static struct v4l2_subdev_ops tegra_csi_ops = {