mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-08 03:40:35 +09:00
media: platform: rockchip: cif: fix fmt/crop for isp is not correct
Signed-off-by: Hu Kejun <william.hu@rock-chips.com> Change-Id: I8ca4b38f6d857d82d77842989099a560e3f4212e
This commit is contained in:
@@ -478,33 +478,6 @@ static struct rkcif_sensor_info *sd_to_sensor(struct rkcif_device *dev,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int rkcif_update_sensor_info(struct rkcif_stream *stream)
|
||||
{
|
||||
struct rkcif_sensor_info *sensor, *terminal_sensor;
|
||||
struct v4l2_subdev *sensor_sd;
|
||||
int ret = 0;
|
||||
|
||||
sensor_sd = get_remote_sensor(stream, NULL);
|
||||
if (!sensor_sd)
|
||||
return -ENODEV;
|
||||
|
||||
sensor = sd_to_sensor(stream->cifdev, sensor_sd);
|
||||
if (!sensor) {
|
||||
v4l2_err(&stream->cifdev->v4l2_dev, "get sensor for updating failed!\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
ret = v4l2_subdev_call(sensor->sd, video, g_mbus_config,
|
||||
&sensor->mbus);
|
||||
if (ret && ret != -ENOIOCTLCMD)
|
||||
return ret;
|
||||
stream->cifdev->active_sensor = sensor;
|
||||
|
||||
terminal_sensor = &stream->cifdev->terminal_sensor;
|
||||
get_remote_terminal_sensor(stream, &terminal_sensor->sd);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static unsigned char get_data_type(u32 pixelformat, u8 cmd_mode_en)
|
||||
{
|
||||
switch (pixelformat) {
|
||||
@@ -3248,6 +3221,33 @@ static u32 rkcif_lvds_get_sof(struct rkcif_device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int rkcif_update_sensor_info(struct rkcif_stream *stream)
|
||||
{
|
||||
struct rkcif_sensor_info *sensor, *terminal_sensor;
|
||||
struct v4l2_subdev *sensor_sd;
|
||||
int ret = 0;
|
||||
|
||||
sensor_sd = get_remote_sensor(stream, NULL);
|
||||
if (!sensor_sd)
|
||||
return -ENODEV;
|
||||
|
||||
sensor = sd_to_sensor(stream->cifdev, sensor_sd);
|
||||
if (!sensor) {
|
||||
v4l2_err(&stream->cifdev->v4l2_dev, "get sensor for updating failed!\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
ret = v4l2_subdev_call(sensor->sd, video, g_mbus_config,
|
||||
&sensor->mbus);
|
||||
if (ret && ret != -ENOIOCTLCMD)
|
||||
return ret;
|
||||
stream->cifdev->active_sensor = sensor;
|
||||
|
||||
terminal_sensor = &stream->cifdev->terminal_sensor;
|
||||
get_remote_terminal_sensor(stream, &terminal_sensor->sd);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int rkcif_register_lvds_subdev(struct rkcif_device *dev)
|
||||
{
|
||||
struct v4l2_device *v4l2_dev = &dev->v4l2_dev;
|
||||
|
||||
@@ -406,5 +406,6 @@ u32 rkcif_get_sof(struct rkcif_device *cif_dev);
|
||||
int rkcif_plat_init(struct rkcif_device *cif_dev, struct device_node *node, int inf_id);
|
||||
int rkcif_plat_uninit(struct rkcif_device *cif_dev);
|
||||
int rkcif_attach_hw(struct rkcif_device *cif_dev);
|
||||
int rkcif_update_sensor_info(struct rkcif_stream *stream);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -33,6 +33,9 @@ static int sditf_g_frame_interval(struct v4l2_subdev *sd,
|
||||
struct rkcif_device *cif_dev = priv->cif_dev;
|
||||
struct v4l2_subdev *sensor_sd;
|
||||
|
||||
if (!cif_dev->active_sensor)
|
||||
rkcif_update_sensor_info(&cif_dev->stream[0]);
|
||||
|
||||
if (cif_dev->active_sensor) {
|
||||
sensor_sd = cif_dev->active_sensor->sd;
|
||||
return v4l2_subdev_call(sensor_sd, video, g_frame_interval, fi);
|
||||
@@ -48,6 +51,9 @@ static int sditf_g_mbus_config(struct v4l2_subdev *sd,
|
||||
struct rkcif_device *cif_dev = priv->cif_dev;
|
||||
struct v4l2_subdev *sensor_sd;
|
||||
|
||||
if (!cif_dev->active_sensor)
|
||||
rkcif_update_sensor_info(&cif_dev->stream[0]);
|
||||
|
||||
if (cif_dev->active_sensor) {
|
||||
sensor_sd = cif_dev->active_sensor->sd;
|
||||
return v4l2_subdev_call(sensor_sd, video, g_mbus_config, config);
|
||||
@@ -62,29 +68,32 @@ static int sditf_get_set_fmt(struct v4l2_subdev *sd,
|
||||
{
|
||||
struct sditf_priv *priv = to_sditf_priv(sd);
|
||||
struct rkcif_device *cif_dev = priv->cif_dev;
|
||||
struct v4l2_subdev *sensor_sd;
|
||||
struct v4l2_subdev_selection input_sel;
|
||||
int ret = -EINVAL;
|
||||
|
||||
if (cif_dev->active_sensor) {
|
||||
sensor_sd = cif_dev->active_sensor->sd;
|
||||
return v4l2_subdev_call(sensor_sd, pad, get_fmt, NULL, fmt);
|
||||
if (!cif_dev->terminal_sensor.sd)
|
||||
rkcif_update_sensor_info(&cif_dev->stream[0]);
|
||||
|
||||
if (cif_dev->terminal_sensor.sd) {
|
||||
v4l2_subdev_call(cif_dev->terminal_sensor.sd, pad, get_fmt, NULL, fmt);
|
||||
|
||||
input_sel.target = V4L2_SEL_TGT_CROP_BOUNDS;
|
||||
ret = v4l2_subdev_call(cif_dev->terminal_sensor.sd,
|
||||
pad, get_selection, NULL,
|
||||
&input_sel);
|
||||
if (!ret) {
|
||||
fmt->format.width = input_sel.r.width;
|
||||
fmt->format.height = input_sel.r.height;
|
||||
}
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int sditf_get_selection(struct v4l2_subdev *sd,
|
||||
struct v4l2_subdev_pad_config *cfg,
|
||||
struct v4l2_subdev_selection *sel)
|
||||
{
|
||||
struct sditf_priv *priv = to_sditf_priv(sd);
|
||||
struct rkcif_device *cif_dev = priv->cif_dev;
|
||||
struct v4l2_subdev *sensor_sd;
|
||||
|
||||
if (cif_dev->active_sensor) {
|
||||
sensor_sd = cif_dev->active_sensor->sd;
|
||||
return v4l2_subdev_call(sensor_sd, pad, get_selection, NULL, sel);
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -94,6 +103,9 @@ static long sditf_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
|
||||
struct rkcif_device *cif_dev = priv->cif_dev;
|
||||
struct v4l2_subdev *sensor_sd;
|
||||
|
||||
if (!cif_dev->terminal_sensor.sd)
|
||||
rkcif_update_sensor_info(&cif_dev->stream[0]);
|
||||
|
||||
if (cif_dev->terminal_sensor.sd) {
|
||||
sensor_sd = cif_dev->terminal_sensor.sd;
|
||||
return v4l2_subdev_call(sensor_sd, core, ioctl, cmd, arg);
|
||||
@@ -110,6 +122,9 @@ static long sditf_compat_ioctl32(struct v4l2_subdev *sd,
|
||||
struct rkcif_device *cif_dev = priv->cif_dev;
|
||||
struct v4l2_subdev *sensor_sd;
|
||||
|
||||
if (!cif_dev->terminal_sensor.sd)
|
||||
rkcif_update_sensor_info(&cif_dev->stream[0]);
|
||||
|
||||
if (cif_dev->terminal_sensor.sd) {
|
||||
sensor_sd = cif_dev->terminal_sensor.sd;
|
||||
return v4l2_subdev_call(sensor_sd, core, compat_ioctl32, cmd, arg);
|
||||
|
||||
Reference in New Issue
Block a user