|
@@ -81,7 +81,6 @@ MODULE_DESCRIPTION(DRIVER_DESC " - v4l2 interface");
|
|
|
MODULE_LICENSE("GPL");
|
|
|
MODULE_VERSION(EM28XX_VERSION);
|
|
|
|
|
|
-
|
|
|
#define EM25XX_FRMDATAHDR_BYTE1 0x02
|
|
|
#define EM25XX_FRMDATAHDR_BYTE2_STILL_IMAGE 0x20
|
|
|
#define EM25XX_FRMDATAHDR_BYTE2_FRAME_END 0x02
|
|
@@ -90,7 +89,6 @@ MODULE_VERSION(EM28XX_VERSION);
|
|
|
EM25XX_FRMDATAHDR_BYTE2_FRAME_END | \
|
|
|
EM25XX_FRMDATAHDR_BYTE2_FRAME_ID)
|
|
|
|
|
|
-
|
|
|
static unsigned int video_nr[] = {[0 ... (EM28XX_MAXBOARDS - 1)] = -1U };
|
|
|
static unsigned int vbi_nr[] = {[0 ... (EM28XX_MAXBOARDS - 1)] = -1U };
|
|
|
static unsigned int radio_nr[] = {[0 ... (EM28XX_MAXBOARDS - 1)] = -1U };
|
|
@@ -194,9 +192,10 @@ static int em28xx_vbi_supported(struct em28xx *dev)
|
|
|
static void em28xx_wake_i2c(struct em28xx *dev)
|
|
|
{
|
|
|
struct v4l2_device *v4l2_dev = &dev->v4l2->v4l2_dev;
|
|
|
+
|
|
|
v4l2_device_call_all(v4l2_dev, 0, core, reset, 0);
|
|
|
v4l2_device_call_all(v4l2_dev, 0, video, s_routing,
|
|
|
- INPUT(dev->ctl_input)->vmux, 0, 0);
|
|
|
+ INPUT(dev->ctl_input)->vmux, 0, 0);
|
|
|
v4l2_device_call_all(v4l2_dev, 0, video, s_stream, 0);
|
|
|
}
|
|
|
|
|
@@ -275,7 +274,7 @@ static int em28xx_accumulator_set(struct em28xx *dev, u8 xmin, u8 xmax,
|
|
|
}
|
|
|
|
|
|
static void em28xx_capture_area_set(struct em28xx *dev, u8 hstart, u8 vstart,
|
|
|
- u16 width, u16 height)
|
|
|
+ u16 width, u16 height)
|
|
|
{
|
|
|
u8 cwidth = width >> 2;
|
|
|
u8 cheight = height >> 2;
|
|
@@ -283,7 +282,7 @@ static void em28xx_capture_area_set(struct em28xx *dev, u8 hstart, u8 vstart,
|
|
|
/* NOTE: size limit: 2047x1023 = 2MPix */
|
|
|
|
|
|
em28xx_videodbg("capture area set to (%d,%d): %dx%d\n",
|
|
|
- hstart, vstart,
|
|
|
+ hstart, vstart,
|
|
|
((overflow & 2) << 9 | cwidth << 2),
|
|
|
((overflow & 1) << 10 | cheight << 2));
|
|
|
|
|
@@ -406,13 +405,13 @@ set_alt:
|
|
|
dev->packet_multiplier = EM28XX_BULK_PACKET_MULTIPLIER;
|
|
|
} else { /* isoc */
|
|
|
em28xx_videodbg("minimum isoc packet size: %u (alt=%d)\n",
|
|
|
- min_pkt_size, dev->alt);
|
|
|
+ min_pkt_size, dev->alt);
|
|
|
dev->max_pkt_size =
|
|
|
dev->alt_max_pkt_size_isoc[dev->alt];
|
|
|
dev->packet_multiplier = EM28XX_NUM_ISOC_PACKETS;
|
|
|
}
|
|
|
em28xx_videodbg("setting alternate %d with wMaxPacketSize=%u\n",
|
|
|
- dev->alt, dev->max_pkt_size);
|
|
|
+ dev->alt, dev->max_pkt_size);
|
|
|
errCode = usb_set_interface(dev->udev, dev->ifnum, dev->alt);
|
|
|
if (errCode < 0) {
|
|
|
em28xx_errdev("cannot change alternate number to %d (error=%i)\n",
|
|
@@ -482,7 +481,7 @@ static void em28xx_copy_video(struct em28xx *dev,
|
|
|
|
|
|
if ((char *)startwrite + lencopy > (char *)buf->vb_buf + buf->length) {
|
|
|
em28xx_isocdbg("Overflow of %zu bytes past buffer end (1)\n",
|
|
|
- ((char *)startwrite + lencopy) -
|
|
|
+ ((char *)startwrite + lencopy) -
|
|
|
((char *)buf->vb_buf + buf->length));
|
|
|
remain = (char *)buf->vb_buf + buf->length -
|
|
|
(char *)startwrite;
|
|
@@ -548,7 +547,7 @@ static void em28xx_copy_vbi(struct em28xx *dev,
|
|
|
}
|
|
|
|
|
|
static inline void print_err_status(struct em28xx *dev,
|
|
|
- int packet, int status)
|
|
|
+ int packet, int status)
|
|
|
{
|
|
|
char *errmsg = "Unknown";
|
|
|
|
|
@@ -831,7 +830,6 @@ static inline int em28xx_urb_data_copy(struct em28xx *dev, struct urb *urb)
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
static int get_ressource(enum v4l2_buf_type f_type)
|
|
|
{
|
|
|
switch (f_type) {
|
|
@@ -1003,6 +1001,7 @@ static void em28xx_stop_streaming(struct vb2_queue *vq)
|
|
|
}
|
|
|
while (!list_empty(&vidq->active)) {
|
|
|
struct em28xx_buffer *buf;
|
|
|
+
|
|
|
buf = list_entry(vidq->active.next, struct em28xx_buffer, list);
|
|
|
list_del(&buf->list);
|
|
|
vb2_buffer_done(&buf->vb, VB2_BUF_STATE_ERROR);
|
|
@@ -1033,6 +1032,7 @@ void em28xx_stop_vbi_streaming(struct vb2_queue *vq)
|
|
|
}
|
|
|
while (!list_empty(&vbiq->active)) {
|
|
|
struct em28xx_buffer *buf;
|
|
|
+
|
|
|
buf = list_entry(vbiq->active.next, struct em28xx_buffer, list);
|
|
|
list_del(&buf->list);
|
|
|
vb2_buffer_done(&buf->vb, VB2_BUF_STATE_ERROR);
|
|
@@ -1109,6 +1109,7 @@ static int em28xx_vb2_setup(struct em28xx *dev)
|
|
|
static void video_mux(struct em28xx *dev, int index)
|
|
|
{
|
|
|
struct v4l2_device *v4l2_dev = &dev->v4l2->v4l2_dev;
|
|
|
+
|
|
|
dev->ctl_input = index;
|
|
|
dev->ctl_ainput = INPUT(index)->amux;
|
|
|
dev->ctl_aoutput = INPUT(index)->aout;
|
|
@@ -1117,21 +1118,22 @@ static void video_mux(struct em28xx *dev, int index)
|
|
|
dev->ctl_aoutput = EM28XX_AOUT_MASTER;
|
|
|
|
|
|
v4l2_device_call_all(v4l2_dev, 0, video, s_routing,
|
|
|
- INPUT(index)->vmux, 0, 0);
|
|
|
+ INPUT(index)->vmux, 0, 0);
|
|
|
|
|
|
if (dev->board.has_msp34xx) {
|
|
|
if (dev->i2s_speed) {
|
|
|
v4l2_device_call_all(v4l2_dev, 0, audio,
|
|
|
- s_i2s_clock_freq, dev->i2s_speed);
|
|
|
+ s_i2s_clock_freq, dev->i2s_speed);
|
|
|
}
|
|
|
/* Note: this is msp3400 specific */
|
|
|
v4l2_device_call_all(v4l2_dev, 0, audio, s_routing,
|
|
|
- dev->ctl_ainput, MSP_OUTPUT(MSP_SC_IN_DSP_SCART1), 0);
|
|
|
+ dev->ctl_ainput,
|
|
|
+ MSP_OUTPUT(MSP_SC_IN_DSP_SCART1), 0);
|
|
|
}
|
|
|
|
|
|
if (dev->board.adecoder != EM28XX_NOADECODER) {
|
|
|
v4l2_device_call_all(v4l2_dev, 0, audio, s_routing,
|
|
|
- dev->ctl_ainput, dev->ctl_aoutput, 0);
|
|
|
+ dev->ctl_ainput, dev->ctl_aoutput, 0);
|
|
|
}
|
|
|
|
|
|
em28xx_audio_analog_set(dev);
|
|
@@ -1203,7 +1205,7 @@ static const struct v4l2_ctrl_ops em28xx_ctrl_ops = {
|
|
|
};
|
|
|
|
|
|
static void size_to_scale(struct em28xx *dev,
|
|
|
- unsigned int width, unsigned int height,
|
|
|
+ unsigned int width, unsigned int height,
|
|
|
unsigned int *hscale, unsigned int *vscale)
|
|
|
{
|
|
|
unsigned int maxw = norm_maxw(dev);
|
|
@@ -1234,7 +1236,7 @@ static void scale_to_size(struct em28xx *dev,
|
|
|
------------------------------------------------------------------*/
|
|
|
|
|
|
static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
|
|
|
- struct v4l2_format *f)
|
|
|
+ struct v4l2_format *f)
|
|
|
{
|
|
|
struct em28xx *dev = video_drvdata(file);
|
|
|
struct em28xx_v4l2 *v4l2 = dev->v4l2;
|
|
@@ -1267,7 +1269,7 @@ static struct em28xx_fmt *format_by_fourcc(unsigned int fourcc)
|
|
|
}
|
|
|
|
|
|
static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
|
|
|
- struct v4l2_format *f)
|
|
|
+ struct v4l2_format *f)
|
|
|
{
|
|
|
struct em28xx *dev = video_drvdata(file);
|
|
|
struct em28xx_v4l2 *v4l2 = dev->v4l2;
|
|
@@ -1338,7 +1340,7 @@ static int em28xx_set_video_format(struct em28xx *dev, unsigned int fourcc,
|
|
|
|
|
|
/* set new image size */
|
|
|
size_to_scale(dev, v4l2->width, v4l2->height,
|
|
|
- &v4l2->hscale, &v4l2->vscale);
|
|
|
+ &v4l2->hscale, &v4l2->vscale);
|
|
|
|
|
|
em28xx_resolution_set(dev);
|
|
|
|
|
@@ -1346,7 +1348,7 @@ static int em28xx_set_video_format(struct em28xx *dev, unsigned int fourcc,
|
|
|
}
|
|
|
|
|
|
static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
|
|
|
- struct v4l2_format *f)
|
|
|
+ struct v4l2_format *f)
|
|
|
{
|
|
|
struct em28xx *dev = video_drvdata(file);
|
|
|
struct em28xx_v4l2 *v4l2 = dev->v4l2;
|
|
@@ -1401,7 +1403,7 @@ static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id norm)
|
|
|
v4l2->width = f.fmt.pix.width;
|
|
|
v4l2->height = f.fmt.pix.height;
|
|
|
size_to_scale(dev, v4l2->width, v4l2->height,
|
|
|
- &v4l2->hscale, &v4l2->vscale);
|
|
|
+ &v4l2->hscale, &v4l2->vscale);
|
|
|
|
|
|
em28xx_resolution_set(dev);
|
|
|
v4l2_device_call_all(&v4l2->v4l2_dev, 0, video, s_std, v4l2->norm);
|
|
@@ -1422,7 +1424,7 @@ static int vidioc_g_parm(struct file *file, void *priv,
|
|
|
video, g_parm, p);
|
|
|
else
|
|
|
v4l2_video_std_frame_period(v4l2->norm,
|
|
|
- &p->parm.capture.timeperframe);
|
|
|
+ &p->parm.capture.timeperframe);
|
|
|
|
|
|
return rc;
|
|
|
}
|
|
@@ -1450,7 +1452,7 @@ static const char *iname[] = {
|
|
|
};
|
|
|
|
|
|
static int vidioc_enum_input(struct file *file, void *priv,
|
|
|
- struct v4l2_input *i)
|
|
|
+ struct v4l2_input *i)
|
|
|
{
|
|
|
struct em28xx *dev = video_drvdata(file);
|
|
|
unsigned int n;
|
|
@@ -1467,7 +1469,7 @@ static int vidioc_enum_input(struct file *file, void *priv,
|
|
|
strcpy(i->name, iname[INPUT(n)->type]);
|
|
|
|
|
|
if ((EM28XX_VMUX_TELEVISION == INPUT(n)->type) ||
|
|
|
- (EM28XX_VMUX_CABLE == INPUT(n)->type))
|
|
|
+ (EM28XX_VMUX_CABLE == INPUT(n)->type))
|
|
|
i->type = V4L2_INPUT_TYPE_TUNER;
|
|
|
|
|
|
i->std = dev->v4l2->vdev->tvnorms;
|
|
@@ -1558,7 +1560,7 @@ static int vidioc_s_audio(struct file *file, void *priv, const struct v4l2_audio
|
|
|
}
|
|
|
|
|
|
static int vidioc_g_tuner(struct file *file, void *priv,
|
|
|
- struct v4l2_tuner *t)
|
|
|
+ struct v4l2_tuner *t)
|
|
|
{
|
|
|
struct em28xx *dev = video_drvdata(file);
|
|
|
|
|
@@ -1572,7 +1574,7 @@ static int vidioc_g_tuner(struct file *file, void *priv,
|
|
|
}
|
|
|
|
|
|
static int vidioc_s_tuner(struct file *file, void *priv,
|
|
|
- const struct v4l2_tuner *t)
|
|
|
+ const struct v4l2_tuner *t)
|
|
|
{
|
|
|
struct em28xx *dev = video_drvdata(file);
|
|
|
|
|
@@ -1584,7 +1586,7 @@ static int vidioc_s_tuner(struct file *file, void *priv,
|
|
|
}
|
|
|
|
|
|
static int vidioc_g_frequency(struct file *file, void *priv,
|
|
|
- struct v4l2_frequency *f)
|
|
|
+ struct v4l2_frequency *f)
|
|
|
{
|
|
|
struct em28xx *dev = video_drvdata(file);
|
|
|
struct em28xx_v4l2 *v4l2 = dev->v4l2;
|
|
@@ -1597,7 +1599,7 @@ static int vidioc_g_frequency(struct file *file, void *priv,
|
|
|
}
|
|
|
|
|
|
static int vidioc_s_frequency(struct file *file, void *priv,
|
|
|
- const struct v4l2_frequency *f)
|
|
|
+ const struct v4l2_frequency *f)
|
|
|
{
|
|
|
struct v4l2_frequency new_freq = *f;
|
|
|
struct em28xx *dev = video_drvdata(file);
|
|
@@ -1615,7 +1617,7 @@ static int vidioc_s_frequency(struct file *file, void *priv,
|
|
|
|
|
|
#ifdef CONFIG_VIDEO_ADV_DEBUG
|
|
|
static int vidioc_g_chip_info(struct file *file, void *priv,
|
|
|
- struct v4l2_dbg_chip_info *chip)
|
|
|
+ struct v4l2_dbg_chip_info *chip)
|
|
|
{
|
|
|
struct em28xx *dev = video_drvdata(file);
|
|
|
|
|
@@ -1670,6 +1672,7 @@ static int vidioc_g_register(struct file *file, void *priv,
|
|
|
reg->val = ret;
|
|
|
} else {
|
|
|
__le16 val = 0;
|
|
|
+
|
|
|
ret = dev->em28xx_read_reg_req_len(dev, USB_REQ_GET_STATUS,
|
|
|
reg->reg, (char *)&val, 2);
|
|
|
if (ret < 0)
|
|
@@ -1700,9 +1703,8 @@ static int vidioc_s_register(struct file *file, void *priv,
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
-
|
|
|
static int vidioc_querycap(struct file *file, void *priv,
|
|
|
- struct v4l2_capability *cap)
|
|
|
+ struct v4l2_capability *cap)
|
|
|
{
|
|
|
struct video_device *vdev = video_devdata(file);
|
|
|
struct em28xx *dev = video_drvdata(file);
|
|
@@ -1736,7 +1738,7 @@ static int vidioc_querycap(struct file *file, void *priv,
|
|
|
}
|
|
|
|
|
|
static int vidioc_enum_fmt_vid_cap(struct file *file, void *priv,
|
|
|
- struct v4l2_fmtdesc *f)
|
|
|
+ struct v4l2_fmtdesc *f)
|
|
|
{
|
|
|
if (unlikely(f->index >= ARRAY_SIZE(format)))
|
|
|
return -EINVAL;
|
|
@@ -2177,9 +2179,10 @@ static unsigned short msp3400_addrs[] = {
|
|
|
|
|
|
/******************************** usb interface ******************************/
|
|
|
|
|
|
-static struct video_device *em28xx_vdev_init(struct em28xx *dev,
|
|
|
- const struct video_device *template,
|
|
|
- const char *type_name)
|
|
|
+static struct video_device
|
|
|
+*em28xx_vdev_init(struct em28xx *dev,
|
|
|
+ const struct video_device *template,
|
|
|
+ const char *type_name)
|
|
|
{
|
|
|
struct video_device *vfd;
|
|
|
|
|
@@ -2344,21 +2347,24 @@ static int em28xx_v4l2_init(struct em28xx *dev)
|
|
|
|
|
|
if (dev->board.radio.type)
|
|
|
v4l2_i2c_new_subdev(&v4l2->v4l2_dev,
|
|
|
- &dev->i2c_adap[dev->def_i2c_bus],
|
|
|
- "tuner", dev->board.radio_addr, NULL);
|
|
|
+ &dev->i2c_adap[dev->def_i2c_bus],
|
|
|
+ "tuner", dev->board.radio_addr,
|
|
|
+ NULL);
|
|
|
|
|
|
if (has_demod)
|
|
|
v4l2_i2c_new_subdev(&v4l2->v4l2_dev,
|
|
|
- &dev->i2c_adap[dev->def_i2c_bus], "tuner",
|
|
|
- 0, v4l2_i2c_tuner_addrs(ADDRS_DEMOD));
|
|
|
+ &dev->i2c_adap[dev->def_i2c_bus],
|
|
|
+ "tuner", 0,
|
|
|
+ v4l2_i2c_tuner_addrs(ADDRS_DEMOD));
|
|
|
if (tuner_addr == 0) {
|
|
|
enum v4l2_i2c_tuner_type type =
|
|
|
has_demod ? ADDRS_TV_WITH_DEMOD : ADDRS_TV;
|
|
|
struct v4l2_subdev *sd;
|
|
|
|
|
|
sd = v4l2_i2c_new_subdev(&v4l2->v4l2_dev,
|
|
|
- &dev->i2c_adap[dev->def_i2c_bus], "tuner",
|
|
|
- 0, v4l2_i2c_tuner_addrs(type));
|
|
|
+ &dev->i2c_adap[dev->def_i2c_bus],
|
|
|
+ "tuner", 0,
|
|
|
+ v4l2_i2c_tuner_addrs(type));
|
|
|
|
|
|
if (sd)
|
|
|
tuner_addr = v4l2_i2c_subdev_addr(sd);
|
|
@@ -2378,20 +2384,20 @@ static int em28xx_v4l2_init(struct em28xx *dev)
|
|
|
ret = em28xx_audio_setup(dev);
|
|
|
if (ret < 0) {
|
|
|
em28xx_errdev("%s: Error while setting audio - error [%d]!\n",
|
|
|
- __func__, ret);
|
|
|
+ __func__, ret);
|
|
|
goto unregister_dev;
|
|
|
}
|
|
|
if (dev->audio_mode.ac97 != EM28XX_NO_AC97) {
|
|
|
v4l2_ctrl_new_std(hdl, &em28xx_ctrl_ops,
|
|
|
- V4L2_CID_AUDIO_MUTE, 0, 1, 1, 1);
|
|
|
+ V4L2_CID_AUDIO_MUTE, 0, 1, 1, 1);
|
|
|
v4l2_ctrl_new_std(hdl, &em28xx_ctrl_ops,
|
|
|
- V4L2_CID_AUDIO_VOLUME, 0, 0x1f, 1, 0x1f);
|
|
|
+ V4L2_CID_AUDIO_VOLUME, 0, 0x1f, 1, 0x1f);
|
|
|
} else {
|
|
|
/* install the em28xx notify callback */
|
|
|
v4l2_ctrl_notify(v4l2_ctrl_find(hdl, V4L2_CID_AUDIO_MUTE),
|
|
|
- em28xx_ctrl_notify, dev);
|
|
|
+ em28xx_ctrl_notify, dev);
|
|
|
v4l2_ctrl_notify(v4l2_ctrl_find(hdl, V4L2_CID_AUDIO_VOLUME),
|
|
|
- em28xx_ctrl_notify, dev);
|
|
|
+ em28xx_ctrl_notify, dev);
|
|
|
}
|
|
|
|
|
|
/* wake i2c devices */
|
|
@@ -2518,7 +2524,7 @@ static int em28xx_v4l2_init(struct em28xx *dev)
|
|
|
|
|
|
/* register v4l2 video video_device */
|
|
|
ret = video_register_device(v4l2->vdev, VFL_TYPE_GRABBER,
|
|
|
- video_nr[dev->devno]);
|
|
|
+ video_nr[dev->devno]);
|
|
|
if (ret) {
|
|
|
em28xx_errdev("unable to register video device (error=%i).\n",
|
|
|
ret);
|