Commit fac6986c authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab
Browse files

V4L/DVB (10247): saa7134: convert to the new v4l2 framework.



Register v4l2_device and switch to v4l2_subdev to access the i2c modules.

Signed-off-by: default avatarHans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 5b73e98c
Loading
Loading
Loading
Loading
+1 −12
Original line number Diff line number Diff line
@@ -36,7 +36,7 @@
#include <media/v4l2-device.h>
#include <media/v4l2-common.h>
#include <media/v4l2-chip-ident.h>
#include <media/v4l2-i2c-drv-legacy.h>
#include <media/v4l2-i2c-drv.h>
#include <linux/init.h>
#include <linux/crc32.h>

@@ -45,10 +45,6 @@
#define MPEG_TOTAL_TARGET_BITRATE_MAX  27000
#define MPEG_PID_MAX ((1 << 14) - 1)

/* Addresses to scan */
static unsigned short normal_i2c[] = {0x20, I2C_CLIENT_END};

I2C_CLIENT_INSMOD;

MODULE_DESCRIPTION("device driver for saa6752hs MPEG2 encoder");
MODULE_AUTHOR("Andrew de Quincey");
@@ -914,11 +910,6 @@ static int saa6752hs_g_chip_ident(struct v4l2_subdev *sd, struct v4l2_dbg_chip_i
			chip, h->chip, h->revision);
}

static int saa6752hs_command(struct i2c_client *client, unsigned cmd, void *arg)
{
	return v4l2_subdev_command(i2c_get_clientdata(client), cmd, arg);
}

/* ----------------------------------------------------------------------- */

static const struct v4l2_subdev_core_ops saa6752hs_core_ops = {
@@ -993,8 +984,6 @@ MODULE_DEVICE_TABLE(i2c, saa6752hs_id);

static struct v4l2_i2c_driver_data v4l2_i2c_data = {
	.name = "saa6752hs",
	.driverid = I2C_DRIVERID_SAA6752HS,
	.command = saa6752hs_command,
	.probe = saa6752hs_probe,
	.remove = saa6752hs_remove,
	.id_table = saa6752hs_id,
+6 −7
Original line number Diff line number Diff line
@@ -4611,7 +4611,7 @@ struct saa7134_board saa7134_boards[] = {
		.tuner_type     = TUNER_YMEC_TVF_5533MF,
		.radio_type     = TUNER_TEA5767,
		.tuner_addr     = ADDR_UNSET,
		.radio_addr     = ADDR_UNSET,
		.radio_addr     = 0x60,
		.gpiomask       = 0x80000700,
		.inputs = { {
			.name   = name_tv,
@@ -6109,7 +6109,7 @@ static void saa7134_tuner_setup(struct saa7134_dev *dev)

		tun_setup.mode_mask = T_RADIO;

		saa7134_i2c_call_clients(dev, TUNER_SET_TYPE_ADDR, &tun_setup);
		saa_call_all(dev, tuner, s_type_addr, &tun_setup);
		mode_mask &= ~T_RADIO;
	}

@@ -6121,7 +6121,7 @@ static void saa7134_tuner_setup(struct saa7134_dev *dev)

		tun_setup.mode_mask = mode_mask;

		saa7134_i2c_call_clients(dev, TUNER_SET_TYPE_ADDR, &tun_setup);
		saa_call_all(dev, tuner, s_type_addr, &tun_setup);
	}

	if (dev->tda9887_conf) {
@@ -6130,8 +6130,7 @@ static void saa7134_tuner_setup(struct saa7134_dev *dev)
		tda9887_cfg.tuner = TUNER_TDA9887;
		tda9887_cfg.priv = &dev->tda9887_conf;

		saa7134_i2c_call_clients(dev, TUNER_SET_CONFIG,
					 &tda9887_cfg);
		saa_call_all(dev, tuner, s_config, &tda9887_cfg);
	}

	if (dev->tuner_type == TUNER_XC2028) {
@@ -6158,7 +6157,7 @@ static void saa7134_tuner_setup(struct saa7134_dev *dev)
		xc2028_cfg.tuner = TUNER_XC2028;
		xc2028_cfg.priv  = &ctl;

		saa7134_i2c_call_clients(dev, TUNER_SET_CONFIG, &xc2028_cfg);
		saa_call_all(dev, tuner, s_config, &xc2028_cfg);
	}
}

@@ -6401,7 +6400,7 @@ int saa7134_board_init2(struct saa7134_dev *dev)
		ctl.xtal_freq = TEA5767_HIGH_LO_13MHz;
		tea5767_cfg.tuner = TUNER_TEA5767;
		tea5767_cfg.priv  = &ctl;
		saa7134_i2c_call_clients(dev, TUNER_SET_CONFIG, &tea5767_cfg);
		saa_call_all(dev, tuner, s_config, &tea5767_cfg);
		break;
	}
	} /* switch() */
+55 −11
Original line number Diff line number Diff line
@@ -851,6 +851,10 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
	if (NULL == dev)
		return -ENOMEM;

	err = v4l2_device_register(&pci_dev->dev, &dev->v4l2_dev);
	if (err)
		goto fail0;

	/* pci init */
	dev->pci = pci_dev;
	if (pci_enable_device(pci_dev)) {
@@ -927,6 +931,8 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
	dev->autodetected = card[dev->nr] != dev->board;
	dev->tuner_type = saa7134_boards[dev->board].tuner_type;
	dev->tuner_addr = saa7134_boards[dev->board].tuner_addr;
	dev->radio_type = saa7134_boards[dev->board].radio_type;
	dev->radio_addr = saa7134_boards[dev->board].radio_addr;
	dev->tda9887_conf = saa7134_boards[dev->board].tda9887_conf;
	if (UNSET != tuner[dev->nr])
		dev->tuner_type = tuner[dev->nr];
@@ -973,15 +979,50 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
	saa7134_i2c_register(dev);

	/* initialize hardware #2 */
	if (TUNER_ABSENT != dev->tuner_type)
		request_module("tuner");
	if (TUNER_ABSENT != dev->tuner_type) {
		if (dev->radio_type != UNSET) {
			v4l2_i2c_new_subdev(&dev->i2c_adap, "tuner", "tuner",
					dev->radio_addr);
		}
		if (dev->tda9887_conf & TDA9887_PRESENT) {
			unsigned short addrs[] = { 0x42, 0x43, 0x4a, 0x4b,
						   I2C_CLIENT_END };

			v4l2_i2c_new_probed_subdev(&dev->i2c_adap,
					"tuner", "tuner", addrs);
		}
		if (dev->tuner_addr != ADDR_UNSET) {
			v4l2_i2c_new_subdev(&dev->i2c_adap,
					"tuner", "tuner", dev->tuner_addr);
		} else {
			unsigned short addrs[] = {
				0x42, 0x43, 0x4a, 0x4b,		/* tda8290 */
				0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
				0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
				I2C_CLIENT_END
			};

			if (dev->tda9887_conf & TDA9887_PRESENT) {
				v4l2_i2c_new_probed_subdev(&dev->i2c_adap,
						"tuner", "tuner", addrs + 4);
			} else {
				v4l2_i2c_new_probed_subdev(&dev->i2c_adap,
						"tuner", "tuner", addrs);
			}
		}
	}
	saa7134_board_init2(dev);

	saa7134_hwinit2(dev);

	/* load i2c helpers */
	if (card_is_empress(dev)) {
		request_module("saa6752hs");
		struct v4l2_subdev *sd =
			v4l2_i2c_new_subdev(&dev->i2c_adap, "saa6752hs",
				"saa6752hs", 0x20);

		if (sd)
			sd->grp_id = GRP_EMPRESS;
	}

	request_submodules(dev);
@@ -1023,7 +1064,6 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
	}

	/* everything worked */
	pci_set_drvdata(pci_dev,dev);
	saa7134_devcount++;

	mutex_lock(&devlist_lock);
@@ -1040,7 +1080,7 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
	}

	if (TUNER_ABSENT != dev->tuner_type)
		saa7134_i2c_call_clients(dev, TUNER_SET_STANDBY, NULL);
		saa_call_all(dev, core, s_standby, 0);

	return 0;

@@ -1055,13 +1095,16 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
	release_mem_region(pci_resource_start(pci_dev,0),
			   pci_resource_len(pci_dev,0));
 fail1:
	v4l2_device_unregister(&dev->v4l2_dev);
 fail0:
	kfree(dev);
	return err;
}

static void __devexit saa7134_finidev(struct pci_dev *pci_dev)
{
	struct saa7134_dev *dev = pci_get_drvdata(pci_dev);
	struct v4l2_device *v4l2_dev = pci_get_drvdata(pci_dev);
	struct saa7134_dev *dev = container_of(v4l2_dev, struct saa7134_dev, v4l2_dev);
	struct saa7134_mpeg_ops *mops;

	/* Release DMA sound modules if present */
@@ -1113,7 +1156,8 @@ static void __devexit saa7134_finidev(struct pci_dev *pci_dev)
	release_mem_region(pci_resource_start(pci_dev,0),
			   pci_resource_len(pci_dev,0));

	pci_set_drvdata(pci_dev, NULL);

	v4l2_device_unregister(&dev->v4l2_dev);

	/* free memory */
	kfree(dev);
@@ -1148,8 +1192,8 @@ static int saa7134_buffer_requeue(struct saa7134_dev *dev,

static int saa7134_suspend(struct pci_dev *pci_dev , pm_message_t state)
{

	struct saa7134_dev *dev = pci_get_drvdata(pci_dev);
	struct v4l2_device *v4l2_dev = pci_get_drvdata(pci_dev);
	struct saa7134_dev *dev = container_of(v4l2_dev, struct saa7134_dev, v4l2_dev);

	/* disable overlay - apps should enable it explicitly on resume*/
	dev->ovenable = 0;
@@ -1185,7 +1229,8 @@ static int saa7134_suspend(struct pci_dev *pci_dev , pm_message_t state)

static int saa7134_resume(struct pci_dev *pci_dev)
{
	struct saa7134_dev *dev = pci_get_drvdata(pci_dev);
	struct v4l2_device *v4l2_dev = pci_get_drvdata(pci_dev);
	struct saa7134_dev *dev = container_of(v4l2_dev, struct saa7134_dev, v4l2_dev);
	unsigned long flags;

	pci_set_power_state(pci_dev, PCI_D0);
@@ -1307,7 +1352,6 @@ module_exit(saa7134_fini);
/* ----------------------------------------------------------- */

EXPORT_SYMBOL(saa7134_set_gpio);
EXPORT_SYMBOL(saa7134_i2c_call_clients);
EXPORT_SYMBOL(saa7134_devlist);
EXPORT_SYMBOL(saa7134_boards);

+2 −2
Original line number Diff line number Diff line
@@ -189,7 +189,7 @@ static int mt352_pinnacle_tuner_set_params(struct dvb_frontend* fe,
	if (fe->ops.i2c_gate_ctrl)
		fe->ops.i2c_gate_ctrl(fe, 1);
	i2c_transfer(&dev->i2c_adap, &msg, 1);
	saa7134_i2c_call_clients(dev,VIDIOC_S_FREQUENCY,&f);
	saa_call_all(dev, tuner, s_frequency, &f);
	msg.buf = on;
	if (fe->ops.i2c_gate_ctrl)
		fe->ops.i2c_gate_ctrl(fe, 1);
@@ -1449,7 +1449,7 @@ static int dvb_fini(struct saa7134_dev *dev)
		tda9887_cfg.priv  = &on;

		/* otherwise we don't detect the tuner on next insmod */
		saa7134_i2c_call_clients(dev, TUNER_SET_CONFIG, &tda9887_cfg);
		saa_call_all(dev, tuner, s_config, &tda9887_cfg);
	} else if (dev->board == SAA7134_BOARD_MEDION_MD8800_QUADRO) {
		if ((dev->eedata[2] == 0x07) && use_frontend) {
			/* turn off the 2nd lnb supply */
+10 −12
Original line number Diff line number Diff line
@@ -76,7 +76,7 @@ static int ts_init_encoder(struct saa7134_dev* dev)
		break;
	}
	ts_reset_encoder(dev);
	saa7134_i2c_call_clients(dev, VIDIOC_INT_INIT, &leading_null_bytes);
	saa_call_all(dev, core, init, leading_null_bytes);
	dev->empress_started = 1;
	return 0;
}
@@ -234,7 +234,7 @@ static int empress_g_fmt_vid_cap(struct file *file, void *priv,
{
	struct saa7134_dev *dev = file->private_data;

	saa7134_i2c_call_clients(dev, VIDIOC_G_FMT, f);
	saa_call_all(dev, video, g_fmt, f);

	f->fmt.pix.pixelformat  = V4L2_PIX_FMT_MPEG;
	f->fmt.pix.sizeimage    = TS_PACKET_SIZE * dev->ts.nr_packets;
@@ -247,7 +247,7 @@ static int empress_s_fmt_vid_cap(struct file *file, void *priv,
{
	struct saa7134_dev *dev = file->private_data;

	saa7134_i2c_call_clients(dev, VIDIOC_S_FMT, f);
	saa_call_all(dev, video, s_fmt, f);

	f->fmt.pix.pixelformat  = V4L2_PIX_FMT_MPEG;
	f->fmt.pix.sizeimage    = TS_PACKET_SIZE * dev->ts.nr_packets;
@@ -317,7 +317,7 @@ static int empress_s_ext_ctrls(struct file *file, void *priv,
	if (ctrls->ctrl_class != V4L2_CTRL_CLASS_MPEG)
		return -EINVAL;

	err = saa7134_i2c_call_saa6752(dev, VIDIOC_S_EXT_CTRLS, ctrls);
	err = saa_call_empress(dev, core, s_ext_ctrls, ctrls);
	ts_init_encoder(dev);

	return err;
@@ -330,7 +330,7 @@ static int empress_g_ext_ctrls(struct file *file, void *priv,

	if (ctrls->ctrl_class != V4L2_CTRL_CLASS_MPEG)
		return -EINVAL;
	return saa7134_i2c_call_saa6752(dev, VIDIOC_G_EXT_CTRLS, ctrls);
	return saa_call_empress(dev, core, g_ext_ctrls, ctrls);
}

static int empress_g_ctrl(struct file *file, void *priv,
@@ -391,7 +391,7 @@ static int empress_queryctrl(struct file *file, void *priv,
		return v4l2_ctrl_query_fill_std(c);
	if (V4L2_CTRL_ID2CLASS(c->id) != V4L2_CTRL_CLASS_MPEG)
		return saa7134_queryctrl(file, priv, c);
	return saa7134_i2c_call_saa6752(dev, VIDIOC_QUERYCTRL, c);
	return saa_call_empress(dev, core, queryctrl, c);
}

static int empress_querymenu(struct file *file, void *priv,
@@ -401,7 +401,7 @@ static int empress_querymenu(struct file *file, void *priv,

	if (V4L2_CTRL_ID2CLASS(c->id) != V4L2_CTRL_CLASS_MPEG)
		return -EINVAL;
	return saa7134_i2c_call_saa6752(dev, VIDIOC_QUERYMENU, c);
	return saa_call_empress(dev, core, querymenu, c);
}

static int empress_g_chip_ident(struct file *file, void *fh,
@@ -411,14 +411,12 @@ static int empress_g_chip_ident(struct file *file, void *fh,

	chip->ident = V4L2_IDENT_NONE;
	chip->revision = 0;
	if (dev->mpeg_i2c_client == NULL)
		return -EINVAL;
	if (chip->match.type == V4L2_CHIP_MATCH_I2C_DRIVER &&
	    !strcmp(chip->match.name, "saa6752hs"))
		return saa7134_i2c_call_saa6752(dev, VIDIOC_DBG_G_CHIP_IDENT, chip);
		return saa_call_empress(dev, core, g_chip_ident, chip);
	if (chip->match.type == V4L2_CHIP_MATCH_I2C_ADDR &&
	    chip->match.addr == dev->mpeg_i2c_client->addr)
		return saa7134_i2c_call_saa6752(dev, VIDIOC_DBG_G_CHIP_IDENT, chip);
	    chip->match.addr == 0x20)
		return saa_call_empress(dev, core, g_chip_ident, chip);
	return -EINVAL;
}

Loading