Skip to content
Snippets Groups Projects
acpiphp_glue.c 27.4 KiB
Newer Older
  • Learn to ignore specific revisions
  • 			return;
    		}
    		bridge->context = context;
    		context->bridge = bridge;
    		/* Get a reference to the parent bridge. */
    
    		get_bridge(context->func.parent);
    
    	/* must be added to the list prior to calling register_slot */
    	mutex_lock(&bridge_mutex);
    	list_add(&bridge->list, &bridge_list);
    	mutex_unlock(&bridge_mutex);
    
    	/* register all slot objects under this bridge */
    
    	status = acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, 1,
    
    				     register_slot, NULL, bridge, NULL);
    	if (ACPI_FAILURE(status)) {
    
    		acpi_handle_err(handle, "failed to register slots\n");
    
    		cleanup_bridge(bridge);
    		put_bridge(bridge);
    
    }
    
    /* Destroy hotplug slots associated with the PCI bus */
    void acpiphp_remove_slots(struct pci_bus *bus)
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    {
    
    	struct acpiphp_bridge *bridge;
    
    	mutex_lock(&bridge_mutex);
    	list_for_each_entry(bridge, &bridge_list, list)
    
    		if (bridge->pci_bus == bus) {
    
    			mutex_unlock(&bridge_mutex);
    
    			cleanup_bridge(bridge);
    
    
    	mutex_unlock(&bridge_mutex);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    }
    
    /**
     * acpiphp_enable_slot - power on slot
    
     * @slot: ACPI PHP slot
    
    Linus Torvalds's avatar
    Linus Torvalds committed
     */
    int acpiphp_enable_slot(struct acpiphp_slot *slot)
    {
    
    	mutex_lock(&slot->crit_sect);
    
    	mutex_unlock(&slot->crit_sect);
    
     * acpiphp_disable_and_eject_slot - power off and eject slot
    
     * @slot: ACPI PHP slot
    
    Linus Torvalds's avatar
    Linus Torvalds committed
     */
    
    int acpiphp_disable_and_eject_slot(struct acpiphp_slot *slot)
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    {
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	int retval = 0;
    
    
    	mutex_lock(&slot->crit_sect);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    
    	/* unconfigure all functions */
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    
    
    	list_for_each_entry(func, &slot->funcs, sibling)
    		if (func->flags & FUNC_HAS_EJ0) {
    			acpi_handle handle = func_to_handle(func);
    
    			if (ACPI_FAILURE(acpi_evaluate_ej0(handle)))
    				acpi_handle_err(handle, "_EJ0 failed\n");
    
    			break;
    		}
    
    
    	mutex_unlock(&slot->crit_sect);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    	return retval;
    }
    
    
    /*
     * slot enabled:  1
     * slot disabled: 0
     */
    u8 acpiphp_get_power_status(struct acpiphp_slot *slot)
    {
    
    	return (slot->flags & SLOT_ENABLED);
    
     * latch   open:  1
     * latch closed:  0
    
    Linus Torvalds's avatar
    Linus Torvalds committed
     */
    u8 acpiphp_get_latch_status(struct acpiphp_slot *slot)
    {
    
    	return !(get_slot_status(slot) & ACPI_STA_DEVICE_UI);
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    }
    
    
    /*
     * adapter presence : 1
     *          absence : 0
     */
    u8 acpiphp_get_adapter_status(struct acpiphp_slot *slot)
    {
    
    Linus Torvalds's avatar
    Linus Torvalds committed
    }