blob: d2838610c807a98f4ff70142989a38f0d4beca66 [file] [log] [blame]
Deepak Katragadda92862ca2013-06-21 14:36:18 -07001/* Copyright (c) 2010-2013, The Linux Foundation. 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
14#ifndef __ARCH_ARM_MACH_MSM_CLOCK_RPM_H
15#define __ARCH_ARM_MACH_MSM_CLOCK_RPM_H
16
17#include <mach/rpm.h>
Vikram Mulukutlaa085dc82012-05-18 11:21:44 -070018#include <mach/rpm-smd.h>
Matt Wagantall33d01f52012-02-23 23:27:44 -080019#include <mach/clk-provider.h>
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070020
Vikram Mulukutla4aba6c02012-07-10 11:12:05 -070021#define RPM_SMD_KEY_RATE 0x007A484B
22#define RPM_SMD_KEY_ENABLE 0x62616E45
Vikram Mulukutla0f63e002012-06-28 14:29:44 -070023#define RPM_SMD_KEY_STATE 0x54415453
Vikram Mulukutla4aba6c02012-07-10 11:12:05 -070024
Vikram Mulukutla80b7ab52012-07-26 19:03:15 -070025#define RPM_CLK_BUFFER_A_REQ 0x616B6C63
26#define RPM_KEY_SOFTWARE_ENABLE 0x6E657773
27#define RPM_KEY_PIN_CTRL_CLK_BUFFER_ENABLE_KEY 0x62636370
28
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070029struct clk_ops;
Vikram Mulukutla0f44f922012-05-16 21:52:26 -070030struct clk_rpmrs_data;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070031extern struct clk_ops clk_ops_rpm;
Stephen Boyda6835112012-01-26 14:40:05 -080032extern struct clk_ops clk_ops_rpm_branch;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070033
34struct rpm_clk {
Vikram Mulukutlaa085dc82012-05-18 11:21:44 -070035 const int rpm_res_type;
Vikram Mulukutla4aba6c02012-07-10 11:12:05 -070036 const int rpm_key;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070037 const int rpm_clk_id;
38 const int rpm_status_id;
39 const bool active_only;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070040 bool enabled;
Stephen Boyda6835112012-01-26 14:40:05 -080041 bool branch; /* true: RPM only accepts 1 for ON and 0 for OFF */
Vikram Mulukutla0f44f922012-05-16 21:52:26 -070042 struct clk_rpmrs_data *rpmrs_data;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070043 struct rpm_clk *peer;
44 struct clk c;
45};
46
47static inline struct rpm_clk *to_rpm_clk(struct clk *clk)
48{
49 return container_of(clk, struct rpm_clk, c);
50}
51
Tianyi Gou71340912012-10-09 19:35:01 -070052/*
53 * RPM scaling enable function used for target that has an RPM resource for
54 * rpm clock scaling enable.
55 */
56void enable_rpm_scaling(void);
57
Vikram Mulukutla0f44f922012-05-16 21:52:26 -070058extern struct clk_rpmrs_data clk_rpmrs_data;
Vikram Mulukutlaa085dc82012-05-18 11:21:44 -070059extern struct clk_rpmrs_data clk_rpmrs_data_smd;
Vikram Mulukutla0f44f922012-05-16 21:52:26 -070060
Vikram Mulukutla4aba6c02012-07-10 11:12:05 -070061#define __DEFINE_CLK_RPM(name, active, type, r_id, stat_id, dep, key, \
62 rpmrsdata) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070063 static struct rpm_clk active; \
64 static struct rpm_clk name = { \
Vikram Mulukutlaa085dc82012-05-18 11:21:44 -070065 .rpm_res_type = (type), \
66 .rpm_clk_id = (r_id), \
67 .rpm_status_id = (stat_id), \
Vikram Mulukutla4aba6c02012-07-10 11:12:05 -070068 .rpm_key = (key), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070069 .peer = &active, \
Vikram Mulukutlaa085dc82012-05-18 11:21:44 -070070 .rpmrs_data = (rpmrsdata),\
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070071 .c = { \
72 .ops = &clk_ops_rpm, \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070073 .dbg_name = #name, \
74 CLK_INIT(name.c), \
Matt Wagantall735f01a2011-08-12 12:40:28 -070075 .depends = dep, \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070076 }, \
77 }; \
78 static struct rpm_clk active = { \
Vikram Mulukutlaa085dc82012-05-18 11:21:44 -070079 .rpm_res_type = (type), \
80 .rpm_clk_id = (r_id), \
81 .rpm_status_id = (stat_id), \
Vikram Mulukutla4aba6c02012-07-10 11:12:05 -070082 .rpm_key = (key), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070083 .peer = &name, \
84 .active_only = true, \
Vikram Mulukutlaa085dc82012-05-18 11:21:44 -070085 .rpmrs_data = (rpmrsdata),\
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070086 .c = { \
87 .ops = &clk_ops_rpm, \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070088 .dbg_name = #active, \
89 CLK_INIT(active.c), \
Matt Wagantall735f01a2011-08-12 12:40:28 -070090 .depends = dep, \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070091 }, \
92 };
93
Vikram Mulukutlaa085dc82012-05-18 11:21:44 -070094#define __DEFINE_CLK_RPM_BRANCH(name, active, type, r_id, stat_id, r, \
Vikram Mulukutla4aba6c02012-07-10 11:12:05 -070095 key, rpmrsdata) \
Stephen Boyda6835112012-01-26 14:40:05 -080096 static struct rpm_clk active; \
97 static struct rpm_clk name = { \
Vikram Mulukutlaa085dc82012-05-18 11:21:44 -070098 .rpm_res_type = (type), \
99 .rpm_clk_id = (r_id), \
100 .rpm_status_id = (stat_id), \
Vikram Mulukutla4aba6c02012-07-10 11:12:05 -0700101 .rpm_key = (key), \
Stephen Boyda6835112012-01-26 14:40:05 -0800102 .peer = &active, \
Stephen Boyda6835112012-01-26 14:40:05 -0800103 .branch = true, \
Vikram Mulukutlaa085dc82012-05-18 11:21:44 -0700104 .rpmrs_data = (rpmrsdata),\
Stephen Boyda6835112012-01-26 14:40:05 -0800105 .c = { \
106 .ops = &clk_ops_rpm_branch, \
Stephen Boyda6835112012-01-26 14:40:05 -0800107 .dbg_name = #name, \
Stephen Boyd72a80352012-01-26 15:57:38 -0800108 .rate = (r), \
Stephen Boyda6835112012-01-26 14:40:05 -0800109 CLK_INIT(name.c), \
110 }, \
111 }; \
112 static struct rpm_clk active = { \
Vikram Mulukutlaa085dc82012-05-18 11:21:44 -0700113 .rpm_res_type = (type), \
114 .rpm_clk_id = (r_id), \
115 .rpm_status_id = (stat_id), \
Vikram Mulukutla4aba6c02012-07-10 11:12:05 -0700116 .rpm_key = (key), \
Stephen Boyda6835112012-01-26 14:40:05 -0800117 .peer = &name, \
Stephen Boyda6835112012-01-26 14:40:05 -0800118 .active_only = true, \
119 .branch = true, \
Vikram Mulukutlaa085dc82012-05-18 11:21:44 -0700120 .rpmrs_data = (rpmrsdata),\
Stephen Boyda6835112012-01-26 14:40:05 -0800121 .c = { \
122 .ops = &clk_ops_rpm_branch, \
Stephen Boyda6835112012-01-26 14:40:05 -0800123 .dbg_name = #active, \
Stephen Boyd72a80352012-01-26 15:57:38 -0800124 .rate = (r), \
Stephen Boyda6835112012-01-26 14:40:05 -0800125 CLK_INIT(active.c), \
126 }, \
127 };
128
Vikram Mulukutlaa085dc82012-05-18 11:21:44 -0700129#define DEFINE_CLK_RPM(name, active, r_id, dep) \
130 __DEFINE_CLK_RPM(name, active, 0, MSM_RPM_ID_##r_id##_CLK, \
Vikram Mulukutla4aba6c02012-07-10 11:12:05 -0700131 MSM_RPM_STATUS_ID_##r_id##_CLK, dep, 0, &clk_rpmrs_data)
Vikram Mulukutlaa085dc82012-05-18 11:21:44 -0700132
Stephen Boydc7fc3b12012-05-17 14:42:46 -0700133#define DEFINE_CLK_RPM_QDSS(name, active) \
Deepak Katragadda92862ca2013-06-21 14:36:18 -0700134 __DEFINE_CLK_RPM(name, active, 0, MSM_RPM_ID_QDSS_CLK, \
135 MSM_RPM_STATUS_ID_QDSS_CLK, 0, 0, &clk_rpmrs_data)
Stephen Boydc7fc3b12012-05-17 14:42:46 -0700136
Vikram Mulukutlaa085dc82012-05-18 11:21:44 -0700137#define DEFINE_CLK_RPM_BRANCH(name, active, r_id, r) \
138 __DEFINE_CLK_RPM_BRANCH(name, active, 0, MSM_RPM_ID_##r_id##_CLK, \
Vikram Mulukutla4aba6c02012-07-10 11:12:05 -0700139 MSM_RPM_STATUS_ID_##r_id##_CLK, r, 0, &clk_rpmrs_data)
Vikram Mulukutlaa085dc82012-05-18 11:21:44 -0700140
141#define DEFINE_CLK_RPM_SMD(name, active, type, r_id, dep) \
Vikram Mulukutla4aba6c02012-07-10 11:12:05 -0700142 __DEFINE_CLK_RPM(name, active, type, r_id, 0, dep, \
143 RPM_SMD_KEY_RATE, &clk_rpmrs_data_smd)
Vikram Mulukutlaa085dc82012-05-18 11:21:44 -0700144
Vikram Mulukutla4aba6c02012-07-10 11:12:05 -0700145#define DEFINE_CLK_RPM_SMD_BRANCH(name, active, type, r_id, r) \
146 __DEFINE_CLK_RPM_BRANCH(name, active, type, r_id, 0, r, \
147 RPM_SMD_KEY_ENABLE, &clk_rpmrs_data_smd)
Vikram Mulukutlaa085dc82012-05-18 11:21:44 -0700148
Vikram Mulukutla0f63e002012-06-28 14:29:44 -0700149#define DEFINE_CLK_RPM_SMD_QDSS(name, active, type, r_id) \
Deepak Katragadda92862ca2013-06-21 14:36:18 -0700150 __DEFINE_CLK_RPM(name, active, type, r_id, \
151 0, 0, RPM_SMD_KEY_STATE, &clk_rpmrs_data_smd)
Vikram Mulukutla80b7ab52012-07-26 19:03:15 -0700152/*
153 * The RPM XO buffer clock management code aggregates votes for pin-control mode
154 * and software mode separately. Software-enable has higher priority over pin-
155 * control, and if the software-mode aggregation results in a 'disable', the
156 * buffer will be left in pin-control mode if a pin-control vote is in place.
157 */
158#define DEFINE_CLK_RPM_SMD_XO_BUFFER(name, active, r_id) \
159 __DEFINE_CLK_RPM_BRANCH(name, active, RPM_CLK_BUFFER_A_REQ, r_id, 0, \
160 1000, RPM_KEY_SOFTWARE_ENABLE, &clk_rpmrs_data_smd)
Vikram Mulukutla0f63e002012-06-28 14:29:44 -0700161
Vikram Mulukutla80b7ab52012-07-26 19:03:15 -0700162#define DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(name, active, r_id) \
163 __DEFINE_CLK_RPM_BRANCH(name, active, RPM_CLK_BUFFER_A_REQ, r_id, 0, \
164 1000, RPM_KEY_PIN_CTRL_CLK_BUFFER_ENABLE_KEY, &clk_rpmrs_data_smd)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700165#endif