Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
common.c
Go to the documentation of this file.
1 /*
2  * arch/arm/mach-kirkwood/common.c
3  *
4  * Core functions for Marvell Kirkwood SoCs
5  *
6  * This file is licensed under the terms of the GNU General Public
7  * License version 2. This program is licensed "as is" without any
8  * warranty of any kind, whether express or implied.
9  */
10 
11 #include <linux/kernel.h>
12 #include <linux/init.h>
13 #include <linux/platform_device.h>
14 #include <linux/serial_8250.h>
15 #include <linux/ata_platform.h>
16 #include <linux/mtd/nand.h>
17 #include <linux/dma-mapping.h>
18 #include <linux/clk-provider.h>
19 #include <linux/spinlock.h>
20 #include <linux/mv643xx_i2c.h>
21 #include <net/dsa.h>
22 #include <asm/page.h>
23 #include <asm/timex.h>
24 #include <asm/kexec.h>
25 #include <asm/mach/map.h>
26 #include <asm/mach/time.h>
27 #include <mach/kirkwood.h>
28 #include <mach/bridge-regs.h>
30 #include <plat/cache-feroceon-l2.h>
34 #include <plat/common.h>
35 #include <plat/time.h>
36 #include <plat/addr-map.h>
38 #include "common.h"
39 
40 /*****************************************************************************
41  * I/O Address Mapping
42  ****************************************************************************/
43 static struct map_desc kirkwood_io_desc[] __initdata = {
44  {
45  .virtual = (unsigned long) KIRKWOOD_REGS_VIRT_BASE,
47  .length = KIRKWOOD_REGS_SIZE,
48  .type = MT_DEVICE,
49  },
50 };
51 
53 {
54  iotable_init(kirkwood_io_desc, ARRAY_SIZE(kirkwood_io_desc));
55 }
56 
57 /*****************************************************************************
58  * CLK tree
59  ****************************************************************************/
60 
61 static void enable_sata0(void)
62 {
63  /* Enable PLL and IVREF */
65  /* Enable PHY */
67 }
68 
69 static void disable_sata0(void)
70 {
71  /* Disable PLL and IVREF */
73  /* Disable PHY */
75 }
76 
77 static void enable_sata1(void)
78 {
79  /* Enable PLL and IVREF */
81  /* Enable PHY */
83 }
84 
85 static void disable_sata1(void)
86 {
87  /* Disable PLL and IVREF */
89  /* Disable PHY */
91 }
92 
93 static void disable_pcie0(void)
94 {
96  while (1)
97  if (readl(PCIE_STATUS) & 0x1)
98  break;
100 }
101 
102 static void disable_pcie1(void)
103 {
104  u32 dev, rev;
105 
106  kirkwood_pcie_id(&dev, &rev);
107 
108  if (dev == MV88F6282_DEV_ID) {
110  while (1)
111  if (readl(PCIE1_STATUS) & 0x1)
112  break;
114  }
115 }
116 
117 /* An extended version of the gated clk. This calls fn_en()/fn_dis
118  * before enabling/disabling the clock. We use this to turn on/off
119  * PHYs etc. */
120 struct clk_gate_fn {
121  struct clk_gate gate;
124 };
125 
126 #define to_clk_gate_fn(_gate) container_of(_gate, struct clk_gate_fn, gate)
127 #define to_clk_gate(_hw) container_of(_hw, struct clk_gate, hw)
128 
129 static int clk_gate_fn_enable(struct clk_hw *hw)
130 {
131  struct clk_gate *gate = to_clk_gate(hw);
132  struct clk_gate_fn *gate_fn = to_clk_gate_fn(gate);
133  int ret;
134 
135  ret = clk_gate_ops.enable(hw);
136  if (!ret && gate_fn->fn_en)
137  gate_fn->fn_en();
138 
139  return ret;
140 }
141 
142 static void clk_gate_fn_disable(struct clk_hw *hw)
143 {
144  struct clk_gate *gate = to_clk_gate(hw);
145  struct clk_gate_fn *gate_fn = to_clk_gate_fn(gate);
146 
147  if (gate_fn->fn_dis)
148  gate_fn->fn_dis();
149 
150  clk_gate_ops.disable(hw);
151 }
152 
153 static struct clk_ops clk_gate_fn_ops;
154 
155 static struct clk __init *clk_register_gate_fn(struct device *dev,
156  const char *name,
157  const char *parent_name, unsigned long flags,
158  void __iomem *reg, u8 bit_idx,
159  u8 clk_gate_flags, spinlock_t *lock,
160  void (*fn_en)(void), void (*fn_dis)(void))
161 {
162  struct clk_gate_fn *gate_fn;
163  struct clk *clk;
164  struct clk_init_data init;
165 
166  gate_fn = kzalloc(sizeof(struct clk_gate_fn), GFP_KERNEL);
167  if (!gate_fn) {
168  pr_err("%s: could not allocate gated clk\n", __func__);
169  return ERR_PTR(-ENOMEM);
170  }
171 
172  init.name = name;
173  init.ops = &clk_gate_fn_ops;
174  init.flags = flags;
175  init.parent_names = (parent_name ? &parent_name : NULL);
176  init.num_parents = (parent_name ? 1 : 0);
177 
178  /* struct clk_gate assignments */
179  gate_fn->gate.reg = reg;
180  gate_fn->gate.bit_idx = bit_idx;
181  gate_fn->gate.flags = clk_gate_flags;
182  gate_fn->gate.lock = lock;
183  gate_fn->gate.hw.init = &init;
184  gate_fn->fn_en = fn_en;
185  gate_fn->fn_dis = fn_dis;
186 
187  /* ops is the gate ops, but with our enable/disable functions */
188  if (clk_gate_fn_ops.enable != clk_gate_fn_enable ||
189  clk_gate_fn_ops.disable != clk_gate_fn_disable) {
190  clk_gate_fn_ops = clk_gate_ops;
191  clk_gate_fn_ops.enable = clk_gate_fn_enable;
192  clk_gate_fn_ops.disable = clk_gate_fn_disable;
193  }
194 
195  clk = clk_register(dev, &gate_fn->gate.hw);
196 
197  if (IS_ERR(clk))
198  kfree(gate_fn);
199 
200  return clk;
201 }
202 
203 static DEFINE_SPINLOCK(gating_lock);
204 static struct clk *tclk;
205 
206 static struct clk __init *kirkwood_register_gate(const char *name, u8 bit_idx)
207 {
208  return clk_register_gate(NULL, name, "tclk", 0, CLOCK_GATING_CTRL,
209  bit_idx, 0, &gating_lock);
210 }
211 
212 static struct clk __init *kirkwood_register_gate_fn(const char *name,
213  u8 bit_idx,
214  void (*fn_en)(void),
215  void (*fn_dis)(void))
216 {
217  return clk_register_gate_fn(NULL, name, "tclk", 0, CLOCK_GATING_CTRL,
218  bit_idx, 0, &gating_lock, fn_en, fn_dis);
219 }
220 
221 static struct clk *ge0, *ge1;
222 
224 {
225  struct clk *runit, *sata0, *sata1, *usb0, *sdio;
226  struct clk *crypto, *xor0, *xor1, *pex0, *pex1, *audio;
227 
228  tclk = clk_register_fixed_rate(NULL, "tclk", NULL,
229  CLK_IS_ROOT, kirkwood_tclk);
230 
231  runit = kirkwood_register_gate("runit", CGC_BIT_RUNIT);
232  ge0 = kirkwood_register_gate("ge0", CGC_BIT_GE0);
233  ge1 = kirkwood_register_gate("ge1", CGC_BIT_GE1);
234  sata0 = kirkwood_register_gate_fn("sata0", CGC_BIT_SATA0,
235  enable_sata0, disable_sata0);
236  sata1 = kirkwood_register_gate_fn("sata1", CGC_BIT_SATA1,
237  enable_sata1, disable_sata1);
238  usb0 = kirkwood_register_gate("usb0", CGC_BIT_USB0);
239  sdio = kirkwood_register_gate("sdio", CGC_BIT_SDIO);
240  crypto = kirkwood_register_gate("crypto", CGC_BIT_CRYPTO);
241  xor0 = kirkwood_register_gate("xor0", CGC_BIT_XOR0);
242  xor1 = kirkwood_register_gate("xor1", CGC_BIT_XOR1);
243  pex0 = kirkwood_register_gate_fn("pex0", CGC_BIT_PEX0,
244  NULL, disable_pcie0);
245  pex1 = kirkwood_register_gate_fn("pex1", CGC_BIT_PEX1,
246  NULL, disable_pcie1);
247  audio = kirkwood_register_gate("audio", CGC_BIT_AUDIO);
248  kirkwood_register_gate("tdm", CGC_BIT_TDM);
249  kirkwood_register_gate("tsu", CGC_BIT_TSU);
250 
251  /* clkdev entries, mapping clks to devices */
252  orion_clkdev_add(NULL, "orion_spi.0", runit);
253  orion_clkdev_add(NULL, "orion_spi.1", runit);
256  orion_clkdev_add(NULL, "orion_wdt", tclk);
257  orion_clkdev_add("0", "sata_mv.0", sata0);
258  orion_clkdev_add("1", "sata_mv.0", sata1);
259  orion_clkdev_add(NULL, "orion-ehci.0", usb0);
260  orion_clkdev_add(NULL, "orion_nand", runit);
261  orion_clkdev_add(NULL, "mvsdio", sdio);
262  orion_clkdev_add(NULL, "mv_crypto", crypto);
265  orion_clkdev_add("0", "pcie", pex0);
266  orion_clkdev_add("1", "pcie", pex1);
267  orion_clkdev_add(NULL, "kirkwood-i2s", audio);
269 
270  /* Marvell says runit is used by SPI, UART, NAND, TWSI, ...,
271  * so should never be gated.
272  */
273  clk_prepare_enable(runit);
274 }
275 
276 /*****************************************************************************
277  * EHCI0
278  ****************************************************************************/
280 {
282 }
283 
284 
285 /*****************************************************************************
286  * GE00
287  ****************************************************************************/
289 {
290  orion_ge00_init(eth_data,
292  IRQ_KIRKWOOD_GE00_ERR, 1600);
293  /* The interface forgets the MAC address assigned by u-boot if
294  the clock is turned off, so claim the clk now. */
295  clk_prepare_enable(ge0);
296 }
297 
298 
299 /*****************************************************************************
300  * GE01
301  ****************************************************************************/
303 {
304  orion_ge01_init(eth_data,
306  IRQ_KIRKWOOD_GE01_ERR, 1600);
307  clk_prepare_enable(ge1);
308 }
309 
310 
311 /*****************************************************************************
312  * Ethernet switch
313  ****************************************************************************/
315 {
316  orion_ge00_switch_init(d, irq);
317 }
318 
319 
320 /*****************************************************************************
321  * NAND flash
322  ****************************************************************************/
323 static struct resource kirkwood_nand_resource = {
324  .flags = IORESOURCE_MEM,
328 };
329 
330 static struct orion_nand_data kirkwood_nand_data = {
331  .cle = 0,
332  .ale = 1,
333  .width = 8,
334 };
335 
336 static struct platform_device kirkwood_nand_flash = {
337  .name = "orion_nand",
338  .id = -1,
339  .dev = {
340  .platform_data = &kirkwood_nand_data,
341  },
342  .resource = &kirkwood_nand_resource,
343  .num_resources = 1,
344 };
345 
346 void __init kirkwood_nand_init(struct mtd_partition *parts, int nr_parts,
347  int chip_delay)
348 {
349  kirkwood_nand_data.parts = parts;
350  kirkwood_nand_data.nr_parts = nr_parts;
351  kirkwood_nand_data.chip_delay = chip_delay;
352  platform_device_register(&kirkwood_nand_flash);
353 }
354 
355 void __init kirkwood_nand_init_rnb(struct mtd_partition *parts, int nr_parts,
356  int (*dev_ready)(struct mtd_info *))
357 {
358  kirkwood_nand_data.parts = parts;
359  kirkwood_nand_data.nr_parts = nr_parts;
360  kirkwood_nand_data.dev_ready = dev_ready;
361  platform_device_register(&kirkwood_nand_flash);
362 }
363 
364 /*****************************************************************************
365  * SoC RTC
366  ****************************************************************************/
367 static void __init kirkwood_rtc_init(void)
368 {
370 }
371 
372 
373 /*****************************************************************************
374  * SATA
375  ****************************************************************************/
377 {
379 }
380 
381 
382 /*****************************************************************************
383  * SD/SDIO/MMC
384  ****************************************************************************/
385 static struct resource mvsdio_resources[] = {
386  [0] = {
387  .start = SDIO_PHYS_BASE,
388  .end = SDIO_PHYS_BASE + SZ_1K - 1,
389  .flags = IORESOURCE_MEM,
390  },
391  [1] = {
392  .start = IRQ_KIRKWOOD_SDIO,
393  .end = IRQ_KIRKWOOD_SDIO,
394  .flags = IORESOURCE_IRQ,
395  },
396 };
397 
398 static u64 mvsdio_dmamask = DMA_BIT_MASK(32);
399 
400 static struct platform_device kirkwood_sdio = {
401  .name = "mvsdio",
402  .id = -1,
403  .dev = {
404  .dma_mask = &mvsdio_dmamask,
405  .coherent_dma_mask = DMA_BIT_MASK(32),
406  },
407  .num_resources = ARRAY_SIZE(mvsdio_resources),
408  .resource = mvsdio_resources,
409 };
410 
412 {
413  u32 dev, rev;
414 
415  kirkwood_pcie_id(&dev, &rev);
416  if (rev == 0 && dev != MV88F6282_DEV_ID) /* catch all Kirkwood Z0's */
417  mvsdio_data->clock = 100000000;
418  else
419  mvsdio_data->clock = 200000000;
420  kirkwood_sdio.dev.platform_data = mvsdio_data;
421  platform_device_register(&kirkwood_sdio);
422 }
423 
424 
425 /*****************************************************************************
426  * SPI
427  ****************************************************************************/
429 {
431 }
432 
433 
434 /*****************************************************************************
435  * I2C
436  ****************************************************************************/
438 {
440 }
441 
442 
443 /*****************************************************************************
444  * UART0
445  ****************************************************************************/
446 
448 {
450  IRQ_KIRKWOOD_UART_0, tclk);
451 }
452 
453 
454 /*****************************************************************************
455  * UART1
456  ****************************************************************************/
458 {
460  IRQ_KIRKWOOD_UART_1, tclk);
461 }
462 
463 /*****************************************************************************
464  * Cryptographic Engines and Security Accelerator (CESA)
465  ****************************************************************************/
467 {
470 }
471 
472 
473 /*****************************************************************************
474  * XOR0
475  ****************************************************************************/
477 {
480 }
481 
482 
483 /*****************************************************************************
484  * XOR1
485  ****************************************************************************/
487 {
490 }
491 
492 
493 /*****************************************************************************
494  * Watchdog
495  ****************************************************************************/
497 {
498  orion_wdt_init();
499 }
500 
501 
502 /*****************************************************************************
503  * Time handling
504  ****************************************************************************/
506 {
508 
509  /*
510  * Some Kirkwood devices allocate their coherent buffers from atomic
511  * context. Increase size of atomic coherent pool to make sure such
512  * the allocations won't fail.
513  */
514  init_dma_coherent_pool_size(SZ_1M);
515 }
516 
518 
519 static int __init kirkwood_find_tclk(void)
520 {
521  u32 dev, rev;
522 
523  kirkwood_pcie_id(&dev, &rev);
524 
525  if (dev == MV88F6281_DEV_ID || dev == MV88F6282_DEV_ID)
526  if (((readl(SAMPLE_AT_RESET) >> 21) & 1) == 0)
527  return 200000000;
528 
529  return 166666667;
530 }
531 
532 static void __init kirkwood_timer_init(void)
533 {
534  kirkwood_tclk = kirkwood_find_tclk();
535 
537  IRQ_KIRKWOOD_BRIDGE, kirkwood_tclk);
538 }
539 
541  .init = kirkwood_timer_init,
542 };
543 
544 /*****************************************************************************
545  * Audio
546  ****************************************************************************/
547 static struct resource kirkwood_i2s_resources[] = {
548  [0] = {
549  .start = AUDIO_PHYS_BASE,
550  .end = AUDIO_PHYS_BASE + SZ_16K - 1,
551  .flags = IORESOURCE_MEM,
552  },
553  [1] = {
554  .start = IRQ_KIRKWOOD_I2S,
555  .end = IRQ_KIRKWOOD_I2S,
556  .flags = IORESOURCE_IRQ,
557  },
558 };
559 
560 static struct kirkwood_asoc_platform_data kirkwood_i2s_data = {
561  .burst = 128,
562 };
563 
564 static struct platform_device kirkwood_i2s_device = {
565  .name = "kirkwood-i2s",
566  .id = -1,
567  .num_resources = ARRAY_SIZE(kirkwood_i2s_resources),
568  .resource = kirkwood_i2s_resources,
569  .dev = {
570  .platform_data = &kirkwood_i2s_data,
571  },
572 };
573 
574 static struct platform_device kirkwood_pcm_device = {
575  .name = "kirkwood-pcm-audio",
576  .id = -1,
577 };
578 
580 {
581  platform_device_register(&kirkwood_i2s_device);
582  platform_device_register(&kirkwood_pcm_device);
583 }
584 
585 /*****************************************************************************
586  * General
587  ****************************************************************************/
588 /*
589  * Identify device ID and revision.
590  */
591 char * __init kirkwood_id(void)
592 {
593  u32 dev, rev;
594 
595  kirkwood_pcie_id(&dev, &rev);
596 
597  if (dev == MV88F6281_DEV_ID) {
598  if (rev == MV88F6281_REV_Z0)
599  return "MV88F6281-Z0";
600  else if (rev == MV88F6281_REV_A0)
601  return "MV88F6281-A0";
602  else if (rev == MV88F6281_REV_A1)
603  return "MV88F6281-A1";
604  else
605  return "MV88F6281-Rev-Unsupported";
606  } else if (dev == MV88F6192_DEV_ID) {
607  if (rev == MV88F6192_REV_Z0)
608  return "MV88F6192-Z0";
609  else if (rev == MV88F6192_REV_A0)
610  return "MV88F6192-A0";
611  else if (rev == MV88F6192_REV_A1)
612  return "MV88F6192-A1";
613  else
614  return "MV88F6192-Rev-Unsupported";
615  } else if (dev == MV88F6180_DEV_ID) {
616  if (rev == MV88F6180_REV_A0)
617  return "MV88F6180-Rev-A0";
618  else if (rev == MV88F6180_REV_A1)
619  return "MV88F6180-Rev-A1";
620  else
621  return "MV88F6180-Rev-Unsupported";
622  } else if (dev == MV88F6282_DEV_ID) {
623  if (rev == MV88F6282_REV_A0)
624  return "MV88F6282-Rev-A0";
625  else if (rev == MV88F6282_REV_A1)
626  return "MV88F6282-Rev-A1";
627  else
628  return "MV88F6282-Rev-Unsupported";
629  } else {
630  return "Device-Unknown";
631  }
632 }
633 
635 {
636 #ifdef CONFIG_CACHE_FEROCEON_L2
637 #ifdef CONFIG_CACHE_FEROCEON_L2_WRITETHROUGH
639  feroceon_l2_init(1);
640 #else
642  feroceon_l2_init(0);
643 #endif
644 #endif
645 }
646 
648 {
649  printk(KERN_INFO "Kirkwood: %s, TCLK=%d.\n",
650  kirkwood_id(), kirkwood_tclk);
651 
652  /*
653  * Disable propagation of mbus errors to the CPU local bus,
654  * as this causes mbus errors (which can occur for example
655  * for PCI aborts) to throw CPU aborts, which we're not set
656  * up to deal with.
657  */
659 
661 
663 
664  /* Setup root of clk tree */
666 
667  /* internal devices that every board has */
668  kirkwood_rtc_init();
673 
674 #ifdef CONFIG_KEXEC
676 #endif
677 }
678 
679 void kirkwood_restart(char mode, const char *cmd)
680 {
681  /*
682  * Enable soft reset to assert RSTOUTn.
683  */
685 
686  /*
687  * Assert soft reset.
688  */
690 
691  while (1)
692  ;
693 }