leds: gpio: Support the "panic-indicator" firmware property
[linux-2.6-block.git] / drivers / clk / qcom / gcc-ipq4019.c
1 /*
2  * Copyright (c) 2015 The Linux Foundation. All rights reserved.
3  *
4  * This software is licensed under the terms of the GNU General Public
5  * License version 2, as published by the Free Software Foundation, and
6  * may be copied, distributed, and modified under those terms.
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 #include <linux/kernel.h>
15 #include <linux/err.h>
16 #include <linux/platform_device.h>
17 #include <linux/module.h>
18 #include <linux/of.h>
19 #include <linux/of_device.h>
20 #include <linux/clk-provider.h>
21 #include <linux/regmap.h>
22 #include <linux/reset-controller.h>
23
24 #include <dt-bindings/clock/qcom,gcc-ipq4019.h>
25
26 #include "common.h"
27 #include "clk-regmap.h"
28 #include "clk-rcg.h"
29 #include "clk-branch.h"
30 #include "reset.h"
31
32 enum {
33         P_XO,
34         P_FEPLL200,
35         P_FEPLL500,
36         P_DDRPLL,
37         P_FEPLLWCSS2G,
38         P_FEPLLWCSS5G,
39         P_FEPLL125DLY,
40         P_DDRPLLAPSS,
41 };
42
43 static struct parent_map gcc_xo_200_500_map[] = {
44         { P_XO, 0 },
45         { P_FEPLL200, 1 },
46         { P_FEPLL500, 2 },
47 };
48
49 static const char * const gcc_xo_200_500[] = {
50         "xo",
51         "fepll200",
52         "fepll500",
53 };
54
55 static struct parent_map gcc_xo_200_map[] = {
56         {  P_XO, 0 },
57         {  P_FEPLL200, 1 },
58 };
59
60 static const char * const gcc_xo_200[] = {
61         "xo",
62         "fepll200",
63 };
64
65 static struct parent_map gcc_xo_200_spi_map[] = {
66         {  P_XO, 0 },
67         {  P_FEPLL200, 2 },
68 };
69
70 static const char * const gcc_xo_200_spi[] = {
71         "xo",
72         "fepll200",
73 };
74
75 static struct parent_map gcc_xo_sdcc1_500_map[] = {
76         {  P_XO, 0 },
77         {  P_DDRPLL, 1 },
78         {  P_FEPLL500, 2 },
79 };
80
81 static const char * const gcc_xo_sdcc1_500[] = {
82         "xo",
83         "ddrpll",
84         "fepll500",
85 };
86
87 static struct parent_map gcc_xo_wcss2g_map[] = {
88         {  P_XO, 0 },
89         {  P_FEPLLWCSS2G, 1 },
90 };
91
92 static const char * const gcc_xo_wcss2g[] = {
93         "xo",
94         "fepllwcss2g",
95 };
96
97 static struct parent_map gcc_xo_wcss5g_map[] = {
98         {  P_XO, 0 },
99         {  P_FEPLLWCSS5G, 1 },
100 };
101
102 static const char * const gcc_xo_wcss5g[] = {
103         "xo",
104         "fepllwcss5g",
105 };
106
107 static struct parent_map gcc_xo_125_dly_map[] = {
108         {  P_XO, 0 },
109         {  P_FEPLL125DLY, 1 },
110 };
111
112 static const char * const gcc_xo_125_dly[] = {
113         "xo",
114         "fepll125dly",
115 };
116
117 static struct parent_map gcc_xo_ddr_500_200_map[] = {
118         {  P_XO, 0 },
119         {  P_FEPLL200, 3 },
120         {  P_FEPLL500, 2 },
121         {  P_DDRPLLAPSS, 1 },
122 };
123
124 static const char * const gcc_xo_ddr_500_200[] = {
125         "xo",
126         "fepll200",
127         "fepll500",
128         "ddrpllapss",
129 };
130
131 #define F(f, s, h, m, n) { (f), (s), (2 * (h) - 1), (m), (n) }
132 #define P_XO 0
133 #define FE_PLL_200 1
134 #define FE_PLL_500 2
135 #define DDRC_PLL_666  3
136
137 #define DDRC_PLL_666_SDCC  1
138 #define FE_PLL_125_DLY 1
139
140 #define FE_PLL_WCSS2G 1
141 #define FE_PLL_WCSS5G 1
142
143 static const struct freq_tbl ftbl_gcc_audio_pwm_clk[] = {
144         F(48000000, P_XO, 1, 0, 0),
145         F(200000000, FE_PLL_200, 1, 0, 0),
146         { }
147 };
148
149 static struct clk_rcg2 audio_clk_src = {
150         .cmd_rcgr = 0x1b000,
151         .hid_width = 5,
152         .parent_map = gcc_xo_200_map,
153         .freq_tbl = ftbl_gcc_audio_pwm_clk,
154         .clkr.hw.init = &(struct clk_init_data){
155                 .name = "audio_clk_src",
156                 .parent_names = gcc_xo_200,
157                 .num_parents = 2,
158                 .ops = &clk_rcg2_ops,
159
160         },
161 };
162
163 static struct clk_branch gcc_audio_ahb_clk = {
164         .halt_reg = 0x1b010,
165         .clkr = {
166                 .enable_reg = 0x1b010,
167                 .enable_mask = BIT(0),
168                 .hw.init = &(struct clk_init_data){
169                         .name = "gcc_audio_ahb_clk",
170                         .parent_names = (const char *[]){
171                                 "pcnoc_clk_src",
172                         },
173                         .flags = CLK_SET_RATE_PARENT,
174                         .num_parents = 1,
175                         .ops = &clk_branch2_ops,
176                 },
177         },
178 };
179
180 static struct clk_branch gcc_audio_pwm_clk = {
181         .halt_reg = 0x1b00C,
182         .clkr = {
183                 .enable_reg = 0x1b00C,
184                 .enable_mask = BIT(0),
185                 .hw.init = &(struct clk_init_data){
186                         .name = "gcc_audio_pwm_clk",
187                         .parent_names = (const char *[]){
188                                 "audio_clk_src",
189                         },
190                         .flags = CLK_SET_RATE_PARENT,
191                         .num_parents = 1,
192                         .ops = &clk_branch2_ops,
193                 },
194         },
195 };
196
197 static const struct freq_tbl ftbl_gcc_blsp1_qup1_2_i2c_apps_clk[] = {
198         F(19200000, P_XO, 1, 2, 5),
199         F(24000000, P_XO, 1, 1, 2),
200         { }
201 };
202
203 static struct clk_rcg2 blsp1_qup1_i2c_apps_clk_src = {
204         .cmd_rcgr = 0x200c,
205         .hid_width = 5,
206         .parent_map = gcc_xo_200_map,
207         .freq_tbl = ftbl_gcc_blsp1_qup1_2_i2c_apps_clk,
208         .clkr.hw.init = &(struct clk_init_data){
209                 .name = "blsp1_qup1_i2c_apps_clk_src",
210                 .parent_names = gcc_xo_200,
211                 .num_parents = 2,
212                 .ops = &clk_rcg2_ops,
213         },
214 };
215
216 static struct clk_branch gcc_blsp1_qup1_i2c_apps_clk = {
217         .halt_reg = 0x2008,
218         .clkr = {
219                 .enable_reg = 0x2008,
220                 .enable_mask = BIT(0),
221                 .hw.init = &(struct clk_init_data){
222                         .name = "gcc_blsp1_qup1_i2c_apps_clk",
223                         .parent_names = (const char *[]){
224                                 "blsp1_qup1_i2c_apps_clk_src",
225                         },
226                         .num_parents = 1,
227                         .ops = &clk_branch2_ops,
228                         .flags = CLK_SET_RATE_PARENT,
229                 },
230         },
231 };
232
233 static struct clk_rcg2 blsp1_qup2_i2c_apps_clk_src = {
234         .cmd_rcgr = 0x3000,
235         .hid_width = 5,
236         .parent_map = gcc_xo_200_map,
237         .freq_tbl = ftbl_gcc_blsp1_qup1_2_i2c_apps_clk,
238         .clkr.hw.init = &(struct clk_init_data){
239                 .name = "blsp1_qup2_i2c_apps_clk_src",
240                 .parent_names = gcc_xo_200,
241                 .num_parents = 2,
242                 .ops = &clk_rcg2_ops,
243         },
244 };
245
246 static struct clk_branch gcc_blsp1_qup2_i2c_apps_clk = {
247         .halt_reg = 0x3010,
248         .clkr = {
249                 .enable_reg = 0x3010,
250                 .enable_mask = BIT(0),
251                 .hw.init = &(struct clk_init_data){
252                         .name = "gcc_blsp1_qup2_i2c_apps_clk",
253                         .parent_names = (const char *[]){
254                                 "blsp1_qup2_i2c_apps_clk_src",
255                         },
256                         .num_parents = 1,
257                         .ops = &clk_branch2_ops,
258                         .flags = CLK_SET_RATE_PARENT,
259                 },
260         },
261 };
262
263 static const struct freq_tbl ftbl_gcc_blsp1_qup1_2_spi_apps_clk[] = {
264         F(960000, P_XO, 12, 1, 4),
265         F(4800000, P_XO, 1, 1, 10),
266         F(9600000, P_XO, 1, 1, 5),
267         F(15000000, P_XO, 1, 1, 3),
268         F(19200000, P_XO, 1, 2, 5),
269         F(24000000, P_XO, 1, 1, 2),
270         F(48000000, P_XO, 1, 0, 0),
271         { }
272 };
273
274 static struct clk_rcg2 blsp1_qup1_spi_apps_clk_src = {
275         .cmd_rcgr = 0x2024,
276         .mnd_width = 8,
277         .hid_width = 5,
278         .parent_map = gcc_xo_200_spi_map,
279         .freq_tbl = ftbl_gcc_blsp1_qup1_2_spi_apps_clk,
280         .clkr.hw.init = &(struct clk_init_data){
281                 .name = "blsp1_qup1_spi_apps_clk_src",
282                 .parent_names = gcc_xo_200_spi,
283                 .num_parents = 2,
284                 .ops = &clk_rcg2_ops,
285         },
286 };
287
288 static struct clk_branch gcc_blsp1_qup1_spi_apps_clk = {
289         .halt_reg = 0x2004,
290         .clkr = {
291                 .enable_reg = 0x2004,
292                 .enable_mask = BIT(0),
293                 .hw.init = &(struct clk_init_data){
294                         .name = "gcc_blsp1_qup1_spi_apps_clk",
295                         .parent_names = (const char *[]){
296                                 "blsp1_qup1_spi_apps_clk_src",
297                         },
298                         .num_parents = 1,
299                         .ops = &clk_branch2_ops,
300                         .flags = CLK_SET_RATE_PARENT,
301                 },
302         },
303 };
304
305 static struct clk_rcg2 blsp1_qup2_spi_apps_clk_src = {
306         .cmd_rcgr = 0x3014,
307         .mnd_width = 8,
308         .hid_width = 5,
309         .freq_tbl = ftbl_gcc_blsp1_qup1_2_spi_apps_clk,
310         .parent_map = gcc_xo_200_spi_map,
311         .clkr.hw.init = &(struct clk_init_data){
312                 .name = "blsp1_qup2_spi_apps_clk_src",
313                 .parent_names = gcc_xo_200_spi,
314                 .num_parents = 2,
315                 .ops = &clk_rcg2_ops,
316         },
317 };
318
319 static struct clk_branch gcc_blsp1_qup2_spi_apps_clk = {
320         .halt_reg = 0x300c,
321         .clkr = {
322                 .enable_reg = 0x300c,
323                 .enable_mask = BIT(0),
324                 .hw.init = &(struct clk_init_data){
325                         .name = "gcc_blsp1_qup2_spi_apps_clk",
326                         .parent_names = (const char *[]){
327                                 "blsp1_qup2_spi_apps_clk_src",
328                         },
329                         .num_parents = 1,
330                         .ops = &clk_branch2_ops,
331                         .flags = CLK_SET_RATE_PARENT,
332                 },
333         },
334 };
335
336 static const struct freq_tbl ftbl_gcc_blsp1_uart1_2_apps_clk[] = {
337         F(1843200, FE_PLL_200, 1, 144, 15625),
338         F(3686400, FE_PLL_200, 1, 288, 15625),
339         F(7372800, FE_PLL_200, 1, 576, 15625),
340         F(14745600, FE_PLL_200, 1, 1152, 15625),
341         F(16000000, FE_PLL_200, 1, 2, 25),
342         F(24000000, P_XO, 1, 1, 2),
343         F(32000000, FE_PLL_200, 1, 4, 25),
344         F(40000000, FE_PLL_200, 1, 1, 5),
345         F(46400000, FE_PLL_200, 1, 29, 125),
346         F(48000000, P_XO, 1, 0, 0),
347         { }
348 };
349
350 static struct clk_rcg2 blsp1_uart1_apps_clk_src = {
351         .cmd_rcgr = 0x2044,
352         .mnd_width = 16,
353         .hid_width = 5,
354         .freq_tbl = ftbl_gcc_blsp1_uart1_2_apps_clk,
355         .parent_map = gcc_xo_200_spi_map,
356         .clkr.hw.init = &(struct clk_init_data){
357                 .name = "blsp1_uart1_apps_clk_src",
358                 .parent_names = gcc_xo_200_spi,
359                 .num_parents = 2,
360                 .ops = &clk_rcg2_ops,
361         },
362 };
363
364 static struct clk_branch gcc_blsp1_uart1_apps_clk = {
365         .halt_reg = 0x203c,
366         .clkr = {
367                 .enable_reg = 0x203c,
368                 .enable_mask = BIT(0),
369                 .hw.init = &(struct clk_init_data){
370                         .name = "gcc_blsp1_uart1_apps_clk",
371                         .parent_names = (const char *[]){
372                                 "blsp1_uart1_apps_clk_src",
373                         },
374                         .flags = CLK_SET_RATE_PARENT,
375                         .num_parents = 1,
376                         .ops = &clk_branch2_ops,
377                 },
378         },
379 };
380
381 static struct clk_rcg2 blsp1_uart2_apps_clk_src = {
382         .cmd_rcgr = 0x3034,
383         .mnd_width = 16,
384         .hid_width = 5,
385         .freq_tbl = ftbl_gcc_blsp1_uart1_2_apps_clk,
386         .parent_map = gcc_xo_200_spi_map,
387         .clkr.hw.init = &(struct clk_init_data){
388                 .name = "blsp1_uart2_apps_clk_src",
389                 .parent_names = gcc_xo_200_spi,
390                 .num_parents = 2,
391                 .ops = &clk_rcg2_ops,
392         },
393 };
394
395 static struct clk_branch gcc_blsp1_uart2_apps_clk = {
396         .halt_reg = 0x302c,
397         .clkr = {
398                 .enable_reg = 0x302c,
399                 .enable_mask = BIT(0),
400                 .hw.init = &(struct clk_init_data){
401                         .name = "gcc_blsp1_uart2_apps_clk",
402                         .parent_names = (const char *[]){
403                                 "blsp1_uart2_apps_clk_src",
404                         },
405                         .num_parents = 1,
406                         .ops = &clk_branch2_ops,
407                         .flags = CLK_SET_RATE_PARENT,
408                 },
409         },
410 };
411
412 static const struct freq_tbl ftbl_gcc_gp_clk[] = {
413         F(1250000,  FE_PLL_200, 1, 16, 0),
414         F(2500000,  FE_PLL_200, 1,  8, 0),
415         F(5000000,  FE_PLL_200, 1,  4, 0),
416         { }
417 };
418
419 static struct clk_rcg2 gp1_clk_src = {
420         .cmd_rcgr = 0x8004,
421         .mnd_width = 8,
422         .hid_width = 5,
423         .freq_tbl = ftbl_gcc_gp_clk,
424         .parent_map = gcc_xo_200_map,
425         .clkr.hw.init = &(struct clk_init_data){
426                 .name = "gp1_clk_src",
427                 .parent_names = gcc_xo_200,
428                 .num_parents = 2,
429                 .ops = &clk_rcg2_ops,
430         },
431 };
432
433 static struct clk_branch gcc_gp1_clk = {
434         .halt_reg = 0x8000,
435         .clkr = {
436                 .enable_reg = 0x8000,
437                 .enable_mask = BIT(0),
438                 .hw.init = &(struct clk_init_data){
439                         .name = "gcc_gp1_clk",
440                         .parent_names = (const char *[]){
441                                 "gp1_clk_src",
442                         },
443                         .num_parents = 1,
444                         .ops = &clk_branch2_ops,
445                         .flags = CLK_SET_RATE_PARENT,
446                 },
447         },
448 };
449
450 static struct clk_rcg2 gp2_clk_src = {
451         .cmd_rcgr = 0x9004,
452         .mnd_width = 8,
453         .hid_width = 5,
454         .freq_tbl = ftbl_gcc_gp_clk,
455         .parent_map = gcc_xo_200_map,
456         .clkr.hw.init = &(struct clk_init_data){
457                 .name = "gp2_clk_src",
458                 .parent_names = gcc_xo_200,
459                 .num_parents = 2,
460                 .ops = &clk_rcg2_ops,
461         },
462 };
463
464 static struct clk_branch gcc_gp2_clk = {
465         .halt_reg = 0x9000,
466         .clkr = {
467                 .enable_reg = 0x9000,
468                 .enable_mask = BIT(0),
469                 .hw.init = &(struct clk_init_data){
470                         .name = "gcc_gp2_clk",
471                         .parent_names = (const char *[]){
472                                 "gp2_clk_src",
473                         },
474                         .num_parents = 1,
475                         .ops = &clk_branch2_ops,
476                         .flags = CLK_SET_RATE_PARENT,
477                 },
478         },
479 };
480
481 static struct clk_rcg2 gp3_clk_src = {
482         .cmd_rcgr = 0xa004,
483         .mnd_width = 8,
484         .hid_width = 5,
485         .freq_tbl = ftbl_gcc_gp_clk,
486         .parent_map = gcc_xo_200_map,
487         .clkr.hw.init = &(struct clk_init_data){
488                 .name = "gp3_clk_src",
489                 .parent_names = gcc_xo_200,
490                 .num_parents = 2,
491                 .ops = &clk_rcg2_ops,
492         },
493 };
494
495 static struct clk_branch gcc_gp3_clk = {
496         .halt_reg = 0xa000,
497         .clkr = {
498                 .enable_reg = 0xa000,
499                 .enable_mask = BIT(0),
500                 .hw.init = &(struct clk_init_data){
501                         .name = "gcc_gp3_clk",
502                         .parent_names = (const char *[]){
503                                 "gp3_clk_src",
504                         },
505                         .num_parents = 1,
506                         .ops = &clk_branch2_ops,
507                         .flags = CLK_SET_RATE_PARENT,
508                 },
509         },
510 };
511
512 static const struct freq_tbl ftbl_gcc_sdcc1_apps_clk[] = {
513         F(144000,    P_XO,                      1,  3, 240),
514         F(400000,    P_XO,                      1,  1, 0),
515         F(20000000,  FE_PLL_500,                1,  1, 25),
516         F(25000000,  FE_PLL_500,                1,  1, 20),
517         F(50000000,  FE_PLL_500,                1,  1, 10),
518         F(100000000, FE_PLL_500,                1,  1, 5),
519         F(193000000, DDRC_PLL_666_SDCC,         1,  0, 0),
520         { }
521 };
522
523 static struct clk_rcg2  sdcc1_apps_clk_src = {
524         .cmd_rcgr = 0x18004,
525         .hid_width = 5,
526         .freq_tbl = ftbl_gcc_sdcc1_apps_clk,
527         .parent_map = gcc_xo_sdcc1_500_map,
528         .clkr.hw.init = &(struct clk_init_data){
529                 .name = "sdcc1_apps_clk_src",
530                 .parent_names = gcc_xo_sdcc1_500,
531                 .num_parents = 3,
532                 .ops = &clk_rcg2_ops,
533                 .flags = CLK_SET_RATE_PARENT,
534         },
535 };
536
537 static const struct freq_tbl ftbl_gcc_apps_clk[] = {
538         F(48000000, P_XO,          1, 0, 0),
539         F(200000000, FE_PLL_200,   1, 0, 0),
540         F(500000000, FE_PLL_500,   1, 0, 0),
541         F(626000000, DDRC_PLL_666, 1, 0, 0),
542         { }
543 };
544
545 static struct clk_rcg2 apps_clk_src = {
546         .cmd_rcgr = 0x1900c,
547         .hid_width = 5,
548         .freq_tbl = ftbl_gcc_apps_clk,
549         .parent_map = gcc_xo_ddr_500_200_map,
550         .clkr.hw.init = &(struct clk_init_data){
551                 .name = "apps_clk_src",
552                 .parent_names = gcc_xo_ddr_500_200,
553                 .num_parents = 4,
554                 .ops = &clk_rcg2_ops,
555         },
556 };
557
558 static const struct freq_tbl ftbl_gcc_apps_ahb_clk[] = {
559         F(48000000, P_XO,          1, 0, 0),
560         F(100000000, FE_PLL_200,   2, 0, 0),
561         { }
562 };
563
564 static struct clk_rcg2 apps_ahb_clk_src = {
565         .cmd_rcgr = 0x19014,
566         .hid_width = 5,
567         .parent_map = gcc_xo_200_500_map,
568         .freq_tbl = ftbl_gcc_apps_ahb_clk,
569         .clkr.hw.init = &(struct clk_init_data){
570                 .name = "apps_ahb_clk_src",
571                 .parent_names = gcc_xo_200_500,
572                 .num_parents = 3,
573                 .ops = &clk_rcg2_ops,
574         },
575 };
576
577 static struct clk_branch gcc_apss_ahb_clk = {
578         .halt_reg = 0x19004,
579         .halt_check = BRANCH_HALT_VOTED,
580         .clkr = {
581                 .enable_reg = 0x6000,
582                 .enable_mask = BIT(14),
583                 .hw.init = &(struct clk_init_data){
584                         .name = "gcc_apss_ahb_clk",
585                         .parent_names = (const char *[]){
586                                 "apps_ahb_clk_src",
587                         },
588                         .num_parents = 1,
589                         .ops = &clk_branch2_ops,
590                         .flags = CLK_SET_RATE_PARENT,
591                 },
592         },
593 };
594
595 static struct clk_branch gcc_blsp1_ahb_clk = {
596         .halt_reg = 0x1008,
597         .halt_check = BRANCH_HALT_VOTED,
598         .clkr = {
599                 .enable_reg = 0x6000,
600                 .enable_mask = BIT(10),
601                 .hw.init = &(struct clk_init_data){
602                         .name = "gcc_blsp1_ahb_clk",
603                         .parent_names = (const char *[]){
604                                 "pcnoc_clk_src",
605                         },
606                         .num_parents = 1,
607                         .ops = &clk_branch2_ops,
608                 },
609         },
610 };
611
612 static struct clk_branch gcc_dcd_xo_clk = {
613         .halt_reg = 0x2103c,
614         .clkr = {
615                 .enable_reg = 0x2103c,
616                 .enable_mask = BIT(0),
617                 .hw.init = &(struct clk_init_data){
618                         .name = "gcc_dcd_xo_clk",
619                         .parent_names = (const char *[]){
620                                 "xo",
621                         },
622                         .num_parents = 1,
623                         .ops = &clk_branch2_ops,
624                 },
625         },
626 };
627
628 static struct clk_branch gcc_boot_rom_ahb_clk = {
629         .halt_reg = 0x1300c,
630         .clkr = {
631                 .enable_reg = 0x1300c,
632                 .enable_mask = BIT(0),
633                 .hw.init = &(struct clk_init_data){
634                         .name = "gcc_boot_rom_ahb_clk",
635                         .parent_names = (const char *[]){
636                                 "pcnoc_clk_src",
637                         },
638                         .num_parents = 1,
639                         .ops = &clk_branch2_ops,
640                         .flags = CLK_SET_RATE_PARENT,
641                 },
642         },
643 };
644
645 static struct clk_branch gcc_crypto_ahb_clk = {
646         .halt_reg = 0x16024,
647         .halt_check = BRANCH_HALT_VOTED,
648         .clkr = {
649                 .enable_reg = 0x6000,
650                 .enable_mask = BIT(0),
651                 .hw.init = &(struct clk_init_data){
652                         .name = "gcc_crypto_ahb_clk",
653                         .parent_names = (const char *[]){
654                                 "pcnoc_clk_src",
655                         },
656                         .num_parents = 1,
657                         .ops = &clk_branch2_ops,
658                 },
659         },
660 };
661
662 static struct clk_branch gcc_crypto_axi_clk = {
663         .halt_reg = 0x16020,
664         .halt_check = BRANCH_HALT_VOTED,
665         .clkr = {
666                 .enable_reg = 0x6000,
667                 .enable_mask = BIT(1),
668                 .hw.init = &(struct clk_init_data){
669                         .name = "gcc_crypto_axi_clk",
670                         .parent_names = (const char *[]){
671                                 "fepll125",
672                         },
673                         .num_parents = 1,
674                         .ops = &clk_branch2_ops,
675                 },
676         },
677 };
678
679 static struct clk_branch gcc_crypto_clk = {
680         .halt_reg = 0x1601c,
681         .halt_check = BRANCH_HALT_VOTED,
682         .clkr = {
683                 .enable_reg = 0x6000,
684                 .enable_mask = BIT(2),
685                 .hw.init = &(struct clk_init_data){
686                         .name = "gcc_crypto_clk",
687                         .parent_names = (const char *[]){
688                                 "fepll125",
689                         },
690                         .num_parents = 1,
691                         .ops = &clk_branch2_ops,
692                 },
693         },
694 };
695
696 static struct clk_branch gcc_ess_clk = {
697         .halt_reg = 0x12010,
698         .clkr = {
699                 .enable_reg = 0x12010,
700                 .enable_mask = BIT(0),
701                 .hw.init = &(struct clk_init_data){
702                         .name = "gcc_ess_clk",
703                         .parent_names = (const char *[]){
704                                 "fephy_125m_dly_clk_src",
705                         },
706                         .num_parents = 1,
707                         .ops = &clk_branch2_ops,
708                         .flags = CLK_SET_RATE_PARENT,
709                 },
710         },
711 };
712
713 static struct clk_branch gcc_imem_axi_clk = {
714         .halt_reg = 0xe004,
715         .halt_check = BRANCH_HALT_VOTED,
716         .clkr = {
717                 .enable_reg = 0x6000,
718                 .enable_mask = BIT(17),
719                 .hw.init = &(struct clk_init_data){
720                         .name = "gcc_imem_axi_clk",
721                         .parent_names = (const char *[]){
722                                 "fepll200",
723                         },
724                         .num_parents = 1,
725                         .ops = &clk_branch2_ops,
726                 },
727         },
728 };
729
730 static struct clk_branch gcc_imem_cfg_ahb_clk = {
731         .halt_reg = 0xe008,
732         .clkr = {
733                 .enable_reg = 0xe008,
734                 .enable_mask = BIT(0),
735                 .hw.init = &(struct clk_init_data){
736                         .name = "gcc_imem_cfg_ahb_clk",
737                         .parent_names = (const char *[]){
738                                 "pcnoc_clk_src",
739                         },
740                         .num_parents = 1,
741                         .ops = &clk_branch2_ops,
742                 },
743         },
744 };
745
746 static struct clk_branch gcc_pcie_ahb_clk = {
747         .halt_reg = 0x1d00c,
748         .clkr = {
749                 .enable_reg = 0x1d00c,
750                 .enable_mask = BIT(0),
751                 .hw.init = &(struct clk_init_data){
752                         .name = "gcc_pcie_ahb_clk",
753                         .parent_names = (const char *[]){
754                                 "pcnoc_clk_src",
755                         },
756                         .num_parents = 1,
757                         .ops = &clk_branch2_ops,
758                 },
759         },
760 };
761
762 static struct clk_branch gcc_pcie_axi_m_clk = {
763         .halt_reg = 0x1d004,
764         .clkr = {
765                 .enable_reg = 0x1d004,
766                 .enable_mask = BIT(0),
767                 .hw.init = &(struct clk_init_data){
768                         .name = "gcc_pcie_axi_m_clk",
769                         .parent_names = (const char *[]){
770                                 "fepll200",
771                         },
772                         .num_parents = 1,
773                         .ops = &clk_branch2_ops,
774                 },
775         },
776 };
777
778 static struct clk_branch gcc_pcie_axi_s_clk = {
779         .halt_reg = 0x1d008,
780         .clkr = {
781                 .enable_reg = 0x1d008,
782                 .enable_mask = BIT(0),
783                 .hw.init = &(struct clk_init_data){
784                         .name = "gcc_pcie_axi_s_clk",
785                         .parent_names = (const char *[]){
786                                 "fepll200",
787                         },
788                         .num_parents = 1,
789                         .ops = &clk_branch2_ops,
790                 },
791         },
792 };
793
794 static struct clk_branch gcc_prng_ahb_clk = {
795         .halt_reg = 0x13004,
796         .halt_check = BRANCH_HALT_VOTED,
797         .clkr = {
798                 .enable_reg = 0x6000,
799                 .enable_mask = BIT(8),
800                 .hw.init = &(struct clk_init_data){
801                         .name = "gcc_prng_ahb_clk",
802                         .parent_names = (const char *[]){
803                                 "pcnoc_clk_src",
804                         },
805                         .num_parents = 1,
806                         .ops = &clk_branch2_ops,
807                 },
808         },
809 };
810
811 static struct clk_branch gcc_qpic_ahb_clk = {
812         .halt_reg = 0x1c008,
813         .clkr = {
814                 .enable_reg = 0x1c008,
815                 .enable_mask = BIT(0),
816                 .hw.init = &(struct clk_init_data){
817                         .name = "gcc_qpic_ahb_clk",
818                         .parent_names = (const char *[]){
819                                 "pcnoc_clk_src",
820                         },
821                         .num_parents = 1,
822                         .ops = &clk_branch2_ops,
823                 },
824         },
825 };
826
827 static struct clk_branch gcc_qpic_clk = {
828         .halt_reg = 0x1c004,
829         .clkr = {
830                 .enable_reg = 0x1c004,
831                 .enable_mask = BIT(0),
832                 .hw.init = &(struct clk_init_data){
833                         .name = "gcc_qpic_clk",
834                         .parent_names = (const char *[]){
835                                 "pcnoc_clk_src",
836                         },
837                         .num_parents = 1,
838                         .ops = &clk_branch2_ops,
839                 },
840         },
841 };
842
843 static struct clk_branch gcc_sdcc1_ahb_clk = {
844         .halt_reg = 0x18010,
845         .clkr = {
846                 .enable_reg = 0x18010,
847                 .enable_mask = BIT(0),
848                 .hw.init = &(struct clk_init_data){
849                         .name = "gcc_sdcc1_ahb_clk",
850                         .parent_names = (const char *[]){
851                                 "pcnoc_clk_src",
852                         },
853                         .num_parents = 1,
854                         .ops = &clk_branch2_ops,
855                 },
856         },
857 };
858
859 static struct clk_branch gcc_sdcc1_apps_clk = {
860         .halt_reg = 0x1800c,
861         .clkr = {
862                 .enable_reg = 0x1800c,
863                 .enable_mask = BIT(0),
864                 .hw.init = &(struct clk_init_data){
865                         .name = "gcc_sdcc1_apps_clk",
866                         .parent_names = (const char *[]){
867                                 "sdcc1_apps_clk_src",
868                         },
869                         .num_parents = 1,
870                         .ops = &clk_branch2_ops,
871                         .flags = CLK_SET_RATE_PARENT,
872                 },
873         },
874 };
875
876 static struct clk_branch gcc_tlmm_ahb_clk = {
877         .halt_reg = 0x5004,
878         .halt_check = BRANCH_HALT_VOTED,
879         .clkr = {
880                 .enable_reg = 0x6000,
881                 .enable_mask = BIT(5),
882                 .hw.init = &(struct clk_init_data){
883                         .name = "gcc_tlmm_ahb_clk",
884                         .parent_names = (const char *[]){
885                                 "pcnoc_clk_src",
886                         },
887                         .num_parents = 1,
888                         .ops = &clk_branch2_ops,
889                 },
890         },
891 };
892
893 static struct clk_branch gcc_usb2_master_clk = {
894         .halt_reg = 0x1e00c,
895         .clkr = {
896                 .enable_reg = 0x1e00c,
897                 .enable_mask = BIT(0),
898                 .hw.init = &(struct clk_init_data){
899                         .name = "gcc_usb2_master_clk",
900                         .parent_names = (const char *[]){
901                                 "pcnoc_clk_src",
902                         },
903                         .num_parents = 1,
904                         .ops = &clk_branch2_ops,
905                 },
906         },
907 };
908
909 static struct clk_branch gcc_usb2_sleep_clk = {
910         .halt_reg = 0x1e010,
911         .clkr = {
912                 .enable_reg = 0x1e010,
913                 .enable_mask = BIT(0),
914                 .hw.init = &(struct clk_init_data){
915                         .name = "gcc_usb2_sleep_clk",
916                         .parent_names = (const char *[]){
917                                 "gcc_sleep_clk_src",
918                         },
919                         .num_parents = 1,
920                         .ops = &clk_branch2_ops,
921                 },
922         },
923 };
924
925 static struct clk_branch gcc_usb2_mock_utmi_clk = {
926         .halt_reg = 0x1e014,
927         .clkr = {
928                 .enable_reg = 0x1e014,
929                 .enable_mask = BIT(0),
930                 .hw.init = &(struct clk_init_data){
931                         .name = "gcc_usb2_mock_utmi_clk",
932                         .parent_names = (const char *[]){
933                                 "usb30_mock_utmi_clk_src",
934                         },
935                         .num_parents = 1,
936                         .ops = &clk_branch2_ops,
937                         .flags = CLK_SET_RATE_PARENT,
938                 },
939         },
940 };
941
942 static const struct freq_tbl ftbl_gcc_usb30_mock_utmi_clk[] = {
943         F(2000000, FE_PLL_200, 10, 0, 0),
944         { }
945 };
946
947 static struct clk_rcg2 usb30_mock_utmi_clk_src = {
948         .cmd_rcgr = 0x1e000,
949         .hid_width = 5,
950         .parent_map = gcc_xo_200_map,
951         .freq_tbl = ftbl_gcc_usb30_mock_utmi_clk,
952         .clkr.hw.init = &(struct clk_init_data){
953                 .name = "usb30_mock_utmi_clk_src",
954                 .parent_names = gcc_xo_200,
955                 .num_parents = 2,
956                 .ops = &clk_rcg2_ops,
957         },
958 };
959
960 static struct clk_branch gcc_usb3_master_clk = {
961         .halt_reg = 0x1e028,
962         .clkr = {
963                 .enable_reg = 0x1e028,
964                 .enable_mask = BIT(0),
965                 .hw.init = &(struct clk_init_data){
966                         .name = "gcc_usb3_master_clk",
967                         .parent_names = (const char *[]){
968                                 "fepll125",
969                         },
970                         .num_parents = 1,
971                         .ops = &clk_branch2_ops,
972                 },
973         },
974 };
975
976 static struct clk_branch gcc_usb3_sleep_clk = {
977         .halt_reg = 0x1e02C,
978         .clkr = {
979                 .enable_reg = 0x1e02C,
980                 .enable_mask = BIT(0),
981                 .hw.init = &(struct clk_init_data){
982                         .name = "gcc_usb3_sleep_clk",
983                         .parent_names = (const char *[]){
984                                 "gcc_sleep_clk_src",
985                         },
986                         .num_parents = 1,
987                         .ops = &clk_branch2_ops,
988                 },
989         },
990 };
991
992 static struct clk_branch gcc_usb3_mock_utmi_clk = {
993         .halt_reg = 0x1e030,
994         .clkr = {
995                 .enable_reg = 0x1e030,
996                 .enable_mask = BIT(0),
997                 .hw.init = &(struct clk_init_data){
998                         .name = "gcc_usb3_mock_utmi_clk",
999                         .parent_names = (const char *[]){
1000                                 "usb30_mock_utmi_clk_src",
1001                         },
1002                         .num_parents = 1,
1003                         .ops = &clk_branch2_ops,
1004                         .flags = CLK_SET_RATE_PARENT,
1005                 },
1006         },
1007 };
1008
1009 static const struct freq_tbl ftbl_gcc_fephy_dly_clk[] = {
1010         F(125000000, FE_PLL_125_DLY, 1, 0, 0),
1011         { }
1012 };
1013
1014 static struct clk_rcg2 fephy_125m_dly_clk_src = {
1015         .cmd_rcgr = 0x12000,
1016         .hid_width = 5,
1017         .parent_map = gcc_xo_125_dly_map,
1018         .freq_tbl = ftbl_gcc_fephy_dly_clk,
1019         .clkr.hw.init = &(struct clk_init_data){
1020                 .name = "fephy_125m_dly_clk_src",
1021                 .parent_names = gcc_xo_125_dly,
1022                 .num_parents = 2,
1023                 .ops = &clk_rcg2_ops,
1024         },
1025 };
1026
1027
1028 static const struct freq_tbl ftbl_gcc_wcss2g_clk[] = {
1029         F(48000000, P_XO, 1, 0, 0),
1030         F(250000000, FE_PLL_WCSS2G, 1, 0, 0),
1031         { }
1032 };
1033
1034 static struct clk_rcg2 wcss2g_clk_src = {
1035         .cmd_rcgr = 0x1f000,
1036         .hid_width = 5,
1037         .freq_tbl = ftbl_gcc_wcss2g_clk,
1038         .parent_map = gcc_xo_wcss2g_map,
1039         .clkr.hw.init = &(struct clk_init_data){
1040                 .name = "wcss2g_clk_src",
1041                 .parent_names = gcc_xo_wcss2g,
1042                 .num_parents = 2,
1043                 .ops = &clk_rcg2_ops,
1044                 .flags = CLK_SET_RATE_PARENT,
1045         },
1046 };
1047
1048 static struct clk_branch gcc_wcss2g_clk = {
1049         .halt_reg = 0x1f00C,
1050         .clkr = {
1051                 .enable_reg = 0x1f00C,
1052                 .enable_mask = BIT(0),
1053                 .hw.init = &(struct clk_init_data){
1054                         .name = "gcc_wcss2g_clk",
1055                         .parent_names = (const char *[]){
1056                                 "wcss2g_clk_src",
1057                         },
1058                         .num_parents = 1,
1059                         .ops = &clk_branch2_ops,
1060                         .flags = CLK_SET_RATE_PARENT,
1061                 },
1062         },
1063 };
1064
1065 static struct clk_branch gcc_wcss2g_ref_clk = {
1066         .halt_reg = 0x1f00C,
1067         .clkr = {
1068                 .enable_reg = 0x1f00C,
1069                 .enable_mask = BIT(0),
1070                 .hw.init = &(struct clk_init_data){
1071                         .name = "gcc_wcss2g_ref_clk",
1072                         .parent_names = (const char *[]){
1073                                 "xo",
1074                         },
1075                         .num_parents = 1,
1076                         .ops = &clk_branch2_ops,
1077                         .flags = CLK_SET_RATE_PARENT,
1078                 },
1079         },
1080 };
1081
1082 static struct clk_branch gcc_wcss2g_rtc_clk = {
1083         .halt_reg = 0x1f010,
1084         .clkr = {
1085                 .enable_reg = 0x1f010,
1086                 .enable_mask = BIT(0),
1087                 .hw.init = &(struct clk_init_data){
1088                         .name = "gcc_wcss2g_rtc_clk",
1089                         .parent_names = (const char *[]){
1090                                 "gcc_sleep_clk_src",
1091                         },
1092                         .num_parents = 1,
1093                         .ops = &clk_branch2_ops,
1094                 },
1095         },
1096 };
1097
1098 static const struct freq_tbl ftbl_gcc_wcss5g_clk[] = {
1099         F(48000000, P_XO, 1, 0, 0),
1100         F(250000000, FE_PLL_WCSS5G, 1, 0, 0),
1101         { }
1102 };
1103
1104 static struct clk_rcg2 wcss5g_clk_src = {
1105         .cmd_rcgr = 0x20000,
1106         .hid_width = 5,
1107         .parent_map = gcc_xo_wcss5g_map,
1108         .freq_tbl = ftbl_gcc_wcss5g_clk,
1109         .clkr.hw.init = &(struct clk_init_data){
1110                 .name = "wcss5g_clk_src",
1111                 .parent_names = gcc_xo_wcss5g,
1112                 .num_parents = 2,
1113                 .ops = &clk_rcg2_ops,
1114         },
1115 };
1116
1117 static struct clk_branch gcc_wcss5g_clk = {
1118         .halt_reg = 0x2000c,
1119         .clkr = {
1120                 .enable_reg = 0x2000c,
1121                 .enable_mask = BIT(0),
1122                 .hw.init = &(struct clk_init_data){
1123                         .name = "gcc_wcss5g_clk",
1124                         .parent_names = (const char *[]){
1125                                 "wcss5g_clk_src",
1126                         },
1127                         .num_parents = 1,
1128                         .ops = &clk_branch2_ops,
1129                         .flags = CLK_SET_RATE_PARENT,
1130                 },
1131         },
1132 };
1133
1134 static struct clk_branch gcc_wcss5g_ref_clk = {
1135         .halt_reg = 0x2000c,
1136         .clkr = {
1137                 .enable_reg = 0x2000c,
1138                 .enable_mask = BIT(0),
1139                 .hw.init = &(struct clk_init_data){
1140                         .name = "gcc_wcss5g_ref_clk",
1141                         .parent_names = (const char *[]){
1142                                 "xo",
1143                         },
1144                         .num_parents = 1,
1145                         .ops = &clk_branch2_ops,
1146                         .flags = CLK_SET_RATE_PARENT,
1147                 },
1148         },
1149 };
1150
1151 static struct clk_branch gcc_wcss5g_rtc_clk = {
1152         .halt_reg = 0x20010,
1153         .clkr = {
1154                 .enable_reg = 0x20010,
1155                 .enable_mask = BIT(0),
1156                 .hw.init = &(struct clk_init_data){
1157                         .name = "gcc_wcss5g_rtc_clk",
1158                         .parent_names = (const char *[]){
1159                                 "gcc_sleep_clk_src",
1160                         },
1161                         .num_parents = 1,
1162                         .ops = &clk_branch2_ops,
1163                         .flags = CLK_SET_RATE_PARENT,
1164                 },
1165         },
1166 };
1167
1168 static struct clk_regmap *gcc_ipq4019_clocks[] = {
1169         [AUDIO_CLK_SRC] = &audio_clk_src.clkr,
1170         [BLSP1_QUP1_I2C_APPS_CLK_SRC] = &blsp1_qup1_i2c_apps_clk_src.clkr,
1171         [BLSP1_QUP1_SPI_APPS_CLK_SRC] = &blsp1_qup1_spi_apps_clk_src.clkr,
1172         [BLSP1_QUP2_I2C_APPS_CLK_SRC] = &blsp1_qup2_i2c_apps_clk_src.clkr,
1173         [BLSP1_QUP2_SPI_APPS_CLK_SRC] = &blsp1_qup2_spi_apps_clk_src.clkr,
1174         [BLSP1_UART1_APPS_CLK_SRC] = &blsp1_uart1_apps_clk_src.clkr,
1175         [BLSP1_UART2_APPS_CLK_SRC] = &blsp1_uart2_apps_clk_src.clkr,
1176         [GCC_USB3_MOCK_UTMI_CLK_SRC] = &usb30_mock_utmi_clk_src.clkr,
1177         [GCC_APPS_CLK_SRC] = &apps_clk_src.clkr,
1178         [GCC_APPS_AHB_CLK_SRC] = &apps_ahb_clk_src.clkr,
1179         [GP1_CLK_SRC] = &gp1_clk_src.clkr,
1180         [GP2_CLK_SRC] = &gp2_clk_src.clkr,
1181         [GP3_CLK_SRC] = &gp3_clk_src.clkr,
1182         [SDCC1_APPS_CLK_SRC] = &sdcc1_apps_clk_src.clkr,
1183         [FEPHY_125M_DLY_CLK_SRC] = &fephy_125m_dly_clk_src.clkr,
1184         [WCSS2G_CLK_SRC] = &wcss2g_clk_src.clkr,
1185         [WCSS5G_CLK_SRC] = &wcss5g_clk_src.clkr,
1186         [GCC_APSS_AHB_CLK] = &gcc_apss_ahb_clk.clkr,
1187         [GCC_AUDIO_AHB_CLK] = &gcc_audio_ahb_clk.clkr,
1188         [GCC_AUDIO_PWM_CLK] = &gcc_audio_pwm_clk.clkr,
1189         [GCC_BLSP1_AHB_CLK] = &gcc_blsp1_ahb_clk.clkr,
1190         [GCC_BLSP1_QUP1_I2C_APPS_CLK] = &gcc_blsp1_qup1_i2c_apps_clk.clkr,
1191         [GCC_BLSP1_QUP1_SPI_APPS_CLK] = &gcc_blsp1_qup1_spi_apps_clk.clkr,
1192         [GCC_BLSP1_QUP2_I2C_APPS_CLK] = &gcc_blsp1_qup2_i2c_apps_clk.clkr,
1193         [GCC_BLSP1_QUP2_SPI_APPS_CLK] = &gcc_blsp1_qup2_spi_apps_clk.clkr,
1194         [GCC_BLSP1_UART1_APPS_CLK] = &gcc_blsp1_uart1_apps_clk.clkr,
1195         [GCC_BLSP1_UART2_APPS_CLK] = &gcc_blsp1_uart2_apps_clk.clkr,
1196         [GCC_DCD_XO_CLK] = &gcc_dcd_xo_clk.clkr,
1197         [GCC_GP1_CLK] = &gcc_gp1_clk.clkr,
1198         [GCC_GP2_CLK] = &gcc_gp2_clk.clkr,
1199         [GCC_GP3_CLK] = &gcc_gp3_clk.clkr,
1200         [GCC_BOOT_ROM_AHB_CLK] = &gcc_boot_rom_ahb_clk.clkr,
1201         [GCC_CRYPTO_AHB_CLK] = &gcc_crypto_ahb_clk.clkr,
1202         [GCC_CRYPTO_AXI_CLK] = &gcc_crypto_axi_clk.clkr,
1203         [GCC_CRYPTO_CLK] = &gcc_crypto_clk.clkr,
1204         [GCC_ESS_CLK] = &gcc_ess_clk.clkr,
1205         [GCC_IMEM_AXI_CLK] = &gcc_imem_axi_clk.clkr,
1206         [GCC_IMEM_CFG_AHB_CLK] = &gcc_imem_cfg_ahb_clk.clkr,
1207         [GCC_PCIE_AHB_CLK] = &gcc_pcie_ahb_clk.clkr,
1208         [GCC_PCIE_AXI_M_CLK] = &gcc_pcie_axi_m_clk.clkr,
1209         [GCC_PCIE_AXI_S_CLK] = &gcc_pcie_axi_s_clk.clkr,
1210         [GCC_PRNG_AHB_CLK] = &gcc_prng_ahb_clk.clkr,
1211         [GCC_QPIC_AHB_CLK] = &gcc_qpic_ahb_clk.clkr,
1212         [GCC_QPIC_CLK] = &gcc_qpic_clk.clkr,
1213         [GCC_SDCC1_AHB_CLK] = &gcc_sdcc1_ahb_clk.clkr,
1214         [GCC_SDCC1_APPS_CLK] = &gcc_sdcc1_apps_clk.clkr,
1215         [GCC_TLMM_AHB_CLK] = &gcc_tlmm_ahb_clk.clkr,
1216         [GCC_USB2_MASTER_CLK] = &gcc_usb2_master_clk.clkr,
1217         [GCC_USB2_SLEEP_CLK] = &gcc_usb2_sleep_clk.clkr,
1218         [GCC_USB2_MOCK_UTMI_CLK] = &gcc_usb2_mock_utmi_clk.clkr,
1219         [GCC_USB3_MASTER_CLK] = &gcc_usb3_master_clk.clkr,
1220         [GCC_USB3_SLEEP_CLK] = &gcc_usb3_sleep_clk.clkr,
1221         [GCC_USB3_MOCK_UTMI_CLK] = &gcc_usb3_mock_utmi_clk.clkr,
1222         [GCC_WCSS2G_CLK] = &gcc_wcss2g_clk.clkr,
1223         [GCC_WCSS2G_REF_CLK] = &gcc_wcss2g_ref_clk.clkr,
1224         [GCC_WCSS2G_RTC_CLK] = &gcc_wcss2g_rtc_clk.clkr,
1225         [GCC_WCSS5G_CLK] = &gcc_wcss5g_clk.clkr,
1226         [GCC_WCSS5G_REF_CLK] = &gcc_wcss5g_ref_clk.clkr,
1227         [GCC_WCSS5G_RTC_CLK] = &gcc_wcss5g_rtc_clk.clkr,
1228 };
1229
1230 static const struct qcom_reset_map gcc_ipq4019_resets[] = {
1231         [WIFI0_CPU_INIT_RESET] = { 0x1f008, 5 },
1232         [WIFI0_RADIO_SRIF_RESET] = { 0x1f008, 4 },
1233         [WIFI0_RADIO_WARM_RESET] = { 0x1f008, 3 },
1234         [WIFI0_RADIO_COLD_RESET] = { 0x1f008, 2 },
1235         [WIFI0_CORE_WARM_RESET] = { 0x1f008, 1 },
1236         [WIFI0_CORE_COLD_RESET] = { 0x1f008, 0 },
1237         [WIFI1_CPU_INIT_RESET] = { 0x20008, 5 },
1238         [WIFI1_RADIO_SRIF_RESET] = { 0x20008, 4 },
1239         [WIFI1_RADIO_WARM_RESET] = { 0x20008, 3 },
1240         [WIFI1_RADIO_COLD_RESET] = { 0x20008, 2 },
1241         [WIFI1_CORE_WARM_RESET] = { 0x20008, 1 },
1242         [WIFI1_CORE_COLD_RESET] = { 0x20008, 0 },
1243         [USB3_UNIPHY_PHY_ARES] = { 0x1e038, 5 },
1244         [USB3_HSPHY_POR_ARES] = { 0x1e038, 4 },
1245         [USB3_HSPHY_S_ARES] = { 0x1e038, 2 },
1246         [USB2_HSPHY_POR_ARES] = { 0x1e01c, 4 },
1247         [USB2_HSPHY_S_ARES] = { 0x1e01c, 2 },
1248         [PCIE_PHY_AHB_ARES] = { 0x1d010, 11 },
1249         [PCIE_AHB_ARES] = { 0x1d010, 10 },
1250         [PCIE_PWR_ARES] = { 0x1d010, 9 },
1251         [PCIE_PIPE_STICKY_ARES] = { 0x1d010, 8 },
1252         [PCIE_AXI_M_STICKY_ARES] = { 0x1d010, 7 },
1253         [PCIE_PHY_ARES] = { 0x1d010, 6 },
1254         [PCIE_PARF_XPU_ARES] = { 0x1d010, 5 },
1255         [PCIE_AXI_S_XPU_ARES] = { 0x1d010, 4 },
1256         [PCIE_AXI_M_VMIDMT_ARES] = { 0x1d010, 3 },
1257         [PCIE_PIPE_ARES] = { 0x1d010, 2 },
1258         [PCIE_AXI_S_ARES] = { 0x1d010, 1 },
1259         [PCIE_AXI_M_ARES] = { 0x1d010, 0 },
1260         [ESS_RESET] = { 0x12008, 0},
1261         [GCC_BLSP1_BCR] = {0x01000, 0},
1262         [GCC_BLSP1_QUP1_BCR] = {0x02000, 0},
1263         [GCC_BLSP1_UART1_BCR] = {0x02038, 0},
1264         [GCC_BLSP1_QUP2_BCR] = {0x03008, 0},
1265         [GCC_BLSP1_UART2_BCR] = {0x03028, 0},
1266         [GCC_BIMC_BCR] = {0x04000, 0},
1267         [GCC_TLMM_BCR] = {0x05000, 0},
1268         [GCC_IMEM_BCR] = {0x0E000, 0},
1269         [GCC_ESS_BCR] = {0x12008, 0},
1270         [GCC_PRNG_BCR] = {0x13000, 0},
1271         [GCC_BOOT_ROM_BCR] = {0x13008, 0},
1272         [GCC_CRYPTO_BCR] = {0x16000, 0},
1273         [GCC_SDCC1_BCR] = {0x18000, 0},
1274         [GCC_SEC_CTRL_BCR] = {0x1A000, 0},
1275         [GCC_AUDIO_BCR] = {0x1B008, 0},
1276         [GCC_QPIC_BCR] = {0x1C000, 0},
1277         [GCC_PCIE_BCR] = {0x1D000, 0},
1278         [GCC_USB2_BCR] = {0x1E008, 0},
1279         [GCC_USB2_PHY_BCR] = {0x1E018, 0},
1280         [GCC_USB3_BCR] = {0x1E024, 0},
1281         [GCC_USB3_PHY_BCR] = {0x1E034, 0},
1282         [GCC_SYSTEM_NOC_BCR] = {0x21000, 0},
1283         [GCC_PCNOC_BCR] = {0x2102C, 0},
1284         [GCC_DCD_BCR] = {0x21038, 0},
1285         [GCC_SNOC_BUS_TIMEOUT0_BCR] = {0x21064, 0},
1286         [GCC_SNOC_BUS_TIMEOUT1_BCR] = {0x2106C, 0},
1287         [GCC_SNOC_BUS_TIMEOUT2_BCR] = {0x21074, 0},
1288         [GCC_SNOC_BUS_TIMEOUT3_BCR] = {0x2107C, 0},
1289         [GCC_PCNOC_BUS_TIMEOUT0_BCR] = {0x21084, 0},
1290         [GCC_PCNOC_BUS_TIMEOUT1_BCR] = {0x2108C, 0},
1291         [GCC_PCNOC_BUS_TIMEOUT2_BCR] = {0x21094, 0},
1292         [GCC_PCNOC_BUS_TIMEOUT3_BCR] = {0x2109C, 0},
1293         [GCC_PCNOC_BUS_TIMEOUT4_BCR] = {0x210A4, 0},
1294         [GCC_PCNOC_BUS_TIMEOUT5_BCR] = {0x210AC, 0},
1295         [GCC_PCNOC_BUS_TIMEOUT6_BCR] = {0x210B4, 0},
1296         [GCC_PCNOC_BUS_TIMEOUT7_BCR] = {0x210BC, 0},
1297         [GCC_PCNOC_BUS_TIMEOUT8_BCR] = {0x210C4, 0},
1298         [GCC_PCNOC_BUS_TIMEOUT9_BCR] = {0x210CC, 0},
1299         [GCC_TCSR_BCR] = {0x22000, 0},
1300         [GCC_MPM_BCR] = {0x24000, 0},
1301         [GCC_SPDM_BCR] = {0x25000, 0},
1302 };
1303
1304 static const struct regmap_config gcc_ipq4019_regmap_config = {
1305         .reg_bits       = 32,
1306         .reg_stride     = 4,
1307         .val_bits       = 32,
1308         .max_register   = 0x2dfff,
1309         .fast_io        = true,
1310 };
1311
1312 static const struct qcom_cc_desc gcc_ipq4019_desc = {
1313         .config = &gcc_ipq4019_regmap_config,
1314         .clks = gcc_ipq4019_clocks,
1315         .num_clks = ARRAY_SIZE(gcc_ipq4019_clocks),
1316         .resets = gcc_ipq4019_resets,
1317         .num_resets = ARRAY_SIZE(gcc_ipq4019_resets),
1318 };
1319
1320 static const struct of_device_id gcc_ipq4019_match_table[] = {
1321         { .compatible = "qcom,gcc-ipq4019" },
1322         { }
1323 };
1324 MODULE_DEVICE_TABLE(of, gcc_ipq4019_match_table);
1325
1326 static int gcc_ipq4019_probe(struct platform_device *pdev)
1327 {
1328         return qcom_cc_probe(pdev, &gcc_ipq4019_desc);
1329 }
1330
1331 static struct platform_driver gcc_ipq4019_driver = {
1332         .probe          = gcc_ipq4019_probe,
1333         .driver         = {
1334                 .name   = "qcom,gcc-ipq4019",
1335                 .owner  = THIS_MODULE,
1336                 .of_match_table = gcc_ipq4019_match_table,
1337         },
1338 };
1339
1340 static int __init gcc_ipq4019_init(void)
1341 {
1342         return platform_driver_register(&gcc_ipq4019_driver);
1343 }
1344 core_initcall(gcc_ipq4019_init);
1345
1346 static void __exit gcc_ipq4019_exit(void)
1347 {
1348         platform_driver_unregister(&gcc_ipq4019_driver);
1349 }
1350 module_exit(gcc_ipq4019_exit);
1351
1352 MODULE_ALIAS("platform:gcc-ipq4019");
1353 MODULE_LICENSE("GPL v2");
1354 MODULE_DESCRIPTION("QCOM GCC IPQ4019 driver");