• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * omap-pm.h - OMAP power management interface
3  *
4  * Copyright (C) 2008-2010 Texas Instruments, Inc.
5  * Copyright (C) 2008-2010 Nokia Corporation
6  * Paul Walmsley
7  *
8  * Interface developed by (in alphabetical order): Karthik Dasu, Jouni
9  * Högander, Tony Lindgren, Rajendra Nayak, Sakari Poussa,
10  * Veeramanikandan Raju, Anand Sawant, Igor Stoppa, Paul Walmsley,
11  * Richard Woodruff
12  */
13 
14 #ifndef ASM_ARM_ARCH_OMAP_OMAP_PM_H
15 #define ASM_ARM_ARCH_OMAP_OMAP_PM_H
16 
17 #include <linux/device.h>
18 #include <linux/cpufreq.h>
19 #include <linux/clk.h>
20 #include <linux/pm_opp.h>
21 
22 /*
23  * agent_id values for use with omap_pm_set_min_bus_tput():
24  *
25  * OCP_INITIATOR_AGENT is only valid for devices that can act as
26  * initiators -- it represents the device's L3 interconnect
27  * connection.  OCP_TARGET_AGENT represents the device's L4
28  * interconnect connection.
29  */
30 #define OCP_TARGET_AGENT		1
31 #define OCP_INITIATOR_AGENT		2
32 
33 /**
34  * omap_pm_if_early_init - OMAP PM init code called before clock fw init
35  * @mpu_opp_table: array ptr to struct omap_opp for MPU
36  * @dsp_opp_table: array ptr to struct omap_opp for DSP
37  * @l3_opp_table : array ptr to struct omap_opp for CORE
38  *
39  * Initialize anything that must be configured before the clock
40  * framework starts.  The "_if_" is to avoid name collisions with the
41  * PM idle-loop code.
42  */
43 int __init omap_pm_if_early_init(void);
44 
45 /**
46  * omap_pm_if_init - OMAP PM init code called after clock fw init
47  *
48  * The main initialization code.  OPP tables are passed in here.  The
49  * "_if_" is to avoid name collisions with the PM idle-loop code.
50  */
51 int __init omap_pm_if_init(void);
52 
53 /*
54  * Device-driver-originated constraints (via board-*.c files, platform_data)
55  */
56 
57 
58 /**
59  * omap_pm_set_max_mpu_wakeup_lat - set the maximum MPU wakeup latency
60  * @dev: struct device * requesting the constraint
61  * @t: maximum MPU wakeup latency in microseconds
62  *
63  * Request that the maximum interrupt latency for the MPU to be no
64  * greater than @t microseconds. "Interrupt latency" in this case is
65  * defined as the elapsed time from the occurrence of a hardware or
66  * timer interrupt to the time when the device driver's interrupt
67  * service routine has been entered by the MPU.
68  *
69  * It is intended that underlying PM code will use this information to
70  * determine what power state to put the MPU powerdomain into, and
71  * possibly the CORE powerdomain as well, since interrupt handling
72  * code currently runs from SDRAM.  Advanced PM or board*.c code may
73  * also configure interrupt controller priorities, OCP bus priorities,
74  * CPU speed(s), etc.
75  *
76  * This function will not affect device wakeup latency, e.g., time
77  * elapsed from when a device driver enables a hardware device with
78  * clk_enable(), to when the device is ready for register access or
79  * other use.  To control this device wakeup latency, use
80  * omap_pm_set_max_dev_wakeup_lat()
81  *
82  * Multiple calls to omap_pm_set_max_mpu_wakeup_lat() will replace the
83  * previous t value.  To remove the latency target for the MPU, call
84  * with t = -1.
85  *
86  * XXX This constraint will be deprecated soon in favor of the more
87  * general omap_pm_set_max_dev_wakeup_lat()
88  *
89  * Returns -EINVAL for an invalid argument, -ERANGE if the constraint
90  * is not satisfiable, or 0 upon success.
91  */
92 int omap_pm_set_max_mpu_wakeup_lat(struct device *dev, long t);
93 
94 
95 /**
96  * omap_pm_set_min_bus_tput - set minimum bus throughput needed by device
97  * @dev: struct device * requesting the constraint
98  * @tbus_id: interconnect to operate on (OCP_{INITIATOR,TARGET}_AGENT)
99  * @r: minimum throughput (in KiB/s)
100  *
101  * Request that the minimum data throughput on the OCP interconnect
102  * attached to device @dev interconnect agent @tbus_id be no less
103  * than @r KiB/s.
104  *
105  * It is expected that the OMAP PM or bus code will use this
106  * information to set the interconnect clock to run at the lowest
107  * possible speed that satisfies all current system users.  The PM or
108  * bus code will adjust the estimate based on its model of the bus, so
109  * device driver authors should attempt to specify an accurate
110  * quantity for their device use case, and let the PM or bus code
111  * overestimate the numbers as necessary to handle request/response
112  * latency, other competing users on the system, etc.  On OMAP2/3, if
113  * a driver requests a minimum L4 interconnect speed constraint, the
114  * code will also need to add an minimum L3 interconnect speed
115  * constraint,
116  *
117  * Multiple calls to omap_pm_set_min_bus_tput() will replace the
118  * previous rate value for this device.  To remove the interconnect
119  * throughput restriction for this device, call with r = 0.
120  *
121  * Returns -EINVAL for an invalid argument, -ERANGE if the constraint
122  * is not satisfiable, or 0 upon success.
123  */
124 int omap_pm_set_min_bus_tput(struct device *dev, u8 agent_id, unsigned long r);
125 
126 
127 /*
128  * CPUFreq-originated constraint
129  *
130  * In the future, this should be handled by custom OPP clocktype
131  * functions.
132  */
133 
134 
135 /*
136  * Device context loss tracking
137  */
138 
139 /**
140  * omap_pm_get_dev_context_loss_count - return count of times dev has lost ctx
141  * @dev: struct device *
142  *
143  * This function returns the number of times that the device @dev has
144  * lost its internal context.  This generally occurs on a powerdomain
145  * transition to OFF.  Drivers use this as an optimization to avoid restoring
146  * context if the device hasn't lost it.  To use, drivers should initially
147  * call this in their context save functions and store the result.  Early in
148  * the driver's context restore function, the driver should call this function
149  * again, and compare the result to the stored counter.  If they differ, the
150  * driver must restore device context.   If the number of context losses
151  * exceeds the maximum positive integer, the function will wrap to 0 and
152  * continue counting.  Returns the number of context losses for this device,
153  * or negative value upon error.
154  */
155 int omap_pm_get_dev_context_loss_count(struct device *dev);
156 
157 void omap_pm_enable_off_mode(void);
158 void omap_pm_disable_off_mode(void);
159 
160 #endif
161