The camera location is retrieved from the firmware interface parsing the "location" device property and reported through the read-only V4L2_CID_LOCATION control. Signed-off-by: Jacopo Mondi <jacopo@xxxxxxxxxx> --- drivers/media/i2c/ov5670.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/drivers/media/i2c/ov5670.c b/drivers/media/i2c/ov5670.c index 041fcbb4eebd..1446aef1fc1e 100644 --- a/drivers/media/i2c/ov5670.c +++ b/drivers/media/i2c/ov5670.c @@ -2059,10 +2059,12 @@ static const struct v4l2_ctrl_ops ov5670_ctrl_ops = { /* Initialize control handlers */ static int ov5670_init_controls(struct ov5670 *ov5670) { + struct i2c_client *client = v4l2_get_subdevdata(&ov5670->sd); struct v4l2_ctrl_handler *ctrl_hdlr; s64 vblank_max; s64 vblank_def; s64 vblank_min; + u32 location; s64 exposure_max; int ret; @@ -2124,6 +2126,15 @@ static int ov5670_init_controls(struct ov5670 *ov5670) ARRAY_SIZE(ov5670_test_pattern_menu) - 1, 0, 0, ov5670_test_pattern_menu); + ret = device_property_read_u32(&client->dev, "location", &location); + if (!ret) { + v4l2_ctrl_new_std(ctrl_hdlr, &ov5670_ctrl_ops, + V4L2_CID_LOCATION, V4L2_LOCATION_FRONT, + V4L2_LOCATION_BACK, 1, + location == V4L2_LOCATION_FRONT ? + V4L2_LOCATION_FRONT : V4L2_LOCATION_BACK); + } + if (ctrl_hdlr->error) { ret = ctrl_hdlr->error; goto error; -- 2.22.0