0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/clk-provider.h>
0010 #include <linux/io.h>
0011 #include <linux/clk.h>
0012 #include <linux/clkdev.h>
0013 #include <linux/of.h>
0014 #include <linux/soc/pxa/smemc.h>
0015
0016 #include <dt-bindings/clock/pxa-clock.h>
0017 #include "clk-pxa.h"
0018 #include "clk-pxa2xx.h"
0019
0020 #define KHz 1000
0021 #define MHz (1000 * 1000)
0022
0023 enum {
0024 PXA_CORE_13Mhz = 0,
0025 PXA_CORE_RUN,
0026 PXA_CORE_TURBO,
0027 };
0028
0029 enum {
0030 PXA_BUS_13Mhz = 0,
0031 PXA_BUS_RUN,
0032 };
0033
0034 enum {
0035 PXA_LCD_13Mhz = 0,
0036 PXA_LCD_RUN,
0037 };
0038
0039 enum {
0040 PXA_MEM_13Mhz = 0,
0041 PXA_MEM_SYSTEM_BUS,
0042 PXA_MEM_RUN,
0043 };
0044
0045 #define PXA27x_CLKCFG(B, HT, T) \
0046 (CLKCFG_FCS | \
0047 ((B) ? CLKCFG_FASTBUS : 0) | \
0048 ((HT) ? CLKCFG_HALFTURBO : 0) | \
0049 ((T) ? CLKCFG_TURBO : 0))
0050 #define PXA27x_CCCR(A, L, N2) (A << 25 | N2 << 7 | L)
0051
0052
0053 #define SDRAM_TREF 64
0054
0055 static void __iomem *clk_regs;
0056
0057 static const char * const get_freq_khz[] = {
0058 "core", "run", "cpll", "memory",
0059 "system_bus"
0060 };
0061
0062 static u32 mdrefr_dri(unsigned int freq_khz)
0063 {
0064 u32 interval = freq_khz * SDRAM_TREF / pxa2xx_smemc_get_sdram_rows();
0065
0066 return (interval - 31) / 32;
0067 }
0068
0069
0070
0071
0072
0073
0074 unsigned int pxa27x_get_clk_frequency_khz(int info)
0075 {
0076 struct clk *clk;
0077 unsigned long clks[5];
0078 int i;
0079
0080 for (i = 0; i < 5; i++) {
0081 clk = clk_get(NULL, get_freq_khz[i]);
0082 if (IS_ERR(clk)) {
0083 clks[i] = 0;
0084 } else {
0085 clks[i] = clk_get_rate(clk);
0086 clk_put(clk);
0087 }
0088 }
0089 if (info) {
0090 pr_info("Run Mode clock: %ld.%02ldMHz\n",
0091 clks[1] / 1000000, (clks[1] % 1000000) / 10000);
0092 pr_info("Turbo Mode clock: %ld.%02ldMHz\n",
0093 clks[2] / 1000000, (clks[2] % 1000000) / 10000);
0094 pr_info("Memory clock: %ld.%02ldMHz\n",
0095 clks[3] / 1000000, (clks[3] % 1000000) / 10000);
0096 pr_info("System bus clock: %ld.%02ldMHz\n",
0097 clks[4] / 1000000, (clks[4] % 1000000) / 10000);
0098 }
0099 return (unsigned int)clks[0] / KHz;
0100 }
0101
0102 bool pxa27x_is_ppll_disabled(void)
0103 {
0104 unsigned long ccsr = readl(clk_regs + CCSR);
0105
0106 return ccsr & (1 << CCCR_PPDIS_BIT);
0107 }
0108
0109 #define PXA27X_CKEN(dev_id, con_id, parents, mult_hp, div_hp, \
0110 bit, is_lp, flags) \
0111 PXA_CKEN(dev_id, con_id, bit, parents, 1, 1, mult_hp, div_hp, \
0112 is_lp, CKEN, CKEN_ ## bit, flags)
0113 #define PXA27X_PBUS_CKEN(dev_id, con_id, bit, mult_hp, div_hp, delay) \
0114 PXA27X_CKEN(dev_id, con_id, pxa27x_pbus_parents, mult_hp, \
0115 div_hp, bit, pxa27x_is_ppll_disabled, 0)
0116
0117 PARENTS(pxa27x_pbus) = { "osc_13mhz", "ppll_312mhz" };
0118 PARENTS(pxa27x_sbus) = { "system_bus", "system_bus" };
0119 PARENTS(pxa27x_32Mhz_bus) = { "osc_32_768khz", "osc_32_768khz" };
0120 PARENTS(pxa27x_lcd_bus) = { "lcd_base", "lcd_base" };
0121 PARENTS(pxa27x_membus) = { "lcd_base", "lcd_base" };
0122
0123 #define PXA27X_CKEN_1RATE(dev_id, con_id, bit, parents, delay) \
0124 PXA_CKEN_1RATE(dev_id, con_id, bit, parents, \
0125 CKEN, CKEN_ ## bit, 0)
0126 #define PXA27X_CKEN_1RATE_AO(dev_id, con_id, bit, parents, delay) \
0127 PXA_CKEN_1RATE(dev_id, con_id, bit, parents, \
0128 CKEN, CKEN_ ## bit, CLK_IGNORE_UNUSED)
0129
0130 static struct desc_clk_cken pxa27x_clocks[] __initdata = {
0131 PXA27X_PBUS_CKEN("pxa2xx-uart.0", NULL, FFUART, 2, 42, 1),
0132 PXA27X_PBUS_CKEN("pxa2xx-uart.1", NULL, BTUART, 2, 42, 1),
0133 PXA27X_PBUS_CKEN("pxa2xx-uart.2", NULL, STUART, 2, 42, 1),
0134 PXA27X_PBUS_CKEN("pxa2xx-i2s", NULL, I2S, 2, 51, 0),
0135 PXA27X_PBUS_CKEN("pxa2xx-i2c.0", NULL, I2C, 2, 19, 0),
0136 PXA27X_PBUS_CKEN("pxa27x-udc", NULL, USB, 2, 13, 5),
0137 PXA27X_PBUS_CKEN("pxa2xx-mci.0", NULL, MMC, 2, 32, 0),
0138 PXA27X_PBUS_CKEN("pxa2xx-ir", "FICPCLK", FICP, 2, 13, 0),
0139 PXA27X_PBUS_CKEN("pxa27x-ohci", NULL, USBHOST, 2, 13, 0),
0140 PXA27X_PBUS_CKEN("pxa2xx-i2c.1", NULL, PWRI2C, 1, 24, 0),
0141 PXA27X_PBUS_CKEN("pxa27x-ssp.0", NULL, SSP1, 1, 24, 0),
0142 PXA27X_PBUS_CKEN("pxa27x-ssp.1", NULL, SSP2, 1, 24, 0),
0143 PXA27X_PBUS_CKEN("pxa27x-ssp.2", NULL, SSP3, 1, 24, 0),
0144 PXA27X_PBUS_CKEN("pxa27x-pwm.0", NULL, PWM0, 1, 24, 0),
0145 PXA27X_PBUS_CKEN("pxa27x-pwm.1", NULL, PWM1, 1, 24, 0),
0146 PXA27X_PBUS_CKEN(NULL, "MSLCLK", MSL, 2, 13, 0),
0147 PXA27X_PBUS_CKEN(NULL, "USIMCLK", USIM, 2, 13, 0),
0148 PXA27X_PBUS_CKEN(NULL, "MSTKCLK", MEMSTK, 2, 32, 0),
0149 PXA27X_PBUS_CKEN(NULL, "AC97CLK", AC97, 1, 1, 0),
0150 PXA27X_PBUS_CKEN(NULL, "AC97CONFCLK", AC97CONF, 1, 1, 0),
0151 PXA27X_PBUS_CKEN(NULL, "OSTIMER0", OSTIMER, 1, 96, 0),
0152
0153 PXA27X_CKEN_1RATE("pxa27x-keypad", NULL, KEYPAD,
0154 pxa27x_32Mhz_bus_parents, 0),
0155 PXA27X_CKEN_1RATE(NULL, "IMCLK", IM, pxa27x_sbus_parents, 0),
0156 PXA27X_CKEN_1RATE("pxa2xx-fb", NULL, LCD, pxa27x_lcd_bus_parents, 0),
0157 PXA27X_CKEN_1RATE("pxa27x-camera.0", NULL, CAMERA,
0158 pxa27x_lcd_bus_parents, 0),
0159 PXA27X_CKEN_1RATE_AO("pxa2xx-pcmcia", NULL, MEMC,
0160 pxa27x_membus_parents, 0),
0161
0162 };
0163
0164
0165
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190 static struct pxa2xx_freq pxa27x_freqs[] = {
0191 {104000000, 104000, PXA27x_CCCR(1, 8, 2), 0, PXA27x_CLKCFG(1, 0, 1) },
0192 {156000000, 104000, PXA27x_CCCR(1, 8, 3), 0, PXA27x_CLKCFG(1, 0, 1) },
0193 {208000000, 208000, PXA27x_CCCR(0, 16, 2), 1, PXA27x_CLKCFG(0, 0, 1) },
0194 {312000000, 208000, PXA27x_CCCR(1, 16, 3), 1, PXA27x_CLKCFG(1, 0, 1) },
0195 {416000000, 208000, PXA27x_CCCR(1, 16, 4), 1, PXA27x_CLKCFG(1, 0, 1) },
0196 {520000000, 208000, PXA27x_CCCR(1, 16, 5), 1, PXA27x_CLKCFG(1, 0, 1) },
0197 {624000000, 208000, PXA27x_CCCR(1, 16, 6), 1, PXA27x_CLKCFG(1, 0, 1) },
0198 };
0199
0200 static unsigned long clk_pxa27x_cpll_get_rate(struct clk_hw *hw,
0201 unsigned long parent_rate)
0202 {
0203 unsigned long clkcfg;
0204 unsigned int t, ht;
0205 unsigned int l, L, n2, N;
0206 unsigned long ccsr = readl(clk_regs + CCSR);
0207
0208 asm("mrc\tp14, 0, %0, c6, c0, 0" : "=r" (clkcfg));
0209 t = clkcfg & (1 << 0);
0210 ht = clkcfg & (1 << 2);
0211
0212 l = ccsr & CCSR_L_MASK;
0213 n2 = (ccsr & CCSR_N2_MASK) >> CCSR_N2_SHIFT;
0214 L = l * parent_rate;
0215 N = (L * n2) / 2;
0216
0217 return N;
0218 }
0219
0220 static int clk_pxa27x_cpll_determine_rate(struct clk_hw *hw,
0221 struct clk_rate_request *req)
0222 {
0223 return pxa2xx_determine_rate(req, pxa27x_freqs,
0224 ARRAY_SIZE(pxa27x_freqs));
0225 }
0226
0227 static int clk_pxa27x_cpll_set_rate(struct clk_hw *hw, unsigned long rate,
0228 unsigned long parent_rate)
0229 {
0230 int i;
0231
0232 pr_debug("%s(rate=%lu parent_rate=%lu)\n", __func__, rate, parent_rate);
0233 for (i = 0; i < ARRAY_SIZE(pxa27x_freqs); i++)
0234 if (pxa27x_freqs[i].cpll == rate)
0235 break;
0236
0237 if (i >= ARRAY_SIZE(pxa27x_freqs))
0238 return -EINVAL;
0239
0240 pxa2xx_cpll_change(&pxa27x_freqs[i], mdrefr_dri, clk_regs + CCCR);
0241 return 0;
0242 }
0243
0244 PARENTS(clk_pxa27x_cpll) = { "osc_13mhz" };
0245 RATE_OPS(clk_pxa27x_cpll, "cpll");
0246
0247 static unsigned long clk_pxa27x_lcd_base_get_rate(struct clk_hw *hw,
0248 unsigned long parent_rate)
0249 {
0250 unsigned int l, osc_forced;
0251 unsigned long ccsr = readl(clk_regs + CCSR);
0252 unsigned long cccr = readl(clk_regs + CCCR);
0253
0254 l = ccsr & CCSR_L_MASK;
0255 osc_forced = ccsr & (1 << CCCR_CPDIS_BIT);
0256 if (osc_forced) {
0257 if (cccr & (1 << CCCR_LCD_26_BIT))
0258 return parent_rate * 2;
0259 else
0260 return parent_rate;
0261 }
0262
0263 if (l <= 7)
0264 return parent_rate;
0265 if (l <= 16)
0266 return parent_rate / 2;
0267 return parent_rate / 4;
0268 }
0269
0270 static u8 clk_pxa27x_lcd_base_get_parent(struct clk_hw *hw)
0271 {
0272 unsigned int osc_forced;
0273 unsigned long ccsr = readl(clk_regs + CCSR);
0274
0275 osc_forced = ccsr & (1 << CCCR_CPDIS_BIT);
0276 if (osc_forced)
0277 return PXA_LCD_13Mhz;
0278 else
0279 return PXA_LCD_RUN;
0280 }
0281
0282 PARENTS(clk_pxa27x_lcd_base) = { "osc_13mhz", "run" };
0283 MUX_RO_RATE_RO_OPS(clk_pxa27x_lcd_base, "lcd_base");
0284
0285 static void __init pxa27x_register_plls(void)
0286 {
0287 clk_register_fixed_rate(NULL, "osc_13mhz", NULL,
0288 CLK_GET_RATE_NOCACHE,
0289 13 * MHz);
0290 clkdev_pxa_register(CLK_OSC32k768, "osc_32_768khz", NULL,
0291 clk_register_fixed_rate(NULL, "osc_32_768khz", NULL,
0292 CLK_GET_RATE_NOCACHE,
0293 32768 * KHz));
0294 clk_register_fixed_rate(NULL, "clk_dummy", NULL, 0, 0);
0295 clk_register_fixed_factor(NULL, "ppll_312mhz", "osc_13mhz", 0, 24, 1);
0296 }
0297
0298 static u8 clk_pxa27x_core_get_parent(struct clk_hw *hw)
0299 {
0300 unsigned long clkcfg;
0301 unsigned int t, ht, osc_forced;
0302 unsigned long ccsr = readl(clk_regs + CCSR);
0303
0304 osc_forced = ccsr & (1 << CCCR_CPDIS_BIT);
0305 if (osc_forced)
0306 return PXA_CORE_13Mhz;
0307
0308 asm("mrc\tp14, 0, %0, c6, c0, 0" : "=r" (clkcfg));
0309 t = clkcfg & (1 << 0);
0310 ht = clkcfg & (1 << 2);
0311
0312 if (ht || t)
0313 return PXA_CORE_TURBO;
0314 return PXA_CORE_RUN;
0315 }
0316
0317 static int clk_pxa27x_core_set_parent(struct clk_hw *hw, u8 index)
0318 {
0319 if (index > PXA_CORE_TURBO)
0320 return -EINVAL;
0321
0322 pxa2xx_core_turbo_switch(index == PXA_CORE_TURBO);
0323
0324 return 0;
0325 }
0326
0327 static int clk_pxa27x_core_determine_rate(struct clk_hw *hw,
0328 struct clk_rate_request *req)
0329 {
0330 return __clk_mux_determine_rate(hw, req);
0331 }
0332
0333 PARENTS(clk_pxa27x_core) = { "osc_13mhz", "run", "cpll" };
0334 MUX_OPS(clk_pxa27x_core, "core", CLK_SET_RATE_PARENT);
0335
0336 static unsigned long clk_pxa27x_run_get_rate(struct clk_hw *hw,
0337 unsigned long parent_rate)
0338 {
0339 unsigned long ccsr = readl(clk_regs + CCSR);
0340 unsigned int n2 = (ccsr & CCSR_N2_MASK) >> CCSR_N2_SHIFT;
0341
0342 return (parent_rate / n2) * 2;
0343 }
0344 PARENTS(clk_pxa27x_run) = { "cpll" };
0345 RATE_RO_OPS(clk_pxa27x_run, "run");
0346
0347 static void __init pxa27x_register_core(void)
0348 {
0349 clkdev_pxa_register(CLK_NONE, "cpll", NULL,
0350 clk_register_clk_pxa27x_cpll());
0351 clkdev_pxa_register(CLK_NONE, "run", NULL,
0352 clk_register_clk_pxa27x_run());
0353 clkdev_pxa_register(CLK_CORE, "core", NULL,
0354 clk_register_clk_pxa27x_core());
0355 }
0356
0357 static unsigned long clk_pxa27x_system_bus_get_rate(struct clk_hw *hw,
0358 unsigned long parent_rate)
0359 {
0360 unsigned long clkcfg;
0361 unsigned int b, osc_forced;
0362 unsigned long ccsr = readl(clk_regs + CCSR);
0363
0364 osc_forced = ccsr & (1 << CCCR_CPDIS_BIT);
0365 asm("mrc\tp14, 0, %0, c6, c0, 0" : "=r" (clkcfg));
0366 b = clkcfg & (1 << 3);
0367
0368 if (osc_forced)
0369 return parent_rate;
0370 if (b)
0371 return parent_rate;
0372 else
0373 return parent_rate / 2;
0374 }
0375
0376 static u8 clk_pxa27x_system_bus_get_parent(struct clk_hw *hw)
0377 {
0378 unsigned int osc_forced;
0379 unsigned long ccsr = readl(clk_regs + CCSR);
0380
0381 osc_forced = ccsr & (1 << CCCR_CPDIS_BIT);
0382 if (osc_forced)
0383 return PXA_BUS_13Mhz;
0384 else
0385 return PXA_BUS_RUN;
0386 }
0387
0388 PARENTS(clk_pxa27x_system_bus) = { "osc_13mhz", "run" };
0389 MUX_RO_RATE_RO_OPS(clk_pxa27x_system_bus, "system_bus");
0390
0391 static unsigned long clk_pxa27x_memory_get_rate(struct clk_hw *hw,
0392 unsigned long parent_rate)
0393 {
0394 unsigned int a, l, osc_forced;
0395 unsigned long cccr = readl(clk_regs + CCCR);
0396 unsigned long ccsr = readl(clk_regs + CCSR);
0397
0398 osc_forced = ccsr & (1 << CCCR_CPDIS_BIT);
0399 a = cccr & (1 << CCCR_A_BIT);
0400 l = ccsr & CCSR_L_MASK;
0401
0402 if (osc_forced || a)
0403 return parent_rate;
0404 if (l <= 10)
0405 return parent_rate;
0406 if (l <= 20)
0407 return parent_rate / 2;
0408 return parent_rate / 4;
0409 }
0410
0411 static u8 clk_pxa27x_memory_get_parent(struct clk_hw *hw)
0412 {
0413 unsigned int osc_forced, a;
0414 unsigned long cccr = readl(clk_regs + CCCR);
0415 unsigned long ccsr = readl(clk_regs + CCSR);
0416
0417 osc_forced = ccsr & (1 << CCCR_CPDIS_BIT);
0418 a = cccr & (1 << CCCR_A_BIT);
0419 if (osc_forced)
0420 return PXA_MEM_13Mhz;
0421 if (a)
0422 return PXA_MEM_SYSTEM_BUS;
0423 else
0424 return PXA_MEM_RUN;
0425 }
0426
0427 PARENTS(clk_pxa27x_memory) = { "osc_13mhz", "system_bus", "run" };
0428 MUX_RO_RATE_RO_OPS(clk_pxa27x_memory, "memory");
0429
0430 #define DUMMY_CLK(_con_id, _dev_id, _parent) \
0431 { .con_id = _con_id, .dev_id = _dev_id, .parent = _parent }
0432 struct dummy_clk {
0433 const char *con_id;
0434 const char *dev_id;
0435 const char *parent;
0436 };
0437 static struct dummy_clk dummy_clks[] __initdata = {
0438 DUMMY_CLK(NULL, "pxa27x-gpio", "osc_32_768khz"),
0439 DUMMY_CLK(NULL, "pxa-rtc", "osc_32_768khz"),
0440 DUMMY_CLK(NULL, "sa1100-rtc", "osc_32_768khz"),
0441 DUMMY_CLK("UARTCLK", "pxa2xx-ir", "STUART"),
0442 };
0443
0444 static void __init pxa27x_dummy_clocks_init(void)
0445 {
0446 struct clk *clk;
0447 struct dummy_clk *d;
0448 const char *name;
0449 int i;
0450
0451 for (i = 0; i < ARRAY_SIZE(dummy_clks); i++) {
0452 d = &dummy_clks[i];
0453 name = d->dev_id ? d->dev_id : d->con_id;
0454 clk = clk_register_fixed_factor(NULL, name, d->parent, 0, 1, 1);
0455 clk_register_clkdev(clk, d->con_id, d->dev_id);
0456 }
0457 }
0458
0459 static void __init pxa27x_base_clocks_init(void)
0460 {
0461 pxa27x_register_plls();
0462 pxa27x_register_core();
0463 clkdev_pxa_register(CLK_NONE, "system_bus", NULL,
0464 clk_register_clk_pxa27x_system_bus());
0465 clkdev_pxa_register(CLK_NONE, "memory", NULL,
0466 clk_register_clk_pxa27x_memory());
0467 clk_register_clk_pxa27x_lcd_base();
0468 }
0469
0470 int __init pxa27x_clocks_init(void __iomem *regs)
0471 {
0472 clk_regs = regs;
0473 pxa27x_base_clocks_init();
0474 pxa27x_dummy_clocks_init();
0475 return clk_pxa_cken_init(pxa27x_clocks, ARRAY_SIZE(pxa27x_clocks), regs);
0476 }
0477
0478 static void __init pxa27x_dt_clocks_init(struct device_node *np)
0479 {
0480 pxa27x_clocks_init(ioremap(0x41300000ul, 0x10));
0481 clk_pxa_dt_common_init(np);
0482 }
0483 CLK_OF_DECLARE(pxa_clks, "marvell,pxa270-clocks", pxa27x_dt_clocks_init);