/** * omap_device_idle - idle an omap_device * @od: struct omap_device * to idle * * Idle omap_device @od by calling as many .deactivate_func() entries * in the omap_device's pm_lats table as is possible without exceeding * the device's maximum wakeup latency limit, pm_lat_limit. Device * drivers should call this function (through platform_data function * pointers) where they would normally disable clocks after operations * complete, etc.. Returns -EINVAL if the omap_device is not * currently enabled, or passes along the return value of * _omap_device_deactivate(). */ int omap_device_idle(struct platform_device *pdev) { int ret; struct omap_device *od; od = _find_by_pdev(pdev); if (od->_state != OMAP_DEVICE_STATE_ENABLED) { WARN(1, "omap_device: %s.%d: %s() called from invalid state %d\n", od->pdev.name, od->pdev.id, __func__, od->_state); return -EINVAL; } ret = _omap_device_deactivate(od, USE_WAKEUP_LAT); od->_state = OMAP_DEVICE_STATE_IDLE; return ret; }
/** * omap_device_idle - idle an omap_device * @od: struct omap_device * to idle * * Idle omap_device @od by calling as many .deactivate_func() entries * in the omap_device's pm_lats table as is possible without exceeding * the device's maximum wakeup latency limit, pm_lat_limit. Device * drivers should call this function (through platform_data function * pointers) where they would normally disable clocks after operations * complete, etc.. Returns -EINVAL if the omap_device is not * currently enabled, or passes along the return value of * _omap_device_deactivate(). */ int omap_device_idle(struct platform_device *pdev) { int ret; struct omap_device *od; od = to_omap_device(pdev); if (od->_state != OMAP_DEVICE_STATE_ENABLED) { dev_warn(&pdev->dev, "omap_device: %s() called from invalid state %d\n", __func__, od->_state); return -EINVAL; } ret = _omap_device_deactivate(od, USE_WAKEUP_LAT); od->_state = OMAP_DEVICE_STATE_IDLE; return ret; }
/** * omap_device_align_pm_lat - activate/deactivate device to match wakeup lat lim * @od: struct omap_device * * * When a device's maximum wakeup latency limit changes, call some of * the .activate_func or .deactivate_func function pointers in the * omap_device's pm_lats array to ensure that the device's maximum * wakeup latency is less than or equal to the new latency limit. * Intended to be called by OMAP PM code whenever a device's maximum * wakeup latency limit changes (e.g., via * omap_pm_set_dev_wakeup_lat()). Returns 0 if nothing needs to be * done (e.g., if the omap_device is not currently idle, or if the * wakeup latency is already current with the new limit) or passes * along the return value of _omap_device_deactivate() or * _omap_device_activate(). */ int omap_device_align_pm_lat(struct platform_device *pdev, u32 new_wakeup_lat_limit) { int ret = -EINVAL; struct omap_device *od; od = _find_by_pdev(pdev); if (new_wakeup_lat_limit == od->dev_wakeup_lat) return 0; od->_dev_wakeup_lat_limit = new_wakeup_lat_limit; if (od->_state != OMAP_DEVICE_STATE_IDLE) return 0; else if (new_wakeup_lat_limit > od->dev_wakeup_lat) ret = _omap_device_deactivate(od, USE_WAKEUP_LAT); else if (new_wakeup_lat_limit < od->dev_wakeup_lat) ret = _omap_device_activate(od, USE_WAKEUP_LAT); return ret; }
/** * omap_device_shutdown - shut down an omap_device * @od: struct omap_device * to shut down * * Shut down omap_device @od by calling all .deactivate_func() entries * in the omap_device's pm_lats table and then shutting down all of * the underlying omap_hwmods. Used when a device is being "removed" * or a device driver is being unloaded. Returns -EINVAL if the * omap_device is not currently enabled or idle, or passes along the * return value of _omap_device_deactivate(). */ int omap_device_shutdown(struct platform_device *pdev) { int ret, i; struct omap_device *od; od = _find_by_pdev(pdev); if (od->_state != OMAP_DEVICE_STATE_ENABLED && od->_state != OMAP_DEVICE_STATE_IDLE) { WARN(1, "omap_device: %s.%d: %s() called from invalid state %d\n", od->pdev.name, od->pdev.id, __func__, od->_state); return -EINVAL; } ret = _omap_device_deactivate(od, IGNORE_WAKEUP_LAT); for (i = 0; i < od->hwmods_cnt; i++) omap_hwmod_shutdown(od->hwmods[i]); od->_state = OMAP_DEVICE_STATE_SHUTDOWN; return ret; }