Commit | Line | Data |
---|---|---|
c0407a96 PW |
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> | |
c80705aa | 23 | #include <linux/platform_device.h> |
c0407a96 | 24 | |
6e740f9a TL |
25 | #include "omap_device.h" |
26 | #include "omap-pm.h" | |
c0407a96 | 27 | |
6081dc34 | 28 | static bool off_mode_enabled; |
fc013873 | 29 | static int dummy_context_loss_counter; |
6081dc34 | 30 | |
c0407a96 PW |
31 | /* |
32 | * Device-driver-originated constraints (via board-*.c files) | |
33 | */ | |
34 | ||
564889c1 | 35 | int omap_pm_set_max_mpu_wakeup_lat(struct device *dev, long t) |
c0407a96 PW |
36 | { |
37 | if (!dev || t < -1) { | |
564889c1 PW |
38 | WARN(1, "OMAP PM: %s: invalid parameter(s)", __func__); |
39 | return -EINVAL; | |
59c27953 | 40 | } |
c0407a96 PW |
41 | |
42 | if (t == -1) | |
7852ec05 PW |
43 | pr_debug("OMAP PM: remove max MPU wakeup latency constraint: dev %s\n", |
44 | dev_name(dev)); | |
c0407a96 | 45 | else |
7852ec05 PW |
46 | pr_debug("OMAP PM: add max MPU wakeup latency constraint: dev %s, t = %ld usec\n", |
47 | dev_name(dev), t); | |
c0407a96 PW |
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 | */ | |
564889c1 PW |
59 | |
60 | return 0; | |
c0407a96 PW |
61 | } |
62 | ||
564889c1 | 63 | int omap_pm_set_min_bus_tput(struct device *dev, u8 agent_id, unsigned long r) |
c0407a96 PW |
64 | { |
65 | if (!dev || (agent_id != OCP_INITIATOR_AGENT && | |
66 | agent_id != OCP_TARGET_AGENT)) { | |
564889c1 PW |
67 | WARN(1, "OMAP PM: %s: invalid parameter(s)", __func__); |
68 | return -EINVAL; | |
59c27953 | 69 | } |
c0407a96 PW |
70 | |
71 | if (r == 0) | |
7852ec05 PW |
72 | pr_debug("OMAP PM: remove min bus tput constraint: dev %s for agent_id %d\n", |
73 | dev_name(dev), agent_id); | |
c0407a96 | 74 | else |
7852ec05 | 75 | pr_debug("OMAP PM: add min bus tput constraint: dev %s for agent_id %d: rate %ld KiB\n", |
c0407a96 PW |
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 | */ | |
564889c1 PW |
85 | |
86 | return 0; | |
c0407a96 PW |
87 | } |
88 | ||
c0407a96 PW |
89 | /* |
90 | * DSP Bridge-specific constraints | |
91 | */ | |
92 | ||
c0407a96 | 93 | |
6081dc34 KH |
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 | */ | |
100 | void 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 | */ | |
111 | void omap_pm_disable_off_mode(void) | |
112 | { | |
113 | off_mode_enabled = false; | |
114 | } | |
115 | ||
c0407a96 PW |
116 | /* |
117 | * Device context loss tracking | |
118 | */ | |
119 | ||
6081dc34 KH |
120 | #ifdef CONFIG_ARCH_OMAP2PLUS |
121 | ||
fc013873 | 122 | int omap_pm_get_dev_context_loss_count(struct device *dev) |
c0407a96 | 123 | { |
c80705aa | 124 | struct platform_device *pdev = to_platform_device(dev); |
fc013873 | 125 | int count; |
c0407a96 | 126 | |
c80705aa | 127 | if (WARN_ON(!dev)) |
fc013873 | 128 | return -ENODEV; |
c0407a96 | 129 | |
3ec2decb | 130 | if (dev->pm_domain == &omap_device_pm_domain) { |
6081dc34 KH |
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)); | |
fc013873 | 135 | |
6081dc34 | 136 | count = dummy_context_loss_counter; |
fc013873 TV |
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 | } | |
6081dc34 KH |
148 | } |
149 | ||
c80705aa KH |
150 | pr_debug("OMAP PM: context loss count for dev %s = %d\n", |
151 | dev_name(dev), count); | |
c0407a96 | 152 | |
c80705aa | 153 | return count; |
c0407a96 PW |
154 | } |
155 | ||
6081dc34 KH |
156 | #else |
157 | ||
fc013873 | 158 | int omap_pm_get_dev_context_loss_count(struct device *dev) |
6081dc34 KH |
159 | { |
160 | return dummy_context_loss_counter; | |
161 | } | |
162 | ||
163 | #endif | |
c0407a96 PW |
164 | |
165 | /* Should be called before clk framework init */ | |
53da4ce2 | 166 | int __init omap_pm_if_early_init(void) |
c0407a96 | 167 | { |
c0407a96 PW |
168 | return 0; |
169 | } | |
170 | ||
171 | /* Must be called after clock framework is initialized */ | |
172 | int __init omap_pm_if_init(void) | |
173 | { | |
174 | return 0; | |
175 | } |