Пример #1
0
/**
 * 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;
}
Пример #2
0
/**
 * 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)
{
    int error;

    if (!dev->active)
        return 0;

    error = pnp_stop_dev(dev);
    if (error)
        return error;

    dev->active = 0;

    /* release the resources so that other devices can use them */
    mutex_lock(&pnp_res_mutex);
    pnp_clean_resource_table(dev);
    mutex_unlock(&pnp_res_mutex);

    return 0;
}
Пример #3
0
/**
 * 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)
{
	int error;

	if (!dev->active)
		return 0;	/* the device is already disabled */

	error = pnp_stop_dev(dev);
	if (error)
		return error;

	dev->active = 0;

	/* 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;
}
Пример #4
0
/**
 * pnp_assign_resources - assigns resources to the device based on the specified dependent number
 * @dev: pointer to the desired device
 * @depnum: the dependent function number
 *
 * Only set depnum to 0 if the device does not have dependent options.
 */
static int pnp_assign_resources(struct pnp_dev *dev, int depnum)
{
	struct pnp_port *port;
	struct pnp_mem *mem;
	struct pnp_irq *irq;
	struct pnp_dma *dma;
	int nport = 0, nmem = 0, nirq = 0, ndma = 0;

	if (!pnp_can_configure(dev))
		return -ENODEV;

	down(&pnp_res_mutex);
	pnp_clean_resource_table(&dev->res); /* start with a fresh slate */
	if (dev->independent) {
		port = dev->independent->port;
		mem = dev->independent->mem;
		irq = dev->independent->irq;
		dma = dev->independent->dma;
		while (port) {
			if (!pnp_assign_port(dev, port, nport))
				goto fail;
			nport++;
			port = port->next;
		}
		while (mem) {
			if (!pnp_assign_mem(dev, mem, nmem))
				goto fail;
			nmem++;
			mem = mem->next;
		}
		while (irq) {
			if (!pnp_assign_irq(dev, irq, nirq))
				goto fail;
			nirq++;
			irq = irq->next;
		}
		while (dma) {
			if (!pnp_assign_dma(dev, dma, ndma))
				goto fail;
			ndma++;
			dma = dma->next;
		}
	}

	if (depnum) {
		struct pnp_option *dep;
		int i;
		for (i=1,dep=dev->dependent; i<depnum; i++, dep=dep->next)
			if(!dep)
				goto fail;
		port =dep->port;
		mem = dep->mem;
		irq = dep->irq;
		dma = dep->dma;
		while (port) {
			if (!pnp_assign_port(dev, port, nport))
				goto fail;
			nport++;
			port = port->next;
		}
		while (mem) {
			if (!pnp_assign_mem(dev, mem, nmem))
				goto fail;
			nmem++;
			mem = mem->next;
		}
		while (irq) {
			if (!pnp_assign_irq(dev, irq, nirq))
				goto fail;
			nirq++;
			irq = irq->next;
		}
		while (dma) {
			if (!pnp_assign_dma(dev, dma, ndma))
				goto fail;
			ndma++;
			dma = dma->next;
		}
	} else if (dev->dependent)
		goto fail;

	up(&pnp_res_mutex);
	return 1;

fail:
	pnp_clean_resource_table(&dev->res);
	up(&pnp_res_mutex);
	return 0;
}
Пример #5
0
/**
 * pnp_assign_resources - assigns resources to the device based on the specified dependent number
 * @dev: pointer to the desired device
 * @depnum: the dependent function number
 *
 * Only set depnum to 0 if the device does not have dependent options.
 */
static int pnp_assign_resources(struct pnp_dev *dev, int depnum)
{
    struct pnp_port *port;
    struct pnp_mem *mem;
    struct pnp_irq *irq;
    struct pnp_dma *dma;
    int nport = 0, nmem = 0, nirq = 0, ndma = 0;

    if (!pnp_can_configure(dev))
        return -ENODEV;

    dbg_pnp_show_resources(dev, "before pnp_assign_resources");
    mutex_lock(&pnp_res_mutex);
    pnp_clean_resource_table(dev);
    if (dev->independent) {
        dev_dbg(&dev->dev, "assigning independent options\n");
        port = dev->independent->port;
        mem = dev->independent->mem;
        irq = dev->independent->irq;
        dma = dev->independent->dma;
        while (port) {
            if (!pnp_assign_port(dev, port, nport))
                goto fail;
            nport++;
            port = port->next;
        }
        while (mem) {
            if (!pnp_assign_mem(dev, mem, nmem))
                goto fail;
            nmem++;
            mem = mem->next;
        }
        while (irq) {
            if (!pnp_assign_irq(dev, irq, nirq))
                goto fail;
            nirq++;
            irq = irq->next;
        }
        while (dma) {
            pnp_assign_dma(dev, dma, ndma);
            ndma++;
            dma = dma->next;
        }
    }

    if (depnum) {
        struct pnp_option *dep;
        int i;

        dev_dbg(&dev->dev, "assigning dependent option %d\n", depnum);
        for (i = 1, dep = dev->dependent; i < depnum;
             i++, dep = dep->next)
            if (!dep)
                goto fail;
        port = dep->port;
        mem = dep->mem;
        irq = dep->irq;
        dma = dep->dma;
        while (port) {
            if (!pnp_assign_port(dev, port, nport))
                goto fail;
            nport++;
            port = port->next;
        }
        while (mem) {
            if (!pnp_assign_mem(dev, mem, nmem))
                goto fail;
            nmem++;
            mem = mem->next;
        }
        while (irq) {
            if (!pnp_assign_irq(dev, irq, nirq))
                goto fail;
            nirq++;
            irq = irq->next;
        }
        while (dma) {
            pnp_assign_dma(dev, dma, ndma);
            ndma++;
            dma = dma->next;
        }
    } else if (dev->dependent)
        goto fail;

    mutex_unlock(&pnp_res_mutex);
    dbg_pnp_show_resources(dev, "after pnp_assign_resources");
    return 1;

fail:
    pnp_clean_resource_table(dev);
    mutex_unlock(&pnp_res_mutex);
    dbg_pnp_show_resources(dev, "after pnp_assign_resources (failed)");
    return 0;
}