Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
spear3xx.c
Go to the documentation of this file.
1 /*
2  * arch/arm/mach-spear3xx/spear3xx.c
3  *
4  * SPEAr3XX machines common source file
5  *
6  * Copyright (C) 2009-2012 ST Microelectronics
7  * Viresh Kumar <[email protected]>
8  *
9  * This file is licensed under the terms of the GNU General Public
10  * License version 2. This program is licensed "as is" without any
11  * warranty of any kind, whether express or implied.
12  */
13 
14 #define pr_fmt(fmt) "SPEAr3xx: " fmt
15 
16 #include <linux/amba/pl022.h>
17 #include <linux/amba/pl08x.h>
18 #include <linux/of_irq.h>
19 #include <linux/io.h>
20 #include <asm/hardware/pl080.h>
21 #include <asm/hardware/vic.h>
22 #include <plat/pl080.h>
23 #include <mach/generic.h>
24 #include <mach/spear.h>
25 
26 /* ssp device registration */
28  .bus_id = 0,
29  .enable_dma = 1,
30  .dma_filter = pl08x_filter_id,
31  .dma_tx_param = "ssp0_tx",
32  .dma_rx_param = "ssp0_rx",
33  /*
34  * This is number of spi devices that can be connected to spi. There are
35  * two type of chipselects on which slave devices can work. One is chip
36  * select provided by spi masters other is controlled through external
37  * gpio's. We can't use chipselect provided from spi master (because as
38  * soon as FIFO becomes empty, CS is disabled and transfer ends). So
39  * this number now depends on number of gpios available for spi. each
40  * slave on each master requires a separate gpio pin.
41  */
42  .num_chipselect = 2,
43 };
44 
45 /* dmac device registration */
47  .memcpy_channel = {
48  .bus_id = "memcpy",
49  .cctl_memcpy =
51  PL080_BSIZE_16 << PL080_CONTROL_DB_SIZE_SHIFT | \
52  PL080_WIDTH_32BIT << PL080_CONTROL_SWIDTH_SHIFT | \
53  PL080_WIDTH_32BIT << PL080_CONTROL_DWIDTH_SHIFT | \
54  PL080_CONTROL_PROT_BUFF | PL080_CONTROL_PROT_CACHE | \
55  PL080_CONTROL_PROT_SYS),
56  },
61 };
62 
63 /*
64  * Following will create 16MB static virtual/physical mappings
65  * PHYSICAL VIRTUAL
66  * 0xD0000000 0xFD000000
67  * 0xFC000000 0xFC000000
68  */
69 struct map_desc spear3xx_io_desc[] __initdata = {
70  {
71  .virtual = VA_SPEAR3XX_ICM1_2_BASE,
73  .length = SZ_16M,
74  .type = MT_DEVICE
75  }, {
78  .length = SZ_16M,
79  .type = MT_DEVICE
80  },
81 };
82 
83 /* This will create static memory mapping for selected devices */
85 {
86  iotable_init(spear3xx_io_desc, ARRAY_SIZE(spear3xx_io_desc));
87 }
88 
89 static void __init spear3xx_timer_init(void)
90 {
91  char pclk_name[] = "pll3_clk";
92  struct clk *gpt_clk, *pclk;
93 
95 
96  /* get the system timer clock */
97  gpt_clk = clk_get_sys("gpt0", NULL);
98  if (IS_ERR(gpt_clk)) {
99  pr_err("%s:couldn't get clk for gpt\n", __func__);
100  BUG();
101  }
102 
103  /* get the suitable parent clock for timer*/
104  pclk = clk_get(NULL, pclk_name);
105  if (IS_ERR(pclk)) {
106  pr_err("%s:couldn't get %s as parent for gpt\n",
107  __func__, pclk_name);
108  BUG();
109  }
110 
111  clk_set_parent(gpt_clk, pclk);
112  clk_put(gpt_clk);
113  clk_put(pclk);
114 
116 }
117 
119  .init = spear3xx_timer_init,
120 };
121 
122 static const struct of_device_id vic_of_match[] __initconst = {
123  { .compatible = "arm,pl190-vic", .data = vic_of_init, },
124  { /* Sentinel */ }
125 };
126 
128 {
129  of_irq_init(vic_of_match);
130 }