[PATCH 2/2] xc5000: add product id of xc5000C

2014-06-27 Thread Mikhail Domrachev
Signed-off-by: Mikhail Domrachev mihail.domryc...@comexp.ru
---
 drivers/media/tuners/xc5000.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/media/tuners/xc5000.c b/drivers/media/tuners/xc5000.c
index 2b3d514..d1f539c 100644
--- a/drivers/media/tuners/xc5000.c
+++ b/drivers/media/tuners/xc5000.c
@@ -85,6 +85,7 @@ struct xc5000_priv {
 /* Product id */
 #define XC_PRODUCT_ID_FW_NOT_LOADED0x2000
 #define XC_PRODUCT_ID_FW_LOADED0x1388
+#define XC_PRODUCT_ID_FW_LOADED_5000C  0x14b4
 
 /* Registers */
 #define XREG_INIT 0x00
@@ -1344,6 +1345,7 @@ struct dvb_frontend *xc5000_attach(struct dvb_frontend 
*fe,
 
switch (id) {
case XC_PRODUCT_ID_FW_LOADED:
+   case XC_PRODUCT_ID_FW_LOADED_5000C:
printk(KERN_INFO
xc5000: Successfully identified at address 0x%02x\n,
cfg-i2c_address);
-- 
1.9.3



--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 1/2] saa7134: add new card BeholdTV H7 (rev. 7191)

2014-06-27 Thread Mikhail Domrachev
New revision of the H7 card has a tuner xc5000C instead of xc5000.

Signed-off-by: Mikhail Domrachev mihail.domryc...@comexp.ru
---
 Documentation/video4linux/CARDLIST.saa7134 |  1 +
 drivers/media/pci/saa7134/saa7134-cards.c  | 37 ++
 drivers/media/pci/saa7134/saa7134-dvb.c|  1 +
 drivers/media/pci/saa7134/saa7134-input.c  |  1 +
 drivers/media/pci/saa7134/saa7134.h|  1 +
 5 files changed, 41 insertions(+)

diff --git a/Documentation/video4linux/CARDLIST.saa7134 
b/Documentation/video4linux/CARDLIST.saa7134
index 8df17d0..1a067d7 100644
--- a/Documentation/video4linux/CARDLIST.saa7134
+++ b/Documentation/video4linux/CARDLIST.saa7134
@@ -191,3 +191,4 @@
 190 - Asus My Cinema PS3-100   [1043:48cd]
 191 - Hawell HW-9004V1
 192 - AverMedia AverTV Satellite Hybrid+FM A706 [1461:2055]
+193 - Beholder BeholdTV H7 (rev. 7191)  [5ace:7191]
diff --git a/drivers/media/pci/saa7134/saa7134-cards.c 
b/drivers/media/pci/saa7134/saa7134-cards.c
index 6e4bdb9..376feb5 100644
--- a/drivers/media/pci/saa7134/saa7134-cards.c
+++ b/drivers/media/pci/saa7134/saa7134-cards.c
@@ -5827,6 +5827,34 @@ struct saa7134_board saa7134_boards[] = {
.gpio = 0x800,
},
},
+   [SAA7134_BOARD_BEHOLD_H7_7191] = {
+   .name   = Beholder BeholdTV H7 (rev. 7191),
+   .audio_clock= 0x00187de7,
+   .tuner_type = TUNER_XC5000C,
+   .radio_type = UNSET,
+   .tuner_addr = ADDR_UNSET,
+   .radio_addr = ADDR_UNSET,
+   .mpeg   = SAA7134_MPEG_DVB,
+   .ts_type= SAA7134_MPEG_TS_PARALLEL,
+   .inputs = { {
+   .name = name_tv,
+   .vmux = 2,
+   .amux = TV,
+   .tv   = 1,
+   }, {
+   .name = name_comp1,
+   .vmux = 0,
+   .amux = LINE1,
+   }, {
+   .name = name_svideo,
+   .vmux = 9,
+   .amux = LINE1,
+   } },
+   .radio = {
+   .name = name_radio,
+   .amux = TV,
+   },
+   },
 
 };
 
@@ -7035,6 +7063,12 @@ struct pci_device_id saa7134_pci_tbl[] = {
.vendor   = PCI_VENDOR_ID_PHILIPS,
.device   = PCI_DEVICE_ID_PHILIPS_SAA7133,
.subvendor= 0x5ace, /* Beholder Intl. Ltd. */
+   .subdevice= 0x7191,
+   .driver_data  = SAA7134_BOARD_BEHOLD_H7_7191,
+   }, {
+   .vendor   = PCI_VENDOR_ID_PHILIPS,
+   .device   = PCI_DEVICE_ID_PHILIPS_SAA7133,
+   .subvendor= 0x5ace, /* Beholder Intl. Ltd. */
.subdevice= 0x7090,
.driver_data  = SAA7134_BOARD_BEHOLD_A7,
}, {
@@ -7176,6 +7210,7 @@ static int saa7134_xc5000_callback(struct saa7134_dev 
*dev,
switch (dev-board) {
case SAA7134_BOARD_BEHOLD_X7:
case SAA7134_BOARD_BEHOLD_H7:
+   case SAA7134_BOARD_BEHOLD_H7_7191:
case SAA7134_BOARD_BEHOLD_A7:
if (command == XC5000_TUNER_RESET) {
/* Down and UP pheripherial RESET pin for reset all chips */
@@ -7348,6 +7383,7 @@ int saa7134_tuner_callback(void *priv, int component, int 
command, int arg)
case TUNER_XC2028:
return saa7134_xc2028_callback(dev, command, arg);
case TUNER_XC5000:
+   case TUNER_XC5000C:
return saa7134_xc5000_callback(dev, command, arg);
}
} else {
@@ -7606,6 +7642,7 @@ int saa7134_board_init1(struct saa7134_dev *dev)
case SAA7134_BOARD_BEHOLD_H6:
case SAA7134_BOARD_BEHOLD_X7:
case SAA7134_BOARD_BEHOLD_H7:
+   case SAA7134_BOARD_BEHOLD_H7_7191:
case SAA7134_BOARD_BEHOLD_A7:
case SAA7134_BOARD_KWORLD_PC150U:
dev-has_remote = SAA7134_REMOTE_I2C;
diff --git a/drivers/media/pci/saa7134/saa7134-dvb.c 
b/drivers/media/pci/saa7134/saa7134-dvb.c
index 73ffbab..89d2a66 100644
--- a/drivers/media/pci/saa7134/saa7134-dvb.c
+++ b/drivers/media/pci/saa7134/saa7134-dvb.c
@@ -1734,6 +1734,7 @@ static int dvb_init(struct saa7134_dev *dev)
}
break;
case SAA7134_BOARD_BEHOLD_H7:
+   case SAA7134_BOARD_BEHOLD_H7_7191:
fe0-dvb.frontend = dvb_attach(zl10353_attach,
behold_x7_config,
dev-i2c_adap);
diff --git a/drivers/media/pci/saa7134/saa7134-input.c 
b/drivers/media/pci/saa7134/saa7134-input.c
index 6f43126..1d89a3f 100644
--- a/drivers/media/pci/saa7134/saa7134-input.c
+++ b/drivers/media/pci/saa7134/saa7134-input.c
@@ -986,6

[PATCH v3] saa7134: add vidioc_querystd

2014-04-01 Thread Mikhail Domrachev
Signed-off-by: Mikhail Domrachev mihail.domryc...@comexp.ru
---
 drivers/media/pci/saa7134/saa7134-empress.c |  1 +
 drivers/media/pci/saa7134/saa7134-reg.h |  5 
 drivers/media/pci/saa7134/saa7134-video.c   | 41 +++--
 drivers/media/pci/saa7134/saa7134.h |  1 +
 4 files changed, 46 insertions(+), 2 deletions(-)

diff --git a/drivers/media/pci/saa7134/saa7134-empress.c 
b/drivers/media/pci/saa7134/saa7134-empress.c
index 0a9047e..a150deb 100644
--- a/drivers/media/pci/saa7134/saa7134-empress.c
+++ b/drivers/media/pci/saa7134/saa7134-empress.c
@@ -262,6 +262,7 @@ static const struct v4l2_ioctl_ops ts_ioctl_ops = {
.vidioc_s_input = saa7134_s_input,
.vidioc_s_std   = saa7134_s_std,
.vidioc_g_std   = saa7134_g_std,
+   .vidioc_querystd= saa7134_querystd,
.vidioc_log_status  = v4l2_ctrl_log_status,
.vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
.vidioc_unsubscribe_event   = v4l2_event_unsubscribe,
diff --git a/drivers/media/pci/saa7134/saa7134-reg.h 
b/drivers/media/pci/saa7134/saa7134-reg.h
index e7e0af1..51737b1 100644
--- a/drivers/media/pci/saa7134/saa7134-reg.h
+++ b/drivers/media/pci/saa7134/saa7134-reg.h
@@ -167,17 +167,22 @@
 #define SAA7134_HSYNC_START 0x106
 #define SAA7134_HSYNC_STOP  0x107
 #define SAA7134_SYNC_CTRL   0x108
+#define   SAA7134_SYNC_CTRL_AUFD(1  7)
 #define SAA7134_LUMA_CTRL   0x109
+#define   SAA7134_LUMA_CTRL_LDEL(1  5)
 #define SAA7134_DEC_LUMA_BRIGHT 0x10a
 #define SAA7134_DEC_LUMA_CONTRAST   0x10b
 #define SAA7134_DEC_CHROMA_SATURATION   0x10c
 #define SAA7134_DEC_CHROMA_HUE  0x10d
 #define SAA7134_CHROMA_CTRL10x10e
+#define   SAA7134_CHROMA_CTRL1_AUTO0(1  1)
+#define   SAA7134_CHROMA_CTRL1_FCTC (1  2)
 #define SAA7134_CHROMA_GAIN 0x10f
 #define SAA7134_CHROMA_CTRL20x110
 #define SAA7134_MODE_DELAY_CTRL 0x111
 
 #define SAA7134_ANALOG_ADC  0x114
+#define   SAA7134_ANALOG_ADC_AUTO1  (1  2)
 #define SAA7134_VGATE_START 0x115
 #define SAA7134_VGATE_STOP  0x116
 #define SAA7134_MISC_VGATE_MSB  0x117
diff --git a/drivers/media/pci/saa7134/saa7134-video.c 
b/drivers/media/pci/saa7134/saa7134-video.c
index eb472b5..5eb61ca 100644
--- a/drivers/media/pci/saa7134/saa7134-video.c
+++ b/drivers/media/pci/saa7134/saa7134-video.c
@@ -452,19 +452,26 @@ static void video_mux(struct saa7134_dev *dev, int input)
 
 static void saa7134_set_decoder(struct saa7134_dev *dev)
 {
-   int luma_control, sync_control, mux;
+   int luma_control, sync_control, chroma_ctrl1, mux;
 
struct saa7134_tvnorm *norm = dev-tvnorm;
mux = card_in(dev, dev-ctl_input).vmux;
 
luma_control = norm-luma_control;
sync_control = norm-sync_control;
+   chroma_ctrl1 = norm-chroma_ctrl1;
 
if (mux  5)
luma_control |= 0x80; /* svideo */
if (noninterlaced || dev-nosignal)
sync_control |= 0x20;
 
+   /* switch on auto standard detection */
+   sync_control |= SAA7134_SYNC_CTRL_AUFD;
+   chroma_ctrl1 |= SAA7134_CHROMA_CTRL1_AUTO0;
+   chroma_ctrl1 = ~SAA7134_CHROMA_CTRL1_FCTC;
+   luma_control = ~SAA7134_LUMA_CTRL_LDEL;
+
/* setup video decoder */
saa_writeb(SAA7134_INCR_DELAY,0x08);
saa_writeb(SAA7134_ANALOG_IN_CTRL1,   0xc0 | mux);
@@ -487,7 +494,7 @@ static void saa7134_set_decoder(struct saa7134_dev *dev)
dev-ctl_invert ? -dev-ctl_saturation : dev-ctl_saturation);
 
saa_writeb(SAA7134_DEC_CHROMA_HUE,dev-ctl_hue);
-   saa_writeb(SAA7134_CHROMA_CTRL1,  norm-chroma_ctrl1);
+   saa_writeb(SAA7134_CHROMA_CTRL1,  chroma_ctrl1);
saa_writeb(SAA7134_CHROMA_GAIN,   norm-chroma_gain);
 
saa_writeb(SAA7134_CHROMA_CTRL2,  norm-chroma_ctrl2);
@@ -1686,6 +1693,35 @@ int saa7134_g_std(struct file *file, void *priv, 
v4l2_std_id *id)
 }
 EXPORT_SYMBOL_GPL(saa7134_g_std);
 
+static v4l2_std_id saa7134_read_std(struct saa7134_dev *dev)
+{
+   static v4l2_std_id stds[] = {
+   V4L2_STD_UNKNOWN,
+   V4L2_STD_NTSC,
+   V4L2_STD_PAL,
+   V4L2_STD_SECAM };
+
+   v4l2_std_id result = 0;
+
+   u8 st1 = saa_readb(SAA7134_STATUS_VIDEO1);
+   u8 st2 = saa_readb(SAA7134_STATUS_VIDEO2);
+
+   if (!(st2  0x1)) /* RDCAP == 0 */
+   result = V4L2_STD_UNKNOWN;
+   else
+   result = stds[st1  0x03];
+
+   return result;
+}
+
+int saa7134_querystd(struct file *file, void *priv, v4l2_std_id *std

[PATCH v2 1/3] saa7134: add vidioc_querystd

2014-03-31 Thread Mikhail Domrachev
Signed-off-by: Mikhail Domrachev mihail.domryc...@comexp.ru
---
 drivers/media/pci/saa7134/saa7134-empress.c |  1 +
 drivers/media/pci/saa7134/saa7134-reg.h |  6 
 drivers/media/pci/saa7134/saa7134-video.c   | 53 ++---
 drivers/media/pci/saa7134/saa7134.h |  1 +
 4 files changed, 57 insertions(+), 4 deletions(-)

diff --git a/drivers/media/pci/saa7134/saa7134-empress.c 
b/drivers/media/pci/saa7134/saa7134-empress.c
index 0a9047e..a150deb 100644
--- a/drivers/media/pci/saa7134/saa7134-empress.c
+++ b/drivers/media/pci/saa7134/saa7134-empress.c
@@ -262,6 +262,7 @@ static const struct v4l2_ioctl_ops ts_ioctl_ops = {
.vidioc_s_input = saa7134_s_input,
.vidioc_s_std   = saa7134_s_std,
.vidioc_g_std   = saa7134_g_std,
+   .vidioc_querystd= saa7134_querystd,
.vidioc_log_status  = v4l2_ctrl_log_status,
.vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
.vidioc_unsubscribe_event   = v4l2_event_unsubscribe,
diff --git a/drivers/media/pci/saa7134/saa7134-reg.h 
b/drivers/media/pci/saa7134/saa7134-reg.h
index e7e0af1..9681d31 100644
--- a/drivers/media/pci/saa7134/saa7134-reg.h
+++ b/drivers/media/pci/saa7134/saa7134-reg.h
@@ -369,6 +369,12 @@
 #define SAA7135_DSP_RWCLEAR_RERR   1
 
 #define SAA7133_I2S_AUDIO_CONTROL   0x591
+
+#define SAA7134_STDDETECT_AUFD  (1  7)
+#define SAA7134_STDDETECT_FCTC  (1  2)
+#define SAA7134_STDDETECT_LDEL  (1  5)
+#define SAA7134_STDDETECT_AUTO0 (1  1)
+#define SAA7134_STDDETECT_AUTO1 (1  2)
 /* -- */
 /*
  * Local variables:
diff --git a/drivers/media/pci/saa7134/saa7134-video.c 
b/drivers/media/pci/saa7134/saa7134-video.c
index eb472b5..bc85d84 100644
--- a/drivers/media/pci/saa7134/saa7134-video.c
+++ b/drivers/media/pci/saa7134/saa7134-video.c
@@ -452,19 +452,29 @@ static void video_mux(struct saa7134_dev *dev, int input)
 
 static void saa7134_set_decoder(struct saa7134_dev *dev)
 {
-   int luma_control, sync_control, mux;
+   int luma_control, sync_control, chroma_ctrl1,
+   analog_adc, vgate_misc, mux;
 
struct saa7134_tvnorm *norm = dev-tvnorm;
mux = card_in(dev, dev-ctl_input).vmux;
 
luma_control = norm-luma_control;
sync_control = norm-sync_control;
+   chroma_ctrl1 = norm-chroma_ctrl1;
+   analog_adc = 0x01;
+   vgate_misc = norm-vgate_misc;
 
if (mux  5)
luma_control |= 0x80; /* svideo */
if (noninterlaced || dev-nosignal)
sync_control |= 0x20;
 
+   /* switch on auto standard detection */
+   sync_control |= SAA7134_STDDETECT_AUFD;
+   chroma_ctrl1 |= SAA7134_STDDETECT_AUTO0;
+   chroma_ctrl1 = ~SAA7134_STDDETECT_FCTC;
+   luma_control = ~SAA7134_STDDETECT_LDEL;
+
/* setup video decoder */
saa_writeb(SAA7134_INCR_DELAY,0x08);
saa_writeb(SAA7134_ANALOG_IN_CTRL1,   0xc0 | mux);
@@ -487,16 +497,16 @@ static void saa7134_set_decoder(struct saa7134_dev *dev)
dev-ctl_invert ? -dev-ctl_saturation : dev-ctl_saturation);
 
saa_writeb(SAA7134_DEC_CHROMA_HUE,dev-ctl_hue);
-   saa_writeb(SAA7134_CHROMA_CTRL1,  norm-chroma_ctrl1);
+   saa_writeb(SAA7134_CHROMA_CTRL1,  chroma_ctrl1);
saa_writeb(SAA7134_CHROMA_GAIN,   norm-chroma_gain);
 
saa_writeb(SAA7134_CHROMA_CTRL2,  norm-chroma_ctrl2);
saa_writeb(SAA7134_MODE_DELAY_CTRL,   0x00);
 
-   saa_writeb(SAA7134_ANALOG_ADC,0x01);
+   saa_writeb(SAA7134_ANALOG_ADC,analog_adc);
saa_writeb(SAA7134_VGATE_START,   0x11);
saa_writeb(SAA7134_VGATE_STOP,0xfe);
-   saa_writeb(SAA7134_MISC_VGATE_MSB,norm-vgate_misc);
+   saa_writeb(SAA7134_MISC_VGATE_MSB,vgate_misc);
saa_writeb(SAA7134_RAW_DATA_GAIN, 0x40);
saa_writeb(SAA7134_RAW_DATA_OFFSET,   0x80);
 }
@@ -1686,6 +1696,40 @@ int saa7134_g_std(struct file *file, void *priv, 
v4l2_std_id *id)
 }
 EXPORT_SYMBOL_GPL(saa7134_g_std);
 
+static v4l2_std_id saa7134_read_std(struct saa7134_dev *dev)
+{
+   static v4l2_std_id stds[] = {
+   V4L2_STD_ALL,
+   V4L2_STD_NTSC,
+   V4L2_STD_PAL,
+   V4L2_STD_SECAM };
+
+   v4l2_std_id result = 0;
+
+   u8 st1 = saa_readb(SAA7134_STATUS_VIDEO1);
+   u8 st2 = saa_readb(SAA7134_STATUS_VIDEO2);
+
+   if (!(st2  0x1)) /* RDCAP == 0 */
+   result = V4L2_STD_ALL;
+   else
+   result = stds[st1  0x03];
+
+   return result;
+}
+
+int saa7134_querystd(struct file *file, void *priv, v4l2_std_id *std)
+{
+   struct saa7134_dev *dev

Re: [PATCH] saa7134: automatic norm detection

2014-03-31 Thread Mikhail Domrachev
Hi, Hans,

 I agree with Devin here. None of the existing SDTV receivers do this, and
 nobody ever used interrupts to check for this. Such interrupts are rarely
 available, and if they exists they are never hooked up. This is quite
 different for HDTV receivers where such an event is pretty much required
 (even though it still isn't officially added to the kernel, but that's
 another story).
OK, I got it.

 Is there any reason why your application cannot periodically call QUERYSTD?
There's no reason, it can.

 I'll test your patch today or Friday.
OK. Thank you.

-- 
Regards,
Mikhail Domrachev
Comexp

--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v2 3/3] saa7134: add notification about TV standard changes

2014-03-31 Thread Mikhail Domrachev
The v4l2 event of type V4L2_EVENT_SIGNALCHANGED is emitted
when the current TV standard changes.

Signed-off-by: Mikhail Domrachev mihail.domryc...@comexp.ru
---
 drivers/media/pci/saa7134/saa7134-video.c | 125 +-
 drivers/media/pci/saa7134/saa7134.h   |  11 +++
 2 files changed, 135 insertions(+), 1 deletion(-)

diff --git a/drivers/media/pci/saa7134/saa7134-video.c 
b/drivers/media/pci/saa7134/saa7134-video.c
index bc85d84..0c0f218 100644
--- a/drivers/media/pci/saa7134/saa7134-video.c
+++ b/drivers/media/pci/saa7134/saa7134-video.c
@@ -24,6 +24,9 @@
 #include linux/list.h
 #include linux/module.h
 #include linux/kernel.h
+#include linux/kthread.h
+#include linux/delay.h
+#include linux/freezer.h
 #include linux/slab.h
 #include linux/sort.h
 
@@ -51,6 +54,7 @@ MODULE_PARM_DESC(noninterlaced,capture non interlaced 
video);
 module_param_string(secam, secam, sizeof(secam), 0644);
 MODULE_PARM_DESC(secam, force SECAM variant, either DK,L or Lc);
 
+static int saa7134_standard_detector_thread(void *arg);
 
 #define dprintk(fmt, arg...)   if (video_debug0x04) \
printk(KERN_DEBUG %s/video:  fmt, dev-name , ## arg)
@@ -2097,6 +2101,17 @@ static int radio_s_tuner(struct file *file, void *priv,
return 0;
 }
 
+static int saa7134_subscribe_event(struct v4l2_fh *fh,
+   const struct v4l2_event_subscription *sub)
+{
+   if (sub-type == V4L2_EVENT_SIGNALCHANGED) {
+   return v4l2_event_subscribe(fh, sub,
+   SAA7134_EVENTS_QUEUE_SIZE, NULL);
+   } else {
+   return v4l2_ctrl_subscribe_event(fh, sub);
+   }
+}
+
 static const struct v4l2_file_operations video_fops =
 {
.owner= THIS_MODULE,
@@ -2148,7 +2163,7 @@ static const struct v4l2_ioctl_ops video_ioctl_ops = {
.vidioc_s_register  = vidioc_s_register,
 #endif
.vidioc_log_status  = v4l2_ctrl_log_status,
-   .vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
+   .vidioc_subscribe_event = saa7134_subscribe_event,
.vidioc_unsubscribe_event   = v4l2_event_unsubscribe,
 };
 
@@ -2317,6 +2332,11 @@ int saa7134_video_init1(struct saa7134_dev *dev)
 
 void saa7134_video_fini(struct saa7134_dev *dev)
 {
+   if (dev-std_thread.thread  !dev-std_thread.stopped) {
+   kthread_stop(dev-std_thread.thread);
+   dev-std_thread.thread = NULL;
+   }
+
/* free stuff */
saa7134_pgtable_free(dev-pci, dev-pt_cap);
saa7134_pgtable_free(dev-pci, dev-pt_vbi);
@@ -2369,6 +2389,107 @@ int saa7134_video_init2(struct saa7134_dev *dev)
v4l2_ctrl_handler_setup(dev-ctrl_handler);
saa7134_tvaudio_setmute(dev);
saa7134_tvaudio_setvolume(dev,dev-ctl_volume);
+
+   dev-std_thread.thread = NULL;
+   dev-std_thread.stopped = 0;
+   atomic_set(dev-std_thread.scan1, 0);
+   atomic_set(dev-std_thread.scan2, 0);
+
+   dev-std_thread.thread = kthread_run(saa7134_standard_detector_thread,
+   dev, %s, dev-name);
+   if (IS_ERR(dev-std_thread.thread)) {
+   dev_alert(dev-v4l2_dev.dev, %s: 
kthread_run(saa7134_standard_detector_thread) failed\n,
+   dev-name);
+   dev-std_thread.thread = NULL;
+   dev-std_thread.stopped = 1;
+   }
+   return 0;
+}
+
+static const char *saa7134_std_to_str(v4l2_std_id std)
+{
+   switch (std) {
+   case V4L2_STD_NTSC:
+   return NTSC;
+   case V4L2_STD_PAL:
+   return PAL;
+   case V4L2_STD_SECAM:
+   return SECAM;
+   default:
+   return (no signal);
+   }
+}
+
+static int saa7134_std_sleep(struct saa7134_dev *dev, int timeout)
+{
+   int cmp = (atomic_read(dev-std_thread.scan1)
+   == atomic_read(dev-std_thread.scan2));
+
+   if (cmp  !kthread_should_stop()) {
+   if (timeout  0) {
+   set_current_state(TASK_INTERRUPTIBLE);
+   schedule();
+   } else {
+   schedule_timeout_interruptible(
+   msecs_to_jiffies(timeout));
+   }
+   }
+   cmp = (atomic_read(dev-std_thread.scan1)
+   != atomic_read(dev-std_thread.scan2));
+   return cmp;
+}
+
+static int saa7134_standard_detector_thread(void *arg)
+{
+   struct saa7134_dev *dev = arg;
+   v4l2_std_id dcstd = 0;
+   struct v4l2_event event;
+   static const int detect_time = 10; /* msec */
+   static const int max_detect_time = 2000; /* msec */
+   int time_spent = 0;
+
+   set_freezable();
+   for (;;) {
+   saa7134_std_sleep(dev, -1);
+restart:
+   if (kthread_should_stop())
+   goto done;
+   try_to_freeze();
+
+   atomic_set(dev-std_thread.scan1

[PATCH v2 2/3] videodev2: add new event type V4L2_EVENT_SIGNALCHANGED

2014-03-31 Thread Mikhail Domrachev
Applications subscribed for this event can be notified about
changes of TV standard.

Signed-off-by: Mikhail Domrachev mihail.domryc...@comexp.ru
---
 Documentation/DocBook/media/v4l/vidioc-subscribe-event.xml | 7 +++
 include/uapi/linux/videodev2.h | 1 +
 2 files changed, 8 insertions(+)

diff --git a/Documentation/DocBook/media/v4l/vidioc-subscribe-event.xml 
b/Documentation/DocBook/media/v4l/vidioc-subscribe-event.xml
index 5c70b61..dc7cb9f 100644
--- a/Documentation/DocBook/media/v4l/vidioc-subscribe-event.xml
+++ b/Documentation/DocBook/media/v4l/vidioc-subscribe-event.xml
@@ -155,6 +155,13 @@
/entry
  /row
  row
+   entryconstantV4L2_EVENT_SIGNALCHANGED/constant/entry
+   entry5/entry
+   entryThis event is triggered when TV standard of the input signal 
is changed.
+  New detected standard of type v4l2-std-id; placed to 
u.data[] field of v4l2-event;
+   /entry
+ /row
+ row
entryconstantV4L2_EVENT_PRIVATE_START/constant/entry
entry0x0800/entry
entryBase event number for driver-private events./entry
diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h
index e35ad6c..45094f2 100644
--- a/include/uapi/linux/videodev2.h
+++ b/include/uapi/linux/videodev2.h
@@ -1765,6 +1765,7 @@ struct v4l2_streamparm {
 #define V4L2_EVENT_EOS 2
 #define V4L2_EVENT_CTRL3
 #define V4L2_EVENT_FRAME_SYNC  4
+#define V4L2_EVENT_SIGNALCHANGED   5
 #define V4L2_EVENT_PRIVATE_START   0x0800
 
 /* Payload for V4L2_EVENT_VSYNC */
-- 
1.8.5.3



--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] saa7134: automatic norm detection

2014-03-28 Thread Mikhail Domrachev
Hi Hans,

Thank you for comments, I will rework the patch and document the new
event type.

Let me explain why I created a new thread.
My company is engaged in the monitoring of TV air. All TV channels are
recorded 24/7 for further analysis. But some local TV channels change
the standard over time (SECAM-PAL, PAL-SECAM). So the recording
software must be notified about these changes to set a new standard and
record the picture but not the noise.

Regards,
Mikhail

On Fri, 2014-03-28 at 09:37 +0100, Hans Verkuil wrote:
 Hi Mikhail,
 
 Thank you for the patch. However, it does need some work before I can accept 
 it.
 
 First of all, run your patch through scripts/checkpatch.pl to ensure it 
 complies
 to the kernel coding style.
 
 Secondly, split up this single patch in smaller ones: in particular the 
 addition
 of the new event type needs to be in a patch of its own.
 
 Thirdly, you need to document the new event type in the DocBook documentation 
 as
 well. API additions are only accepted if the documentation is updated at the 
 same
 time.
 
 I also wonder why you need a thread to watch for signal changes. It's not 
 wrong,
 but in practice a TV input signal rarely if ever changes format. It can be 
 different
 between different countries or when testing with a signal generator, but the 
 normal
 case is that you are just interested in the current standard, and not how it 
 might
 change over time. That would simplify the code a lot. This is what other 
 drivers
 that implement querystd do.
 
 Regards,
 
   Hans
 
 On 03/24/2014 12:42 PM, Mikhail Domrachev wrote:
  saa7134: automatic norm detection switched on
  saa7134: vidioc_querystd added
  saa7134: notification about TV norm changes via V4L2 event interface added
  videodev2: new event type added
  
  Signed-off-by: Mikhail Domrachev mihail.domryc...@comexp.ru
  
  ---
   drivers/media/pci/saa7134/saa7134-empress.c |   1 +
   drivers/media/pci/saa7134/saa7134-reg.h |   7 +
   drivers/media/pci/saa7134/saa7134-tvaudio.c |  56 +++---
   drivers/media/pci/saa7134/saa7134-video.c   | 274 
  ++--
   drivers/media/pci/saa7134/saa7134.h |  14 +-
   include/uapi/linux/videodev2.h  |   2 +
   6 files changed, 311 insertions(+), 43 deletions(-)
  
  diff --git a/drivers/media/pci/saa7134/saa7134-empress.c 
  b/drivers/media/pci/saa7134/saa7134-empress.c
  index 0a9047e..a150deb 100644
  --- a/drivers/media/pci/saa7134/saa7134-empress.c
  +++ b/drivers/media/pci/saa7134/saa7134-empress.c
  @@ -262,6 +262,7 @@ static const struct v4l2_ioctl_ops ts_ioctl_ops = {
  .vidioc_s_input = saa7134_s_input,
  .vidioc_s_std   = saa7134_s_std,
  .vidioc_g_std   = saa7134_g_std,
  +   .vidioc_querystd= saa7134_querystd,
  .vidioc_log_status  = v4l2_ctrl_log_status,
  .vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
  .vidioc_unsubscribe_event   = v4l2_event_unsubscribe,
  diff --git a/drivers/media/pci/saa7134/saa7134-reg.h 
  b/drivers/media/pci/saa7134/saa7134-reg.h
  index e7e0af1..d3be05c 100644
  --- a/drivers/media/pci/saa7134/saa7134-reg.h
  +++ b/drivers/media/pci/saa7134/saa7134-reg.h
  @@ -369,6 +369,13 @@
   #define SAA7135_DSP_RWCLEAR_RERR   1
   
   #define SAA7133_I2S_AUDIO_CONTROL   0x591
  +
  +#define SAA7134_STDDETECT_AUFD  (1  7)
  +#define SAA7134_STDDETECT_FCTC  (1  2)
  +#define SAA7134_STDDETECT_LDEL  (1  5)
  +#define SAA7134_STDDETECT_AUTO0 (1  1)
  +#define SAA7134_STDDETECT_AUTO1 (1  2)
  +
   /* -- */
   /*
* Local variables:
  diff --git a/drivers/media/pci/saa7134/saa7134-tvaudio.c 
  b/drivers/media/pci/saa7134/saa7134-tvaudio.c
  index 0f34e09..6380e49 100644
  --- a/drivers/media/pci/saa7134/saa7134-tvaudio.c
  +++ b/drivers/media/pci/saa7134/saa7134-tvaudio.c
  @@ -315,7 +315,7 @@ static void tvaudio_setmode(struct saa7134_dev *dev,
   
   static int tvaudio_sleep(struct saa7134_dev *dev, int timeout)
   {
  -   if (dev-thread.scan1 == dev-thread.scan2 
  +   if (dev-audio_thread.scan1 == dev-audio_thread.scan2 
  !kthread_should_stop()) {
  if (timeout  0) {
  set_current_state(TASK_INTERRUPTIBLE);
  @@ -325,7 +325,7 @@ static int tvaudio_sleep(struct saa7134_dev *dev, int 
  timeout)
  (msecs_to_jiffies(timeout));
  }
  }
  -   return dev-thread.scan1 != dev-thread.scan2;
  +   return dev-audio_thread.scan1 != dev-audio_thread.scan2;
   }
   
   static int tvaudio_checkcarrier(struct saa7134_dev *dev, struct mainscan 
  *scan)
  @@ -488,8 +488,8 @@ static int tvaudio_thread(void *data)
  restart:
  try_to_freeze();
   
  -   dev-thread.scan1 = dev-thread.scan2

Re: [PATCH] saa7134: automatic norm detection

2014-03-25 Thread Mikhail Domrachev
Sorry, I forgot to add the maintainer to the recipients.

 saa7134: automatic norm detection switched on
 saa7134: vidioc_querystd added
 saa7134: notification about TV norm changes via V4L2 event interface added
 videodev2: new event type added
 
 Signed-off-by: Mikhail Domrachev mihail.domryc...@comexp.ru
 
 ---
  drivers/media/pci/saa7134/saa7134-empress.c |   1 +
  drivers/media/pci/saa7134/saa7134-reg.h |   7 +
  drivers/media/pci/saa7134/saa7134-tvaudio.c |  56 +++---
  drivers/media/pci/saa7134/saa7134-video.c   | 274 
 ++--
  drivers/media/pci/saa7134/saa7134.h |  14 +-
  include/uapi/linux/videodev2.h  |   2 +
  6 files changed, 311 insertions(+), 43 deletions(-)
 
 diff --git a/drivers/media/pci/saa7134/saa7134-empress.c 
 b/drivers/media/pci/saa7134/saa7134-empress.c
 index 0a9047e..a150deb 100644
 --- a/drivers/media/pci/saa7134/saa7134-empress.c
 +++ b/drivers/media/pci/saa7134/saa7134-empress.c
 @@ -262,6 +262,7 @@ static const struct v4l2_ioctl_ops ts_ioctl_ops = {
   .vidioc_s_input = saa7134_s_input,
   .vidioc_s_std   = saa7134_s_std,
   .vidioc_g_std   = saa7134_g_std,
 + .vidioc_querystd= saa7134_querystd,
   .vidioc_log_status  = v4l2_ctrl_log_status,
   .vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
   .vidioc_unsubscribe_event   = v4l2_event_unsubscribe,
 diff --git a/drivers/media/pci/saa7134/saa7134-reg.h 
 b/drivers/media/pci/saa7134/saa7134-reg.h
 index e7e0af1..d3be05c 100644
 --- a/drivers/media/pci/saa7134/saa7134-reg.h
 +++ b/drivers/media/pci/saa7134/saa7134-reg.h
 @@ -369,6 +369,13 @@
  #define SAA7135_DSP_RWCLEAR_RERR 1
  
  #define SAA7133_I2S_AUDIO_CONTROL   0x591
 +
 +#define SAA7134_STDDETECT_AUFD  (1  7)
 +#define SAA7134_STDDETECT_FCTC  (1  2)
 +#define SAA7134_STDDETECT_LDEL  (1  5)
 +#define SAA7134_STDDETECT_AUTO0 (1  1)
 +#define SAA7134_STDDETECT_AUTO1 (1  2)
 +
  /* -- */
  /*
   * Local variables:
 diff --git a/drivers/media/pci/saa7134/saa7134-tvaudio.c 
 b/drivers/media/pci/saa7134/saa7134-tvaudio.c
 index 0f34e09..6380e49 100644
 --- a/drivers/media/pci/saa7134/saa7134-tvaudio.c
 +++ b/drivers/media/pci/saa7134/saa7134-tvaudio.c
 @@ -315,7 +315,7 @@ static void tvaudio_setmode(struct saa7134_dev *dev,
  
  static int tvaudio_sleep(struct saa7134_dev *dev, int timeout)
  {
 - if (dev-thread.scan1 == dev-thread.scan2 
 + if (dev-audio_thread.scan1 == dev-audio_thread.scan2 
   !kthread_should_stop()) {
   if (timeout  0) {
   set_current_state(TASK_INTERRUPTIBLE);
 @@ -325,7 +325,7 @@ static int tvaudio_sleep(struct saa7134_dev *dev, int 
 timeout)
   (msecs_to_jiffies(timeout));
   }
   }
 - return dev-thread.scan1 != dev-thread.scan2;
 + return dev-audio_thread.scan1 != dev-audio_thread.scan2;
  }
  
  static int tvaudio_checkcarrier(struct saa7134_dev *dev, struct mainscan 
 *scan)
 @@ -488,8 +488,8 @@ static int tvaudio_thread(void *data)
   restart:
   try_to_freeze();
  
 - dev-thread.scan1 = dev-thread.scan2;
 - dprintk(tvaudio thread scan start [%d]\n,dev-thread.scan1);
 + dev-audio_thread.scan1 = dev-audio_thread.scan2;
 + dprintk(tvaudio thread scan start 
 [%d]\n,dev-audio_thread.scan1);
   dev-tvaudio  = NULL;
  
   saa_writeb(SAA7134_MONITOR_SELECT,   0xa0);
 @@ -528,7 +528,7 @@ static int tvaudio_thread(void *data)
   tvaudio_setmode(dev,tvaudio[0],NULL);
   for (i = 0; i  ARRAY_SIZE(mainscan); i++) {
   carr_vals[i] = tvaudio_checkcarrier(dev, 
 mainscan+i);
 - if (dev-thread.scan1 != dev-thread.scan2)
 + if (dev-audio_thread.scan1 != 
 dev-audio_thread.scan2)
   goto restart;
   }
   for (max1 = 0, max2 = 0, i = 0; i  
 ARRAY_SIZE(mainscan); i++) {
 @@ -604,11 +604,11 @@ static int tvaudio_thread(void *data)
   goto restart;
   if (kthread_should_stop())
   break;
 - if (UNSET == dev-thread.mode) {
 + if (UNSET == dev-audio_thread.mode) {
   rx = tvaudio_getstereo(dev, tvaudio[audio]);
   mode = saa7134_tvaudio_rx2mode(rx);
   } else {
 - mode = dev-thread.mode;
 + mode = dev-audio_thread.mode;
   }
   if (lastmode != mode

[PATCH] saa7134: automatic norm detection

2014-03-24 Thread Mikhail Domrachev
saa7134: automatic norm detection switched on
saa7134: vidioc_querystd added
saa7134: notification about TV norm changes via V4L2 event interface added
videodev2: new event type added

Signed-off-by: Mikhail Domrachev mihail.domryc...@comexp.ru

---
 drivers/media/pci/saa7134/saa7134-empress.c |   1 +
 drivers/media/pci/saa7134/saa7134-reg.h |   7 +
 drivers/media/pci/saa7134/saa7134-tvaudio.c |  56 +++---
 drivers/media/pci/saa7134/saa7134-video.c   | 274 ++--
 drivers/media/pci/saa7134/saa7134.h |  14 +-
 include/uapi/linux/videodev2.h  |   2 +
 6 files changed, 311 insertions(+), 43 deletions(-)

diff --git a/drivers/media/pci/saa7134/saa7134-empress.c 
b/drivers/media/pci/saa7134/saa7134-empress.c
index 0a9047e..a150deb 100644
--- a/drivers/media/pci/saa7134/saa7134-empress.c
+++ b/drivers/media/pci/saa7134/saa7134-empress.c
@@ -262,6 +262,7 @@ static const struct v4l2_ioctl_ops ts_ioctl_ops = {
.vidioc_s_input = saa7134_s_input,
.vidioc_s_std   = saa7134_s_std,
.vidioc_g_std   = saa7134_g_std,
+   .vidioc_querystd= saa7134_querystd,
.vidioc_log_status  = v4l2_ctrl_log_status,
.vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
.vidioc_unsubscribe_event   = v4l2_event_unsubscribe,
diff --git a/drivers/media/pci/saa7134/saa7134-reg.h 
b/drivers/media/pci/saa7134/saa7134-reg.h
index e7e0af1..d3be05c 100644
--- a/drivers/media/pci/saa7134/saa7134-reg.h
+++ b/drivers/media/pci/saa7134/saa7134-reg.h
@@ -369,6 +369,13 @@
 #define SAA7135_DSP_RWCLEAR_RERR   1
 
 #define SAA7133_I2S_AUDIO_CONTROL   0x591
+
+#define SAA7134_STDDETECT_AUFD  (1  7)
+#define SAA7134_STDDETECT_FCTC  (1  2)
+#define SAA7134_STDDETECT_LDEL  (1  5)
+#define SAA7134_STDDETECT_AUTO0 (1  1)
+#define SAA7134_STDDETECT_AUTO1 (1  2)
+
 /* -- */
 /*
  * Local variables:
diff --git a/drivers/media/pci/saa7134/saa7134-tvaudio.c 
b/drivers/media/pci/saa7134/saa7134-tvaudio.c
index 0f34e09..6380e49 100644
--- a/drivers/media/pci/saa7134/saa7134-tvaudio.c
+++ b/drivers/media/pci/saa7134/saa7134-tvaudio.c
@@ -315,7 +315,7 @@ static void tvaudio_setmode(struct saa7134_dev *dev,
 
 static int tvaudio_sleep(struct saa7134_dev *dev, int timeout)
 {
-   if (dev-thread.scan1 == dev-thread.scan2 
+   if (dev-audio_thread.scan1 == dev-audio_thread.scan2 
!kthread_should_stop()) {
if (timeout  0) {
set_current_state(TASK_INTERRUPTIBLE);
@@ -325,7 +325,7 @@ static int tvaudio_sleep(struct saa7134_dev *dev, int 
timeout)
(msecs_to_jiffies(timeout));
}
}
-   return dev-thread.scan1 != dev-thread.scan2;
+   return dev-audio_thread.scan1 != dev-audio_thread.scan2;
 }
 
 static int tvaudio_checkcarrier(struct saa7134_dev *dev, struct mainscan *scan)
@@ -488,8 +488,8 @@ static int tvaudio_thread(void *data)
restart:
try_to_freeze();
 
-   dev-thread.scan1 = dev-thread.scan2;
-   dprintk(tvaudio thread scan start [%d]\n,dev-thread.scan1);
+   dev-audio_thread.scan1 = dev-audio_thread.scan2;
+   dprintk(tvaudio thread scan start 
[%d]\n,dev-audio_thread.scan1);
dev-tvaudio  = NULL;
 
saa_writeb(SAA7134_MONITOR_SELECT,   0xa0);
@@ -528,7 +528,7 @@ static int tvaudio_thread(void *data)
tvaudio_setmode(dev,tvaudio[0],NULL);
for (i = 0; i  ARRAY_SIZE(mainscan); i++) {
carr_vals[i] = tvaudio_checkcarrier(dev, 
mainscan+i);
-   if (dev-thread.scan1 != dev-thread.scan2)
+   if (dev-audio_thread.scan1 != 
dev-audio_thread.scan2)
goto restart;
}
for (max1 = 0, max2 = 0, i = 0; i  
ARRAY_SIZE(mainscan); i++) {
@@ -604,11 +604,11 @@ static int tvaudio_thread(void *data)
goto restart;
if (kthread_should_stop())
break;
-   if (UNSET == dev-thread.mode) {
+   if (UNSET == dev-audio_thread.mode) {
rx = tvaudio_getstereo(dev, tvaudio[audio]);
mode = saa7134_tvaudio_rx2mode(rx);
} else {
-   mode = dev-thread.mode;
+   mode = dev-audio_thread.mode;
}
if (lastmode != mode) {
tvaudio_setstereo(dev,tvaudio[audio],mode