static void bbswitch_off(void) { if (is_card_disabled()) return; // to prevent the system from possibly locking up, don't disable the device // if it's still in use by a driver (i.e. nouveau or nvidia) if (dis_dev->driver) { pr_warn("device %s is in use by driver '%s', refusing OFF\n", dev_name(&dis_dev->dev), dis_dev->driver->name); return; } pr_info("disabling discrete graphics\n"); if (bbswitch_optimus_dsm()) { pr_warn("Optimus ACPI call failed, the device is not disabled\n"); return; } pci_save_state(dis_dev); pci_clear_master(dis_dev); pci_disable_device(dis_dev); pci_set_power_state(dis_dev, PCI_D3cold); if (bbswitch_acpi_off()) pr_warn("The discrete card could not be disabled by a _DSM call\n"); }
static void bbswitch_off(void) { if (is_card_disabled()) return; // to prevent the system from possibly locking up, don't disable the device // if it's still in use by a driver (i.e. nouveau or nvidia) if (dis_dev->driver) { printk(KERN_WARNING "bbswitch: device %s is in use by driver '%s', " "refusing OFF\n", dev_name(&dis_dev->dev), dis_dev->driver->name); return; } printk(KERN_INFO "bbswitch: disabling discrete graphics\n"); if (dsm_type == DSM_TYPE_OPTIMUS && bbswitch_optimus_dsm()) { printk(KERN_WARNING "bbswitch: ACPI call failed, the device is not" " disabled\n"); return; } pci_save_state(dis_dev); pci_clear_master(dis_dev); pci_disable_device(dis_dev); pci_set_power_state(dis_dev, PCI_D3hot); if (bbswitch_acpi_off()) printk(KERN_WARNING "bbswitch: The discrete card could not be disabled" " by a _DSM call\n"); }
static void bbswitch_off(void) { if (is_card_disabled()) return; // to prevent the system from possibly locking up, don't disable the device // if it's still in use by a driver (i.e. nouveau or nvidia) if (dis_dev->driver) { pr_warn("device %s is in use by driver '%s', refusing OFF\n", dev_name(&dis_dev->dev), dis_dev->driver->name); return; } pr_info("disabling discrete graphics\n"); if (bbswitch_optimus_dsm()) { pr_warn("Optimus ACPI call failed, the device is not disabled\n"); return; } pci_save_state(dis_dev); pci_clear_master(dis_dev); pci_disable_device(dis_dev); do { struct acpi_device *ad = NULL; int r; r = acpi_bus_get_device(dis_handle, &ad); if (r || !ad) { pr_warn("Cannot get ACPI device for PCI device\n"); break; } if (ad->power.state == ACPI_STATE_UNKNOWN) { pr_debug("ACPI power state is unknown, forcing D0\n"); ad->power.state = ACPI_STATE_D0; } } while (0); pci_set_power_state(dis_dev, PCI_D3cold); if (bbswitch_acpi_off()) pr_warn("The discrete card could not be disabled by a _DSM call\n"); }