diff options
Diffstat (limited to 'drivers/media/video/saa7134/saa7134-empress.c')
-rw-r--r-- | drivers/media/video/saa7134/saa7134-empress.c | 63 |
1 files changed, 51 insertions, 12 deletions
diff --git a/drivers/media/video/saa7134/saa7134-empress.c b/drivers/media/video/saa7134/saa7134-empress.c index c0c5d7509c25..9a8766a78a0c 100644 --- a/drivers/media/video/saa7134/saa7134-empress.c +++ b/drivers/media/video/saa7134/saa7134-empress.c | |||
@@ -29,6 +29,7 @@ | |||
29 | 29 | ||
30 | #include <media/saa6752hs.h> | 30 | #include <media/saa6752hs.h> |
31 | #include <media/v4l2-common.h> | 31 | #include <media/v4l2-common.h> |
32 | #include <media/v4l2-chip-ident.h> | ||
32 | 33 | ||
33 | /* ------------------------------------------------------------------ */ | 34 | /* ------------------------------------------------------------------ */ |
34 | 35 | ||
@@ -63,10 +64,19 @@ static void ts_reset_encoder(struct saa7134_dev* dev) | |||
63 | 64 | ||
64 | static int ts_init_encoder(struct saa7134_dev* dev) | 65 | static int ts_init_encoder(struct saa7134_dev* dev) |
65 | { | 66 | { |
66 | struct v4l2_ext_controls ctrls = { V4L2_CTRL_CLASS_MPEG, 0 }; | 67 | u32 leading_null_bytes = 0; |
67 | 68 | ||
69 | /* If more cards start to need this, then this | ||
70 | should probably be added to the card definitions. */ | ||
71 | switch (dev->board) { | ||
72 | case SAA7134_BOARD_BEHOLD_M6: | ||
73 | case SAA7134_BOARD_BEHOLD_M63: | ||
74 | case SAA7134_BOARD_BEHOLD_M6_EXTRA: | ||
75 | leading_null_bytes = 1; | ||
76 | break; | ||
77 | } | ||
68 | ts_reset_encoder(dev); | 78 | ts_reset_encoder(dev); |
69 | saa7134_i2c_call_clients(dev, VIDIOC_S_EXT_CTRLS, &ctrls); | 79 | saa7134_i2c_call_clients(dev, VIDIOC_INT_INIT, &leading_null_bytes); |
70 | dev->empress_started = 1; | 80 | dev->empress_started = 1; |
71 | return 0; | 81 | return 0; |
72 | } | 82 | } |
@@ -79,9 +89,11 @@ static int ts_open(struct inode *inode, struct file *file) | |||
79 | struct saa7134_dev *dev; | 89 | struct saa7134_dev *dev; |
80 | int err; | 90 | int err; |
81 | 91 | ||
92 | lock_kernel(); | ||
82 | list_for_each_entry(dev, &saa7134_devlist, devlist) | 93 | list_for_each_entry(dev, &saa7134_devlist, devlist) |
83 | if (dev->empress_dev && dev->empress_dev->minor == minor) | 94 | if (dev->empress_dev && dev->empress_dev->minor == minor) |
84 | goto found; | 95 | goto found; |
96 | unlock_kernel(); | ||
85 | return -ENODEV; | 97 | return -ENODEV; |
86 | found: | 98 | found: |
87 | 99 | ||
@@ -103,6 +115,7 @@ static int ts_open(struct inode *inode, struct file *file) | |||
103 | done_up: | 115 | done_up: |
104 | mutex_unlock(&dev->empress_tsq.vb_lock); | 116 | mutex_unlock(&dev->empress_tsq.vb_lock); |
105 | done: | 117 | done: |
118 | unlock_kernel(); | ||
106 | return err; | 119 | return err; |
107 | } | 120 | } |
108 | 121 | ||
@@ -290,15 +303,6 @@ static int empress_streamoff(struct file *file, void *priv, | |||
290 | return videobuf_streamoff(&dev->empress_tsq); | 303 | return videobuf_streamoff(&dev->empress_tsq); |
291 | } | 304 | } |
292 | 305 | ||
293 | static int saa7134_i2c_call_saa6752(struct saa7134_dev *dev, | ||
294 | unsigned int cmd, void *arg) | ||
295 | { | ||
296 | if (dev->mpeg_i2c_client == NULL) | ||
297 | return -EINVAL; | ||
298 | return dev->mpeg_i2c_client->driver->command(dev->mpeg_i2c_client, | ||
299 | cmd, arg); | ||
300 | } | ||
301 | |||
302 | static int empress_s_ext_ctrls(struct file *file, void *priv, | 306 | static int empress_s_ext_ctrls(struct file *file, void *priv, |
303 | struct v4l2_ext_controls *ctrls) | 307 | struct v4l2_ext_controls *ctrls) |
304 | { | 308 | { |
@@ -400,6 +404,39 @@ static int empress_querymenu(struct file *file, void *priv, | |||
400 | return saa7134_i2c_call_saa6752(dev, VIDIOC_QUERYMENU, c); | 404 | return saa7134_i2c_call_saa6752(dev, VIDIOC_QUERYMENU, c); |
401 | } | 405 | } |
402 | 406 | ||
407 | static int empress_g_chip_ident(struct file *file, void *fh, | ||
408 | struct v4l2_chip_ident *chip) | ||
409 | { | ||
410 | struct saa7134_dev *dev = file->private_data; | ||
411 | |||
412 | chip->ident = V4L2_IDENT_NONE; | ||
413 | chip->revision = 0; | ||
414 | if (dev->mpeg_i2c_client == NULL) | ||
415 | return -EINVAL; | ||
416 | if (chip->match_type == V4L2_CHIP_MATCH_I2C_DRIVER && | ||
417 | chip->match_chip == I2C_DRIVERID_SAA6752HS) | ||
418 | return saa7134_i2c_call_saa6752(dev, VIDIOC_G_CHIP_IDENT, chip); | ||
419 | if (chip->match_type == V4L2_CHIP_MATCH_I2C_ADDR && | ||
420 | chip->match_chip == dev->mpeg_i2c_client->addr) | ||
421 | return saa7134_i2c_call_saa6752(dev, VIDIOC_G_CHIP_IDENT, chip); | ||
422 | return -EINVAL; | ||
423 | } | ||
424 | |||
425 | static int empress_s_std(struct file *file, void *priv, v4l2_std_id *id) | ||
426 | { | ||
427 | struct saa7134_dev *dev = file->private_data; | ||
428 | |||
429 | return saa7134_s_std_internal(dev, NULL, id); | ||
430 | } | ||
431 | |||
432 | static int empress_g_std(struct file *file, void *priv, v4l2_std_id *id) | ||
433 | { | ||
434 | struct saa7134_dev *dev = file->private_data; | ||
435 | |||
436 | *id = dev->tvnorm->id; | ||
437 | return 0; | ||
438 | } | ||
439 | |||
403 | static const struct file_operations ts_fops = | 440 | static const struct file_operations ts_fops = |
404 | { | 441 | { |
405 | .owner = THIS_MODULE, | 442 | .owner = THIS_MODULE, |
@@ -428,11 +465,13 @@ static const struct v4l2_ioctl_ops ts_ioctl_ops = { | |||
428 | .vidioc_enum_input = empress_enum_input, | 465 | .vidioc_enum_input = empress_enum_input, |
429 | .vidioc_g_input = empress_g_input, | 466 | .vidioc_g_input = empress_g_input, |
430 | .vidioc_s_input = empress_s_input, | 467 | .vidioc_s_input = empress_s_input, |
431 | |||
432 | .vidioc_queryctrl = empress_queryctrl, | 468 | .vidioc_queryctrl = empress_queryctrl, |
433 | .vidioc_querymenu = empress_querymenu, | 469 | .vidioc_querymenu = empress_querymenu, |
434 | .vidioc_g_ctrl = empress_g_ctrl, | 470 | .vidioc_g_ctrl = empress_g_ctrl, |
435 | .vidioc_s_ctrl = empress_s_ctrl, | 471 | .vidioc_s_ctrl = empress_s_ctrl, |
472 | .vidioc_g_chip_ident = empress_g_chip_ident, | ||
473 | .vidioc_s_std = empress_s_std, | ||
474 | .vidioc_g_std = empress_g_std, | ||
436 | }; | 475 | }; |
437 | 476 | ||
438 | /* ----------------------------------------------------------- */ | 477 | /* ----------------------------------------------------------- */ |