/** * pnp_disable_dev - disables device * @dev: pointer to the desired device * * inform the correct pnp protocol so that resources can be used by other devices */ int pnp_disable_dev(struct pnp_dev *dev) { if (!dev) return -EINVAL; if (!dev->active) { return 0; /* the device is already disabled */ } if (!pnp_can_disable(dev)) { pnp_info("Device %s does not supported disabling.", dev->dev.bus_id); return -EINVAL; } if (dev->protocol->disable(dev)<0) { pnp_err("Failed to disable device %s.", dev->dev.bus_id); return -EIO; } dev->active = 0; pnp_info("Device %s disabled.", dev->dev.bus_id); /* release the resources so that other devices can use them */ down(&pnp_res_mutex); pnp_clean_resource_table(&dev->res); up(&pnp_res_mutex); return 1; }
static int pnp_bus_suspend(struct device *dev, pm_message_t state) { struct pnp_dev *pnp_dev = to_pnp_dev(dev); struct pnp_driver *pnp_drv = pnp_dev->driver; int error; if (!pnp_drv) return 0; if (pnp_drv->suspend) { error = pnp_drv->suspend(pnp_dev, state); if (error) return error; } if (pnp_can_disable(pnp_dev)) { error = pnp_stop_dev(pnp_dev); if (error) return error; } if (pnp_dev->protocol->suspend) pnp_dev->protocol->suspend(pnp_dev, state); return 0; }
/** * pnp_stop_dev - low-level disable of the PnP device * @dev: pointer to the desired device * * does not free resources */ int pnp_stop_dev(struct pnp_dev *dev) { if (!pnp_can_disable(dev)) { dev_dbg(&dev->dev, "disabling not supported\n"); return -EINVAL; } if (dev->protocol->disable(dev) < 0) { dev_err(&dev->dev, "disable failed\n"); return -EIO; } dev_info(&dev->dev, "disabled\n"); return 0; }
int pnp_stop_dev(struct pnp_dev *dev) { if (!pnp_can_disable(dev)) { pnp_info("Device %s does not support disabling.", dev->dev.bus_id); return -EINVAL; } if (dev->protocol->disable(dev)<0) { pnp_err("Failed to disable device %s.", dev->dev.bus_id); return -EIO; } pnp_info("Device %s disabled.", dev->dev.bus_id); return 0; }
static int pnp_bus_suspend(struct device *dev, pm_message_t state) { struct pnp_dev * pnp_dev = to_pnp_dev(dev); struct pnp_driver * pnp_drv = pnp_dev->driver; int error; if (!pnp_drv) return 0; if (pnp_drv->suspend) { error = pnp_drv->suspend(pnp_dev, state); if (error) return error; } if (!(pnp_drv->flags & PNP_DRIVER_RES_DO_NOT_CHANGE) && pnp_can_disable(pnp_dev)) { error = pnp_stop_dev(pnp_dev); if (error) return error; } return 0; }