|
@@ -299,11 +299,7 @@ static int cx23885_set_tvnorm(struct cx23885_dev *dev, v4l2_std_id norm)
|
|
|
|
|
|
dev->tvnorm = norm;
|
|
|
|
|
|
- /* Tell the analog tuner/demods */
|
|
|
- cx23885_call_i2c_clients(&dev->i2c_bus[1], VIDIOC_S_STD, &norm);
|
|
|
-
|
|
|
- /* Tell the internal A/V decoder */
|
|
|
- cx23885_call_i2c_clients(&dev->i2c_bus[2], VIDIOC_S_STD, &norm);
|
|
|
+ call_all(dev, tuner, s_std, norm);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -410,8 +406,7 @@ static int cx23885_video_mux(struct cx23885_dev *dev, unsigned int input)
|
|
|
route.input = INPUT(input)->vmux;
|
|
|
|
|
|
/* Tell the internal A/V decoder */
|
|
|
- cx23885_call_i2c_clients(&dev->i2c_bus[2],
|
|
|
- VIDIOC_INT_S_VIDEO_ROUTING, &route);
|
|
|
+ v4l2_subdev_call(dev->sd_cx25840, video, s_routing, &route);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -887,7 +882,7 @@ static int cx23885_get_control(struct cx23885_dev *dev,
|
|
|
struct v4l2_control *ctl)
|
|
|
{
|
|
|
dprintk(1, "%s() calling cx25840(VIDIOC_G_CTRL)\n", __func__);
|
|
|
- cx23885_call_i2c_clients(&dev->i2c_bus[2], VIDIOC_G_CTRL, ctl);
|
|
|
+ call_all(dev, core, g_ctrl, ctl);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -1001,7 +996,7 @@ static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
|
|
|
fh->vidq.field = f->fmt.pix.field;
|
|
|
dprintk(2, "%s() width=%d height=%d field=%d\n", __func__,
|
|
|
fh->width, fh->height, fh->vidq.field);
|
|
|
- cx23885_call_i2c_clients(&dev->i2c_bus[2], VIDIOC_S_FMT, f);
|
|
|
+ call_all(dev, video, s_fmt, f);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -1281,7 +1276,7 @@ static int vidioc_g_frequency(struct file *file, void *priv,
|
|
|
f->type = fh->radio ? V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV;
|
|
|
f->frequency = dev->freq;
|
|
|
|
|
|
- cx23885_call_i2c_clients(&dev->i2c_bus[1], VIDIOC_G_FREQUENCY, f);
|
|
|
+ call_all(dev, tuner, g_frequency, f);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -1296,7 +1291,7 @@ static int cx23885_set_freq(struct cx23885_dev *dev, struct v4l2_frequency *f)
|
|
|
mutex_lock(&dev->lock);
|
|
|
dev->freq = f->frequency;
|
|
|
|
|
|
- cx23885_call_i2c_clients(&dev->i2c_bus[1], VIDIOC_S_FREQUENCY, f);
|
|
|
+ call_all(dev, tuner, s_frequency, f);
|
|
|
|
|
|
/* When changing channels it is required to reset TVAUDIO */
|
|
|
msleep(10);
|
|
@@ -1330,7 +1325,7 @@ static int vidioc_g_register(struct file *file, void *fh,
|
|
|
if (!v4l2_chip_match_host(®->match))
|
|
|
return -EINVAL;
|
|
|
|
|
|
- cx23885_call_i2c_clients(&dev->i2c_bus[2], VIDIOC_DBG_G_REGISTER, reg);
|
|
|
+ call_all(dev, core, g_register, reg);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -1343,7 +1338,7 @@ static int vidioc_s_register(struct file *file, void *fh,
|
|
|
if (!v4l2_chip_match_host(®->match))
|
|
|
return -EINVAL;
|
|
|
|
|
|
- cx23885_call_i2c_clients(&dev->i2c_bus[2], VIDIOC_DBG_S_REGISTER, reg);
|
|
|
+ call_all(dev, core, s_register, reg);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -1524,6 +1519,26 @@ int cx23885_video_register(struct cx23885_dev *dev)
|
|
|
/* Don't enable VBI yet */
|
|
|
cx_set(PCI_INT_MSK, 1);
|
|
|
|
|
|
+ if (TUNER_ABSENT != dev->tuner_type) {
|
|
|
+ struct v4l2_subdev *sd = NULL;
|
|
|
+
|
|
|
+ if (dev->tuner_addr)
|
|
|
+ sd = v4l2_i2c_new_subdev(&dev->i2c_bus[1].i2c_adap,
|
|
|
+ "tuner", "tuner", dev->tuner_addr);
|
|
|
+ else
|
|
|
+ sd = v4l2_i2c_new_probed_subdev(&dev->i2c_bus[1].i2c_adap,
|
|
|
+ "tuner", "tuner", v4l2_i2c_tuner_addrs(ADDRS_TV));
|
|
|
+ if (sd) {
|
|
|
+ struct tuner_setup tun_setup;
|
|
|
+
|
|
|
+ tun_setup.mode_mask = T_ANALOG_TV;
|
|
|
+ tun_setup.type = dev->tuner_type;
|
|
|
+ tun_setup.addr = v4l2_i2c_subdev_addr(sd);
|
|
|
+
|
|
|
+ v4l2_subdev_call(sd, tuner, s_type_addr, &tun_setup);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
/* register v4l devices */
|
|
|
dev->video_dev = cx23885_vdev_init(dev, dev->pci,
|