Commit d09dbf92 authored by Andrew de Quincey's avatar Andrew de Quincey Committed by Mauro Carvalho Chehab

V4L/DVB (3762): Add sysfs device links to dvb devices

Currently in /sys/class/dvb/dvbX.demuxY/ we have:
	dev
	uevent
With the patch, we have (for a PCI DVB device):
	dev
	device -> ../../../devices/pci0000:00/0000:00:1e.0/0000:03:0d.0
	uevent
So userspace tools can (finally) work out which physical device a DVB adapter
refers to. Previously you had to kinda look through dmesg and hope that it
hadn't been dumped out of the buffer. This makes debugging a lot easier if
the system has been up for a long time!
This is done by adding an extra 'struct device *' parameter to
dvb_register_adapter(). It will work with any kind of standard
linux 'device'. Additionally, if someone has an embedded system which does
things differently, they can simply supply 'NULL' and the behaviour will be
as before - the link will simply not appear.

Ack'd-by: Manu Abraham <manu@linuxtv.org>
Acked-by: default avatarMichael Krufky <mkrufky@linuxtv.org>
Signed-off-by: default avatarAndrew de Quincey <adq_dvb@lidskialf.net>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent 76d313bf
...@@ -67,7 +67,7 @@ static int flexcop_dvb_stop_feed(struct dvb_demux_feed *dvbdmxfeed) ...@@ -67,7 +67,7 @@ static int flexcop_dvb_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
static int flexcop_dvb_init(struct flexcop_device *fc) static int flexcop_dvb_init(struct flexcop_device *fc)
{ {
int ret; int ret;
if ((ret = dvb_register_adapter(&fc->dvb_adapter,"FlexCop Digital TV device",fc->owner)) < 0) { if ((ret = dvb_register_adapter(&fc->dvb_adapter,"FlexCop Digital TV device",fc->owner,fc->dev)) < 0) {
err("error registering DVB adapter"); err("error registering DVB adapter");
return ret; return ret;
} }
......
...@@ -713,7 +713,7 @@ static int __devinit dvb_bt8xx_load_card(struct dvb_bt8xx_card *card, u32 type) ...@@ -713,7 +713,7 @@ static int __devinit dvb_bt8xx_load_card(struct dvb_bt8xx_card *card, u32 type)
{ {
int result; int result;
if ((result = dvb_register_adapter(&card->dvb_adapter, card->card_name, THIS_MODULE)) < 0) { if ((result = dvb_register_adapter(&card->dvb_adapter, card->card_name, THIS_MODULE, &card->bt->dev->dev)) < 0) {
printk("dvb_bt8xx: dvb_register_adapter failed (errno = %d)\n", result); printk("dvb_bt8xx: dvb_register_adapter failed (errno = %d)\n", result);
return result; return result;
} }
......
...@@ -902,7 +902,7 @@ static int cinergyt2_probe (struct usb_interface *intf, ...@@ -902,7 +902,7 @@ static int cinergyt2_probe (struct usb_interface *intf,
return -ENOMEM; return -ENOMEM;
} }
if ((err = dvb_register_adapter(&cinergyt2->adapter, DRIVER_NAME, THIS_MODULE)) < 0) { if ((err = dvb_register_adapter(&cinergyt2->adapter, DRIVER_NAME, THIS_MODULE, &cinergyt2->udev->dev)) < 0) {
kfree(cinergyt2); kfree(cinergyt2);
return err; return err;
} }
......
...@@ -236,7 +236,7 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev, ...@@ -236,7 +236,7 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
"dvb/adapter%d/%s%d", adap->num, dnames[type], id); "dvb/adapter%d/%s%d", adap->num, dnames[type], id);
class_device_create(dvb_class, NULL, MKDEV(DVB_MAJOR, nums2minor(adap->num, type, id)), class_device_create(dvb_class, NULL, MKDEV(DVB_MAJOR, nums2minor(adap->num, type, id)),
NULL, "dvb%d.%s%d", adap->num, dnames[type], id); adap->device, "dvb%d.%s%d", adap->num, dnames[type], id);
dprintk("DVB: register adapter%d/%s%d @ minor: %i (0x%02x)\n", dprintk("DVB: register adapter%d/%s%d @ minor: %i (0x%02x)\n",
adap->num, dnames[type], id, nums2minor(adap->num, type, id), adap->num, dnames[type], id, nums2minor(adap->num, type, id),
...@@ -285,7 +285,7 @@ static int dvbdev_get_free_adapter_num (void) ...@@ -285,7 +285,7 @@ static int dvbdev_get_free_adapter_num (void)
} }
int dvb_register_adapter(struct dvb_adapter *adap, const char *name, struct module *module) int dvb_register_adapter(struct dvb_adapter *adap, const char *name, struct module *module, struct device *device)
{ {
int num; int num;
...@@ -306,6 +306,7 @@ int dvb_register_adapter(struct dvb_adapter *adap, const char *name, struct modu ...@@ -306,6 +306,7 @@ int dvb_register_adapter(struct dvb_adapter *adap, const char *name, struct modu
adap->num = num; adap->num = num;
adap->name = name; adap->name = name;
adap->module = module; adap->module = module;
adap->device = device;
list_add_tail (&adap->list_head, &dvb_adapter_list); list_add_tail (&adap->list_head, &dvb_adapter_list);
......
...@@ -51,6 +51,8 @@ struct dvb_adapter { ...@@ -51,6 +51,8 @@ struct dvb_adapter {
u8 proposed_mac [6]; u8 proposed_mac [6];
void* priv; void* priv;
struct device *device;
struct module *module; struct module *module;
}; };
...@@ -76,7 +78,7 @@ struct dvb_device { ...@@ -76,7 +78,7 @@ struct dvb_device {
}; };
extern int dvb_register_adapter (struct dvb_adapter *adap, const char *name, struct module *module); extern int dvb_register_adapter (struct dvb_adapter *adap, const char *name, struct module *module, struct device *device);
extern int dvb_unregister_adapter (struct dvb_adapter *adap); extern int dvb_unregister_adapter (struct dvb_adapter *adap);
extern int dvb_register_device (struct dvb_adapter *adap, extern int dvb_register_device (struct dvb_adapter *adap,
......
...@@ -82,7 +82,7 @@ int dvb_usb_dvb_init(struct dvb_usb_device *d) ...@@ -82,7 +82,7 @@ int dvb_usb_dvb_init(struct dvb_usb_device *d)
int ret; int ret;
if ((ret = dvb_register_adapter(&d->dvb_adap, d->desc->name, if ((ret = dvb_register_adapter(&d->dvb_adap, d->desc->name,
d->owner)) < 0) { d->owner, &d->udev->dev)) < 0) {
deb_info("dvb_register_adapter failed: error %d", ret); deb_info("dvb_register_adapter failed: error %d", ret);
goto err; goto err;
} }
......
...@@ -647,7 +647,7 @@ static int __devinit pluto2_probe(struct pci_dev *pdev, ...@@ -647,7 +647,7 @@ static int __devinit pluto2_probe(struct pci_dev *pdev,
goto err_pluto_hw_exit; goto err_pluto_hw_exit;
/* dvb */ /* dvb */
ret = dvb_register_adapter(&pluto->dvb_adapter, DRIVER_NAME, THIS_MODULE); ret = dvb_register_adapter(&pluto->dvb_adapter, DRIVER_NAME, THIS_MODULE, &pdev->dev);
if (ret < 0) if (ret < 0)
goto err_i2c_bit_del_bus; goto err_i2c_bit_del_bus;
......
...@@ -2413,7 +2413,7 @@ static int __devinit av7110_attach(struct saa7146_dev* dev, ...@@ -2413,7 +2413,7 @@ static int __devinit av7110_attach(struct saa7146_dev* dev,
goto err_kfree_0; goto err_kfree_0;
ret = dvb_register_adapter(&av7110->dvb_adapter, av7110->card_name, ret = dvb_register_adapter(&av7110->dvb_adapter, av7110->card_name,
THIS_MODULE); THIS_MODULE, &dev->pci->dev);
if (ret < 0) if (ret < 0)
goto err_put_firmware_1; goto err_put_firmware_1;
......
...@@ -400,7 +400,7 @@ int ttpci_budget_init(struct budget *budget, struct saa7146_dev *dev, ...@@ -400,7 +400,7 @@ int ttpci_budget_init(struct budget *budget, struct saa7146_dev *dev,
budget->dev->name, budget->buffer_width, budget->buffer_height); budget->dev->name, budget->buffer_width, budget->buffer_height);
printk("%s: dma buffer size %u\n", budget->dev->name, budget->buffer_size); printk("%s: dma buffer size %u\n", budget->dev->name, budget->buffer_size);
if ((ret = dvb_register_adapter(&budget->dvb_adapter, budget->card->name, owner)) < 0) { if ((ret = dvb_register_adapter(&budget->dvb_adapter, budget->card->name, owner, &budget->dev->pci->dev)) < 0) {
return ret; return ret;
} }
......
...@@ -1507,7 +1507,7 @@ static int ttusb_probe(struct usb_interface *intf, const struct usb_device_id *i ...@@ -1507,7 +1507,7 @@ static int ttusb_probe(struct usb_interface *intf, const struct usb_device_id *i
mutex_unlock(&ttusb->semi2c); mutex_unlock(&ttusb->semi2c);
if ((result = dvb_register_adapter(&ttusb->adapter, "Technotrend/Hauppauge Nova-USB", THIS_MODULE)) < 0) { if ((result = dvb_register_adapter(&ttusb->adapter, "Technotrend/Hauppauge Nova-USB", THIS_MODULE, &udev->dev)) < 0) {
ttusb_free_iso_urbs(ttusb); ttusb_free_iso_urbs(ttusb);
kfree(ttusb); kfree(ttusb);
return result; return result;
......
...@@ -1432,7 +1432,7 @@ static int ttusb_dec_init_dvb(struct ttusb_dec *dec) ...@@ -1432,7 +1432,7 @@ static int ttusb_dec_init_dvb(struct ttusb_dec *dec)
dprintk("%s\n", __FUNCTION__); dprintk("%s\n", __FUNCTION__);
if ((result = dvb_register_adapter(&dec->adapter, if ((result = dvb_register_adapter(&dec->adapter,
dec->model_name, THIS_MODULE)) < 0) { dec->model_name, THIS_MODULE, &dec->udev->dev)) < 0) {
printk("%s: dvb_register_adapter failed: error %d\n", printk("%s: dvb_register_adapter failed: error %d\n",
__FUNCTION__, result); __FUNCTION__, result);
......
...@@ -722,7 +722,7 @@ static int dvb_register(struct cx8802_dev *dev) ...@@ -722,7 +722,7 @@ static int dvb_register(struct cx8802_dev *dev)
cx88_call_i2c_clients (dev->core, TUNER_SET_STANDBY, NULL); cx88_call_i2c_clients (dev->core, TUNER_SET_STANDBY, NULL);
/* register everything */ /* register everything */
return videobuf_dvb_register(&dev->dvb, THIS_MODULE, dev); return videobuf_dvb_register(&dev->dvb, THIS_MODULE, dev, &dev->pci->dev);
} }
/* ----------------------------------------------------------- */ /* ----------------------------------------------------------- */
......
...@@ -1088,7 +1088,7 @@ static int dvb_init(struct saa7134_dev *dev) ...@@ -1088,7 +1088,7 @@ static int dvb_init(struct saa7134_dev *dev)
} }
/* register everything else */ /* register everything else */
return videobuf_dvb_register(&dev->dvb, THIS_MODULE, dev); return videobuf_dvb_register(&dev->dvb, THIS_MODULE, dev, &dev->pci->dev);
} }
static int dvb_fini(struct saa7134_dev *dev) static int dvb_fini(struct saa7134_dev *dev)
......
...@@ -135,14 +135,15 @@ static int videobuf_dvb_stop_feed(struct dvb_demux_feed *feed) ...@@ -135,14 +135,15 @@ static int videobuf_dvb_stop_feed(struct dvb_demux_feed *feed)
int videobuf_dvb_register(struct videobuf_dvb *dvb, int videobuf_dvb_register(struct videobuf_dvb *dvb,
struct module *module, struct module *module,
void *adapter_priv) void *adapter_priv,
struct device *device)
{ {
int result; int result;
mutex_init(&dvb->lock); mutex_init(&dvb->lock);
/* register adapter */ /* register adapter */
result = dvb_register_adapter(&dvb->adapter, dvb->name, module); result = dvb_register_adapter(&dvb->adapter, dvb->name, module, device);
if (result < 0) { if (result < 0) {
printk(KERN_WARNING "%s: dvb_register_adapter failed (errno = %d)\n", printk(KERN_WARNING "%s: dvb_register_adapter failed (errno = %d)\n",
dvb->name, result); dvb->name, result);
......
...@@ -26,7 +26,8 @@ struct videobuf_dvb { ...@@ -26,7 +26,8 @@ struct videobuf_dvb {
int videobuf_dvb_register(struct videobuf_dvb *dvb, int videobuf_dvb_register(struct videobuf_dvb *dvb,
struct module *module, struct module *module,
void *adapter_priv); void *adapter_priv,
struct device *device);
void videobuf_dvb_unregister(struct videobuf_dvb *dvb); void videobuf_dvb_unregister(struct videobuf_dvb *dvb);
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment