static int scsi_runtime_idle(struct device *dev) { int err; dev_dbg(dev, "scsi_runtime_idle\n"); /* Insert hooks here for targets, hosts, and transport classes */ if (scsi_is_sdev_device(dev)) err = pm_schedule_suspend(dev, 100); else err = pm_runtime_suspend(dev); return err; }
static void gpu_power_off(struct kbase_device *kbdev) { struct exynos_context *platform = (struct exynos_context *) kbdev->platform_context; if (!platform) return; GPU_LOG(DVFS_INFO, DUMMY, 0u, 0u, "power off\n"); pm_schedule_suspend(kbdev->dev, platform->runtime_pm_delay_time); gpu_control_enable_customization(platform); if (platform->early_clk_gating_status) gpu_control_disable_clock(kbdev); }
static int mei_txe_pm_runtime_idle(struct device *device) { struct pci_dev *pdev = to_pci_dev(device); struct mei_device *dev; dev_dbg(&pdev->dev, "rpm: txe: runtime_idle\n"); dev = pci_get_drvdata(pdev); if (!dev) return -ENODEV; if (mei_write_is_idle(dev)) pm_schedule_suspend(device, MEI_TXI_RPM_TIMEOUT * 2); return -EBUSY; }
/* Sysfs stuff */ static void lis3lv02d_sysfs_poweron(struct lis3lv02d *lis3) { /* * SYSFS functions are fast visitors so put-call * immediately after the get-call. However, keep * chip running for a while and schedule delayed * suspend. This way periodic sysfs calls doesn't * suffer from relatively long power up time. */ if (lis3->pm_dev) { pm_runtime_get_sync(lis3->pm_dev); pm_runtime_put_noidle(lis3->pm_dev); pm_schedule_suspend(lis3->pm_dev, LIS3_SYSFS_POWERDOWN_DELAY); } }
static int sdev_runtime_suspend(struct device *dev) { const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL; int (*cb)(struct device *) = pm ? pm->runtime_suspend : NULL; struct scsi_device *sdev = to_scsi_device(dev); int err; if (sdev->request_queue->dev) return sdev_blk_runtime_suspend(sdev, cb); err = scsi_dev_type_suspend(dev, cb); if (err == -EAGAIN) pm_schedule_suspend(dev, jiffies_to_msecs( round_jiffies_up_relative(HZ/10))); return err; }
static int scsi_runtime_suspend(struct device *dev) { int err = 0; dev_dbg(dev, "scsi_runtime_suspend\n"); if (scsi_is_sdev_device(dev)) { err = scsi_dev_type_suspend(dev, PMSG_AUTO_SUSPEND); if (err == -EAGAIN) pm_schedule_suspend(dev, jiffies_to_msecs( round_jiffies_up_relative(HZ/10))); } /* Insert hooks here for targets, hosts, and transport classes */ return err; }
static int scsi_runtime_suspend(struct device *dev) { int err = 0; dev_dbg(dev, "scsi_runtime_suspend\n"); if (scsi_is_sdev_device(dev)) { err = scsi_dev_type_suspend(dev, PMSG_AUTO_SUSPEND); if (err == -EAGAIN) pm_schedule_suspend(dev, jiffies_to_msecs( round_jiffies_up_relative(HZ/10))); } return err; }
void mdfld_dsi_dpi_dpms(struct drm_encoder *encoder, int mode) { dev_dbg(encoder->dev->dev, "DPMS %s\n", (mode == DRM_MODE_DPMS_ON ? "on":"off")); if (mode == DRM_MODE_DPMS_ON) mdfld_dsi_dpi_set_power(encoder, true); else { mdfld_dsi_dpi_set_power(encoder, false); #if 0 /* FIXME */ #ifdef CONFIG_PM_RUNTIME if (enable_gfx_rtpm) pm_schedule_suspend(&gpDrmDevice->pdev->dev, gfxrtdelay); #endif #endif } }
static int msm_otg_runtime_idle(struct device *dev) { struct msm_otg *motg = dev_get_drvdata(dev); struct usb_otg *otg = motg->phy.otg; dev_dbg(dev, "OTG runtime idle\n"); /* * It is observed some times that a spurious interrupt * comes when PHY is put into LPM immediately after PHY reset. * This 1 sec delay also prevents entering into LPM immediately * after asynchronous interrupt. */ if (otg->phy->state != OTG_STATE_UNDEFINED) pm_schedule_suspend(dev, 1000); return -EAGAIN; }
static void pm_callback_power_off(struct kbase_device *kbdev) { struct device *dev = kbdev->dev; int ret = 0, retry = 0; #if HARD_RESET_AT_POWER_OFF /* Cause a GPU hard reset to test whether we have actually idled the GPU * and that we properly reconfigure the GPU on power up. * Usually this would be dangerous, but if the GPU is working correctly it should * be completely safe as the GPU should not be active at this point. * However this is disabled normally because it will most likely interfere with * bus logging etc. */ KBASE_TRACE_ADD(kbdev, CORE_GPU_HARD_RESET, NULL, NULL, 0u, 0); kbase_os_reg_write(kbdev, GPU_CONTROL_REG(GPU_COMMAND), GPU_COMMAND_HARD_RESET); #endif if (unlikely(dev->power.disable_depth > 0)) { kbase_platform_off(kbdev); } else { do { ret = pm_schedule_suspend(dev, RUNTIME_PM_DELAY_TIME); if (ret != -EAGAIN) { if (unlikely(ret < 0)) { pr_err("[mali-midgard] pm_schedule_suspend failed (%d)\n\n", ret); WARN_ON(1); } /* correct status */ break; } /* -EAGAIN, repeated attempts for 1s totally */ msleep(50); } while (++retry < 20); } }
static int xgpiops_idle(struct device *dev) { return pm_schedule_suspend(dev, 1); }
static int __maybe_unused intel_gpio_runtime_idle(struct device *dev) { int err = pm_schedule_suspend(dev, 500); return err ?: -EBUSY; }
static int __maybe_unused zynq_gpio_idle(struct device *dev) { return pm_schedule_suspend(dev, 1); }
static int zynq_gpio_idle(struct device *dev) { return pm_schedule_suspend(dev, 1); }
static void pm_callback_power_off(kbase_device *kbdev) { struct kbase_os_device *osdev = &kbdev->osdev; pm_schedule_suspend(osdev->dev, RUNTIME_PM_DELAY_TIME); }
/* Periodically update dbi panel */ void mdfld_dbi_update_panel(struct drm_device *dev, int pipe) { struct drm_psb_private *dev_priv = dev->dev_private; struct mdfld_dbi_dsr_info *dsr_info = dev_priv->dbi_dsr_info; struct mdfld_dsi_dbi_output **dbi_outputs; struct mdfld_dsi_dbi_output *dbi_output; int i; int can_enter_dsr = 0; u32 damage_mask; dbi_outputs = dsr_info->dbi_outputs; dbi_output = pipe ? dbi_outputs[1] : dbi_outputs[0]; if (!dbi_output) return; if (pipe == 0) damage_mask = dev_priv->dsr_fb_update & MDFLD_DSR_DAMAGE_MASK_0; else if (pipe == 2) damage_mask = dev_priv->dsr_fb_update & MDFLD_DSR_DAMAGE_MASK_2; else return; /* If FB is damaged and panel is on update on-panel FB */ if (damage_mask && dbi_output->dbi_panel_on) { dbi_output->dsr_fb_update_done = false; if (dbi_output->p_funcs->update_fb) dbi_output->p_funcs->update_fb(dbi_output, pipe); if (dev_priv->dsr_enable && dbi_output->dsr_fb_update_done) dev_priv->dsr_fb_update &= ~damage_mask; /*clean IN_DSR flag*/ dbi_output->mode_flags &= ~MODE_SETTING_IN_DSR; dbi_output->dsr_idle_count = 0; } else { dbi_output->dsr_idle_count++; } switch (dsr_info->dbi_output_num) { case 1: if (dbi_output->dsr_idle_count > MDFLD_DSR_MAX_IDLE_COUNT) can_enter_dsr = 1; break; case 2: if (dbi_outputs[0]->dsr_idle_count > MDFLD_DSR_MAX_IDLE_COUNT && dbi_outputs[1]->dsr_idle_count > MDFLD_DSR_MAX_IDLE_COUNT) can_enter_dsr = 1; break; default: DRM_ERROR("Wrong DBI output number\n"); } /* Try to enter DSR */ if (can_enter_dsr) { for (i = 0; i < dsr_info->dbi_output_num; i++) { if (!mdfld_dbi_is_in_dsr(dev) && dbi_outputs[i] && !(dbi_outputs[i]->mode_flags & MODE_SETTING_ON_GOING)) { mdfld_dsi_dbi_enter_dsr(dbi_outputs[i], dbi_outputs[i]->channel_num ? 2 : 0); #if 0 enter_dsr = 1; pr_err("%s: enter_dsr = 1\n", __func__); #endif } } /*schedule rpm suspend after gfxrtdelay*/ #ifdef CONFIG_GFX_RTPM if (!dev_priv->rpm_enabled || !enter_dsr /* || (REG_READ(HDMIB_CONTROL) & HDMIB_PORT_EN) */ || pm_schedule_suspend(&dev->pdev->dev, gfxrtdelay)) dev_warn(dev->dev, "Runtime PM schedule suspend failed, rpm %d\n", dev_priv->rpm_enabled); #endif } }
static int smsc375x_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct smsc375x_chip *chip; int ret = 0, id_val = -1; chip = kzalloc(sizeof(struct smsc375x_chip), GFP_KERNEL); if (!chip) { dev_err(&client->dev, "failed to allocate driver data\n"); return -ENOMEM; } chip->client = client; #ifdef CONFIG_ACPI chip->pdata = smsc375x_platform_data(); #else chip->pdata = dev->platform_data; #endif i2c_set_clientdata(client, chip); wake_lock_init(&chip->wakelock, WAKE_LOCK_SUSPEND, "smsc375x_wakelock"); /* register with extcon */ chip->edev = kzalloc(sizeof(struct extcon_dev), GFP_KERNEL); if (!chip->edev) { dev_err(&client->dev, "mem alloc failed\n"); ret = -ENOMEM; goto extcon_mem_failed; } chip->edev->name = "smsc375x"; chip->edev->supported_cable = smsc375x_extcon_cable; ret = extcon_dev_register(chip->edev, &client->dev); if (ret) { dev_err(&client->dev, "extcon registration failed!!\n"); goto extcon_reg_failed; } /* register for EXTCON USB notification */ INIT_WORK(&chip->vbus_work, smsc375x_pwrsrc_event_worker); chip->vbus_nb.notifier_call = smsc375x_handle_pwrsrc_notification; ret = extcon_register_interest(&chip->cable_obj, NULL, SMSC375X_EXTCON_USB, &chip->vbus_nb); /* OTG notification */ chip->otg = usb_get_phy(USB_PHY_TYPE_USB2); if (!chip->otg) { dev_warn(&client->dev, "Failed to get otg transceiver!!\n"); goto otg_reg_failed; } INIT_WORK(&chip->otg_work, smsc375x_otg_event_worker); chip->id_nb.notifier_call = smsc375x_handle_otg_notification; ret = usb_register_notifier(chip->otg, &chip->id_nb); if (ret) { dev_err(&chip->client->dev, "failed to register otg notifier\n"); goto id_reg_failed; } ret = smsc375x_irq_init(chip); if (ret) goto intr_reg_failed; chip_ptr = chip; if (chip->otg->get_id_status) { ret = chip->otg->get_id_status(chip->otg, &id_val); if (ret < 0) { dev_warn(&client->dev, "otg get ID status failed:%d\n", ret); ret = 0; } } if (!id_val && !chip->id_short) atomic_notifier_call_chain(&chip->otg->notifier, USB_EVENT_ID, &id_val); else smsc375x_detect_dev(chip); /* Init Runtime PM State */ pm_runtime_put_noidle(&chip->client->dev); pm_schedule_suspend(&chip->client->dev, MSEC_PER_SEC); return 0; intr_reg_failed: usb_unregister_notifier(chip->otg, &chip->id_nb); id_reg_failed: usb_put_phy(chip->otg); otg_reg_failed: extcon_dev_unregister(chip->edev); extcon_reg_failed: kfree(chip->edev); extcon_mem_failed: kfree(chip); return ret; }
static int mmc_host_schedule_suspend(struct device *dev, unsigned int delay) { return pm_schedule_suspend(dev, delay); }
static int serial_hsu_runtime_idle(struct device *dev) { pm_schedule_suspend(dev, 500); return -EBUSY; }
static int lnw_gpio_runtime_idle(struct device *dev) { pm_schedule_suspend(dev, 500); return -EBUSY; }
/** * Power Management callback - power OFF */ static void pm_callback_power_off(kbase_device *kbdev) { #ifdef CONFIG_PM_RUNTIME pm_schedule_suspend(kbdev->osdev.dev, RUNTIME_PM_DELAY_TIME); #endif /* CONFIG_PM_RUNTIME */ }
static int fsa9285_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); struct device *dev = &client->dev; struct fsa9285_chip *chip; int ret = 0; if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) return -EIO; ret = fsa9285_read_reg(client, FSA9285_REG_DEVID); if (ret < 0 || ret != DEVID_VALUE) { dev_err(&client->dev, "fsa chip ID check failed:%d\n", ret); return -ENODEV; } chip = kzalloc(sizeof(struct fsa9285_chip), GFP_KERNEL); if (!chip) { dev_err(&client->dev, "failed to allocate driver data\n"); return -ENOMEM; } chip->client = client; chip->pdata = dev->platform_data; chip->pdata = fsa9285_platform_data(); i2c_set_clientdata(client, chip); chip_ptr = chip; /* register with extcon */ chip->edev = kzalloc(sizeof(struct extcon_dev), GFP_KERNEL); if (!chip->edev) { dev_err(&client->dev, "mem alloc failed\n"); ret = -ENOMEM; goto extcon_mem_failed; } chip->edev->name = "fsa9285"; chip->edev->supported_cable = fsa9285_extcon_cable; ret = extcon_dev_register(chip->edev, &client->dev); if (ret) { dev_err(&client->dev, "extcon registration failed!!\n"); goto extcon_reg_failed; } /* OTG notification */ chip->otg = usb_get_phy(USB_PHY_TYPE_USB2); if (!chip->otg) { dev_warn(&client->dev, "Failed to get otg transceiver!!\n"); goto otg_reg_failed; } chip->otg->a_bus_drop = fsa9285_vbus_cntl_state; ret = fsa9285_irq_init(chip); if (ret) goto intr_reg_failed; wake_lock_init(&chip->wakelock, WAKE_LOCK_SUSPEND, "fsa_charger_wakelock"); /* device detection */ ret = fsa9285_detect_dev(chip); if (ret < 0) dev_warn(&client->dev, "probe: detection failed\n"); /* Init Runtime PM State */ pm_runtime_put_noidle(&chip->client->dev); pm_schedule_suspend(&chip->client->dev, MSEC_PER_SEC); return 0; intr_reg_failed: if (client->irq) free_irq(client->irq, chip); /* WA for FFRD8 */ if (chip->pdata->mux_gpio != -1) gpio_free(chip->pdata->mux_gpio); /* gpio_req_failed: */ usb_put_phy(chip->otg); otg_reg_failed: extcon_dev_unregister(chip->edev); extcon_reg_failed: kfree(chip->edev); extcon_mem_failed: kfree(chip); return ret; }