Skip to content

Commit

Permalink
V4L/DVB (10247): saa7134: convert to the new v4l2 framework.
Browse files Browse the repository at this point in the history
Register v4l2_device and switch to v4l2_subdev to access the i2c modules.

Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
  • Loading branch information
Hans Verkuil authored and Mauro Carvalho Chehab committed Mar 30, 2009
1 parent 5b73e98 commit fac6986
Show file tree
Hide file tree
Showing 8 changed files with 91 additions and 78 deletions.
13 changes: 1 addition & 12 deletions drivers/media/video/saa7134/saa6752hs.c
Original file line number Diff line number Diff line change
Expand Up @@ -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>

Expand All @@ -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");
Expand Down Expand Up @@ -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 = {
Expand Down Expand Up @@ -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,
Expand Down
13 changes: 6 additions & 7 deletions drivers/media/video/saa7134/saa7134-cards.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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;
}

Expand All @@ -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) {
Expand All @@ -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) {
Expand All @@ -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);
}
}

Expand Down Expand Up @@ -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() */
Expand Down
66 changes: 55 additions & 11 deletions drivers/media/video/saa7134/saa7134-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)) {
Expand Down Expand Up @@ -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];
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand All @@ -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;

Expand All @@ -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 */
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);

Expand Down
4 changes: 2 additions & 2 deletions drivers/media/video/saa7134/saa7134-dvb.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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 */
Expand Down
22 changes: 10 additions & 12 deletions drivers/media/video/saa7134/saa7134-empress.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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,
Expand Down Expand Up @@ -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,
Expand All @@ -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,
Expand All @@ -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;
}

Expand Down
21 changes: 1 addition & 20 deletions drivers/media/video/saa7134/saa7134-i2c.c
Original file line number Diff line number Diff line change
Expand Up @@ -327,8 +327,6 @@ static int attach_inform(struct i2c_client *client)

d1printk( "%s i2c attach [addr=0x%x,client=%s]\n",
client->driver->driver.name, client->addr, client->name);
if (client->addr == 0x20 && client->driver && client->driver->command)
dev->mpeg_i2c_client = client;

/* Am I an i2c remote control? */

Expand Down Expand Up @@ -357,7 +355,6 @@ static struct i2c_algorithm saa7134_algo = {

static struct i2c_adapter saa7134_adap_template = {
.owner = THIS_MODULE,
.class = I2C_CLASS_TV_ANALOG,
.name = "saa7134",
.id = I2C_HW_SAA7134,
.algo = &saa7134_algo,
Expand Down Expand Up @@ -421,29 +418,13 @@ static void do_i2c_scan(char *name, struct i2c_client *c)
}
}

void saa7134_i2c_call_clients(struct saa7134_dev *dev,
unsigned int cmd, void *arg)
{
BUG_ON(NULL == dev->i2c_adap.algo_data);
i2c_clients_command(&dev->i2c_adap, cmd, arg);
}

int saa7134_i2c_call_saa6752(struct saa7134_dev *dev,
unsigned int cmd, void *arg)
{
if (dev->mpeg_i2c_client == NULL)
return -EINVAL;
return dev->mpeg_i2c_client->driver->command(dev->mpeg_i2c_client,
cmd, arg);
}
EXPORT_SYMBOL_GPL(saa7134_i2c_call_saa6752);

int saa7134_i2c_register(struct saa7134_dev *dev)
{
dev->i2c_adap = saa7134_adap_template;
dev->i2c_adap.dev.parent = &dev->pci->dev;
strcpy(dev->i2c_adap.name,dev->name);
dev->i2c_adap.algo_data = dev;
i2c_set_adapdata(&dev->i2c_adap, &dev->v4l2_dev);
i2c_add_adapter(&dev->i2c_adap);

dev->i2c_client = saa7134_client_template;
Expand Down
Loading

0 comments on commit fac6986

Please sign in to comment.