blob: 7dd429ff9b32cb1c59974627f6fe9b6f5d23eae6 [file] [log] [blame]
Lucille Sylvester6e362412011-12-09 16:21:42 -07001/* Copyright (c) 2010-2012, Code Aurora Forum. All rights reserved.
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002 *
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
16/*****************************************************************************
17** power flags
18*****************************************************************************/
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070019#define KGSL_PWRFLAGS_ON 1
20#define KGSL_PWRFLAGS_OFF 0
21
22#define KGSL_PWRLEVEL_TURBO 0
23#define KGSL_PWRLEVEL_NOMINAL 1
Lucille Sylvester6e362412011-12-09 16:21:42 -070024#define KGSL_PWRLEVEL_LAST_OFFSET 2
Lucille Sylvester02e46292011-09-21 14:59:17 -060025
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070026#define KGSL_MAX_CLKS 5
27
28struct platform_device;
29
Suman Tatiraju7fe62a32011-07-14 16:40:37 -070030struct kgsl_busy {
31 struct timeval start;
32 struct timeval stop;
33 int on_time;
34 int time;
35 int on_time_old;
36 int time_old;
37 unsigned int no_nap_cnt;
38};
39
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070040struct kgsl_pwrctrl {
41 int interrupt_num;
42 int have_irq;
43 struct clk *ebi1_clk;
44 struct clk *grp_clks[KGSL_MAX_CLKS];
45 unsigned long power_flags;
46 struct kgsl_pwrlevel pwrlevels[KGSL_MAX_PWRLEVELS];
47 unsigned int active_pwrlevel;
48 int thermal_pwrlevel;
49 unsigned int num_pwrlevels;
50 unsigned int interval_timeout;
Lynus Vazfe4bede2012-04-06 11:53:30 -070051 bool strtstp_sleepwake;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070052 struct regulator *gpu_reg;
53 uint32_t pcl;
54 unsigned int nap_allowed;
Kedar Joshic11d0982012-02-07 10:59:49 +053055 unsigned int idle_needed;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070056 const char *regulator_name;
57 const char *irq_name;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070058 s64 time;
Suman Tatiraju7fe62a32011-07-14 16:40:37 -070059 struct kgsl_busy busy;
Suman Tatiraju24569022011-10-27 11:11:12 -070060 unsigned int restore_slumber;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070061};
62
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070063void kgsl_pwrctrl_irq(struct kgsl_device *device, int state);
64int kgsl_pwrctrl_init(struct kgsl_device *device);
65void kgsl_pwrctrl_close(struct kgsl_device *device);
66void kgsl_timer(unsigned long data);
67void kgsl_idle_check(struct work_struct *work);
68void kgsl_pre_hwaccess(struct kgsl_device *device);
69void kgsl_check_suspended(struct kgsl_device *device);
70int kgsl_pwrctrl_sleep(struct kgsl_device *device);
71void kgsl_pwrctrl_wake(struct kgsl_device *device);
72void kgsl_pwrctrl_pwrlevel_change(struct kgsl_device *device,
73 unsigned int level);
74int kgsl_pwrctrl_init_sysfs(struct kgsl_device *device);
75void kgsl_pwrctrl_uninit_sysfs(struct kgsl_device *device);
76void kgsl_pwrctrl_enable(struct kgsl_device *device);
77void kgsl_pwrctrl_disable(struct kgsl_device *device);
78static inline unsigned long kgsl_get_clkrate(struct clk *clk)
79{
80 return (clk != NULL) ? clk_get_rate(clk) : 0;
81}
82
Jeremy Gebben388c2972011-12-16 09:05:07 -070083void kgsl_pwrctrl_set_state(struct kgsl_device *device, unsigned int state);
84void kgsl_pwrctrl_request_state(struct kgsl_device *device, unsigned int state);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070085#endif /* __KGSL_PWRCTRL_H */