|
@@ -61,6 +61,11 @@ static inline struct adv7175 *to_adv7175(struct v4l2_subdev *sd)
|
|
|
|
|
|
static char *inputs[] = { "pass_through", "play_back", "color_bar" };
|
|
|
|
|
|
+static enum v4l2_mbus_pixelcode adv7175_codes[] = {
|
|
|
+ V4L2_MBUS_FMT_UYVY8_2X8,
|
|
|
+ V4L2_MBUS_FMT_UYVY8_1X16,
|
|
|
+};
|
|
|
+
|
|
|
/* ----------------------------------------------------------------------- */
|
|
|
|
|
|
static inline int adv7175_write(struct v4l2_subdev *sd, u8 reg, u8 value)
|
|
@@ -296,6 +301,60 @@ static int adv7175_s_routing(struct v4l2_subdev *sd,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int adv7175_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
|
|
|
+ enum v4l2_mbus_pixelcode *code)
|
|
|
+{
|
|
|
+ if (index >= ARRAY_SIZE(adv7175_codes))
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ *code = adv7175_codes[index];
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int adv7175_g_fmt(struct v4l2_subdev *sd,
|
|
|
+ struct v4l2_mbus_framefmt *mf)
|
|
|
+{
|
|
|
+ u8 val = adv7175_read(sd, 0x7);
|
|
|
+
|
|
|
+ if ((val & 0x40) == (1 << 6))
|
|
|
+ mf->code = V4L2_MBUS_FMT_UYVY8_1X16;
|
|
|
+ else
|
|
|
+ mf->code = V4L2_MBUS_FMT_UYVY8_2X8;
|
|
|
+
|
|
|
+ mf->colorspace = V4L2_COLORSPACE_SMPTE170M;
|
|
|
+ mf->width = 0;
|
|
|
+ mf->height = 0;
|
|
|
+ mf->field = V4L2_FIELD_ANY;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int adv7175_s_fmt(struct v4l2_subdev *sd,
|
|
|
+ struct v4l2_mbus_framefmt *mf)
|
|
|
+{
|
|
|
+ u8 val = adv7175_read(sd, 0x7);
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ switch (mf->code) {
|
|
|
+ case V4L2_MBUS_FMT_UYVY8_2X8:
|
|
|
+ val &= ~0x40;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case V4L2_MBUS_FMT_UYVY8_1X16:
|
|
|
+ val |= 0x40;
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ v4l2_dbg(1, debug, sd,
|
|
|
+ "illegal v4l2_mbus_framefmt code: %d\n", mf->code);
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ ret = adv7175_write(sd, 0x7, val);
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
static int adv7175_g_chip_ident(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *chip)
|
|
|
{
|
|
|
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
|
@@ -324,6 +383,9 @@ static const struct v4l2_subdev_core_ops adv7175_core_ops = {
|
|
|
static const struct v4l2_subdev_video_ops adv7175_video_ops = {
|
|
|
.s_std_output = adv7175_s_std_output,
|
|
|
.s_routing = adv7175_s_routing,
|
|
|
+ .s_mbus_fmt = adv7175_s_fmt,
|
|
|
+ .g_mbus_fmt = adv7175_g_fmt,
|
|
|
+ .enum_mbus_fmt = adv7175_enum_fmt,
|
|
|
};
|
|
|
|
|
|
static const struct v4l2_subdev_ops adv7175_ops = {
|