void agp_remove_bridge(struct agp_bridge_data *bridge) { agp_backend_cleanup(bridge); list_del(&bridge->list); if (list_empty(&agp_bridges)) agp_frontend_cleanup(); module_put(bridge->driver->owner); }
int agp_add_bridge(struct agp_bridge_data *bridge) { int error; if (agp_off) { error = -ENODEV; goto err_put_bridge; } if (!bridge->dev) { printk (KERN_DEBUG PFX "Erk, registering with no pci_dev!\n"); error = -EINVAL; goto err_put_bridge; } /* Grab reference on the chipset driver. */ if (!try_module_get(bridge->driver->owner)) { dev_info(&bridge->dev->dev, "can't lock chipset driver\n"); error = -EINVAL; goto err_put_bridge; } error = agp_backend_initialize(bridge); if (error) { dev_info(&bridge->dev->dev, "agp_backend_initialize() failed\n"); goto err_out; } if (list_empty(&agp_bridges)) { error = agp_frontend_initialize(); if (error) { dev_info(&bridge->dev->dev, "agp_frontend_initialize() failed\n"); goto frontend_err; } dev_info(&bridge->dev->dev, "AGP aperture is %dM @ 0x%lx\n", bridge->driver->fetch_size(), bridge->gart_bus_addr); } list_add(&bridge->list, &agp_bridges); return 0; frontend_err: agp_backend_cleanup(bridge); err_out: module_put(bridge->driver->owner); err_put_bridge: agp_put_bridge(bridge); return error; }