static bool odd_can_poweroff(struct ata_device *ata_dev) { acpi_handle handle; acpi_status status; struct acpi_device *acpi_dev; handle = ata_dev_acpi_handle(ata_dev); if (!handle) return false; status = acpi_bus_get_device(handle, &acpi_dev); if (ACPI_FAILURE(status)) return false; return acpi_device_can_poweroff(acpi_dev); }
void zpodd_init(struct ata_device *dev) { struct acpi_device *adev = ACPI_COMPANION(&dev->tdev); enum odd_mech_type mech_type; struct zpodd *zpodd; if (dev->zpodd || !adev || !acpi_device_can_poweroff(adev)) return; mech_type = zpodd_get_mech_type(dev); if (mech_type == ODD_MECH_TYPE_UNSUPPORTED) return; zpodd = kzalloc(sizeof(struct zpodd), GFP_KERNEL); if (!zpodd) return; zpodd->mech_type = mech_type; ata_acpi_add_pm_notifier(dev); zpodd->dev = dev; dev->zpodd = zpodd; dev_pm_qos_expose_flags(&dev->tdev, 0); }