summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarco Felsch <m.felsch@pengutronix.de>2018-07-03 16:47:01 +0200
committerMarco Felsch <m.felsch@pengutronix.de>2019-08-29 18:16:08 +0200
commit47a383075bdc63f0a5c1f59a0741e098b72dd6a3 (patch)
tree31cfde86bbe838150f3f7293d103982dadfb3dce
parent6ab4072c0ba7213894bce87e0c4c01325e785a2c (diff)
downloadlinux-0-day-47a383075bdc63f0a5c1f59a0741e098b72dd6a3.tar.gz
linux-0-day-47a383075bdc63f0a5c1f59a0741e098b72dd6a3.tar.xz
media: tvp5150: add s_power callback
Don't en-/disable the interrupts during s_stream because someone can disable the stream but wants to get informed if the stream is locked again. So keep the interrupts enabled the whole time the pipeline is opened. Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
-rw-r--r--drivers/media/i2c/tvp5150.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/drivers/media/i2c/tvp5150.c b/drivers/media/i2c/tvp5150.c
index dc8272d3a4457..d7079809f33f7 100644
--- a/drivers/media/i2c/tvp5150.c
+++ b/drivers/media/i2c/tvp5150.c
@@ -1354,11 +1354,26 @@ static const struct media_entity_operations tvp5150_sd_media_ops = {
/****************************************************************************
I2C Command
****************************************************************************/
+static int tvp5150_s_power(struct v4l2_subdev *sd, int on)
+{
+ struct tvp5150 *decoder = to_tvp5150(sd);
+ unsigned int val = 0;
+
+ if (on)
+ val = TVP5150_INT_A_LOCK;
+
+ if (decoder->irq)
+ /* Enable / Disable lock interrupt */
+ regmap_update_bits(decoder->regmap, TVP5150_INT_ENABLE_REG_A,
+ TVP5150_INT_A_LOCK, val);
+
+ return 0;
+}
static int tvp5150_s_stream(struct v4l2_subdev *sd, int enable)
{
struct tvp5150 *decoder = to_tvp5150(sd);
- unsigned int mask, val = 0, int_val = 0;
+ unsigned int mask, val = 0;
mask = TVP5150_MISC_CTL_YCBCR_OE | TVP5150_MISC_CTL_SYNC_OE |
TVP5150_MISC_CTL_CLOCK_OE;
@@ -1371,15 +1386,10 @@ static int tvp5150_s_stream(struct v4l2_subdev *sd, int enable)
val = decoder->lock ? decoder->oe : 0;
else
val = decoder->oe;
- int_val = TVP5150_INT_A_LOCK;
v4l2_subdev_notify_event(&decoder->sd, &tvp5150_ev_fmt);
}
regmap_update_bits(decoder->regmap, TVP5150_MISC_CTL, mask, val);
- if (decoder->irq)
- /* Enable / Disable lock interrupt */
- regmap_update_bits(decoder->regmap, TVP5150_INT_ENABLE_REG_A,
- TVP5150_INT_A_LOCK, int_val);
return 0;
}
@@ -1576,6 +1586,7 @@ static const struct v4l2_subdev_core_ops tvp5150_core_ops = {
.g_register = tvp5150_g_register,
.s_register = tvp5150_s_register,
#endif
+ .s_power = tvp5150_s_power,
};
static const struct v4l2_subdev_tuner_ops tvp5150_tuner_ops = {