/*
* Copyright (C) 2012 Texas Instruments, Inc
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 as published by
* the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see .
*/
#ifndef SGXFREQ_H
#define SGXFREQ_H
#include
#include
#define SGXFREQ_NAME_LEN 16
//#define SGXFREQ_DEBUG_FTRACE
#if defined(SGXFREQ_DEBUG_FTRACE)
#define SGXFREQ_TRACE(...) trace_printk(__VA_ARGS__)
#else
#define SGXFREQ_TRACE(...)
#endif
struct sgxfreq_sgx_data {
bool clk_on;
bool active;
};
struct sgxfreq_governor {
char name[SGXFREQ_NAME_LEN];
int (*gov_start) (struct sgxfreq_sgx_data *data);
void (*gov_stop) (void);
void (*sgx_clk_on) (void);
void (*sgx_clk_off) (void);
void (*sgx_active) (void);
void (*sgx_idle) (void);
void (*sgx_frame_done) (void);
struct list_head governor_list;
};
/* sgxfreq_init must be called before any other api */
int sgxfreq_init(struct device *dev);
int sgxfreq_deinit(void);
int sgxfreq_register_governor(struct sgxfreq_governor *governor);
void sgxfreq_unregister_governor(struct sgxfreq_governor *governor);
int sgxfreq_set_governor(const char *name);
int sgxfreq_get_freq_list(unsigned long **pfreq_list);
unsigned long sgxfreq_get_freq_min(void);
unsigned long sgxfreq_get_freq_max(void);
unsigned long sgxfreq_get_freq_floor(unsigned long freq);
unsigned long sgxfreq_get_freq_ceil(unsigned long freq);
unsigned long sgxfreq_get_freq(void);
unsigned long sgxfreq_get_freq_request(void);
unsigned long sgxfreq_get_freq_limit(void);
unsigned long sgxfreq_set_freq_request(unsigned long freq_request);
unsigned long sgxfreq_set_freq_limit(unsigned long freq_limit);
unsigned long sgxfreq_get_total_active_time(void);
unsigned long sgxfreq_get_total_idle_time(void);
/* Helper functions */
static inline unsigned long __tv2msec(struct timeval tv)
{
return (tv.tv_sec * 1000) + (tv.tv_usec / 1000);
}
static inline unsigned long __delta32(unsigned long a, unsigned long b)
{
if (a >= b)
return a - b;
else
return 1 + (0xFFFFFFFF - b) + a;
}
/* External notifications to sgxfreq */
void sgxfreq_notif_sgx_clk_on(void);
void sgxfreq_notif_sgx_clk_off(void);
void sgxfreq_notif_sgx_active(void);
void sgxfreq_notif_sgx_idle(void);
void sgxfreq_notif_sgx_frame_done(void);
#endif