linux/arch/arm/mach-omap2/omap-pm-noop.c
<<
>>
Prefs
   1/*
   2 * omap-pm-noop.c - OMAP power management interface - dummy version
   3 *
   4 * This code implements the OMAP power management interface to
   5 * drivers, CPUIdle, CPUFreq, and DSP Bridge.  It is strictly for
   6 * debug/demonstration use, as it does nothing but printk() whenever a
   7 * function is called (when DEBUG is defined, below)
   8 *
   9 * Copyright (C) 2008-2009 Texas Instruments, Inc.
  10 * Copyright (C) 2008-2009 Nokia Corporation
  11 * Paul Walmsley
  12 *
  13 * Interface developed by (in alphabetical order):
  14 * Karthik Dasu, Tony Lindgren, Rajendra Nayak, Sakari Poussa, Veeramanikandan
  15 * Raju, Anand Sawant, Igor Stoppa, Paul Walmsley, Richard Woodruff
  16 */
  17
  18#undef DEBUG
  19
  20#include <linux/init.h>
  21#include <linux/cpufreq.h>
  22#include <linux/device.h>
  23#include <linux/platform_device.h>
  24
  25#include "omap_device.h"
  26#include "omap-pm.h"
  27
  28static bool off_mode_enabled;
  29static int dummy_context_loss_counter;
  30
  31/*
  32 * Device-driver-originated constraints (via board-*.c files)
  33 */
  34
  35int omap_pm_set_max_mpu_wakeup_lat(struct device *dev, long t)
  36{
  37        if (!dev || t < -1) {
  38                WARN(1, "OMAP PM: %s: invalid parameter(s)", __func__);
  39                return -EINVAL;
  40        }
  41
  42        if (t == -1)
  43                pr_debug("OMAP PM: remove max MPU wakeup latency constraint: dev %s\n",
  44                         dev_name(dev));
  45        else
  46                pr_debug("OMAP PM: add max MPU wakeup latency constraint: dev %s, t = %ld usec\n",
  47                         dev_name(dev), t);
  48
  49        /*
  50         * For current Linux, this needs to map the MPU to a
  51         * powerdomain, then go through the list of current max lat
  52         * constraints on the MPU and find the smallest.  If
  53         * the latency constraint has changed, the code should
  54         * recompute the state to enter for the next powerdomain
  55         * state.
  56         *
  57         * TI CDP code can call constraint_set here.
  58         */
  59
  60        return 0;
  61}
  62
  63int omap_pm_set_min_bus_tput(struct device *dev, u8 agent_id, unsigned long r)
  64{
  65        if (!dev || (agent_id != OCP_INITIATOR_AGENT &&
  66            agent_id != OCP_TARGET_AGENT)) {
  67                WARN(1, "OMAP PM: %s: invalid parameter(s)", __func__);
  68                return -EINVAL;
  69        }
  70
  71        if (r == 0)
  72                pr_debug("OMAP PM: remove min bus tput constraint: dev %s for agent_id %d\n",
  73                         dev_name(dev), agent_id);
  74        else
  75                pr_debug("OMAP PM: add min bus tput constraint: dev %s for agent_id %d: rate %ld KiB\n",
  76                         dev_name(dev), agent_id, r);
  77
  78        /*
  79         * This code should model the interconnect and compute the
  80         * required clock frequency, convert that to a VDD2 OPP ID, then
  81         * set the VDD2 OPP appropriately.
  82         *
  83         * TI CDP code can call constraint_set here on the VDD2 OPP.
  84         */
  85
  86        return 0;
  87}
  88
  89/*
  90 * DSP Bridge-specific constraints
  91 */
  92
  93
  94/**
  95 * omap_pm_enable_off_mode - notify OMAP PM that off-mode is enabled
  96 *
  97 * Intended for use only by OMAP PM core code to notify this layer
  98 * that off mode has been enabled.
  99 */
 100void omap_pm_enable_off_mode(void)
 101{
 102        off_mode_enabled = true;
 103}
 104
 105/**
 106 * omap_pm_disable_off_mode - notify OMAP PM that off-mode is disabled
 107 *
 108 * Intended for use only by OMAP PM core code to notify this layer
 109 * that off mode has been disabled.
 110 */
 111void omap_pm_disable_off_mode(void)
 112{
 113        off_mode_enabled = false;
 114}
 115
 116/*
 117 * Device context loss tracking
 118 */
 119
 120#ifdef CONFIG_ARCH_OMAP2PLUS
 121
 122int omap_pm_get_dev_context_loss_count(struct device *dev)
 123{
 124        struct platform_device *pdev = to_platform_device(dev);
 125        int count;
 126
 127        if (WARN_ON(!dev))
 128                return -ENODEV;
 129
 130        if (dev->pm_domain == &omap_device_pm_domain) {
 131                count = omap_device_get_context_loss_count(pdev);
 132        } else {
 133                WARN_ONCE(off_mode_enabled, "omap_pm: using dummy context loss counter; device %s should be converted to omap_device",
 134                          dev_name(dev));
 135
 136                count = dummy_context_loss_counter;
 137
 138                if (off_mode_enabled) {
 139                        count++;
 140                        /*
 141                         * Context loss count has to be a non-negative value.
 142                         * Clear the sign bit to get a value range from 0 to
 143                         * INT_MAX.
 144                         */
 145                        count &= INT_MAX;
 146                        dummy_context_loss_counter = count;
 147                }
 148        }
 149
 150        pr_debug("OMAP PM: context loss count for dev %s = %d\n",
 151                 dev_name(dev), count);
 152
 153        return count;
 154}
 155
 156#else
 157
 158int omap_pm_get_dev_context_loss_count(struct device *dev)
 159{
 160        return dummy_context_loss_counter;
 161}
 162
 163#endif
 164
 165/* Should be called before clk framework init */
 166int __init omap_pm_if_early_init(void)
 167{
 168        return 0;
 169}
 170
 171/* Must be called after clock framework is initialized */
 172int __init omap_pm_if_init(void)
 173{
 174        return 0;
 175}
 176