Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fdc53a6d authored by Johannes Stezenbach's avatar Johannes Stezenbach Committed by Linus Torvalds
Browse files

[PATCH] dvb: modified dvb_register_adapter() to avoid kmalloc/kfree



Modified dvb_register_adapter() to avoid kmalloc/kfree.  Drivers have to embed
struct dvb_adapter into their private data struct from now on.  (Andreas
Oberritter)

Signed-off-by: default avatarJohannes Stezenbach <js@linuxtv.org>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 0b3f5a57
Loading
Loading
Loading
Loading
+10 −10
Original line number Diff line number Diff line
@@ -97,7 +97,7 @@ struct adapter {
	u8 mac_addr[8];
	u32 dw_sram_type;

	struct dvb_adapter *dvb_adapter;
	struct dvb_adapter dvb_adapter;
	struct dvb_demux demux;
	struct dmxdev dmxdev;
	struct dmx_frontend hw_frontend;
@@ -2461,7 +2461,7 @@ static void frontend_init(struct adapter *skystar2)
		       skystar2->pdev->subsystem_vendor,
		       skystar2->pdev->subsystem_device);
	} else {
		if (dvb_register_frontend(skystar2->dvb_adapter, skystar2->fe)) {
		if (dvb_register_frontend(&skystar2->dvb_adapter, skystar2->fe)) {
			printk("skystar2: Frontend registration failed!\n");
			if (skystar2->fe->ops->release)
				skystar2->fe->ops->release(skystar2->fe);
@@ -2486,17 +2486,17 @@ static int skystar2_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
	if (ret < 0)
		goto out;

	ret = dvb_register_adapter(&dvb_adapter, skystar2_pci_driver.name,
	adapter = pci_get_drvdata(pdev);
	dvb_adapter = &adapter->dvb_adapter;

	ret = dvb_register_adapter(dvb_adapter, skystar2_pci_driver.name,
				   THIS_MODULE);
	if (ret < 0) {
		printk("%s: Error registering DVB adapter\n", __FUNCTION__);
		goto err_halt;
	}

	adapter = pci_get_drvdata(pdev);

	dvb_adapter->priv = adapter;
	adapter->dvb_adapter = dvb_adapter;


	init_MUTEX(&adapter->i2c_sem);
@@ -2541,7 +2541,7 @@ static int skystar2_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
	adapter->dmxdev.demux = dmx;
	adapter->dmxdev.capabilities = 0;

	ret = dvb_dmxdev_init(&adapter->dmxdev, adapter->dvb_adapter);
	ret = dvb_dmxdev_init(&adapter->dmxdev, &adapter->dvb_adapter);
	if (ret < 0)
		goto err_dmx_release;

@@ -2559,7 +2559,7 @@ static int skystar2_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
	if (ret < 0)
		goto err_remove_mem_frontend;

	dvb_net_init(adapter->dvb_adapter, &adapter->dvbnet, &dvbdemux->dmx);
	dvb_net_init(&adapter->dvb_adapter, &adapter->dvbnet, &dvbdemux->dmx);

	frontend_init(adapter);
out:
@@ -2576,7 +2576,7 @@ static int skystar2_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
err_i2c_del:
	i2c_del_adapter(&adapter->i2c_adap);
err_dvb_unregister:
	dvb_unregister_adapter(adapter->dvb_adapter);
	dvb_unregister_adapter(&adapter->dvb_adapter);
err_halt:
	driver_halt(pdev);
	goto out;
@@ -2605,7 +2605,7 @@ static void skystar2_remove(struct pci_dev *pdev)
	if (adapter->fe != NULL)
		dvb_unregister_frontend(adapter->fe);

	dvb_unregister_adapter(adapter->dvb_adapter);
	dvb_unregister_adapter(&adapter->dvb_adapter);

			i2c_del_adapter(&adapter->i2c_adap);

+10 −10
Original line number Diff line number Diff line
@@ -531,7 +531,7 @@ static void frontend_init(struct dvb_bt8xx_card *card, u32 type)
		       card->bt->dev->subsystem_vendor,
		       card->bt->dev->subsystem_device);
	} else {
		if (dvb_register_frontend(card->dvb_adapter, card->fe)) {
		if (dvb_register_frontend(&card->dvb_adapter, card->fe)) {
			printk("dvb-bt8xx: Frontend registration failed!\n");
			if (card->fe->ops->release)
				card->fe->ops->release(card->fe);
@@ -550,7 +550,7 @@ static int __init dvb_bt8xx_load_card(struct dvb_bt8xx_card *card, u32 type)
		return result;

	}
	card->dvb_adapter->priv = card;
	card->dvb_adapter.priv = card;

	card->bt->adapter = card->i2c_adapter;

@@ -568,7 +568,7 @@ static int __init dvb_bt8xx_load_card(struct dvb_bt8xx_card *card, u32 type)
	if ((result = dvb_dmx_init(&card->demux)) < 0) {
		printk("dvb_bt8xx: dvb_dmx_init failed (errno = %d)\n", result);

		dvb_unregister_adapter(card->dvb_adapter);
		dvb_unregister_adapter(&card->dvb_adapter);
		return result;
	}

@@ -576,11 +576,11 @@ static int __init dvb_bt8xx_load_card(struct dvb_bt8xx_card *card, u32 type)
	card->dmxdev.demux = &card->demux.dmx;
	card->dmxdev.capabilities = 0;

	if ((result = dvb_dmxdev_init(&card->dmxdev, card->dvb_adapter)) < 0) {
	if ((result = dvb_dmxdev_init(&card->dmxdev, &card->dvb_adapter)) < 0) {
		printk("dvb_bt8xx: dvb_dmxdev_init failed (errno = %d)\n", result);

		dvb_dmx_release(&card->demux);
		dvb_unregister_adapter(card->dvb_adapter);
		dvb_unregister_adapter(&card->dvb_adapter);
		return result;
	}

@@ -591,7 +591,7 @@ static int __init dvb_bt8xx_load_card(struct dvb_bt8xx_card *card, u32 type)

		dvb_dmxdev_release(&card->dmxdev);
		dvb_dmx_release(&card->demux);
		dvb_unregister_adapter(card->dvb_adapter);
		dvb_unregister_adapter(&card->dvb_adapter);
		return result;
	}

@@ -603,7 +603,7 @@ static int __init dvb_bt8xx_load_card(struct dvb_bt8xx_card *card, u32 type)
		card->demux.dmx.remove_frontend(&card->demux.dmx, &card->fe_hw);
		dvb_dmxdev_release(&card->dmxdev);
		dvb_dmx_release(&card->demux);
		dvb_unregister_adapter(card->dvb_adapter);
		dvb_unregister_adapter(&card->dvb_adapter);
		return result;
	}

@@ -614,11 +614,11 @@ static int __init dvb_bt8xx_load_card(struct dvb_bt8xx_card *card, u32 type)
		card->demux.dmx.remove_frontend(&card->demux.dmx, &card->fe_hw);
		dvb_dmxdev_release(&card->dmxdev);
		dvb_dmx_release(&card->demux);
		dvb_unregister_adapter(card->dvb_adapter);
		dvb_unregister_adapter(&card->dvb_adapter);
		return result;
	}

	dvb_net_init(card->dvb_adapter, &card->dvbnet, &card->demux.dmx);
	dvb_net_init(&card->dvb_adapter, &card->dvbnet, &card->demux.dmx);

	tasklet_init(&card->bt->tasklet, dvb_bt8xx_task, (unsigned long) card);

@@ -759,7 +759,7 @@ static int dvb_bt8xx_remove(struct device *dev)
	dvb_dmxdev_release(&card->dmxdev);
	dvb_dmx_release(&card->demux);
	if (card->fe) dvb_unregister_frontend(card->fe);
	dvb_unregister_adapter(card->dvb_adapter);
	dvb_unregister_adapter(&card->dvb_adapter);

	kfree(card);

+1 −1
Original line number Diff line number Diff line
@@ -40,7 +40,7 @@ struct dvb_bt8xx_card {
	struct semaphore lock;
	int nfeeds;
	char card_name[32];
	struct dvb_adapter *dvb_adapter;
	struct dvb_adapter dvb_adapter;
	struct bt878 *bt;
	unsigned int bttv_nr;
	struct dvb_demux demux;
+6 −6
Original line number Diff line number Diff line
@@ -119,7 +119,7 @@ struct cinergyt2 {
	struct dvb_demux demux;
	struct usb_device *udev;
	struct semaphore sem;
	struct dvb_adapter *adapter;
	struct dvb_adapter adapter;
	struct dvb_device *fedev;
	struct dmxdev dmxdev;
	struct dvb_net dvbnet;
@@ -813,15 +813,15 @@ static int cinergyt2_probe (struct usb_interface *intf,
	cinergyt2->dmxdev.demux = &cinergyt2->demux.dmx;
	cinergyt2->dmxdev.capabilities = 0;

	if ((err = dvb_dmxdev_init(&cinergyt2->dmxdev, cinergyt2->adapter)) < 0) {
	if ((err = dvb_dmxdev_init(&cinergyt2->dmxdev, &cinergyt2->adapter)) < 0) {
		dprintk(1, "dvb_dmxdev_init() failed (err = %d)\n", err);
		goto bailout;
	}

	if (dvb_net_init(cinergyt2->adapter, &cinergyt2->dvbnet, &cinergyt2->demux.dmx))
	if (dvb_net_init(&cinergyt2->adapter, &cinergyt2->dvbnet, &cinergyt2->demux.dmx))
		dprintk(1, "dvb_net_init() failed!\n");

	dvb_register_device(cinergyt2->adapter, &cinergyt2->fedev,
	dvb_register_device(&cinergyt2->adapter, &cinergyt2->fedev,
			    &cinergyt2_fe_template, cinergyt2,
			    DVB_DEVICE_FRONTEND);

@@ -848,7 +848,7 @@ static int cinergyt2_probe (struct usb_interface *intf,
bailout:
	dvb_dmxdev_release(&cinergyt2->dmxdev);
	dvb_dmx_release(&cinergyt2->demux);
	dvb_unregister_adapter (cinergyt2->adapter);
	dvb_unregister_adapter (&cinergyt2->adapter);
	cinergyt2_free_stream_urbs (cinergyt2);
	kfree(cinergyt2);
	return -ENOMEM;
@@ -872,7 +872,7 @@ static void cinergyt2_disconnect (struct usb_interface *intf)
	dvb_dmxdev_release(&cinergyt2->dmxdev);
	dvb_dmx_release(&cinergyt2->demux);
	dvb_unregister_device(cinergyt2->fedev);
	dvb_unregister_adapter(cinergyt2->adapter);
	dvb_unregister_adapter(&cinergyt2->adapter);

	cinergyt2_free_stream_urbs(cinergyt2);
	up(&cinergyt2->sem);
+5 −5
Original line number Diff line number Diff line
@@ -131,7 +131,7 @@ int dibusb_dvb_init(struct usb_dibusb *dib)
		deb_info("dvb_register_adapter failed: error %d", ret);
		goto err;
	}
	dib->adapter->priv = dib;
	dib->adapter.priv = dib;
	
/* i2c is done in dibusb_i2c_init */
	
@@ -151,18 +151,18 @@ int dibusb_dvb_init(struct usb_dibusb *dib)
	dib->dmxdev.filternum = dib->demux.filternum;
	dib->dmxdev.demux = &dib->demux.dmx;
	dib->dmxdev.capabilities = 0;
	if ((ret = dvb_dmxdev_init(&dib->dmxdev, dib->adapter)) < 0) {
	if ((ret = dvb_dmxdev_init(&dib->dmxdev, &dib->adapter)) < 0) {
		err("dvb_dmxdev_init failed: error %d",ret);
		goto err_dmx_dev;
	}

	dvb_net_init(dib->adapter, &dib->dvb_net, &dib->demux.dmx);
	dvb_net_init(&dib->adapter, &dib->dvb_net, &dib->demux.dmx);

	goto success;
err_dmx_dev:
	dvb_dmx_release(&dib->demux);
err_dmx:
	dvb_unregister_adapter(dib->adapter);
	dvb_unregister_adapter(&dib->adapter);
err:
	return ret;
success:
@@ -179,7 +179,7 @@ int dibusb_dvb_exit(struct usb_dibusb *dib)
		dib->demux.dmx.close(&dib->demux.dmx);
		dvb_dmxdev_release(&dib->dmxdev);
		dvb_dmx_release(&dib->demux);
		dvb_unregister_adapter(dib->adapter);
		dvb_unregister_adapter(&dib->adapter);
	}
	return 0;
}
Loading