|
@@ -38,6 +38,7 @@
|
|
|
#include <media/adv7343.h>
|
|
|
#include <media/v4l2-device.h>
|
|
|
#include <media/v4l2-ioctl.h>
|
|
|
+#include <media/v4l2-chip-ident.h>
|
|
|
|
|
|
#include <mach/dm646x.h>
|
|
|
|
|
@@ -1315,6 +1316,85 @@ static int vpif_s_priority(struct file *file, void *priv, enum v4l2_priority p)
|
|
|
return v4l2_prio_change(&ch->prio, &fh->prio, p);
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+/*
|
|
|
+ * vpif_g_chip_ident() - Identify the chip
|
|
|
+ * @file: file ptr
|
|
|
+ * @priv: file handle
|
|
|
+ * @chip: chip identity
|
|
|
+ *
|
|
|
+ * Returns zero or -EINVAL if read operations fails.
|
|
|
+ */
|
|
|
+static int vpif_g_chip_ident(struct file *file, void *priv,
|
|
|
+ struct v4l2_dbg_chip_ident *chip)
|
|
|
+{
|
|
|
+ chip->ident = V4L2_IDENT_NONE;
|
|
|
+ chip->revision = 0;
|
|
|
+ if (chip->match.type != V4L2_CHIP_MATCH_I2C_DRIVER &&
|
|
|
+ chip->match.type != V4L2_CHIP_MATCH_I2C_ADDR) {
|
|
|
+ vpif_dbg(2, debug, "match_type is invalid.\n");
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ return v4l2_device_call_until_err(&vpif_obj.v4l2_dev, 0, core,
|
|
|
+ g_chip_ident, chip);
|
|
|
+}
|
|
|
+
|
|
|
+#ifdef CONFIG_VIDEO_ADV_DEBUG
|
|
|
+/*
|
|
|
+ * vpif_dbg_g_register() - Read register
|
|
|
+ * @file: file ptr
|
|
|
+ * @priv: file handle
|
|
|
+ * @reg: register to be read
|
|
|
+ *
|
|
|
+ * Debugging only
|
|
|
+ * Returns zero or -EINVAL if read operations fails.
|
|
|
+ */
|
|
|
+static int vpif_dbg_g_register(struct file *file, void *priv,
|
|
|
+ struct v4l2_dbg_register *reg){
|
|
|
+ struct vpif_fh *fh = priv;
|
|
|
+ struct channel_obj *ch = fh->channel;
|
|
|
+ struct video_obj *vid_ch = &ch->video;
|
|
|
+
|
|
|
+ return v4l2_subdev_call(vpif_obj.sd[vid_ch->output_id], core,
|
|
|
+ g_register, reg);
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * vpif_dbg_s_register() - Write to register
|
|
|
+ * @file: file ptr
|
|
|
+ * @priv: file handle
|
|
|
+ * @reg: register to be modified
|
|
|
+ *
|
|
|
+ * Debugging only
|
|
|
+ * Returns zero or -EINVAL if write operations fails.
|
|
|
+ */
|
|
|
+static int vpif_dbg_s_register(struct file *file, void *priv,
|
|
|
+ struct v4l2_dbg_register *reg){
|
|
|
+ struct vpif_fh *fh = priv;
|
|
|
+ struct channel_obj *ch = fh->channel;
|
|
|
+ struct video_obj *vid_ch = &ch->video;
|
|
|
+
|
|
|
+ return v4l2_subdev_call(vpif_obj.sd[vid_ch->output_id], core,
|
|
|
+ s_register, reg);
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
+/*
|
|
|
+ * vpif_log_status() - Status information
|
|
|
+ * @file: file ptr
|
|
|
+ * @priv: file handle
|
|
|
+ *
|
|
|
+ * Returns zero.
|
|
|
+ */
|
|
|
+static int vpif_log_status(struct file *filep, void *priv)
|
|
|
+{
|
|
|
+ /* status for sub devices */
|
|
|
+ v4l2_device_call_all(&vpif_obj.v4l2_dev, 0, core, log_status);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
/* vpif display ioctl operations */
|
|
|
static const struct v4l2_ioctl_ops vpif_ioctl_ops = {
|
|
|
.vidioc_querycap = vpif_querycap,
|
|
@@ -1336,6 +1416,12 @@ static const struct v4l2_ioctl_ops vpif_ioctl_ops = {
|
|
|
.vidioc_s_output = vpif_s_output,
|
|
|
.vidioc_g_output = vpif_g_output,
|
|
|
.vidioc_cropcap = vpif_cropcap,
|
|
|
+ .vidioc_g_chip_ident = vpif_g_chip_ident,
|
|
|
+#ifdef CONFIG_VIDEO_ADV_DEBUG
|
|
|
+ .vidioc_g_register = vpif_dbg_g_register,
|
|
|
+ .vidioc_s_register = vpif_dbg_s_register,
|
|
|
+#endif
|
|
|
+ .vidioc_log_status = vpif_log_status,
|
|
|
};
|
|
|
|
|
|
static const struct v4l2_file_operations vpif_fops = {
|