blob: f1041e36bcf135c055ee393a82e5e47e6026b96b [file] [log] [blame]
Jun Nie5a465802015-06-04 11:21:01 +08001/*
2 * Copyright 2015 Linaro Ltd.
3 * Copyright (C) 2014 ZTE Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
8 */
9
10#ifndef __ZTE_CLK_H
11#define __ZTE_CLK_H
12#include <linux/clk-provider.h>
13#include <linux/spinlock.h>
14
Jun Nieca023322016-09-06 14:02:42 +080015#define PNAME(x) static const char *x[]
16
Jun Nie5a465802015-06-04 11:21:01 +080017struct zx_pll_config {
18 unsigned long rate;
19 u32 cfg0;
20 u32 cfg1;
21};
22
23struct clk_zx_pll {
24 struct clk_hw hw;
25 void __iomem *reg_base;
26 const struct zx_pll_config *lookup_table; /* order by rate asc */
27 int count;
28 spinlock_t *lock;
Jun Nie8d9a0862016-09-06 14:02:41 +080029 u8 pd_bit; /* power down bit */
30 u8 lock_bit; /* pll lock flag bit */
Jun Nie5a465802015-06-04 11:21:01 +080031};
32
Jun Nieca023322016-09-06 14:02:42 +080033#define PLL_RATE(_rate, _cfg0, _cfg1) \
34{ \
35 .rate = _rate, \
36 .cfg0 = _cfg0, \
37 .cfg1 = _cfg1, \
38}
39
40#define ZX_PLL(_name, _parent, _reg, _table, _pd, _lock) \
41{ \
42 .reg_base = (void __iomem *) _reg, \
43 .lookup_table = _table, \
44 .count = ARRAY_SIZE(_table), \
45 .pd_bit = _pd, \
46 .lock_bit = _lock, \
47 .hw.init = CLK_HW_INIT(_name, _parent, &zx_pll_ops, \
48 CLK_GET_RATE_NOCACHE), \
49}
50
Shawn Guoee249cb2017-03-21 16:38:22 +080051/*
52 * The pd_bit is not available on ZX296718, so let's pass something
53 * bigger than 31, e.g. 0xff, to indicate that.
54 */
Jun Nieca023322016-09-06 14:02:42 +080055#define ZX296718_PLL(_name, _parent, _reg, _table) \
Shawn Guoee249cb2017-03-21 16:38:22 +080056ZX_PLL(_name, _parent, _reg, _table, 0xff, 30)
Jun Nieca023322016-09-06 14:02:42 +080057
58struct zx_clk_gate {
59 struct clk_gate gate;
60 u16 id;
61};
62
63#define GATE(_id, _name, _parent, _reg, _bit, _flag, _gflags) \
64{ \
65 .gate = { \
66 .reg = (void __iomem *) _reg, \
67 .bit_idx = (_bit), \
68 .flags = _gflags, \
69 .lock = &clk_lock, \
70 .hw.init = CLK_HW_INIT(_name, \
71 _parent, \
72 &clk_gate_ops, \
73 _flag | CLK_IGNORE_UNUSED), \
74 }, \
75 .id = _id, \
76}
77
78struct zx_clk_fixed_factor {
79 struct clk_fixed_factor factor;
80 u16 id;
81};
82
83#define FFACTOR(_id, _name, _parent, _mult, _div, _flag) \
84{ \
85 .factor = { \
86 .div = _div, \
87 .mult = _mult, \
88 .hw.init = CLK_HW_INIT(_name, \
89 _parent, \
90 &clk_fixed_factor_ops, \
91 _flag), \
92 }, \
93 .id = _id, \
94}
95
96struct zx_clk_mux {
97 struct clk_mux mux;
98 u16 id;
99};
100
101#define MUX_F(_id, _name, _parent, _reg, _shift, _width, _flag, _mflag) \
102{ \
103 .mux = { \
104 .reg = (void __iomem *) _reg, \
105 .mask = BIT(_width) - 1, \
106 .shift = _shift, \
107 .flags = _mflag, \
108 .lock = &clk_lock, \
109 .hw.init = CLK_HW_INIT_PARENTS(_name, \
110 _parent, \
111 &clk_mux_ops, \
112 _flag), \
113 }, \
114 .id = _id, \
115}
116
117#define MUX(_id, _name, _parent, _reg, _shift, _width) \
118MUX_F(_id, _name, _parent, _reg, _shift, _width, 0, 0)
119
120struct zx_clk_div {
121 struct clk_divider div;
122 u16 id;
123};
124
125#define DIV_T(_id, _name, _parent, _reg, _shift, _width, _flag, _table) \
126{ \
127 .div = { \
128 .reg = (void __iomem *) _reg, \
129 .shift = _shift, \
130 .width = _width, \
131 .flags = 0, \
132 .table = _table, \
133 .lock = &clk_lock, \
134 .hw.init = CLK_HW_INIT(_name, \
135 _parent, \
136 &clk_divider_ops, \
137 _flag), \
138 }, \
139 .id = _id, \
140}
141
Jun Nieedc6da22016-12-16 15:26:47 +0800142struct clk_zx_audio_divider {
143 struct clk_hw hw;
144 void __iomem *reg_base;
145 unsigned int rate_count;
146 spinlock_t *lock;
147 u16 id;
148};
149
150#define AUDIO_DIV(_id, _name, _parent, _reg) \
151{ \
152 .reg_base = (void __iomem *) _reg, \
153 .lock = &clk_lock, \
154 .hw.init = CLK_HW_INIT(_name, \
155 _parent, \
156 &zx_audio_div_ops, \
157 0), \
158 .id = _id, \
159}
160
Jun Nie5a465802015-06-04 11:21:01 +0800161struct clk *clk_register_zx_pll(const char *name, const char *parent_name,
162 unsigned long flags, void __iomem *reg_base,
163 const struct zx_pll_config *lookup_table, int count, spinlock_t *lock);
Jun Nie4599dd22015-07-23 15:02:51 +0800164
165struct clk_zx_audio {
166 struct clk_hw hw;
167 void __iomem *reg_base;
168};
169
170struct clk *clk_register_zx_audio(const char *name,
171 const char * const parent_name,
172 unsigned long flags, void __iomem *reg_base);
Jun Nie8d9a0862016-09-06 14:02:41 +0800173
174extern const struct clk_ops zx_pll_ops;
Jun Nieedc6da22016-12-16 15:26:47 +0800175extern const struct clk_ops zx_audio_div_ops;
176
Jun Nie5a465802015-06-04 11:21:01 +0800177#endif