[media] tc358743: allow event subscription
authorPhilipp Zabel <p.zabel@pengutronix.de>
Fri, 17 Jul 2015 15:26:45 +0000 (12:26 -0300)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>
Wed, 22 Jul 2015 14:27:38 +0000 (11:27 -0300)
This is useful to subscribe to HDMI hotplug events via the
V4L2_CID_DV_RX_POWER_PRESENT control.

Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
drivers/media/i2c/tc358743.c

index 934f6e17e06d17be63a23e924f5fc425bfd3b4e6..d0dd83d7a38ea43d47f20f9e103028882b6f3926 100644 (file)
@@ -40,6 +40,7 @@
 #include <media/v4l2-dv-timings.h>
 #include <media/v4l2-device.h>
 #include <media/v4l2-ctrls.h>
+#include <media/v4l2-event.h>
 #include <media/v4l2-of.h>
 #include <media/tc358743.h>
 
@@ -859,8 +860,7 @@ static void tc358743_format_change(struct v4l2_subdev *sd)
                                &timings, false);
        }
 
-       v4l2_subdev_notify(sd, V4L2_DEVICE_NOTIFY_EVENT,
-                       (void *)&tc358743_ev_fmt);
+       v4l2_subdev_notify_event(sd, &tc358743_ev_fmt);
 }
 
 static void tc358743_init_interrupts(struct v4l2_subdev *sd)
@@ -1317,6 +1317,19 @@ static irqreturn_t tc358743_irq_handler(int irq, void *dev_id)
        return handled ? IRQ_HANDLED : IRQ_NONE;
 }
 
+static int tc358743_subscribe_event(struct v4l2_subdev *sd, struct v4l2_fh *fh,
+                                   struct v4l2_event_subscription *sub)
+{
+       switch (sub->type) {
+       case V4L2_EVENT_SOURCE_CHANGE:
+               return v4l2_src_change_event_subdev_subscribe(sd, fh, sub);
+       case V4L2_EVENT_CTRL:
+               return v4l2_ctrl_subdev_subscribe_event(sd, fh, sub);
+       default:
+               return -EINVAL;
+       }
+}
+
 /* --------------- VIDEO OPS --------------- */
 
 static int tc358743_g_input_status(struct v4l2_subdev *sd, u32 *status)
@@ -1604,6 +1617,8 @@ static const struct v4l2_subdev_core_ops tc358743_core_ops = {
        .s_register = tc358743_s_register,
 #endif
        .interrupt_service_routine = tc358743_isr,
+       .subscribe_event = tc358743_subscribe_event,
+       .unsubscribe_event = v4l2_event_subdev_unsubscribe,
 };
 
 static const struct v4l2_subdev_video_ops tc358743_video_ops = {