cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

clk-pxa910.c (10792B)


      1/*
      2 * pxa910 clock framework source file
      3 *
      4 * Copyright (C) 2012 Marvell
      5 * Chao Xie <xiechao.mail@gmail.com>
      6 *
      7 * This file is licensed under the terms of the GNU General Public
      8 * License version 2. This program is licensed "as is" without any
      9 * warranty of any kind, whether express or implied.
     10 */
     11
     12#include <linux/clk.h>
     13#include <linux/clk/mmp.h>
     14#include <linux/module.h>
     15#include <linux/kernel.h>
     16#include <linux/spinlock.h>
     17#include <linux/io.h>
     18#include <linux/delay.h>
     19#include <linux/err.h>
     20
     21#include "clk.h"
     22
     23#define APBC_RTC	0x28
     24#define APBC_TWSI0	0x2c
     25#define APBC_KPC	0x18
     26#define APBC_UART0	0x0
     27#define APBC_UART1	0x4
     28#define APBC_GPIO	0x8
     29#define APBC_PWM0	0xc
     30#define APBC_PWM1	0x10
     31#define APBC_PWM2	0x14
     32#define APBC_PWM3	0x18
     33#define APBC_SSP0	0x1c
     34#define APBC_SSP1	0x20
     35#define APBC_SSP2	0x4c
     36#define APBCP_TWSI1	0x28
     37#define APBCP_UART2	0x1c
     38#define APMU_SDH0	0x54
     39#define APMU_SDH1	0x58
     40#define APMU_USB	0x5c
     41#define APMU_DISP0	0x4c
     42#define APMU_CCIC0	0x50
     43#define APMU_DFC	0x60
     44#define MPMU_UART_PLL	0x14
     45
     46static DEFINE_SPINLOCK(clk_lock);
     47
     48static struct mmp_clk_factor_masks uart_factor_masks = {
     49	.factor = 2,
     50	.num_mask = 0x1fff,
     51	.den_mask = 0x1fff,
     52	.num_shift = 16,
     53	.den_shift = 0,
     54};
     55
     56static struct mmp_clk_factor_tbl uart_factor_tbl[] = {
     57	{.num = 8125, .den = 1536},	/*14.745MHZ */
     58};
     59
     60static const char *uart_parent[] = {"pll1_3_16", "uart_pll"};
     61static const char *ssp_parent[] = {"pll1_96", "pll1_48", "pll1_24", "pll1_12"};
     62static const char *sdh_parent[] = {"pll1_12", "pll1_13"};
     63static const char *disp_parent[] = {"pll1_2", "pll1_12"};
     64static const char *ccic_parent[] = {"pll1_2", "pll1_12"};
     65static const char *ccic_phy_parent[] = {"pll1_6", "pll1_12"};
     66
     67void __init pxa910_clk_init(phys_addr_t mpmu_phys, phys_addr_t apmu_phys,
     68			    phys_addr_t apbc_phys, phys_addr_t apbcp_phys)
     69{
     70	struct clk *clk;
     71	struct clk *uart_pll;
     72	void __iomem *mpmu_base;
     73	void __iomem *apmu_base;
     74	void __iomem *apbcp_base;
     75	void __iomem *apbc_base;
     76
     77	mpmu_base = ioremap(mpmu_phys, SZ_4K);
     78	if (!mpmu_base) {
     79		pr_err("error to ioremap MPMU base\n");
     80		return;
     81	}
     82
     83	apmu_base = ioremap(apmu_phys, SZ_4K);
     84	if (!apmu_base) {
     85		pr_err("error to ioremap APMU base\n");
     86		return;
     87	}
     88
     89	apbcp_base = ioremap(apbcp_phys, SZ_4K);
     90	if (!apbcp_base) {
     91		pr_err("error to ioremap APBC extension base\n");
     92		return;
     93	}
     94
     95	apbc_base = ioremap(apbc_phys, SZ_4K);
     96	if (!apbc_base) {
     97		pr_err("error to ioremap APBC base\n");
     98		return;
     99	}
    100
    101	clk = clk_register_fixed_rate(NULL, "clk32", NULL, 0, 3200);
    102	clk_register_clkdev(clk, "clk32", NULL);
    103
    104	clk = clk_register_fixed_rate(NULL, "vctcxo", NULL, 0, 26000000);
    105	clk_register_clkdev(clk, "vctcxo", NULL);
    106
    107	clk = clk_register_fixed_rate(NULL, "pll1", NULL, 0, 624000000);
    108	clk_register_clkdev(clk, "pll1", NULL);
    109
    110	clk = clk_register_fixed_factor(NULL, "pll1_2", "pll1",
    111				CLK_SET_RATE_PARENT, 1, 2);
    112	clk_register_clkdev(clk, "pll1_2", NULL);
    113
    114	clk = clk_register_fixed_factor(NULL, "pll1_4", "pll1_2",
    115				CLK_SET_RATE_PARENT, 1, 2);
    116	clk_register_clkdev(clk, "pll1_4", NULL);
    117
    118	clk = clk_register_fixed_factor(NULL, "pll1_8", "pll1_4",
    119				CLK_SET_RATE_PARENT, 1, 2);
    120	clk_register_clkdev(clk, "pll1_8", NULL);
    121
    122	clk = clk_register_fixed_factor(NULL, "pll1_16", "pll1_8",
    123				CLK_SET_RATE_PARENT, 1, 2);
    124	clk_register_clkdev(clk, "pll1_16", NULL);
    125
    126	clk = clk_register_fixed_factor(NULL, "pll1_6", "pll1_2",
    127				CLK_SET_RATE_PARENT, 1, 3);
    128	clk_register_clkdev(clk, "pll1_6", NULL);
    129
    130	clk = clk_register_fixed_factor(NULL, "pll1_12", "pll1_6",
    131				CLK_SET_RATE_PARENT, 1, 2);
    132	clk_register_clkdev(clk, "pll1_12", NULL);
    133
    134	clk = clk_register_fixed_factor(NULL, "pll1_24", "pll1_12",
    135				CLK_SET_RATE_PARENT, 1, 2);
    136	clk_register_clkdev(clk, "pll1_24", NULL);
    137
    138	clk = clk_register_fixed_factor(NULL, "pll1_48", "pll1_24",
    139				CLK_SET_RATE_PARENT, 1, 2);
    140	clk_register_clkdev(clk, "pll1_48", NULL);
    141
    142	clk = clk_register_fixed_factor(NULL, "pll1_96", "pll1_48",
    143				CLK_SET_RATE_PARENT, 1, 2);
    144	clk_register_clkdev(clk, "pll1_96", NULL);
    145
    146	clk = clk_register_fixed_factor(NULL, "pll1_13", "pll1",
    147				CLK_SET_RATE_PARENT, 1, 13);
    148	clk_register_clkdev(clk, "pll1_13", NULL);
    149
    150	clk = clk_register_fixed_factor(NULL, "pll1_13_1_5", "pll1",
    151				CLK_SET_RATE_PARENT, 2, 3);
    152	clk_register_clkdev(clk, "pll1_13_1_5", NULL);
    153
    154	clk = clk_register_fixed_factor(NULL, "pll1_2_1_5", "pll1",
    155				CLK_SET_RATE_PARENT, 2, 3);
    156	clk_register_clkdev(clk, "pll1_2_1_5", NULL);
    157
    158	clk = clk_register_fixed_factor(NULL, "pll1_3_16", "pll1",
    159				CLK_SET_RATE_PARENT, 3, 16);
    160	clk_register_clkdev(clk, "pll1_3_16", NULL);
    161
    162	uart_pll =  mmp_clk_register_factor("uart_pll", "pll1_4", 0,
    163				mpmu_base + MPMU_UART_PLL,
    164				&uart_factor_masks, uart_factor_tbl,
    165				ARRAY_SIZE(uart_factor_tbl), &clk_lock);
    166	clk_set_rate(uart_pll, 14745600);
    167	clk_register_clkdev(uart_pll, "uart_pll", NULL);
    168
    169	clk = mmp_clk_register_apbc("twsi0", "pll1_13_1_5",
    170				apbc_base + APBC_TWSI0, 10, 0, &clk_lock);
    171	clk_register_clkdev(clk, NULL, "pxa2xx-i2c.0");
    172
    173	clk = mmp_clk_register_apbc("twsi1", "pll1_13_1_5",
    174				apbcp_base + APBCP_TWSI1, 10, 0, &clk_lock);
    175	clk_register_clkdev(clk, NULL, "pxa2xx-i2c.1");
    176
    177	clk = mmp_clk_register_apbc("gpio", "vctcxo",
    178				apbc_base + APBC_GPIO, 10, 0, &clk_lock);
    179	clk_register_clkdev(clk, NULL, "mmp-gpio");
    180
    181	clk = mmp_clk_register_apbc("kpc", "clk32",
    182				apbc_base + APBC_KPC, 10, 0, &clk_lock);
    183	clk_register_clkdev(clk, NULL, "pxa27x-keypad");
    184
    185	clk = mmp_clk_register_apbc("rtc", "clk32",
    186				apbc_base + APBC_RTC, 10, 0, &clk_lock);
    187	clk_register_clkdev(clk, NULL, "sa1100-rtc");
    188
    189	clk = mmp_clk_register_apbc("pwm0", "pll1_48",
    190				apbc_base + APBC_PWM0, 10, 0, &clk_lock);
    191	clk_register_clkdev(clk, NULL, "pxa910-pwm.0");
    192
    193	clk = mmp_clk_register_apbc("pwm1", "pll1_48",
    194				apbc_base + APBC_PWM1, 10, 0, &clk_lock);
    195	clk_register_clkdev(clk, NULL, "pxa910-pwm.1");
    196
    197	clk = mmp_clk_register_apbc("pwm2", "pll1_48",
    198				apbc_base + APBC_PWM2, 10, 0, &clk_lock);
    199	clk_register_clkdev(clk, NULL, "pxa910-pwm.2");
    200
    201	clk = mmp_clk_register_apbc("pwm3", "pll1_48",
    202				apbc_base + APBC_PWM3, 10, 0, &clk_lock);
    203	clk_register_clkdev(clk, NULL, "pxa910-pwm.3");
    204
    205	clk = clk_register_mux(NULL, "uart0_mux", uart_parent,
    206				ARRAY_SIZE(uart_parent),
    207				CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
    208				apbc_base + APBC_UART0, 4, 3, 0, &clk_lock);
    209	clk_set_parent(clk, uart_pll);
    210	clk_register_clkdev(clk, "uart_mux.0", NULL);
    211
    212	clk = mmp_clk_register_apbc("uart0", "uart0_mux",
    213				apbc_base + APBC_UART0, 10, 0, &clk_lock);
    214	clk_register_clkdev(clk, NULL, "pxa2xx-uart.0");
    215
    216	clk = clk_register_mux(NULL, "uart1_mux", uart_parent,
    217				ARRAY_SIZE(uart_parent),
    218				CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
    219				apbc_base + APBC_UART1, 4, 3, 0, &clk_lock);
    220	clk_set_parent(clk, uart_pll);
    221	clk_register_clkdev(clk, "uart_mux.1", NULL);
    222
    223	clk = mmp_clk_register_apbc("uart1", "uart1_mux",
    224				apbc_base + APBC_UART1, 10, 0, &clk_lock);
    225	clk_register_clkdev(clk, NULL, "pxa2xx-uart.1");
    226
    227	clk = clk_register_mux(NULL, "uart2_mux", uart_parent,
    228				ARRAY_SIZE(uart_parent),
    229				CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
    230				apbcp_base + APBCP_UART2, 4, 3, 0, &clk_lock);
    231	clk_set_parent(clk, uart_pll);
    232	clk_register_clkdev(clk, "uart_mux.2", NULL);
    233
    234	clk = mmp_clk_register_apbc("uart2", "uart2_mux",
    235				apbcp_base + APBCP_UART2, 10, 0, &clk_lock);
    236	clk_register_clkdev(clk, NULL, "pxa2xx-uart.2");
    237
    238	clk = clk_register_mux(NULL, "ssp0_mux", ssp_parent,
    239				ARRAY_SIZE(ssp_parent),
    240				CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
    241				apbc_base + APBC_SSP0, 4, 3, 0, &clk_lock);
    242	clk_register_clkdev(clk, "uart_mux.0", NULL);
    243
    244	clk = mmp_clk_register_apbc("ssp0", "ssp0_mux",
    245				apbc_base + APBC_SSP0, 10, 0, &clk_lock);
    246	clk_register_clkdev(clk, NULL, "mmp-ssp.0");
    247
    248	clk = clk_register_mux(NULL, "ssp1_mux", ssp_parent,
    249				ARRAY_SIZE(ssp_parent),
    250				CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
    251				apbc_base + APBC_SSP1, 4, 3, 0, &clk_lock);
    252	clk_register_clkdev(clk, "ssp_mux.1", NULL);
    253
    254	clk = mmp_clk_register_apbc("ssp1", "ssp1_mux",
    255				apbc_base + APBC_SSP1, 10, 0, &clk_lock);
    256	clk_register_clkdev(clk, NULL, "mmp-ssp.1");
    257
    258	clk = mmp_clk_register_apmu("dfc", "pll1_4",
    259				apmu_base + APMU_DFC, 0x19b, &clk_lock);
    260	clk_register_clkdev(clk, NULL, "pxa3xx-nand.0");
    261
    262	clk = clk_register_mux(NULL, "sdh0_mux", sdh_parent,
    263				ARRAY_SIZE(sdh_parent),
    264				CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
    265				apmu_base + APMU_SDH0, 6, 1, 0, &clk_lock);
    266	clk_register_clkdev(clk, "sdh0_mux", NULL);
    267
    268	clk = mmp_clk_register_apmu("sdh0", "sdh_mux",
    269				apmu_base + APMU_SDH0, 0x1b, &clk_lock);
    270	clk_register_clkdev(clk, NULL, "sdhci-pxa.0");
    271
    272	clk = clk_register_mux(NULL, "sdh1_mux", sdh_parent,
    273				ARRAY_SIZE(sdh_parent),
    274				CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
    275				apmu_base + APMU_SDH1, 6, 1, 0, &clk_lock);
    276	clk_register_clkdev(clk, "sdh1_mux", NULL);
    277
    278	clk = mmp_clk_register_apmu("sdh1", "sdh1_mux",
    279				apmu_base + APMU_SDH1, 0x1b, &clk_lock);
    280	clk_register_clkdev(clk, NULL, "sdhci-pxa.1");
    281
    282	clk = mmp_clk_register_apmu("usb", "usb_pll",
    283				apmu_base + APMU_USB, 0x9, &clk_lock);
    284	clk_register_clkdev(clk, "usb_clk", NULL);
    285
    286	clk = mmp_clk_register_apmu("sph", "usb_pll",
    287				apmu_base + APMU_USB, 0x12, &clk_lock);
    288	clk_register_clkdev(clk, "sph_clk", NULL);
    289
    290	clk = clk_register_mux(NULL, "disp0_mux", disp_parent,
    291				ARRAY_SIZE(disp_parent),
    292				CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
    293				apmu_base + APMU_DISP0, 6, 1, 0, &clk_lock);
    294	clk_register_clkdev(clk, "disp_mux.0", NULL);
    295
    296	clk = mmp_clk_register_apmu("disp0", "disp0_mux",
    297				apmu_base + APMU_DISP0, 0x1b, &clk_lock);
    298	clk_register_clkdev(clk, NULL, "mmp-disp.0");
    299
    300	clk = clk_register_mux(NULL, "ccic0_mux", ccic_parent,
    301				ARRAY_SIZE(ccic_parent),
    302				CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
    303				apmu_base + APMU_CCIC0, 6, 1, 0, &clk_lock);
    304	clk_register_clkdev(clk, "ccic_mux.0", NULL);
    305
    306	clk = mmp_clk_register_apmu("ccic0", "ccic0_mux",
    307				apmu_base + APMU_CCIC0, 0x1b, &clk_lock);
    308	clk_register_clkdev(clk, "fnclk", "mmp-ccic.0");
    309
    310	clk = clk_register_mux(NULL, "ccic0_phy_mux", ccic_phy_parent,
    311				ARRAY_SIZE(ccic_phy_parent),
    312				CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
    313				apmu_base + APMU_CCIC0, 7, 1, 0, &clk_lock);
    314	clk_register_clkdev(clk, "ccic_phy_mux.0", NULL);
    315
    316	clk = mmp_clk_register_apmu("ccic0_phy", "ccic0_phy_mux",
    317				apmu_base + APMU_CCIC0, 0x24, &clk_lock);
    318	clk_register_clkdev(clk, "phyclk", "mmp-ccic.0");
    319
    320	clk = clk_register_divider(NULL, "ccic0_sphy_div", "ccic0_mux",
    321				CLK_SET_RATE_PARENT, apmu_base + APMU_CCIC0,
    322				10, 5, 0, &clk_lock);
    323	clk_register_clkdev(clk, "sphyclk_div", NULL);
    324
    325	clk = mmp_clk_register_apmu("ccic0_sphy", "ccic0_sphy_div",
    326				apmu_base + APMU_CCIC0, 0x300, &clk_lock);
    327	clk_register_clkdev(clk, "sphyclk", "mmp-ccic.0");
    328}