blob: 8d66505cd5dbf4d5705d9d0924cc02a737f8dcc0 [file] [log] [blame]
Flemmard9fc10142013-04-10 15:59:59 +02001/* Copyright (c) 2010-2012, The Linux Foundation. All rights reserved.
Nicholas Flintham1e3d3112013-04-10 10:48:38 +01002 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 */
13#ifndef __KGSL_PWRCTRL_H
14#define __KGSL_PWRCTRL_H
15
Flemmard9fc10142013-04-10 15:59:59 +020016/*****************************************************************************
17** power flags
18*****************************************************************************/
Nicholas Flintham1e3d3112013-04-10 10:48:38 +010019#define KGSL_PWRFLAGS_ON 1
20#define KGSL_PWRFLAGS_OFF 0
21
22#define KGSL_PWRLEVEL_TURBO 0
23#define KGSL_PWRLEVEL_NOMINAL 1
24#define KGSL_PWRLEVEL_LAST_OFFSET 2
25
26#define KGSL_MAX_CLKS 5
27
28struct platform_device;
29
Flemmard9fc10142013-04-10 15:59:59 +020030struct kgsl_clk_stats {
31 unsigned int old_clock_time[KGSL_MAX_PWRLEVELS];
32 unsigned int clock_time[KGSL_MAX_PWRLEVELS];
33 unsigned int on_time_old;
34 ktime_t start;
35 ktime_t stop;
Nicholas Flintham1e3d3112013-04-10 10:48:38 +010036 unsigned int no_nap_cnt;
Flemmard9fc10142013-04-10 15:59:59 +020037 unsigned int elapsed;
38 unsigned int elapsed_old;
Nicholas Flintham1e3d3112013-04-10 10:48:38 +010039};
40
Flemmard9fc10142013-04-10 15:59:59 +020041/**
42 * struct kgsl_pwrctrl - Power control settings for a KGSL device
43 * @interrupt_num - The interrupt number for the device
44 * @ebi1_clk - Pointer to the EBI clock structure
45 * @grp_clks - Array of clocks structures that we control
46 * @power_flags - Control flags for power
47 * @pwrlevels - List of supported power levels
48 * @active_pwrlevel - The currently active power level
49 * @thermal_pwrlevel - maximum powerlevel constraint from thermal
50 * @max_pwrlevel - maximum allowable powerlevel per the user
51 * @min_pwrlevel - minimum allowable powerlevel per the user
52 * @num_pwrlevels - number of available power levels
53 * @interval_timeout - timeout in jiffies to be idle before a power event
54 * @strtstp_sleepwake - true if the device supports low latency GPU start/stop
55 * @gpu_reg - pointer to the regulator structure for gpu_reg
56 * @gpu_cx - pointer to the regulator structure for gpu_cx
57 * @pcl - bus scale identifier
58 * @nap_allowed - true if the device supports naps
59 * @idle_needed - true if the device needs a idle before clock change
60 * @irq_name - resource name for the IRQ
61 * @restore_slumber - Flag to indicate that we are in a suspend/restore sequence
62 * @clk_stats - structure of clock statistics
63 */
64
Nicholas Flintham1e3d3112013-04-10 10:48:38 +010065struct kgsl_pwrctrl {
66 int interrupt_num;
67 struct clk *ebi1_clk;
68 struct clk *grp_clks[KGSL_MAX_CLKS];
69 unsigned long power_flags;
70 struct kgsl_pwrlevel pwrlevels[KGSL_MAX_PWRLEVELS];
71 unsigned int active_pwrlevel;
72 int thermal_pwrlevel;
73 unsigned int default_pwrlevel;
Flemmard9fc10142013-04-10 15:59:59 +020074 unsigned int max_pwrlevel;
75 unsigned int min_pwrlevel;
Nicholas Flintham1e3d3112013-04-10 10:48:38 +010076 unsigned int num_pwrlevels;
77 unsigned int interval_timeout;
78 bool strtstp_sleepwake;
79 struct regulator *gpu_reg;
Flemmard9fc10142013-04-10 15:59:59 +020080 struct regulator *gpu_cx;
Nicholas Flintham1e3d3112013-04-10 10:48:38 +010081 uint32_t pcl;
82 unsigned int nap_allowed;
83 unsigned int idle_needed;
84 const char *irq_name;
85 s64 time;
Nicholas Flintham1e3d3112013-04-10 10:48:38 +010086 unsigned int restore_slumber;
Flemmard9fc10142013-04-10 15:59:59 +020087 struct kgsl_clk_stats clk_stats;
Nicholas Flintham1e3d3112013-04-10 10:48:38 +010088};
89
90void kgsl_pwrctrl_irq(struct kgsl_device *device, int state);
91int kgsl_pwrctrl_init(struct kgsl_device *device);
92void kgsl_pwrctrl_close(struct kgsl_device *device);
93void kgsl_timer(unsigned long data);
94void kgsl_idle_check(struct work_struct *work);
95void kgsl_pre_hwaccess(struct kgsl_device *device);
96void kgsl_check_suspended(struct kgsl_device *device);
97int kgsl_pwrctrl_sleep(struct kgsl_device *device);
98void kgsl_pwrctrl_wake(struct kgsl_device *device);
99void kgsl_pwrctrl_pwrlevel_change(struct kgsl_device *device,
100 unsigned int level);
101int kgsl_pwrctrl_init_sysfs(struct kgsl_device *device);
102void kgsl_pwrctrl_uninit_sysfs(struct kgsl_device *device);
103void kgsl_pwrctrl_enable(struct kgsl_device *device);
104void kgsl_pwrctrl_disable(struct kgsl_device *device);
105static inline unsigned long kgsl_get_clkrate(struct clk *clk)
106{
107 return (clk != NULL) ? clk_get_rate(clk) : 0;
108}
109
110void kgsl_pwrctrl_set_state(struct kgsl_device *device, unsigned int state);
111void kgsl_pwrctrl_request_state(struct kgsl_device *device, unsigned int state);
Flemmard9fc10142013-04-10 15:59:59 +0200112#endif /* __KGSL_PWRCTRL_H */