diff options
-rw-r--r-- | arch/arm/boot/dts/integratorap.dts | 5 | ||||
-rw-r--r-- | arch/arm/mach-integrator/Kconfig | 1 | ||||
-rw-r--r-- | arch/arm/mach-integrator/common.h | 1 | ||||
-rw-r--r-- | arch/arm/mach-integrator/core.c | 91 | ||||
-rw-r--r-- | arch/arm/mach-integrator/integrator_ap.c | 57 |
5 files changed, 153 insertions, 2 deletions
diff --git a/arch/arm/boot/dts/integratorap.dts b/arch/arm/boot/dts/integratorap.dts index 61767757b50a..c9c3fa344647 100644 --- a/arch/arm/boot/dts/integratorap.dts +++ b/arch/arm/boot/dts/integratorap.dts | |||
@@ -18,6 +18,11 @@ | |||
18 | bootargs = "root=/dev/ram0 console=ttyAM0,38400n8 earlyprintk"; | 18 | bootargs = "root=/dev/ram0 console=ttyAM0,38400n8 earlyprintk"; |
19 | }; | 19 | }; |
20 | 20 | ||
21 | syscon { | ||
22 | /* AP system controller registers */ | ||
23 | reg = <0x11000000 0x100>; | ||
24 | }; | ||
25 | |||
21 | timer0: timer@13000000 { | 26 | timer0: timer@13000000 { |
22 | compatible = "arm,integrator-timer"; | 27 | compatible = "arm,integrator-timer"; |
23 | }; | 28 | }; |
diff --git a/arch/arm/mach-integrator/Kconfig b/arch/arm/mach-integrator/Kconfig index 350e26636a06..3961942c9e11 100644 --- a/arch/arm/mach-integrator/Kconfig +++ b/arch/arm/mach-integrator/Kconfig | |||
@@ -8,6 +8,7 @@ config ARCH_INTEGRATOR_AP | |||
8 | select MIGHT_HAVE_PCI | 8 | select MIGHT_HAVE_PCI |
9 | select SERIAL_AMBA_PL010 | 9 | select SERIAL_AMBA_PL010 |
10 | select SERIAL_AMBA_PL010_CONSOLE | 10 | select SERIAL_AMBA_PL010_CONSOLE |
11 | select SOC_BUS | ||
11 | help | 12 | help |
12 | Include support for the ARM(R) Integrator/AP and | 13 | Include support for the ARM(R) Integrator/AP and |
13 | Integrator/PP2 platforms. | 14 | Integrator/PP2 platforms. |
diff --git a/arch/arm/mach-integrator/common.h b/arch/arm/mach-integrator/common.h index c3ff21b5ea24..fc9f47d289f4 100644 --- a/arch/arm/mach-integrator/common.h +++ b/arch/arm/mach-integrator/common.h | |||
@@ -4,3 +4,4 @@ void integrator_init_early(void); | |||
4 | int integrator_init(bool is_cp); | 4 | int integrator_init(bool is_cp); |
5 | void integrator_reserve(void); | 5 | void integrator_reserve(void); |
6 | void integrator_restart(char, const char *); | 6 | void integrator_restart(char, const char *); |
7 | void integrator_init_sysfs(struct device *parent, u32 id); | ||
diff --git a/arch/arm/mach-integrator/core.c b/arch/arm/mach-integrator/core.c index ea22a17246d7..161fbf8596bd 100644 --- a/arch/arm/mach-integrator/core.c +++ b/arch/arm/mach-integrator/core.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <linux/amba/bus.h> | 22 | #include <linux/amba/bus.h> |
23 | #include <linux/amba/serial.h> | 23 | #include <linux/amba/serial.h> |
24 | #include <linux/io.h> | 24 | #include <linux/io.h> |
25 | #include <linux/stat.h> | ||
25 | 26 | ||
26 | #include <mach/hardware.h> | 27 | #include <mach/hardware.h> |
27 | #include <mach/platform.h> | 28 | #include <mach/platform.h> |
@@ -169,3 +170,93 @@ void integrator_restart(char mode, const char *cmd) | |||
169 | { | 170 | { |
170 | cm_control(CM_CTRL_RESET, CM_CTRL_RESET); | 171 | cm_control(CM_CTRL_RESET, CM_CTRL_RESET); |
171 | } | 172 | } |
173 | |||
174 | static u32 integrator_id; | ||
175 | |||
176 | static ssize_t intcp_get_manf(struct device *dev, | ||
177 | struct device_attribute *attr, | ||
178 | char *buf) | ||
179 | { | ||
180 | return sprintf(buf, "%02x\n", integrator_id >> 24); | ||
181 | } | ||
182 | |||
183 | static struct device_attribute intcp_manf_attr = | ||
184 | __ATTR(manufacturer, S_IRUGO, intcp_get_manf, NULL); | ||
185 | |||
186 | static ssize_t intcp_get_arch(struct device *dev, | ||
187 | struct device_attribute *attr, | ||
188 | char *buf) | ||
189 | { | ||
190 | const char *arch; | ||
191 | |||
192 | switch ((integrator_id >> 16) & 0xff) { | ||
193 | case 0x00: | ||
194 | arch = "ASB little-endian"; | ||
195 | break; | ||
196 | case 0x01: | ||
197 | arch = "AHB little-endian"; | ||
198 | break; | ||
199 | case 0x03: | ||
200 | arch = "AHB-Lite system bus, bi-endian"; | ||
201 | break; | ||
202 | case 0x04: | ||
203 | arch = "AHB"; | ||
204 | break; | ||
205 | default: | ||
206 | arch = "Unknown"; | ||
207 | break; | ||
208 | } | ||
209 | |||
210 | return sprintf(buf, "%s\n", arch); | ||
211 | } | ||
212 | |||
213 | static struct device_attribute intcp_arch_attr = | ||
214 | __ATTR(architecture, S_IRUGO, intcp_get_arch, NULL); | ||
215 | |||
216 | static ssize_t intcp_get_fpga(struct device *dev, | ||
217 | struct device_attribute *attr, | ||
218 | char *buf) | ||
219 | { | ||
220 | const char *fpga; | ||
221 | |||
222 | switch ((integrator_id >> 12) & 0xf) { | ||
223 | case 0x01: | ||
224 | fpga = "XC4062"; | ||
225 | break; | ||
226 | case 0x02: | ||
227 | fpga = "XC4085"; | ||
228 | break; | ||
229 | case 0x04: | ||
230 | fpga = "EPM7256AE (Altera PLD)"; | ||
231 | break; | ||
232 | default: | ||
233 | fpga = "Unknown"; | ||
234 | break; | ||
235 | } | ||
236 | |||
237 | return sprintf(buf, "%s\n", fpga); | ||
238 | } | ||
239 | |||
240 | static struct device_attribute intcp_fpga_attr = | ||
241 | __ATTR(fpga, S_IRUGO, intcp_get_fpga, NULL); | ||
242 | |||
243 | static ssize_t intcp_get_build(struct device *dev, | ||
244 | struct device_attribute *attr, | ||
245 | char *buf) | ||
246 | { | ||
247 | return sprintf(buf, "%02x\n", (integrator_id >> 4) & 0xFF); | ||
248 | } | ||
249 | |||
250 | static struct device_attribute intcp_build_attr = | ||
251 | __ATTR(build, S_IRUGO, intcp_get_build, NULL); | ||
252 | |||
253 | |||
254 | |||
255 | void integrator_init_sysfs(struct device *parent, u32 id) | ||
256 | { | ||
257 | integrator_id = id; | ||
258 | device_create_file(parent, &intcp_manf_attr); | ||
259 | device_create_file(parent, &intcp_arch_attr); | ||
260 | device_create_file(parent, &intcp_fpga_attr); | ||
261 | device_create_file(parent, &intcp_build_attr); | ||
262 | } | ||
diff --git a/arch/arm/mach-integrator/integrator_ap.c b/arch/arm/mach-integrator/integrator_ap.c index e6617c134faf..7d84080f9aa3 100644 --- a/arch/arm/mach-integrator/integrator_ap.c +++ b/arch/arm/mach-integrator/integrator_ap.c | |||
@@ -37,6 +37,8 @@ | |||
37 | #include <linux/of_irq.h> | 37 | #include <linux/of_irq.h> |
38 | #include <linux/of_address.h> | 38 | #include <linux/of_address.h> |
39 | #include <linux/of_platform.h> | 39 | #include <linux/of_platform.h> |
40 | #include <linux/stat.h> | ||
41 | #include <linux/sys_soc.h> | ||
40 | #include <video/vga.h> | 42 | #include <video/vga.h> |
41 | 43 | ||
42 | #include <mach/hardware.h> | 44 | #include <mach/hardware.h> |
@@ -462,13 +464,64 @@ static struct of_dev_auxdata ap_auxdata_lookup[] __initdata = { | |||
462 | { /* sentinel */ }, | 464 | { /* sentinel */ }, |
463 | }; | 465 | }; |
464 | 466 | ||
467 | /* Base address to the AP system controller */ | ||
468 | static void __iomem *ap_syscon_base; | ||
469 | |||
465 | static void __init ap_init_of(void) | 470 | static void __init ap_init_of(void) |
466 | { | 471 | { |
467 | unsigned long sc_dec; | 472 | unsigned long sc_dec; |
473 | struct device_node *root; | ||
474 | struct device_node *syscon; | ||
475 | struct device *parent; | ||
476 | struct soc_device *soc_dev; | ||
477 | struct soc_device_attribute *soc_dev_attr; | ||
478 | u32 ap_sc_id; | ||
479 | int err; | ||
468 | int i; | 480 | int i; |
469 | 481 | ||
470 | of_platform_populate(NULL, of_default_bus_match_table, | 482 | /* Here we create an SoC device for the root node */ |
471 | ap_auxdata_lookup, NULL); | 483 | root = of_find_node_by_path("/"); |
484 | if (!root) | ||
485 | return; | ||
486 | syscon = of_find_node_by_path("/syscon"); | ||
487 | if (!syscon) | ||
488 | return; | ||
489 | |||
490 | ap_syscon_base = of_iomap(syscon, 0); | ||
491 | if (!ap_syscon_base) | ||
492 | return; | ||
493 | |||
494 | ap_sc_id = readl(ap_syscon_base); | ||
495 | |||
496 | soc_dev_attr = kzalloc(sizeof(*soc_dev_attr), GFP_KERNEL); | ||
497 | if (!soc_dev_attr) | ||
498 | return; | ||
499 | |||
500 | err = of_property_read_string(root, "compatible", | ||
501 | &soc_dev_attr->soc_id); | ||
502 | if (err) | ||
503 | return; | ||
504 | err = of_property_read_string(root, "model", &soc_dev_attr->machine); | ||
505 | if (err) | ||
506 | return; | ||
507 | soc_dev_attr->family = "Integrator"; | ||
508 | soc_dev_attr->revision = kasprintf(GFP_KERNEL, "%c", | ||
509 | 'A' + (ap_sc_id & 0x0f)); | ||
510 | |||
511 | soc_dev = soc_device_register(soc_dev_attr); | ||
512 | if (IS_ERR_OR_NULL(soc_dev)) { | ||
513 | kfree(soc_dev_attr->revision); | ||
514 | kfree(soc_dev_attr); | ||
515 | return; | ||
516 | } | ||
517 | |||
518 | parent = soc_device_to_device(soc_dev); | ||
519 | |||
520 | if (!IS_ERR_OR_NULL(parent)) | ||
521 | integrator_init_sysfs(parent, ap_sc_id); | ||
522 | |||
523 | of_platform_populate(root, of_default_bus_match_table, | ||
524 | ap_auxdata_lookup, parent); | ||
472 | 525 | ||
473 | sc_dec = readl(VA_SC_BASE + INTEGRATOR_SC_DEC_OFFSET); | 526 | sc_dec = readl(VA_SC_BASE + INTEGRATOR_SC_DEC_OFFSET); |
474 | for (i = 0; i < 4; i++) { | 527 | for (i = 0; i < 4; i++) { |