Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
cpu-db8500.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2008-2009 ST-Ericsson SA
3  *
4  * Author: Srinidhi KASAGAR <[email protected]>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2, as
8  * published by the Free Software Foundation.
9  *
10  */
11 #include <linux/types.h>
12 #include <linux/init.h>
13 #include <linux/device.h>
14 #include <linux/amba/bus.h>
15 #include <linux/interrupt.h>
16 #include <linux/irq.h>
17 #include <linux/platform_device.h>
18 #include <linux/io.h>
20 
21 #include <asm/pmu.h>
22 #include <asm/mach/map.h>
23 #include <plat/gpio-nomadik.h>
24 #include <mach/hardware.h>
25 #include <mach/setup.h>
26 #include <mach/devices.h>
28 #include <mach/db8500-regs.h>
29 
30 #include "devices-db8500.h"
31 #include "ste-dma40-db8500.h"
32 
33 /* minimum static i/o mapping required to boot U8500 platforms */
34 static struct map_desc u8500_uart_io_desc[] __initdata = {
37 };
38 /* U8500 and U9540 common io_desc */
39 static struct map_desc u8500_common_io_desc[] __initdata = {
40  /* SCU base also covers GIC CPU BASE and TWD with its 4K page */
46 
52 
57 };
58 
59 /* U8500 IO map specific description */
60 static struct map_desc u8500_io_desc[] __initdata = {
63 
64 };
65 
66 /* U9540 IO map specific description */
67 static struct map_desc u9540_io_desc[] __initdata = {
70 };
71 
72 void __init u8500_map_io(void)
73 {
74  /*
75  * Map the UARTs early so that the DEBUG_LL stuff continues to work.
76  */
77  iotable_init(u8500_uart_io_desc, ARRAY_SIZE(u8500_uart_io_desc));
78 
79  ux500_map_io();
80 
81  iotable_init(u8500_common_io_desc, ARRAY_SIZE(u8500_common_io_desc));
82 
83  if (cpu_is_ux540_family())
84  iotable_init(u9540_io_desc, ARRAY_SIZE(u9540_io_desc));
85  else
86  iotable_init(u8500_io_desc, ARRAY_SIZE(u8500_io_desc));
87 
89 }
90 
91 static struct resource db8500_pmu_resources[] = {
92  [0] = {
93  .start = IRQ_DB8500_PMU,
94  .end = IRQ_DB8500_PMU,
95  .flags = IORESOURCE_IRQ,
96  },
97 };
98 
99 /*
100  * The PMU IRQ lines of two cores are wired together into a single interrupt.
101  * Bounce the interrupt to the other core if it's not ours.
102  */
103 static irqreturn_t db8500_pmu_handler(int irq, void *dev, irq_handler_t handler)
104 {
105  irqreturn_t ret = handler(irq, dev);
106  int other = !smp_processor_id();
107 
108  if (ret == IRQ_NONE && cpu_online(other))
109  irq_set_affinity(irq, cpumask_of(other));
110 
111  /*
112  * We should be able to get away with the amount of IRQ_NONEs we give,
113  * while still having the spurious IRQ detection code kick in if the
114  * interrupt really starts hitting spuriously.
115  */
116  return ret;
117 }
118 
120  .handle_irq = db8500_pmu_handler,
121 };
122 
123 static struct platform_device db8500_pmu_device = {
124  .name = "arm-pmu",
125  .id = -1,
126  .num_resources = ARRAY_SIZE(db8500_pmu_resources),
127  .resource = db8500_pmu_resources,
128  .dev.platform_data = &db8500_pmu_platdata,
129 };
130 
131 static struct platform_device db8500_prcmu_device = {
132  .name = "db8500-prcmu",
133 };
134 
135 static struct platform_device *platform_devs[] __initdata = {
137  &db8500_pmu_device,
138  &db8500_prcmu_device,
139 };
140 
141 static resource_size_t __initdata db8500_gpio_base[] = {
151 };
152 
153 static void __init db8500_add_gpios(struct device *parent)
154 {
155  struct nmk_gpio_platform_data pdata = {
156  .supports_sleepmode = true,
157  };
158 
159  dbx500_add_gpios(parent, ARRAY_AND_SIZE(db8500_gpio_base),
160  IRQ_DB8500_GPIO0, &pdata);
161  dbx500_add_pinctrl(parent, "pinctrl-db8500");
162 }
163 
164 static int usb_db8500_rx_dma_cfg[] = {
173 };
174 
175 static int usb_db8500_tx_dma_cfg[] = {
184 };
185 
186 static const char *db8500_read_soc_id(void)
187 {
189 
190  return kasprintf(GFP_KERNEL, "%08x%08x%08x%08x%08x",
191  readl((u32 *)uid+1),
192  readl((u32 *)uid+1), readl((u32 *)uid+2),
193  readl((u32 *)uid+3), readl((u32 *)uid+4));
194 }
195 
196 static struct device * __init db8500_soc_device_init(void)
197 {
198  const char *soc_id = db8500_read_soc_id();
199 
200  return ux500_soc_device_init(soc_id);
201 }
202 
203 /*
204  * This function is called from the board init
205  */
207 {
208  struct device *parent;
209  int i;
210 
211  parent = db8500_soc_device_init();
212 
213  db8500_add_rtc(parent);
214  db8500_add_gpios(parent);
215  db8500_add_usb(parent, usb_db8500_rx_dma_cfg, usb_db8500_tx_dma_cfg);
216 
217  platform_device_register_data(parent,
218  "cpufreq-u8500", -1, NULL, 0);
219 
220  for (i = 0; i < ARRAY_SIZE(platform_devs); i++)
221  platform_devs[i]->dev.parent = parent;
222 
223  db8500_prcmu_device.dev.platform_data = ab8500;
224 
225  platform_add_devices(platform_devs, ARRAY_SIZE(platform_devs));
226 
227  return parent;
228 }
229 
230 /* TODO: Once all pieces are DT:ed, remove completely. */
232 {
233  struct device *parent;
234 
235  parent = db8500_soc_device_init();
236 
237  db8500_add_usb(parent, usb_db8500_rx_dma_cfg, usb_db8500_tx_dma_cfg);
238 
239  platform_device_register_data(parent,
240  "cpufreq-u8500", -1, NULL, 0);
241 
242  u8500_dma40_device.dev.parent = parent;
243 
244  /*
245  * Devices to be DT:ed:
246  * u8500_dma40_device = todo
247  * db8500_pmu_device = done
248  * db8500_prcmu_device = done
249  */
251 
252  return parent;
253 }