blob: 2b68eb3d41ae35a5700b519225da649bd3e17762 [file] [log] [blame]
Pankaj Kumar3912c982011-12-07 16:59:03 +05301/*
Duy Truonge833aca2013-02-12 13:35:08 -08002 * Copyright (c) 2012, The Linux Foundation. All rights reserved.
Pankaj Kumar3912c982011-12-07 16:59:03 +05303 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 and
6 * only version 2 as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 */
14
Vikram Mulukutla681d8682012-03-09 23:56:20 -080015#ifndef __ARCH_ARM_MACH_MSM_CLOCK_PLL_H
16#define __ARCH_ARM_MACH_MSM_CLOCK_PLL_H
17
Matt Wagantalld55b90f2012-02-23 23:27:44 -080018#include <mach/clk-provider.h>
19
Pankaj Kumar3912c982011-12-07 16:59:03 +053020/**
21 * enum - For PLL IDs
22 */
23enum {
24 PLL_TCXO = -1,
25 PLL_0 = 0,
26 PLL_1,
27 PLL_2,
28 PLL_3,
29 PLL_4,
30 PLL_END,
31};
32
33/**
34 * struct pll_shared_clk - PLL shared with other processors without
35 * any HW voting
36 * @id: PLL ID
37 * @mode_reg: enable register
38 * @parent: clock source
Matt Wagantallf82f2942012-01-27 13:56:13 -080039 * @c: clock
Pankaj Kumar3912c982011-12-07 16:59:03 +053040 */
41struct pll_shared_clk {
42 unsigned int id;
43 void __iomem *const mode_reg;
44 struct clk c;
Vikram Mulukutla4d6caa82012-04-10 18:04:55 -070045 void *const __iomem *base;
Pankaj Kumar3912c982011-12-07 16:59:03 +053046};
47
Matt Wagantallae053222012-05-14 19:42:07 -070048extern struct clk_ops clk_ops_pll;
Pankaj Kumar3912c982011-12-07 16:59:03 +053049
Matt Wagantallf82f2942012-01-27 13:56:13 -080050static inline struct pll_shared_clk *to_pll_shared_clk(struct clk *c)
Pankaj Kumar3912c982011-12-07 16:59:03 +053051{
Matt Wagantallf82f2942012-01-27 13:56:13 -080052 return container_of(c, struct pll_shared_clk, c);
Pankaj Kumar3912c982011-12-07 16:59:03 +053053}
54
55/**
56 * msm_shared_pll_control_init() - Initialize shared pll control structure
57 */
58void msm_shared_pll_control_init(void);
Vikram Mulukutla681d8682012-03-09 23:56:20 -080059
60/**
61 * struct pll_vote_clk - phase locked loop (HW voteable)
62 * @soft_vote: soft voting variable for multiple PLL software instances
63 * @soft_vote_mask: soft voting mask for multiple PLL software instances
64 * @en_reg: enable register
65 * @en_mask: ORed with @en_reg to enable the clock
66 * @status_mask: ANDed with @status_reg to determine if PLL is active.
67 * @status_reg: status register
68 * @parent: clock source
Matt Wagantallf82f2942012-01-27 13:56:13 -080069 * @c: clock
Vikram Mulukutla681d8682012-03-09 23:56:20 -080070 */
71struct pll_vote_clk {
72 u32 *soft_vote;
73 const u32 soft_vote_mask;
74 void __iomem *const en_reg;
75 const u32 en_mask;
76 void __iomem *const status_reg;
77 const u32 status_mask;
78
79 struct clk *parent;
80 struct clk c;
Vikram Mulukutla4d6caa82012-04-10 18:04:55 -070081 void *const __iomem *base;
Vikram Mulukutla681d8682012-03-09 23:56:20 -080082};
83
84extern struct clk_ops clk_ops_pll_vote;
85
Matt Wagantallf82f2942012-01-27 13:56:13 -080086static inline struct pll_vote_clk *to_pll_vote_clk(struct clk *c)
Vikram Mulukutla681d8682012-03-09 23:56:20 -080087{
Matt Wagantallf82f2942012-01-27 13:56:13 -080088 return container_of(c, struct pll_vote_clk, c);
Vikram Mulukutla681d8682012-03-09 23:56:20 -080089}
90
91/**
92 * struct pll_clk - phase locked loop
93 * @mode_reg: enable register
Vikram Mulukutlaaa3e0112012-04-23 14:40:51 -070094 * @status_reg: status register, contains the lock detection bit
Vikram Mulukutla681d8682012-03-09 23:56:20 -080095 * @parent: clock source
96 * @c: clk
Vikram Mulukutlaaa3e0112012-04-23 14:40:51 -070097 * @base: pointer to base address of ioremapped registers.
Vikram Mulukutla681d8682012-03-09 23:56:20 -080098 */
99struct pll_clk {
100 void __iomem *const mode_reg;
Vikram Mulukutlaaa3e0112012-04-23 14:40:51 -0700101 void __iomem *const status_reg;
Vikram Mulukutla681d8682012-03-09 23:56:20 -0800102
103 struct clk *parent;
104 struct clk c;
Vikram Mulukutla4d6caa82012-04-10 18:04:55 -0700105 void *const __iomem *base;
Vikram Mulukutla681d8682012-03-09 23:56:20 -0800106};
107
108extern struct clk_ops clk_ops_local_pll;
109
Matt Wagantallf82f2942012-01-27 13:56:13 -0800110static inline struct pll_clk *to_pll_clk(struct clk *c)
Vikram Mulukutla681d8682012-03-09 23:56:20 -0800111{
Matt Wagantallf82f2942012-01-27 13:56:13 -0800112 return container_of(c, struct pll_clk, c);
Vikram Mulukutla681d8682012-03-09 23:56:20 -0800113}
114
Matt Wagantallf82f2942012-01-27 13:56:13 -0800115int sr_pll_clk_enable(struct clk *c);
Vikram Mulukutlae12adf62012-07-18 13:55:31 -0700116int sr_hpm_lp_pll_clk_enable(struct clk *c);
Vikram Mulukutla681d8682012-03-09 23:56:20 -0800117
118/*
119 * PLL vote clock APIs
120 */
Matt Wagantallf82f2942012-01-27 13:56:13 -0800121int pll_vote_clk_enable(struct clk *c);
122void pll_vote_clk_disable(struct clk *c);
123struct clk *pll_vote_clk_get_parent(struct clk *c);
124int pll_vote_clk_is_enabled(struct clk *c);
Vikram Mulukutla681d8682012-03-09 23:56:20 -0800125
Vikram Mulukutla5b146722012-04-23 18:17:50 -0700126struct pll_config {
127 u32 l;
128 u32 m;
129 u32 n;
130 u32 vco_val;
131 u32 vco_mask;
132 u32 pre_div_val;
133 u32 pre_div_mask;
134 u32 post_div_val;
135 u32 post_div_mask;
136 u32 mn_ena_val;
137 u32 mn_ena_mask;
138 u32 main_output_val;
139 u32 main_output_mask;
140};
141
142struct pll_config_regs {
143 void __iomem *l_reg;
144 void __iomem *m_reg;
145 void __iomem *n_reg;
146 void __iomem *config_reg;
147 void __iomem *mode_reg;
148 void *const __iomem *base;
149};
150
Vikram Mulukutlae12adf62012-07-18 13:55:31 -0700151void configure_sr_pll(struct pll_config *config, struct pll_config_regs *regs,
152 u32 ena_fsm_mode);
153void configure_sr_hpm_lp_pll(struct pll_config *config,
154 struct pll_config_regs *, u32 ena_fsm_mode);
Vikram Mulukutla681d8682012-03-09 23:56:20 -0800155#endif