blob: 6ea691bcffcab5e1ba28788ed754b1d14199f6aa [file] [log] [blame]
Matt Wagantall6d9ebee2011-08-26 12:15:24 -07001/*
2 * MSM architecture CPU clock driver header
Daniel Walker43b39f92010-03-03 08:54:11 -08003 *
4 * Copyright (C) 2007 Google, Inc.
Matt Wagantall6d9ebee2011-08-26 12:15:24 -07005 * Copyright (c) 2007-2011, Code Aurora Forum. All rights reserved.
Daniel Walker43b39f92010-03-03 08:54:11 -08006 * Author: San Mehat <san@android.com>
7 *
8 * This software is licensed under the terms of the GNU General Public
9 * License version 2, as published by the Free Software Foundation, and
10 * may be copied, distributed, and modified under those terms.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 */
18
19#ifndef __ARCH_ARM_MACH_MSM_ACPUCLOCK_H
20#define __ARCH_ARM_MACH_MSM_ACPUCLOCK_H
21
Matt Wagantall6d9ebee2011-08-26 12:15:24 -070022/**
23 * enum setrate_reason - Reasons for use with acpuclk_set_rate()
24 */
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070025enum setrate_reason {
26 SETRATE_CPUFREQ = 0,
27 SETRATE_SWFI,
28 SETRATE_PC,
29 SETRATE_HOTPLUG,
30 SETRATE_INIT,
31};
32
Matt Wagantall6d9ebee2011-08-26 12:15:24 -070033/**
Matt Wagantallec57f062011-08-16 23:54:46 -070034 * struct acpuclk_soc_data - SoC data for acpuclk_init()
Matt Wagantall6d9ebee2011-08-26 12:15:24 -070035 */
Matt Wagantallec57f062011-08-16 23:54:46 -070036struct acpuclk_soc_data {
Matt Wagantall6d9ebee2011-08-26 12:15:24 -070037 unsigned long max_speed_delta_khz;
Matt Wagantall6d9ebee2011-08-26 12:15:24 -070038 unsigned int max_axi_khz;
Matt Wagantallec57f062011-08-16 23:54:46 -070039 int (*init)(struct acpuclk_soc_data *);
Matt Wagantall6d9ebee2011-08-26 12:15:24 -070040};
41
42/**
43 * struct acpuclk_data - Function pointers and data for function implementations
44 */
45struct acpuclk_data {
46 unsigned long (*get_rate)(int cpu);
47 int (*set_rate)(int cpu, unsigned long rate, enum setrate_reason);
48 uint32_t switch_time_us;
49 unsigned long power_collapse_khz;
50 unsigned long wait_for_irq_khz;
51};
52
53/**
54 * acpulock_get_rate() - Get a CPU's clock rate in KHz
55 * @cpu: CPU to query the rate of
56 */
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070057unsigned long acpuclk_get_rate(int cpu);
Matt Wagantall6d9ebee2011-08-26 12:15:24 -070058
59/**
60 * acpuclk_set_rate() - Set a CPU's clock rate
61 * @cpu: CPU to set rate of
62 * @rate: Desired rate in KHz
63 * @setrate_reason: Reason for the rate switch
64 *
65 * Returns 0 for success.
66 */
67int acpuclk_set_rate(int cpu, unsigned long rate, enum setrate_reason);
68
69/**
70 * acpuclk_get_switch_time() - Query estimated time in us for a CPU rate switch
71 */
Daniel Walker43b39f92010-03-03 08:54:11 -080072uint32_t acpuclk_get_switch_time(void);
Matt Wagantall6d9ebee2011-08-26 12:15:24 -070073
74/**
75 * acpuclk_power_collapse() - Prepare current CPU clocks for power-collapse
76 *
77 * Returns the previous rate of the CPU in KHz.
78 */
Daniel Walker43b39f92010-03-03 08:54:11 -080079unsigned long acpuclk_power_collapse(void);
Daniel Walker43b39f92010-03-03 08:54:11 -080080
Matt Wagantall6d9ebee2011-08-26 12:15:24 -070081/**
82 * acpuclk_wait_for_irq() - Prepare current CPU clocks for SWFI
83 *
84 * Returns the previous rate of the CPU in KHz.
85 */
86unsigned long acpuclk_wait_for_irq(void);
87
88/**
89 * acpuclk_register() - Register acpuclk_data function implementations
90 * @data: acpuclock API implementations and data
91 */
92void acpuclk_register(struct acpuclk_data *data);
93
94/**
95 * acpuclk_init() - acpuclock driver initialization function
96 *
97 * Return 0 for success.
98 */
Matt Wagantallec57f062011-08-16 23:54:46 -070099int acpuclk_init(struct acpuclk_soc_data *);
Matt Wagantall6d9ebee2011-08-26 12:15:24 -0700100
101/* SoC-specific acpuclock initialization functions. */
Matt Wagantallec57f062011-08-16 23:54:46 -0700102extern struct acpuclk_soc_data acpuclk_7x27_soc_data;
103extern struct acpuclk_soc_data acpuclk_7x27a_soc_data;
104extern struct acpuclk_soc_data acpuclk_7x27aa_soc_data;
Matt Wagantallec57f062011-08-16 23:54:46 -0700105extern struct acpuclk_soc_data acpuclk_7x30_soc_data;
106extern struct acpuclk_soc_data acpuclk_8x50_soc_data;
107extern struct acpuclk_soc_data acpuclk_8x60_soc_data;
108extern struct acpuclk_soc_data acpuclk_8960_soc_data;
109extern struct acpuclk_soc_data acpuclk_9xxx_soc_data;
Matt Wagantall44f672e2011-09-07 20:31:16 -0700110extern struct acpuclk_soc_data acpuclk_9615_soc_data;
Tianyi Gou7c6b81f2011-12-07 23:09:08 -0800111extern struct acpuclk_soc_data acpuclk_8930_soc_data;
Matt Wagantall44f672e2011-09-07 20:31:16 -0700112
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700113#endif