Root/drivers/clk/clk-u300.c

1/*
2 * U300 clock implementation
3 * Copyright (C) 2007-2012 ST-Ericsson AB
4 * License terms: GNU General Public License (GPL) version 2
5 * Author: Linus Walleij <linus.walleij@stericsson.com>
6 * Author: Jonas Aaberg <jonas.aberg@stericsson.com>
7 */
8#include <linux/clk.h>
9#include <linux/clkdev.h>
10#include <linux/err.h>
11#include <linux/io.h>
12#include <linux/clk-provider.h>
13#include <linux/spinlock.h>
14#include <mach/syscon.h>
15
16/*
17 * The clocking hierarchy currently looks like this.
18 * NOTE: the idea is NOT to show how the clocks are routed on the chip!
19 * The ideas is to show dependencies, so a clock higher up in the
20 * hierarchy has to be on in order for another clock to be on. Now,
21 * both CPU and DMA can actually be on top of the hierarchy, and that
22 * is not modeled currently. Instead we have the backbone AMBA bus on
23 * top. This bus cannot be programmed in any way but conceptually it
24 * needs to be active for the bridges and devices to transport data.
25 *
26 * Please be aware that a few clocks are hw controlled, which mean that
27 * the hw itself can turn on/off or change the rate of the clock when
28 * needed!
29 *
30 * AMBA bus
31 * |
32 * +- CPU
33 * +- FSMC NANDIF NAND Flash interface
34 * +- SEMI Shared Memory interface
35 * +- ISP Image Signal Processor (U335 only)
36 * +- CDS (U335 only)
37 * +- DMA Direct Memory Access Controller
38 * +- AAIF APP/ACC Inteface (Mobile Scalable Link, MSL)
39 * +- APEX
40 * +- VIDEO_ENC AVE2/3 Video Encoder
41 * +- XGAM Graphics Accelerator Controller
42 * +- AHB
43 * |
44 * +- ahb:0 AHB Bridge
45 * | |
46 * | +- ahb:1 INTCON Interrupt controller
47 * | +- ahb:3 MSPRO Memory Stick Pro controller
48 * | +- ahb:4 EMIF External Memory interface
49 * |
50 * +- fast:0 FAST bridge
51 * | |
52 * | +- fast:1 MMCSD MMC/SD card reader controller
53 * | +- fast:2 I2S0 PCM I2S channel 0 controller
54 * | +- fast:3 I2S1 PCM I2S channel 1 controller
55 * | +- fast:4 I2C0 I2C channel 0 controller
56 * | +- fast:5 I2C1 I2C channel 1 controller
57 * | +- fast:6 SPI SPI controller
58 * | +- fast:7 UART1 Secondary UART (U335 only)
59 * |
60 * +- slow:0 SLOW bridge
61 * |
62 * +- slow:1 SYSCON (not possible to control)
63 * +- slow:2 WDOG Watchdog
64 * +- slow:3 UART0 primary UART
65 * +- slow:4 TIMER_APP Application timer - used in Linux
66 * +- slow:5 KEYPAD controller
67 * +- slow:6 GPIO controller
68 * +- slow:7 RTC controller
69 * +- slow:8 BT Bus Tracer (not used currently)
70 * +- slow:9 EH Event Handler (not used currently)
71 * +- slow:a TIMER_ACC Access style timer (not used currently)
72 * +- slow:b PPM (U335 only, what is that?)
73 */
74
75/* Global syscon virtual base */
76static void __iomem *syscon_vbase;
77
78/**
79 * struct clk_syscon - U300 syscon clock
80 * @hw: corresponding clock hardware entry
81 * @hw_ctrld: whether this clock is hardware controlled (for refcount etc)
82 * and does not need any magic pokes to be enabled/disabled
83 * @reset: state holder, whether this block's reset line is asserted or not
84 * @res_reg: reset line enable/disable flag register
85 * @res_bit: bit for resetting or taking this consumer out of reset
86 * @en_reg: clock line enable/disable flag register
87 * @en_bit: bit for enabling/disabling this consumer clock line
88 * @clk_val: magic value to poke in the register to enable/disable
89 * this one clock
90 */
91struct clk_syscon {
92    struct clk_hw hw;
93    bool hw_ctrld;
94    bool reset;
95    void __iomem *res_reg;
96    u8 res_bit;
97    void __iomem *en_reg;
98    u8 en_bit;
99    u16 clk_val;
100};
101
102#define to_syscon(_hw) container_of(_hw, struct clk_syscon, hw)
103
104static DEFINE_SPINLOCK(syscon_resetreg_lock);
105
106/*
107 * Reset control functions. We remember if a block has been
108 * taken out of reset and don't remove the reset assertion again
109 * and vice versa. Currently we only remove resets so the
110 * enablement function is defined out.
111 */
112static void syscon_block_reset_enable(struct clk_syscon *sclk)
113{
114    unsigned long iflags;
115    u16 val;
116
117    /* Not all blocks support resetting */
118    if (!sclk->res_reg)
119        return;
120    spin_lock_irqsave(&syscon_resetreg_lock, iflags);
121    val = readw(sclk->res_reg);
122    val |= BIT(sclk->res_bit);
123    writew(val, sclk->res_reg);
124    spin_unlock_irqrestore(&syscon_resetreg_lock, iflags);
125    sclk->reset = true;
126}
127
128static void syscon_block_reset_disable(struct clk_syscon *sclk)
129{
130    unsigned long iflags;
131    u16 val;
132
133    /* Not all blocks support resetting */
134    if (!sclk->res_reg)
135        return;
136    spin_lock_irqsave(&syscon_resetreg_lock, iflags);
137    val = readw(sclk->res_reg);
138    val &= ~BIT(sclk->res_bit);
139    writew(val, sclk->res_reg);
140    spin_unlock_irqrestore(&syscon_resetreg_lock, iflags);
141    sclk->reset = false;
142}
143
144static int syscon_clk_prepare(struct clk_hw *hw)
145{
146    struct clk_syscon *sclk = to_syscon(hw);
147
148    /* If the block is in reset, bring it out */
149    if (sclk->reset)
150        syscon_block_reset_disable(sclk);
151    return 0;
152}
153
154static void syscon_clk_unprepare(struct clk_hw *hw)
155{
156    struct clk_syscon *sclk = to_syscon(hw);
157
158    /* Please don't force the console into reset */
159    if (sclk->clk_val == U300_SYSCON_SBCER_UART_CLK_EN)
160        return;
161    /* When unpreparing, force block into reset */
162    if (!sclk->reset)
163        syscon_block_reset_enable(sclk);
164}
165
166static int syscon_clk_enable(struct clk_hw *hw)
167{
168    struct clk_syscon *sclk = to_syscon(hw);
169
170    /* Don't touch the hardware controlled clocks */
171    if (sclk->hw_ctrld)
172        return 0;
173    /* These cannot be controlled */
174    if (sclk->clk_val == 0xFFFFU)
175        return 0;
176
177    writew(sclk->clk_val, syscon_vbase + U300_SYSCON_SBCER);
178    return 0;
179}
180
181static void syscon_clk_disable(struct clk_hw *hw)
182{
183    struct clk_syscon *sclk = to_syscon(hw);
184
185    /* Don't touch the hardware controlled clocks */
186    if (sclk->hw_ctrld)
187        return;
188    if (sclk->clk_val == 0xFFFFU)
189        return;
190    /* Please don't disable the console port */
191    if (sclk->clk_val == U300_SYSCON_SBCER_UART_CLK_EN)
192        return;
193
194    writew(sclk->clk_val, syscon_vbase + U300_SYSCON_SBCDR);
195}
196
197static int syscon_clk_is_enabled(struct clk_hw *hw)
198{
199    struct clk_syscon *sclk = to_syscon(hw);
200    u16 val;
201
202    /* If no enable register defined, it's always-on */
203    if (!sclk->en_reg)
204        return 1;
205
206    val = readw(sclk->en_reg);
207    val &= BIT(sclk->en_bit);
208
209    return val ? 1 : 0;
210}
211
212static u16 syscon_get_perf(void)
213{
214    u16 val;
215
216    val = readw(syscon_vbase + U300_SYSCON_CCR);
217    val &= U300_SYSCON_CCR_CLKING_PERFORMANCE_MASK;
218    return val;
219}
220
221static unsigned long
222syscon_clk_recalc_rate(struct clk_hw *hw,
223               unsigned long parent_rate)
224{
225    struct clk_syscon *sclk = to_syscon(hw);
226    u16 perf = syscon_get_perf();
227
228    switch(sclk->clk_val) {
229    case U300_SYSCON_SBCER_FAST_BRIDGE_CLK_EN:
230    case U300_SYSCON_SBCER_I2C0_CLK_EN:
231    case U300_SYSCON_SBCER_I2C1_CLK_EN:
232    case U300_SYSCON_SBCER_MMC_CLK_EN:
233    case U300_SYSCON_SBCER_SPI_CLK_EN:
234        /* The FAST clocks have one progression */
235        switch(perf) {
236        case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER:
237        case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW:
238            return 13000000;
239        default:
240            return parent_rate; /* 26 MHz */
241        }
242    case U300_SYSCON_SBCER_DMAC_CLK_EN:
243    case U300_SYSCON_SBCER_NANDIF_CLK_EN:
244    case U300_SYSCON_SBCER_XGAM_CLK_EN:
245        /* AMBA interconnect peripherals */
246        switch(perf) {
247        case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER:
248        case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW:
249            return 6500000;
250        case U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE:
251            return 26000000;
252        default:
253            return parent_rate; /* 52 MHz */
254        }
255    case U300_SYSCON_SBCER_SEMI_CLK_EN:
256    case U300_SYSCON_SBCER_EMIF_CLK_EN:
257        /* EMIF speeds */
258        switch(perf) {
259        case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER:
260        case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW:
261            return 13000000;
262        case U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE:
263            return 52000000;
264        default:
265            return 104000000;
266        }
267    case U300_SYSCON_SBCER_CPU_CLK_EN:
268        /* And the fast CPU clock */
269        switch(perf) {
270        case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER:
271        case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW:
272            return 13000000;
273        case U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE:
274            return 52000000;
275        case U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH:
276            return 104000000;
277        default:
278            return parent_rate; /* 208 MHz */
279        }
280    default:
281        /*
282         * The SLOW clocks and default just inherit the rate of
283         * their parent (typically PLL13 13 MHz).
284         */
285        return parent_rate;
286    }
287}
288
289static long
290syscon_clk_round_rate(struct clk_hw *hw, unsigned long rate,
291              unsigned long *prate)
292{
293    struct clk_syscon *sclk = to_syscon(hw);
294
295    if (sclk->clk_val != U300_SYSCON_SBCER_CPU_CLK_EN)
296        return *prate;
297    /* We really only support setting the rate of the CPU clock */
298    if (rate <= 13000000)
299        return 13000000;
300    if (rate <= 52000000)
301        return 52000000;
302    if (rate <= 104000000)
303        return 104000000;
304    return 208000000;
305}
306
307static int syscon_clk_set_rate(struct clk_hw *hw, unsigned long rate,
308                   unsigned long parent_rate)
309{
310    struct clk_syscon *sclk = to_syscon(hw);
311    u16 val;
312
313    /* We only support setting the rate of the CPU clock */
314    if (sclk->clk_val != U300_SYSCON_SBCER_CPU_CLK_EN)
315        return -EINVAL;
316    switch (rate) {
317    case 13000000:
318        val = U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER;
319        break;
320    case 52000000:
321        val = U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE;
322        break;
323    case 104000000:
324        val = U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH;
325        break;
326    case 208000000:
327        val = U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST;
328        break;
329    default:
330        return -EINVAL;
331    }
332    val |= readw(syscon_vbase + U300_SYSCON_CCR) &
333        ~U300_SYSCON_CCR_CLKING_PERFORMANCE_MASK ;
334    writew(val, syscon_vbase + U300_SYSCON_CCR);
335    return 0;
336}
337
338static const struct clk_ops syscon_clk_ops = {
339    .prepare = syscon_clk_prepare,
340    .unprepare = syscon_clk_unprepare,
341    .enable = syscon_clk_enable,
342    .disable = syscon_clk_disable,
343    .is_enabled = syscon_clk_is_enabled,
344    .recalc_rate = syscon_clk_recalc_rate,
345    .round_rate = syscon_clk_round_rate,
346    .set_rate = syscon_clk_set_rate,
347};
348
349static struct clk * __init
350syscon_clk_register(struct device *dev, const char *name,
351            const char *parent_name, unsigned long flags,
352            bool hw_ctrld,
353            void __iomem *res_reg, u8 res_bit,
354            void __iomem *en_reg, u8 en_bit,
355            u16 clk_val)
356{
357    struct clk *clk;
358    struct clk_syscon *sclk;
359    struct clk_init_data init;
360
361    sclk = kzalloc(sizeof(struct clk_syscon), GFP_KERNEL);
362    if (!sclk) {
363        pr_err("could not allocate syscon clock %s\n",
364            name);
365        return ERR_PTR(-ENOMEM);
366    }
367    init.name = name;
368    init.ops = &syscon_clk_ops;
369    init.flags = flags;
370    init.parent_names = (parent_name ? &parent_name : NULL);
371    init.num_parents = (parent_name ? 1 : 0);
372    sclk->hw.init = &init;
373    sclk->hw_ctrld = hw_ctrld;
374    /* Assume the block is in reset at registration */
375    sclk->reset = true;
376    sclk->res_reg = res_reg;
377    sclk->res_bit = res_bit;
378    sclk->en_reg = en_reg;
379    sclk->en_bit = en_bit;
380    sclk->clk_val = clk_val;
381
382    clk = clk_register(dev, &sclk->hw);
383    if (IS_ERR(clk))
384        kfree(sclk);
385
386    return clk;
387}
388
389/**
390 * struct clk_mclk - U300 MCLK clock (MMC/SD clock)
391 * @hw: corresponding clock hardware entry
392 * @is_mspro: if this is the memory stick clock rather than MMC/SD
393 */
394struct clk_mclk {
395    struct clk_hw hw;
396    bool is_mspro;
397};
398
399#define to_mclk(_hw) container_of(_hw, struct clk_mclk, hw)
400
401static int mclk_clk_prepare(struct clk_hw *hw)
402{
403    struct clk_mclk *mclk = to_mclk(hw);
404    u16 val;
405
406    /* The MMC and MSPRO clocks need some special set-up */
407    if (!mclk->is_mspro) {
408        /* Set default MMC clock divisor to 18.9 MHz */
409        writew(0x0054U, syscon_vbase + U300_SYSCON_MMF0R);
410        val = readw(syscon_vbase + U300_SYSCON_MMCR);
411        /* Disable the MMC feedback clock */
412        val &= ~U300_SYSCON_MMCR_MMC_FB_CLK_SEL_ENABLE;
413        /* Disable MSPRO frequency */
414        val &= ~U300_SYSCON_MMCR_MSPRO_FREQSEL_ENABLE;
415        writew(val, syscon_vbase + U300_SYSCON_MMCR);
416    } else {
417        val = readw(syscon_vbase + U300_SYSCON_MMCR);
418        /* Disable the MMC feedback clock */
419        val &= ~U300_SYSCON_MMCR_MMC_FB_CLK_SEL_ENABLE;
420        /* Enable MSPRO frequency */
421        val |= U300_SYSCON_MMCR_MSPRO_FREQSEL_ENABLE;
422        writew(val, syscon_vbase + U300_SYSCON_MMCR);
423    }
424
425    return 0;
426}
427
428static unsigned long
429mclk_clk_recalc_rate(struct clk_hw *hw,
430             unsigned long parent_rate)
431{
432    u16 perf = syscon_get_perf();
433
434    switch (perf) {
435    case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER:
436        /*
437         * Here, the 208 MHz PLL gets shut down and the always
438         * on 13 MHz PLL used for RTC etc kicks into use
439         * instead.
440         */
441        return 13000000;
442    case U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW:
443    case U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE:
444    case U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH:
445    case U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST:
446    {
447        /*
448         * This clock is under program control. The register is
449         * divided in two nybbles, bit 7-4 gives cycles-1 to count
450         * high, bit 3-0 gives cycles-1 to count low. Distribute
451         * these with no more than 1 cycle difference between
452         * low and high and add low and high to get the actual
453         * divisor. The base PLL is 208 MHz. Writing 0x00 will
454         * divide by 1 and 1 so the highest frequency possible
455         * is 104 MHz.
456         *
457         * e.g. 0x54 =>
458         * f = 208 / ((5+1) + (4+1)) = 208 / 11 = 18.9 MHz
459         */
460        u16 val = readw(syscon_vbase + U300_SYSCON_MMF0R) &
461            U300_SYSCON_MMF0R_MASK;
462        switch (val) {
463        case 0x0054:
464            return 18900000;
465        case 0x0044:
466            return 20800000;
467        case 0x0043:
468            return 23100000;
469        case 0x0033:
470            return 26000000;
471        case 0x0032:
472            return 29700000;
473        case 0x0022:
474            return 34700000;
475        case 0x0021:
476            return 41600000;
477        case 0x0011:
478            return 52000000;
479        case 0x0000:
480            return 104000000;
481        default:
482            break;
483        }
484    }
485    default:
486        break;
487    }
488    return parent_rate;
489}
490
491static long
492mclk_clk_round_rate(struct clk_hw *hw, unsigned long rate,
493            unsigned long *prate)
494{
495    if (rate <= 18900000)
496        return 18900000;
497    if (rate <= 20800000)
498        return 20800000;
499    if (rate <= 23100000)
500        return 23100000;
501    if (rate <= 26000000)
502        return 26000000;
503    if (rate <= 29700000)
504        return 29700000;
505    if (rate <= 34700000)
506        return 34700000;
507    if (rate <= 41600000)
508        return 41600000;
509    /* Highest rate */
510    return 52000000;
511}
512
513static int mclk_clk_set_rate(struct clk_hw *hw, unsigned long rate,
514                 unsigned long parent_rate)
515{
516    u16 val;
517    u16 reg;
518
519    switch (rate) {
520    case 18900000:
521        val = 0x0054;
522        break;
523    case 20800000:
524        val = 0x0044;
525        break;
526    case 23100000:
527        val = 0x0043;
528        break;
529    case 26000000:
530        val = 0x0033;
531        break;
532    case 29700000:
533        val = 0x0032;
534        break;
535    case 34700000:
536        val = 0x0022;
537        break;
538    case 41600000:
539        val = 0x0021;
540        break;
541    case 52000000:
542        val = 0x0011;
543        break;
544    case 104000000:
545        val = 0x0000;
546        break;
547    default:
548        return -EINVAL;
549    }
550
551    reg = readw(syscon_vbase + U300_SYSCON_MMF0R) &
552        ~U300_SYSCON_MMF0R_MASK;
553    writew(reg | val, syscon_vbase + U300_SYSCON_MMF0R);
554    return 0;
555}
556
557static const struct clk_ops mclk_ops = {
558    .prepare = mclk_clk_prepare,
559    .recalc_rate = mclk_clk_recalc_rate,
560    .round_rate = mclk_clk_round_rate,
561    .set_rate = mclk_clk_set_rate,
562};
563
564static struct clk * __init
565mclk_clk_register(struct device *dev, const char *name,
566          const char *parent_name, bool is_mspro)
567{
568    struct clk *clk;
569    struct clk_mclk *mclk;
570    struct clk_init_data init;
571
572    mclk = kzalloc(sizeof(struct clk_mclk), GFP_KERNEL);
573    if (!mclk) {
574        pr_err("could not allocate MMC/SD clock %s\n",
575               name);
576        return ERR_PTR(-ENOMEM);
577    }
578    init.name = "mclk";
579    init.ops = &mclk_ops;
580    init.flags = 0;
581    init.parent_names = (parent_name ? &parent_name : NULL);
582    init.num_parents = (parent_name ? 1 : 0);
583    mclk->hw.init = &init;
584    mclk->is_mspro = is_mspro;
585
586    clk = clk_register(dev, &mclk->hw);
587    if (IS_ERR(clk))
588        kfree(mclk);
589
590    return clk;
591}
592
593void __init u300_clk_init(void __iomem *base)
594{
595    u16 val;
596    struct clk *clk;
597
598    syscon_vbase = base;
599
600    /* Set system to run at PLL208, max performance, a known state. */
601    val = readw(syscon_vbase + U300_SYSCON_CCR);
602    val &= ~U300_SYSCON_CCR_CLKING_PERFORMANCE_MASK;
603    writew(val, syscon_vbase + U300_SYSCON_CCR);
604    /* Wait for the PLL208 to lock if not locked in yet */
605    while (!(readw(syscon_vbase + U300_SYSCON_CSR) &
606         U300_SYSCON_CSR_PLL208_LOCK_IND));
607
608    /* Power management enable */
609    val = readw(syscon_vbase + U300_SYSCON_PMCR);
610    val |= U300_SYSCON_PMCR_PWR_MGNT_ENABLE;
611    writew(val, syscon_vbase + U300_SYSCON_PMCR);
612
613    /* These are always available (RTC and PLL13) */
614    clk = clk_register_fixed_rate(NULL, "app_32_clk", NULL,
615                      CLK_IS_ROOT, 32768);
616    /* The watchdog sits directly on the 32 kHz clock */
617    clk_register_clkdev(clk, NULL, "coh901327_wdog");
618    clk = clk_register_fixed_rate(NULL, "pll13", NULL,
619                      CLK_IS_ROOT, 13000000);
620
621    /* These derive from PLL208 */
622    clk = clk_register_fixed_rate(NULL, "pll208", NULL,
623                      CLK_IS_ROOT, 208000000);
624    clk = clk_register_fixed_factor(NULL, "app_208_clk", "pll208",
625                    0, 1, 1);
626    clk = clk_register_fixed_factor(NULL, "app_104_clk", "pll208",
627                    0, 1, 2);
628    clk = clk_register_fixed_factor(NULL, "app_52_clk", "pll208",
629                    0, 1, 4);
630    /* The 52 MHz is divided down to 26 MHz */
631    clk = clk_register_fixed_factor(NULL, "app_26_clk", "app_52_clk",
632                    0, 1, 2);
633
634    /* Directly on the AMBA interconnect */
635    clk = syscon_clk_register(NULL, "cpu_clk", "app_208_clk", 0, true,
636                  syscon_vbase + U300_SYSCON_RRR, 3,
637                  syscon_vbase + U300_SYSCON_CERR, 3,
638                  U300_SYSCON_SBCER_CPU_CLK_EN);
639    clk = syscon_clk_register(NULL, "dmac_clk", "app_52_clk", 0, true,
640                  syscon_vbase + U300_SYSCON_RRR, 4,
641                  syscon_vbase + U300_SYSCON_CERR, 4,
642                  U300_SYSCON_SBCER_DMAC_CLK_EN);
643    clk_register_clkdev(clk, NULL, "dma");
644    clk = syscon_clk_register(NULL, "fsmc_clk", "app_52_clk", 0, false,
645                  syscon_vbase + U300_SYSCON_RRR, 6,
646                  syscon_vbase + U300_SYSCON_CERR, 6,
647                  U300_SYSCON_SBCER_NANDIF_CLK_EN);
648    clk_register_clkdev(clk, NULL, "fsmc-nand");
649    clk = syscon_clk_register(NULL, "xgam_clk", "app_52_clk", 0, true,
650                  syscon_vbase + U300_SYSCON_RRR, 8,
651                  syscon_vbase + U300_SYSCON_CERR, 8,
652                  U300_SYSCON_SBCER_XGAM_CLK_EN);
653    clk_register_clkdev(clk, NULL, "xgam");
654    clk = syscon_clk_register(NULL, "semi_clk", "app_104_clk", 0, false,
655                  syscon_vbase + U300_SYSCON_RRR, 9,
656                  syscon_vbase + U300_SYSCON_CERR, 9,
657                  U300_SYSCON_SBCER_SEMI_CLK_EN);
658    clk_register_clkdev(clk, NULL, "semi");
659
660    /* AHB bridge clocks */
661    clk = syscon_clk_register(NULL, "ahb_subsys_clk", "app_52_clk", 0, true,
662                  syscon_vbase + U300_SYSCON_RRR, 10,
663                  syscon_vbase + U300_SYSCON_CERR, 10,
664                  U300_SYSCON_SBCER_AHB_SUBSYS_BRIDGE_CLK_EN);
665    clk = syscon_clk_register(NULL, "intcon_clk", "ahb_subsys_clk", 0, false,
666                  syscon_vbase + U300_SYSCON_RRR, 12,
667                  syscon_vbase + U300_SYSCON_CERR, 12,
668                  /* Cannot be enabled, just taken out of reset */
669                  0xFFFFU);
670    clk_register_clkdev(clk, NULL, "intcon");
671    clk = syscon_clk_register(NULL, "emif_clk", "ahb_subsys_clk", 0, false,
672                  syscon_vbase + U300_SYSCON_RRR, 5,
673                  syscon_vbase + U300_SYSCON_CERR, 5,
674                  U300_SYSCON_SBCER_EMIF_CLK_EN);
675    clk_register_clkdev(clk, NULL, "pl172");
676
677    /* FAST bridge clocks */
678    clk = syscon_clk_register(NULL, "fast_clk", "app_26_clk", 0, true,
679                  syscon_vbase + U300_SYSCON_RFR, 0,
680                  syscon_vbase + U300_SYSCON_CEFR, 0,
681                  U300_SYSCON_SBCER_FAST_BRIDGE_CLK_EN);
682    clk = syscon_clk_register(NULL, "i2c0_p_clk", "fast_clk", 0, false,
683                  syscon_vbase + U300_SYSCON_RFR, 1,
684                  syscon_vbase + U300_SYSCON_CEFR, 1,
685                  U300_SYSCON_SBCER_I2C0_CLK_EN);
686    clk_register_clkdev(clk, NULL, "stu300.0");
687    clk = syscon_clk_register(NULL, "i2c1_p_clk", "fast_clk", 0, false,
688                  syscon_vbase + U300_SYSCON_RFR, 2,
689                  syscon_vbase + U300_SYSCON_CEFR, 2,
690                  U300_SYSCON_SBCER_I2C1_CLK_EN);
691    clk_register_clkdev(clk, NULL, "stu300.1");
692    clk = syscon_clk_register(NULL, "mmc_p_clk", "fast_clk", 0, false,
693                  syscon_vbase + U300_SYSCON_RFR, 5,
694                  syscon_vbase + U300_SYSCON_CEFR, 5,
695                  U300_SYSCON_SBCER_MMC_CLK_EN);
696    clk_register_clkdev(clk, "apb_pclk", "mmci");
697    clk = syscon_clk_register(NULL, "spi_p_clk", "fast_clk", 0, false,
698                  syscon_vbase + U300_SYSCON_RFR, 6,
699                  syscon_vbase + U300_SYSCON_CEFR, 6,
700                  U300_SYSCON_SBCER_SPI_CLK_EN);
701    /* The SPI has no external clock for the outward bus, uses the pclk */
702    clk_register_clkdev(clk, NULL, "pl022");
703    clk_register_clkdev(clk, "apb_pclk", "pl022");
704
705    /* SLOW bridge clocks */
706    clk = syscon_clk_register(NULL, "slow_clk", "pll13", 0, true,
707                  syscon_vbase + U300_SYSCON_RSR, 0,
708                  syscon_vbase + U300_SYSCON_CESR, 0,
709                  U300_SYSCON_SBCER_SLOW_BRIDGE_CLK_EN);
710    clk = syscon_clk_register(NULL, "uart0_clk", "slow_clk", 0, false,
711                  syscon_vbase + U300_SYSCON_RSR, 1,
712                  syscon_vbase + U300_SYSCON_CESR, 1,
713                  U300_SYSCON_SBCER_UART_CLK_EN);
714    /* Same clock is used for APB and outward bus */
715    clk_register_clkdev(clk, NULL, "uart0");
716    clk_register_clkdev(clk, "apb_pclk", "uart0");
717    clk = syscon_clk_register(NULL, "gpio_clk", "slow_clk", 0, false,
718                  syscon_vbase + U300_SYSCON_RSR, 4,
719                  syscon_vbase + U300_SYSCON_CESR, 4,
720                  U300_SYSCON_SBCER_GPIO_CLK_EN);
721    clk_register_clkdev(clk, NULL, "u300-gpio");
722    clk = syscon_clk_register(NULL, "keypad_clk", "slow_clk", 0, false,
723                  syscon_vbase + U300_SYSCON_RSR, 5,
724                  syscon_vbase + U300_SYSCON_CESR, 6,
725                  U300_SYSCON_SBCER_KEYPAD_CLK_EN);
726    clk_register_clkdev(clk, NULL, "coh901461-keypad");
727    clk = syscon_clk_register(NULL, "rtc_clk", "slow_clk", 0, true,
728                  syscon_vbase + U300_SYSCON_RSR, 6,
729                  /* No clock enable register bit */
730                  NULL, 0, 0xFFFFU);
731    clk_register_clkdev(clk, NULL, "rtc-coh901331");
732    clk = syscon_clk_register(NULL, "app_tmr_clk", "slow_clk", 0, false,
733                  syscon_vbase + U300_SYSCON_RSR, 7,
734                  syscon_vbase + U300_SYSCON_CESR, 7,
735                  U300_SYSCON_SBCER_APP_TMR_CLK_EN);
736    clk_register_clkdev(clk, NULL, "apptimer");
737    clk = syscon_clk_register(NULL, "acc_tmr_clk", "slow_clk", 0, false,
738                  syscon_vbase + U300_SYSCON_RSR, 8,
739                  syscon_vbase + U300_SYSCON_CESR, 8,
740                  U300_SYSCON_SBCER_ACC_TMR_CLK_EN);
741    clk_register_clkdev(clk, NULL, "timer");
742
743    /* Then this special MMC/SD clock */
744    clk = mclk_clk_register(NULL, "mmc_clk", "mmc_p_clk", false);
745    clk_register_clkdev(clk, NULL, "mmci");
746}
747

Archive Download this file



interactive